76 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "syslib.h"
 | |
| #include <string.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| #include <sys/ucred.h>
 | |
| 
 | |
| static pid_t
 | |
| getepinfo(endpoint_t proc_ep, uid_t *uid, gid_t *gid)
 | |
| {
 | |
| 	message m;
 | |
| 	int r;
 | |
| 
 | |
| 	memset(&m, 0, sizeof(m));
 | |
| 	m.m_lsys_pm_getepinfo.endpt = proc_ep;
 | |
| 
 | |
| 	if ((r = _taskcall(PM_PROC_NR, PM_GETEPINFO, &m)) < 0)
 | |
| 		return r;
 | |
| 
 | |
| 	if (uid != NULL)
 | |
| 		*uid = m.m_pm_lsys_getepinfo.uid;
 | |
| 	if (gid != NULL)
 | |
| 		*gid = m.m_pm_lsys_getepinfo.gid;
 | |
| 	return (pid_t) r;
 | |
| }
 | |
| 
 | |
| pid_t
 | |
| getnpid(endpoint_t proc_ep)
 | |
| {
 | |
| 	return getepinfo(proc_ep, NULL, NULL);
 | |
| }
 | |
| 
 | |
| uid_t
 | |
| getnuid(endpoint_t proc_ep)
 | |
| {
 | |
| 	uid_t uid;
 | |
| 	int r;
 | |
| 
 | |
| 	if ((r = getepinfo(proc_ep, &uid, NULL)) < 0)
 | |
| 		return (uid_t) r;
 | |
| 
 | |
| 	return uid;
 | |
| }
 | |
| 
 | |
| gid_t
 | |
| getngid(endpoint_t proc_ep)
 | |
| {
 | |
| 	gid_t gid;
 | |
| 	int r;
 | |
| 
 | |
| 	if ((r = getepinfo(proc_ep, NULL, &gid)) < 0)
 | |
| 		return (gid_t) r;
 | |
| 
 | |
| 	return gid;
 | |
| }
 | |
| 
 | |
| int
 | |
| getnucred(endpoint_t proc_ep, struct uucred *ucred)
 | |
| {
 | |
| 	uid_t uid;
 | |
| 	gid_t gid;
 | |
| 	int r;
 | |
| 
 | |
| 	if (ucred == NULL)
 | |
| 		return EFAULT;
 | |
| 
 | |
| 	if ((r = getepinfo(proc_ep, &uid, &gid)) < 0)
 | |
| 		return r;
 | |
| 
 | |
| 	/* Only two fields are used for now; ensure the rest is zeroed out. */
 | |
| 	memset(ucred, 0, sizeof(struct uucred));
 | |
| 	ucred->cr_uid = uid;
 | |
| 	ucred->cr_gid = gid;
 | |
| 
 | |
| 	return r;
 | |
| }
 | 
