diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2015-07-15 08:46:35 +0100 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2015-07-15 08:46:35 +0100 |
commit | 8c96e2a6d941bf5438b587c3d4a5ee1c97f9aa14 (patch) | |
tree | 3c57032ec43d1daad3889b6d4f7011bdfbd01824 /osdep-aix.c | |
parent | 5ffb869e1a543b264b9d94a19077d16f9832aff5 (diff) | |
download | rtmux-8c96e2a6d941bf5438b587c3d4a5ee1c97f9aa14.tar.gz rtmux-8c96e2a6d941bf5438b587c3d4a5ee1c97f9aa14.tar.bz2 rtmux-8c96e2a6d941bf5438b587c3d4a5ee1c97f9aa14.zip |
Implement osdep_get_name and osdep_get_cwd for AIX, from J Raynor.
Diffstat (limited to 'osdep-aix.c')
-rw-r--r-- | osdep-aix.c | 64 |
1 files changed, 59 insertions, 5 deletions
diff --git a/osdep-aix.c b/osdep-aix.c index 24051ab8..0a3d12e4 100644 --- a/osdep-aix.c +++ b/osdep-aix.c @@ -16,21 +16,75 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include <sys/types.h> +#include <sys/param.h> +#include <sys/procfs.h> -#include <event.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> #include "tmux.h" char * -osdep_get_name(unused int fd, unused char *tty) +osdep_get_name(unused int fd, char *tty) { - return (NULL); + struct psinfo p; + char *path; + ssize_t bytes; + int f, ttyfd, retval; + pid_t pgrp; + + if ((ttyfd = open(tty, O_RDONLY|O_NOCTTY)) == -1) + return (NULL); + + retval = ioctl(ttyfd, TIOCGPGRP, &pgrp); + close(ttyfd); + if (retval == -1) + return (NULL); + + xasprintf(&path, "/proc/%u/psinfo", (u_int) pgrp); + f = open(path, O_RDONLY); + free(path); + if (f < 0) + return (NULL); + + bytes = read(f, &p, sizeof(p)); + close(f); + if (bytes != sizeof(p)) + return (NULL); + + return (xstrdup(p.pr_fname)); } char * -osdep_get_cwd(unused int fd) +osdep_get_cwd(int fd) { + static char target[MAXPATHLEN + 1]; + char *path; + const char *ttypath; + ssize_t n; + pid_t pgrp; + int len, retval, ttyfd; + + if ((ttypath = ptsname(fd)) == NULL) + return (NULL); + if ((ttyfd = open(ttypath, O_RDONLY|O_NOCTTY)) == -1) + return (NULL); + + retval = ioctl(ttyfd, TIOCGPGRP, &pgrp); + close(ttyfd); + if (retval == -1) + return (NULL); + + xasprintf(&path, "/proc/%u/cwd", (u_int) pgrp); + n = readlink(path, target, MAXPATHLEN); + free(path); + if (n > 0) { + target[n] = '\0'; + if ((len = strlen(target)) > 1 && target[len - 1] == '/') + target[len - 1] = '\0'; + return (target); + } return (NULL); } |