URI: 
       simple_plumb.diff - sites - public wiki contents of suckless.org
  HTML git clone git://git.suckless.org/sites
   DIR Log
   DIR Files
   DIR Refs
       ---
       simple_plumb.diff (3265B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 index 546edda..df14610 100644
            3 --- a/config.def.h
            4 +++ b/config.def.h
            5 @@ -457,3 +457,9 @@ static char ascii_printable[] =
            6          " !\"#$%&'()*+,-./0123456789:;<=>?"
            7          "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
            8          "`abcdefghijklmnopqrstuvwxyz{|}~";
            9 +
           10 +/*
           11 + * plumb_cmd is run on mouse button 3 click, with first NULL set to
           12 + * current selection and with cwd set to the cwd of the active shell
           13 + */
           14 +static char *plumb_cmd[] = {"plumb", "-m", NULL, NULL};
           15 diff --git a/st.c b/st.c
           16 index 3e48410..11dda7b 100644
           17 --- a/st.c
           18 +++ b/st.c
           19 @@ -27,6 +27,9 @@
           20  #elif defined(__FreeBSD__) || defined(__DragonFly__)
           21   #include <libutil.h>
           22  #endif
           23 +#if defined(__OpenBSD__)
           24 + #include <sys/sysctl.h>
           25 +#endif
           26  
           27  /* Arbitrary sizes */
           28  #define UTF_INVALID   0xFFFD
           29 @@ -232,6 +235,22 @@ static uchar utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
           30  static Rune utfmin[UTF_SIZ + 1] = {       0,    0,  0x80,  0x800,  0x10000};
           31  static Rune utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
           32  
           33 +int
           34 +subprocwd(char *path)
           35 +{
           36 +#if   defined(__linux)
           37 +        if (snprintf(path, PATH_MAX, "/proc/%d/cwd", pid) < 0)
           38 +                return -1;
           39 +        return 0;
           40 +#elif defined(__OpenBSD__)
           41 +        size_t sz = PATH_MAX;
           42 +        int name[3] = {CTL_KERN, KERN_PROC_CWD, pid};
           43 +        if (sysctl(name, 3, path, &sz, 0, 0) == -1)
           44 +                return -1;
           45 +        return 0;
           46 +#endif
           47 +}
           48 +
           49  ssize_t
           50  xwrite(int fd, const char *s, size_t len)
           51  {
           52 @@ -799,7 +818,7 @@ ttynew(char *line, char *cmd, char *out, char **args)
           53                  break;
           54          default:
           55  #ifdef __OpenBSD__
           56 -                if (pledge("stdio rpath tty proc", NULL) == -1)
           57 +                if (pledge("stdio rpath tty proc ps exec", NULL) == -1)
           58                          die("pledge\n");
           59  #endif
           60                  close(s);
           61 diff --git a/st.h b/st.h
           62 index a1928ca..4f5abc4 100644
           63 --- a/st.h
           64 +++ b/st.h
           65 @@ -111,6 +111,8 @@ void *xmalloc(size_t);
           66  void *xrealloc(void *, size_t);
           67  char *xstrdup(char *);
           68  
           69 +int subprocwd(char *);
           70 +
           71  /* config.h globals */
           72  extern char *utmp;
           73  extern char *stty_args;
           74 diff --git a/x.c b/x.c
           75 index e5f1737..cc58642 100644
           76 --- a/x.c
           77 +++ b/x.c
           78 @@ -5,6 +5,7 @@
           79  #include <locale.h>
           80  #include <signal.h>
           81  #include <sys/select.h>
           82 +#include <sys/wait.h>
           83  #include <time.h>
           84  #include <unistd.h>
           85  #include <libgen.h>
           86 @@ -216,6 +217,7 @@ static void (*handler[LASTEvent])(XEvent *) = {
           87  };
           88  
           89  /* Globals */
           90 +static int plumbsel;
           91  static DC dc;
           92  static XWindow xw;
           93  static XSelection xsel;
           94 @@ -681,6 +683,37 @@ xsetsel(char *str)
           95          setsel(str, CurrentTime);
           96  }
           97  
           98 +void
           99 +plumbinit()
          100 +{
          101 +        for(plumbsel = 0; plumb_cmd[plumbsel]; plumbsel++);
          102 +}
          103 +
          104 +void
          105 +plumb(char *sel) {
          106 +        if (sel == NULL)
          107 +                return;
          108 +        char cwd[PATH_MAX];
          109 +        pid_t child;
          110 +        if (subprocwd(cwd) != 0)
          111 +                return;
          112 +
          113 +        plumb_cmd[plumbsel] = sel;
          114 +
          115 +        switch(child = fork()) {
          116 +                case -1:
          117 +                        return;
          118 +                case 0:
          119 +                        if (chdir(cwd) != 0)
          120 +                                exit(1);
          121 +                        if (execvp(plumb_cmd[0], plumb_cmd) == -1)
          122 +                                exit(1);
          123 +                        exit(0);
          124 +                default:
          125 +                        waitpid(child, NULL, 0);
          126 +        }
          127 +}
          128 +
          129  void
          130  brelease(XEvent *e)
          131  {
          132 @@ -693,6 +726,8 @@ brelease(XEvent *e)
          133                  return;
          134          if (e->xbutton.button == Button1)
          135                  mousesel(e, 1);
          136 +        else if (e->xbutton.button == Button3)
          137 +                plumb(xsel.primary);
          138  }
          139  
          140  void
          141 @@ -2035,6 +2070,7 @@ main(int argc, char *argv[])
          142          } ARGEND;
          143  
          144  run:
          145 +        plumbinit();
          146          if (argc > 0) /* eat all remaining arguments */
          147                  opt_cmd = argv;
          148