1 #include "syslib.h" 2 #include <string.h> 3 #include <unistd.h> 4 5 #include <sys/socket.h> 6 7 pid_t 8 getepinfo(endpoint_t proc_ep, uid_t *uid, gid_t *gid) 9 { 10 message m; 11 int r; 12 13 memset(&m, 0, sizeof(m)); 14 m.m_lsys_pm_getepinfo.endpt = proc_ep; 15 m.m_lsys_pm_getepinfo.groups = (vir_bytes)NULL; 16 m.m_lsys_pm_getepinfo.ngroups = 0; 17 18 if ((r = _taskcall(PM_PROC_NR, PM_GETEPINFO, &m)) < 0) 19 return r; 20 21 if (uid != NULL) 22 *uid = m.m_pm_lsys_getepinfo.euid; 23 if (gid != NULL) 24 *gid = m.m_pm_lsys_getepinfo.egid; 25 return (pid_t) r; 26 } 27 28 pid_t 29 getnpid(endpoint_t proc_ep) 30 { 31 return getepinfo(proc_ep, NULL, NULL); 32 } 33 34 uid_t 35 getnuid(endpoint_t proc_ep) 36 { 37 uid_t uid; 38 int r; 39 40 if ((r = getepinfo(proc_ep, &uid, NULL)) < 0) 41 return (uid_t) r; 42 43 return uid; 44 } 45 46 gid_t 47 getngid(endpoint_t proc_ep) 48 { 49 gid_t gid; 50 int r; 51 52 if ((r = getepinfo(proc_ep, NULL, &gid)) < 0) 53 return (gid_t) r; 54 55 return gid; 56 } 57 58 int 59 getsockcred(endpoint_t proc_ep, struct sockcred * sockcred, gid_t * groups, 60 int ngroups) 61 { 62 message m; 63 int r; 64 65 memset(&m, 0, sizeof(m)); 66 m.m_lsys_pm_getepinfo.endpt = proc_ep; 67 m.m_lsys_pm_getepinfo.groups = (vir_bytes)groups; 68 m.m_lsys_pm_getepinfo.ngroups = ngroups; 69 70 if ((r = _taskcall(PM_PROC_NR, PM_GETEPINFO, &m)) < 0) 71 return r; 72 73 sockcred->sc_uid = m.m_pm_lsys_getepinfo.uid; 74 sockcred->sc_euid = m.m_pm_lsys_getepinfo.euid; 75 sockcred->sc_gid = m.m_pm_lsys_getepinfo.gid; 76 sockcred->sc_egid = m.m_pm_lsys_getepinfo.egid; 77 sockcred->sc_ngroups = m.m_pm_lsys_getepinfo.ngroups; 78 79 return OK; 80 } 81