14b17dab0SDag-Erling Smørgrav /*
2efcad6b7SDag-Erling Smørgrav * Copyright (c) 2002,2004 Damien Miller <djm@mindrot.org>
34b17dab0SDag-Erling Smørgrav *
4efcad6b7SDag-Erling Smørgrav * Permission to use, copy, modify, and distribute this software for any
5efcad6b7SDag-Erling Smørgrav * purpose with or without fee is hereby granted, provided that the above
6efcad6b7SDag-Erling Smørgrav * copyright notice and this permission notice appear in all copies.
74b17dab0SDag-Erling Smørgrav *
8efcad6b7SDag-Erling Smørgrav * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9efcad6b7SDag-Erling Smørgrav * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10efcad6b7SDag-Erling Smørgrav * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11efcad6b7SDag-Erling Smørgrav * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12efcad6b7SDag-Erling Smørgrav * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13efcad6b7SDag-Erling Smørgrav * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14efcad6b7SDag-Erling Smørgrav * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
154b17dab0SDag-Erling Smørgrav */
164b17dab0SDag-Erling Smørgrav
174b17dab0SDag-Erling Smørgrav #include "includes.h"
184b17dab0SDag-Erling Smørgrav
194b17dab0SDag-Erling Smørgrav #if !defined(HAVE_GETPEEREID)
204b17dab0SDag-Erling Smørgrav
21761efaa7SDag-Erling Smørgrav #include <sys/types.h>
22761efaa7SDag-Erling Smørgrav #include <sys/socket.h>
23761efaa7SDag-Erling Smørgrav
24761efaa7SDag-Erling Smørgrav #include <unistd.h>
25761efaa7SDag-Erling Smørgrav
264b17dab0SDag-Erling Smørgrav #if defined(SO_PEERCRED)
274b17dab0SDag-Erling Smørgrav int
getpeereid(int s,uid_t * euid,gid_t * gid)284b17dab0SDag-Erling Smørgrav getpeereid(int s, uid_t *euid, gid_t *gid)
294b17dab0SDag-Erling Smørgrav {
304b17dab0SDag-Erling Smørgrav struct ucred cred;
31d0c8c0bcSDag-Erling Smørgrav socklen_t len = sizeof(cred);
324b17dab0SDag-Erling Smørgrav
334b17dab0SDag-Erling Smørgrav if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cred, &len) < 0)
344b17dab0SDag-Erling Smørgrav return (-1);
354b17dab0SDag-Erling Smørgrav *euid = cred.uid;
364b17dab0SDag-Erling Smørgrav *gid = cred.gid;
374b17dab0SDag-Erling Smørgrav
384b17dab0SDag-Erling Smørgrav return (0);
394b17dab0SDag-Erling Smørgrav }
40d4af9e69SDag-Erling Smørgrav #elif defined(HAVE_GETPEERUCRED)
41d4af9e69SDag-Erling Smørgrav
42d4af9e69SDag-Erling Smørgrav #ifdef HAVE_UCRED_H
43d4af9e69SDag-Erling Smørgrav # include <ucred.h>
44d4af9e69SDag-Erling Smørgrav #endif
45d4af9e69SDag-Erling Smørgrav
46d4af9e69SDag-Erling Smørgrav int
getpeereid(int s,uid_t * euid,gid_t * gid)47d4af9e69SDag-Erling Smørgrav getpeereid(int s, uid_t *euid, gid_t *gid)
48d4af9e69SDag-Erling Smørgrav {
49d4af9e69SDag-Erling Smørgrav ucred_t *ucred = NULL;
50d4af9e69SDag-Erling Smørgrav
51d4af9e69SDag-Erling Smørgrav if (getpeerucred(s, &ucred) == -1)
52d4af9e69SDag-Erling Smørgrav return (-1);
53d4af9e69SDag-Erling Smørgrav if ((*euid = ucred_geteuid(ucred)) == -1)
54d4af9e69SDag-Erling Smørgrav return (-1);
55d4af9e69SDag-Erling Smørgrav if ((*gid = ucred_getrgid(ucred)) == -1)
56d4af9e69SDag-Erling Smørgrav return (-1);
57d4af9e69SDag-Erling Smørgrav
58d4af9e69SDag-Erling Smørgrav ucred_free(ucred);
59d4af9e69SDag-Erling Smørgrav
60d4af9e69SDag-Erling Smørgrav return (0);
61d4af9e69SDag-Erling Smørgrav }
624b17dab0SDag-Erling Smørgrav #else
634b17dab0SDag-Erling Smørgrav int
getpeereid(int s,uid_t * euid,gid_t * gid)644b17dab0SDag-Erling Smørgrav getpeereid(int s, uid_t *euid, gid_t *gid)
654b17dab0SDag-Erling Smørgrav {
664b17dab0SDag-Erling Smørgrav *euid = geteuid();
674b17dab0SDag-Erling Smørgrav *gid = getgid();
684b17dab0SDag-Erling Smørgrav
694b17dab0SDag-Erling Smørgrav return (0);
704b17dab0SDag-Erling Smørgrav }
714b17dab0SDag-Erling Smørgrav #endif /* defined(SO_PEERCRED) */
724b17dab0SDag-Erling Smørgrav
734b17dab0SDag-Erling Smørgrav #endif /* !defined(HAVE_GETPEEREID) */
74