1 /* $OpenBSD$ */ 2 3 /* 4 * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com> 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 <stdio.h> 23 #include <stdlib.h> 24 #include <unistd.h> 25 26 #include "tmux.h" 27 28 char * 29 osdep_get_name(int fd, __unused char *tty) 30 { 31 FILE *f; 32 char *path, *buf; 33 size_t len; 34 int ch; 35 pid_t pgrp; 36 37 if ((pgrp = tcgetpgrp(fd)) == -1) 38 return (NULL); 39 40 xasprintf(&path, "/proc/%lld/cmdline", (long long) pgrp); 41 if ((f = fopen(path, "r")) == NULL) { 42 free(path); 43 return (NULL); 44 } 45 free(path); 46 47 len = 0; 48 buf = NULL; 49 while ((ch = fgetc(f)) != EOF) { 50 if (ch == '\0') 51 break; 52 buf = xrealloc(buf, len + 2); 53 buf[len++] = ch; 54 } 55 if (buf != NULL) 56 buf[len] = '\0'; 57 58 fclose(f); 59 return (buf); 60 } 61 62 char * 63 osdep_get_cwd(int fd) 64 { 65 static char target[MAXPATHLEN + 1]; 66 char *path; 67 pid_t pgrp; 68 ssize_t n; 69 70 if ((pgrp = tcgetpgrp(fd)) == -1) 71 return (NULL); 72 73 xasprintf(&path, "/proc/%lld/cwd", (long long) pgrp); 74 n = readlink(path, target, MAXPATHLEN); 75 free(path); 76 if (n > 0) { 77 target[n] = '\0'; 78 return (target); 79 } 80 return (NULL); 81 } 82 83 struct event_base * 84 osdep_event_init(void) 85 { 86 return (event_init()); 87 } 88