1 /* $OpenBSD$ */ 2 3 /* 4 * Copyright (c) 2009 Todd Carson <toc@daybefore.net> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER 15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #include <sys/param.h> 20 #include <sys/stat.h> 21 22 #include <event.h> 23 #include <fcntl.h> 24 #include <procfs.h> 25 #include <stdio.h> 26 #include <stdlib.h> 27 #include <unistd.h> 28 29 #include "tmux.h" 30 31 char * 32 osdep_get_name(__unused int fd, char *tty) 33 { 34 struct psinfo p; 35 struct stat st; 36 char *path; 37 ssize_t bytes; 38 int f; 39 pid_t pgrp; 40 41 if ((f = open(tty, O_RDONLY)) < 0) 42 return (NULL); 43 44 if (fstat(f, &st) != 0 || ioctl(f, TIOCGPGRP, &pgrp) != 0) { 45 close(f); 46 return (NULL); 47 } 48 close(f); 49 50 xasprintf(&path, "/proc/%u/psinfo", (u_int) pgrp); 51 f = open(path, O_RDONLY); 52 free(path); 53 if (f < 0) 54 return (NULL); 55 56 bytes = read(f, &p, sizeof(p)); 57 close(f); 58 if (bytes != sizeof(p)) 59 return (NULL); 60 61 if (p.pr_ttydev != st.st_rdev) 62 return (NULL); 63 64 return (xstrdup(p.pr_fname)); 65 } 66 67 char * 68 osdep_get_cwd(int fd) 69 { 70 static char target[MAXPATHLEN + 1]; 71 char *path; 72 const char *ttypath; 73 ssize_t n; 74 pid_t pgrp; 75 int retval, ttyfd; 76 77 if ((ttypath = ptsname(fd)) == NULL) 78 return (NULL); 79 if ((ttyfd = open(ttypath, O_RDONLY|O_NOCTTY)) == -1) 80 return (NULL); 81 82 retval = ioctl(ttyfd, TIOCGPGRP, &pgrp); 83 close(ttyfd); 84 if (retval == -1) 85 return (NULL); 86 87 xasprintf(&path, "/proc/%u/path/cwd", (u_int) pgrp); 88 n = readlink(path, target, MAXPATHLEN); 89 free(path); 90 if (n > 0) { 91 target[n] = '\0'; 92 return (target); 93 } 94 return (NULL); 95 } 96 97 struct event_base * 98 osdep_event_init(void) 99 { 100 return (event_init()); 101 } 102