bsd-getpeereid.c revision 181111
1217309Snwhitehorn/*
2251843Sbapt * Copyright (c) 2002,2004 Damien Miller <djm@mindrot.org>
3217309Snwhitehorn *
4220749Snwhitehorn * Permission to use, copy, modify, and distribute this software for any
5217309Snwhitehorn * purpose with or without fee is hereby granted, provided that the above
6251843Sbapt * copyright notice and this permission notice appear in all copies.
7217309Snwhitehorn *
8217309Snwhitehorn * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9217309Snwhitehorn * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10217309Snwhitehorn * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11217309Snwhitehorn * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12217309Snwhitehorn * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13217309Snwhitehorn * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14217309Snwhitehorn * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15217309Snwhitehorn */
16217309Snwhitehorn
17217309Snwhitehorn#include "includes.h"
18217309Snwhitehorn
19217309Snwhitehorn#if !defined(HAVE_GETPEEREID)
20217309Snwhitehorn
21217309Snwhitehorn#include <sys/types.h>
22217309Snwhitehorn#include <sys/socket.h>
23217309Snwhitehorn
24217309Snwhitehorn#include <unistd.h>
25217309Snwhitehorn
26217309Snwhitehorn#if defined(SO_PEERCRED)
27217309Snwhitehornint
28217309Snwhitehorngetpeereid(int s, uid_t *euid, gid_t *gid)
29217309Snwhitehorn{
30217309Snwhitehorn	struct ucred cred;
31217309Snwhitehorn	socklen_t len = sizeof(cred);
32217309Snwhitehorn
33217309Snwhitehorn	if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cred, &len) < 0)
34217309Snwhitehorn		return (-1);
35217309Snwhitehorn	*euid = cred.uid;
36217309Snwhitehorn	*gid = cred.gid;
37217309Snwhitehorn
38217309Snwhitehorn	return (0);
39217309Snwhitehorn}
40217309Snwhitehorn#elif defined(HAVE_GETPEERUCRED)
41217309Snwhitehorn
42217309Snwhitehorn#ifdef HAVE_UCRED_H
43217309Snwhitehorn# include <ucred.h>
44217309Snwhitehorn#endif
45217309Snwhitehorn
46217309Snwhitehornint
47217309Snwhitehorngetpeereid(int s, uid_t *euid, gid_t *gid)
48217309Snwhitehorn{
49217309Snwhitehorn	ucred_t *ucred = NULL;
50217309Snwhitehorn
51217309Snwhitehorn	if (getpeerucred(s, &ucred) == -1)
52217309Snwhitehorn		return (-1);
53217309Snwhitehorn	if ((*euid = ucred_geteuid(ucred)) == -1)
54217309Snwhitehorn		return (-1);
55217309Snwhitehorn	if ((*gid = ucred_getrgid(ucred)) == -1)
56217309Snwhitehorn		return (-1);
57217309Snwhitehorn
58251843Sbapt	ucred_free(ucred);
59217309Snwhitehorn
60217309Snwhitehorn	return (0);
61217309Snwhitehorn}
62217309Snwhitehorn#else
63217309Snwhitehornint
64217309Snwhitehorngetpeereid(int s, uid_t *euid, gid_t *gid)
65217309Snwhitehorn{
66217309Snwhitehorn	*euid = geteuid();
67217309Snwhitehorn	*gid = getgid();
68217309Snwhitehorn
69217309Snwhitehorn	return (0);
70217309Snwhitehorn}
71217309Snwhitehorn#endif /* defined(SO_PEERCRED) */
72217309Snwhitehorn
73217309Snwhitehorn#endif /* !defined(HAVE_GETPEEREID) */
74217309Snwhitehorn