1433d6423SLionel Sambuc #include "syslib.h"
2433d6423SLionel Sambuc #include <string.h>
3433d6423SLionel Sambuc #include <unistd.h>
4433d6423SLionel Sambuc
5*bfa518c7SDavid van Moolenbroek #include <sys/socket.h>
6433d6423SLionel Sambuc
746271349SDavid van Moolenbroek pid_t
getepinfo(endpoint_t proc_ep,uid_t * uid,gid_t * gid)8433d6423SLionel Sambuc getepinfo(endpoint_t proc_ep, uid_t *uid, gid_t *gid)
9433d6423SLionel Sambuc {
10433d6423SLionel Sambuc message m;
11433d6423SLionel Sambuc int r;
12433d6423SLionel Sambuc
13433d6423SLionel Sambuc memset(&m, 0, sizeof(m));
14433d6423SLionel Sambuc m.m_lsys_pm_getepinfo.endpt = proc_ep;
15*bfa518c7SDavid van Moolenbroek m.m_lsys_pm_getepinfo.groups = (vir_bytes)NULL;
16*bfa518c7SDavid van Moolenbroek m.m_lsys_pm_getepinfo.ngroups = 0;
17433d6423SLionel Sambuc
18433d6423SLionel Sambuc if ((r = _taskcall(PM_PROC_NR, PM_GETEPINFO, &m)) < 0)
19433d6423SLionel Sambuc return r;
20433d6423SLionel Sambuc
21433d6423SLionel Sambuc if (uid != NULL)
22*bfa518c7SDavid van Moolenbroek *uid = m.m_pm_lsys_getepinfo.euid;
23433d6423SLionel Sambuc if (gid != NULL)
24*bfa518c7SDavid van Moolenbroek *gid = m.m_pm_lsys_getepinfo.egid;
25433d6423SLionel Sambuc return (pid_t) r;
26433d6423SLionel Sambuc }
27433d6423SLionel Sambuc
28433d6423SLionel Sambuc pid_t
getnpid(endpoint_t proc_ep)29433d6423SLionel Sambuc getnpid(endpoint_t proc_ep)
30433d6423SLionel Sambuc {
31433d6423SLionel Sambuc return getepinfo(proc_ep, NULL, NULL);
32433d6423SLionel Sambuc }
33433d6423SLionel Sambuc
34433d6423SLionel Sambuc uid_t
getnuid(endpoint_t proc_ep)35433d6423SLionel Sambuc getnuid(endpoint_t proc_ep)
36433d6423SLionel Sambuc {
37433d6423SLionel Sambuc uid_t uid;
38433d6423SLionel Sambuc int r;
39433d6423SLionel Sambuc
40433d6423SLionel Sambuc if ((r = getepinfo(proc_ep, &uid, NULL)) < 0)
41433d6423SLionel Sambuc return (uid_t) r;
42433d6423SLionel Sambuc
43433d6423SLionel Sambuc return uid;
44433d6423SLionel Sambuc }
45433d6423SLionel Sambuc
46433d6423SLionel Sambuc gid_t
getngid(endpoint_t proc_ep)47433d6423SLionel Sambuc getngid(endpoint_t proc_ep)
48433d6423SLionel Sambuc {
49433d6423SLionel Sambuc gid_t gid;
50433d6423SLionel Sambuc int r;
51433d6423SLionel Sambuc
52433d6423SLionel Sambuc if ((r = getepinfo(proc_ep, NULL, &gid)) < 0)
53433d6423SLionel Sambuc return (gid_t) r;
54433d6423SLionel Sambuc
55433d6423SLionel Sambuc return gid;
56433d6423SLionel Sambuc }
57*bfa518c7SDavid van Moolenbroek
58*bfa518c7SDavid van Moolenbroek int
getsockcred(endpoint_t proc_ep,struct sockcred * sockcred,gid_t * groups,int ngroups)59*bfa518c7SDavid van Moolenbroek getsockcred(endpoint_t proc_ep, struct sockcred * sockcred, gid_t * groups,
60*bfa518c7SDavid van Moolenbroek int ngroups)
61*bfa518c7SDavid van Moolenbroek {
62*bfa518c7SDavid van Moolenbroek message m;
63*bfa518c7SDavid van Moolenbroek int r;
64*bfa518c7SDavid van Moolenbroek
65*bfa518c7SDavid van Moolenbroek memset(&m, 0, sizeof(m));
66*bfa518c7SDavid van Moolenbroek m.m_lsys_pm_getepinfo.endpt = proc_ep;
67*bfa518c7SDavid van Moolenbroek m.m_lsys_pm_getepinfo.groups = (vir_bytes)groups;
68*bfa518c7SDavid van Moolenbroek m.m_lsys_pm_getepinfo.ngroups = ngroups;
69*bfa518c7SDavid van Moolenbroek
70*bfa518c7SDavid van Moolenbroek if ((r = _taskcall(PM_PROC_NR, PM_GETEPINFO, &m)) < 0)
71*bfa518c7SDavid van Moolenbroek return r;
72*bfa518c7SDavid van Moolenbroek
73*bfa518c7SDavid van Moolenbroek sockcred->sc_uid = m.m_pm_lsys_getepinfo.uid;
74*bfa518c7SDavid van Moolenbroek sockcred->sc_euid = m.m_pm_lsys_getepinfo.euid;
75*bfa518c7SDavid van Moolenbroek sockcred->sc_gid = m.m_pm_lsys_getepinfo.gid;
76*bfa518c7SDavid van Moolenbroek sockcred->sc_egid = m.m_pm_lsys_getepinfo.egid;
77*bfa518c7SDavid van Moolenbroek sockcred->sc_ngroups = m.m_pm_lsys_getepinfo.ngroups;
78*bfa518c7SDavid van Moolenbroek
79*bfa518c7SDavid van Moolenbroek return OK;
80*bfa518c7SDavid van Moolenbroek }
81