by picking up the process group leader from the terminal fd
via tcgetpgrp() instead of using the direct pane child process.

(works on linux, other platforms untested)
---
 trunk/cmd.c             |    2 +-
 trunk/format.c          |    2 +-
 trunk/osdep-aix.c       |    2 +-
 trunk/osdep-darwin.c    |   10 +++++++---
 trunk/osdep-dragonfly.c |    4 ++--
 trunk/osdep-freebsd.c   |   10 +++++++---
 trunk/osdep-hpux.c      |    2 +-
 trunk/osdep-linux.c     |    8 ++++++--
 trunk/osdep-netbsd.c    |    4 ++--
 trunk/osdep-openbsd.c   |    8 +++++---
 trunk/osdep-sunos.c     |    8 ++++++--
 trunk/osdep-unknown.c   |    2 +-
 trunk/tmux.h            |    2 +-
 13 files changed, 41 insertions(+), 23 deletions(-)

diff --git a/trunk/cmd.c b/trunk/cmd.c
index 2413642..17d182c 100644
--- a/trunk/cmd.c
+++ b/trunk/cmd.c
@@ -1296,7 +1296,7 @@ cmd_get_default_path(struct cmd_ctx *ctx, const char *cwd)
                if (ctx->cmdclient != NULL && ctx->cmdclient->cwd != NULL)
                        root = ctx->cmdclient->cwd;
                else if (ctx->curclient != NULL && s->curw != NULL)
-                       root = osdep_get_cwd(s->curw->window->active->pid);
+                       root = osdep_get_cwd(s->curw->window->active->fd);
                else
                        return (s->cwd);
                skip = 0;
diff --git a/trunk/format.c b/trunk/format.c
index 55d51df..19f322a 100644
--- a/trunk/format.c
+++ b/trunk/format.c
@@ -391,7 +391,7 @@ format_window_pane(struct format_tree *ft, struct 
window_pane *wp)
                format_add(ft, "pane_start_command", "%s", wp->cmd);
        if (wp->cwd != NULL)
                format_add(ft, "pane_start_path", "%s", wp->cwd);
-       format_add(ft, "pane_current_path", "%s", osdep_get_cwd(wp->pid));
+       format_add(ft, "pane_current_path", "%s", osdep_get_cwd(wp->fd));
        format_add(ft, "pane_pid", "%ld", (long) wp->pid);
        format_add(ft, "pane_tty", "%s", wp->tty);
 }
diff --git a/trunk/osdep-aix.c b/trunk/osdep-aix.c
index 2a29165..8d59081 100644
--- a/trunk/osdep-aix.c
+++ b/trunk/osdep-aix.c
@@ -29,7 +29,7 @@ osdep_get_name(unused int fd, unused char *tty)
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(unused int fd)
 {
        return (NULL);
 }
diff --git a/trunk/osdep-darwin.c b/trunk/osdep-darwin.c
index 9cac131..b112fa7 100644
--- a/trunk/osdep-darwin.c
+++ b/trunk/osdep-darwin.c
@@ -26,7 +26,7 @@
 #include <unistd.h>
 
 char                   *osdep_get_name(int, char *);
-char                   *osdep_get_cwd(pid_t);
+char                   *osdep_get_cwd(int);
 struct event_base      *osdep_event_init(void);
 
 #define unused __attribute__ ((unused))
@@ -51,14 +51,18 @@ osdep_get_name(int fd, unused char *tty)
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(int fd)
 {
        static char                     wd[PATH_MAX];
        struct proc_vnodepathinfo       pathinfo;
+       pid_t                           pgrp;
        int                             ret;
 
+       if ((pgrp = tcgetpgrp(fd)) == -1)
+               return (NULL);
+
        ret = proc_pidinfo(
-           pid, PROC_PIDVNODEPATHINFO, 0, &pathinfo, sizeof pathinfo);
+           pgrp, PROC_PIDVNODEPATHINFO, 0, &pathinfo, sizeof pathinfo);
        if (ret == sizeof pathinfo) {
                strlcpy(wd, pathinfo.pvi_cdir.vip_path, sizeof wd);
                return (wd);
diff --git a/trunk/osdep-dragonfly.c b/trunk/osdep-dragonfly.c
index 22045c3..ad417d9 100644
--- a/trunk/osdep-dragonfly.c
+++ b/trunk/osdep-dragonfly.c
@@ -31,7 +31,7 @@
 
 struct kinfo_proc      *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
 char                   *osdep_get_name(int, char *);
-char                   *osdep_get_cwd(pid_t);
+char                   *osdep_get_cwd(int);
 struct event_base      *osdep_event_init(void);
 
 #ifndef nitems
@@ -121,7 +121,7 @@ error:
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(int fd)
 {
        return (NULL);
 }
diff --git a/trunk/osdep-freebsd.c b/trunk/osdep-freebsd.c
index 1027a64..d596eab 100644
--- a/trunk/osdep-freebsd.c
+++ b/trunk/osdep-freebsd.c
@@ -33,7 +33,7 @@
 
 struct kinfo_proc      *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
 char                   *osdep_get_name(int, char *);
-char                   *osdep_get_cwd(pid_t);
+char                   *osdep_get_cwd(int);
 struct event_base      *osdep_event_init(void);
 
 #ifndef nitems
@@ -133,13 +133,17 @@ error:
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(int fd)
 {
        static char              wd[PATH_MAX];
        struct kinfo_file       *info = NULL;
+       pid_t                    pgrp;
        int                      nrecords, i;
 
-       if ((info = kinfo_getfile(pid, &nrecords)) == NULL)
+       if ((pgrp = tcgetpgrp(fd)) == -1)
+               return (NULL);
+
+       if ((info = kinfo_getfile(pgrp, &nrecords)) == NULL)
                return (NULL);
 
        for (i = 0; i < nrecords; i++) {
diff --git a/trunk/osdep-hpux.c b/trunk/osdep-hpux.c
index c962a1f..352e375 100644
--- a/trunk/osdep-hpux.c
+++ b/trunk/osdep-hpux.c
@@ -29,7 +29,7 @@ osdep_get_name(unused int fd, unused char *tty)
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(unused int fd)
 {
        return (NULL);
 }
diff --git a/trunk/osdep-linux.c b/trunk/osdep-linux.c
index 8adf202..b65acff 100644
--- a/trunk/osdep-linux.c
+++ b/trunk/osdep-linux.c
@@ -61,13 +61,17 @@ osdep_get_name(int fd, unused char *tty)
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(int fd)
 {
        static char      target[MAXPATHLEN + 1];
        char            *path;
+       pid_t            pgrp;
        ssize_t          n;
 
-       xasprintf(&path, "/proc/%d/cwd", pid);
+       if ((pgrp = tcgetpgrp(fd)) == -1)
+               return (NULL);
+
+       xasprintf(&path, "/proc/%lld/cwd", (long long) pgrp);
        n = readlink(path, target, MAXPATHLEN);
        free(path);
        if (n > 0) {
diff --git a/trunk/osdep-netbsd.c b/trunk/osdep-netbsd.c
index bb2676c..f16d0dc 100644
--- a/trunk/osdep-netbsd.c
+++ b/trunk/osdep-netbsd.c
@@ -34,7 +34,7 @@
 
 struct kinfo_proc2     *cmp_procs(struct kinfo_proc2 *, struct kinfo_proc2 *);
 char                   *osdep_get_name(int, char *);
-char                   *osdep_get_cwd(pid_t);
+char                   *osdep_get_cwd(int);
 struct event_base      *osdep_event_init(void);
 
 struct kinfo_proc2 *
@@ -125,7 +125,7 @@ error:
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(int fd)
 {
        return (NULL);
 }
diff --git a/trunk/osdep-openbsd.c b/trunk/osdep-openbsd.c
index 4fb75bf..9eee984 100644
--- a/trunk/osdep-openbsd.c
+++ b/trunk/osdep-openbsd.c
@@ -37,7 +37,7 @@
 
 struct kinfo_proc      *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
 char                   *osdep_get_name(int, char *);
-char                   *osdep_get_cwd(pid_t);
+char                   *osdep_get_cwd(int);
 struct event_base      *osdep_event_init(void);
 
 struct kinfo_proc *
@@ -135,12 +135,14 @@ error:
 }
 
 char*
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(int fd)
 {
-       int             name[] = { CTL_KERN, KERN_PROC_CWD, (int)pid };
+       int             name[] = { CTL_KERN, KERN_PROC_CWD, 0 };
        static char     path[MAXPATHLEN];
        size_t          pathlen = sizeof path;
 
+       if ((name[2] = tcgetpgrp(fd)) == -1)
+               return (NULL);
        if (sysctl(name, 3, path, &pathlen, NULL, 0) != 0)
                return (NULL);
        return (path);
diff --git a/trunk/osdep-sunos.c b/trunk/osdep-sunos.c
index bb67412..fd644f5 100644
--- a/trunk/osdep-sunos.c
+++ b/trunk/osdep-sunos.c
@@ -65,13 +65,17 @@ osdep_get_name(int fd, char *tty)
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(int fd)
 {
        static char      target[MAXPATHLEN + 1];
        char            *path;
        ssize_t          n;
+       pid_t            pgrp;
+
+       if ((pgrp = tcgetpgrp(fd)) == -1)
+               return (NULL);
 
-       xasprintf(&path, "/proc/%u/path/cwd", (u_int) pid);
+       xasprintf(&path, "/proc/%u/path/cwd", (u_int) pgrp);
        n = readlink(path, target, MAXPATHLEN);
        free(path);
        if (n > 0) {
diff --git a/trunk/osdep-unknown.c b/trunk/osdep-unknown.c
index c962a1f..41f435b 100644
--- a/trunk/osdep-unknown.c
+++ b/trunk/osdep-unknown.c
@@ -29,7 +29,7 @@ osdep_get_name(unused int fd, unused char *tty)
 }
 
 char *
-osdep_get_cwd(pid_t pid)
+osdep_get_cwd(int fd)
 {
        return (NULL);
 }
diff --git a/trunk/tmux.h b/trunk/tmux.h
index a3d64de..ce44011 100644
--- a/trunk/tmux.h
+++ b/trunk/tmux.h
@@ -2257,7 +2257,7 @@ u_int     utf8_split2(u_int, u_char *);
 
 /* osdep-*.c */
 char           *osdep_get_name(int, char *);
-char           *osdep_get_cwd(pid_t);
+char           *osdep_get_cwd(int);
 struct event_base *osdep_event_init(void);
 
 /* log.c */
-- 
1.7.10.4


------------------------------------------------------------------------------
How fast is your code?
3 out of 4 devs don\\\'t know how their code performs in production.
Find out how slow your code is with AppDynamics Lite.
http://ad.doubleclick.net/clk;262219672;13503038;z?
http://info.appdynamics.com/FreeJavaPerformanceDownload.html
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users

Reply via email to