Annotation of embedaddon/tmux/osdep-sunos.c, revision 1.1
1.1 ! misho 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: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>