xref: /minix3/minix/lib/libsys/getepinfo.c (revision bfa518c7ec394377db1e3fd9e5221a2b1a74e06b)
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