Annotation of embedaddon/tmux/osdep-darwin.c, revision 1.1.1.1

1.1       misho       1: /* $OpenBSD$ */
                      2: 
                      3: /*
                      4:  * Copyright (c) 2009 Joshua Elsasser <josh@elsasser.org>
                      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/types.h>
                     20: #include <sys/sysctl.h>
                     21: 
                     22: #include <Availability.h>
                     23: #include <event.h>
                     24: #include <libproc.h>
                     25: #include <stdlib.h>
                     26: #include <string.h>
                     27: #include <unistd.h>
                     28: 
                     29: char                   *osdep_get_name(int, char *);
                     30: char                   *osdep_get_cwd(int);
                     31: struct event_base      *osdep_event_init(void);
                     32: 
                     33: #define __unused __attribute__ ((__unused__))
                     34: 
                     35: char *
                     36: osdep_get_name(int fd, __unused char *tty)
                     37: {
                     38: #ifdef __MAC_10_7
                     39:        struct proc_bsdshortinfo        bsdinfo;
                     40:        pid_t                           pgrp;
                     41:        int                             ret;
                     42: 
                     43:        if ((pgrp = tcgetpgrp(fd)) == -1)
                     44:                return (NULL);
                     45: 
                     46:        ret = proc_pidinfo(pgrp, PROC_PIDT_SHORTBSDINFO, 0,
                     47:                        &bsdinfo, sizeof bsdinfo);
                     48:        if (ret == sizeof bsdinfo && *bsdinfo.pbsi_comm != '\0')
                     49:                return (strdup(bsdinfo.pbsi_comm));
                     50: #else
                     51:        int     mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0 };
                     52:        size_t  size;
                     53:        struct kinfo_proc kp;
                     54: 
                     55:        if ((mib[3] = tcgetpgrp(fd)) == -1)
                     56:                return (NULL);
                     57: 
                     58:        size = sizeof kp;
                     59:        if (sysctl(mib, 4, &kp, &size, NULL, 0) == -1)
                     60:                return (NULL);
                     61:        if (*kp.kp_proc.p_comm == '\0')
                     62:                return (NULL);
                     63: 
                     64:        return (strdup(kp.kp_proc.p_comm));
                     65: #endif
                     66: }
                     67: 
                     68: char *
                     69: osdep_get_cwd(int fd)
                     70: {
                     71:        static char                     wd[PATH_MAX];
                     72:        struct proc_vnodepathinfo       pathinfo;
                     73:        pid_t                           pgrp;
                     74:        int                             ret;
                     75: 
                     76:        if ((pgrp = tcgetpgrp(fd)) == -1)
                     77:                return (NULL);
                     78: 
                     79:        ret = proc_pidinfo(pgrp, PROC_PIDVNODEPATHINFO, 0,
                     80:            &pathinfo, sizeof pathinfo);
                     81:        if (ret == sizeof pathinfo) {
                     82:                strlcpy(wd, pathinfo.pvi_cdir.vip_path, sizeof wd);
                     83:                return (wd);
                     84:        }
                     85:        return (NULL);
                     86: }
                     87: 
                     88: struct event_base *
                     89: osdep_event_init(void)
                     90: {
                     91:        /*
                     92:         * On OS X, kqueue and poll are both completely broken and don't
                     93:         * work on anything except socket file descriptors (yes, really).
                     94:         */
                     95:        setenv("EVENT_NOKQUEUE", "1", 1);
                     96:        setenv("EVENT_NOPOLL", "1", 1);
                     97:        return (event_init());
                     98: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>