Damien Miller | 771721f | 2002-09-12 10:32:59 +1000 | [diff] [blame] | 1 | /* |
Damien Miller | 98225c2 | 2004-02-17 16:49:41 +1100 | [diff] [blame] | 2 | * Copyright (c) 2002,2004 Damien Miller <djm@mindrot.org> |
Damien Miller | 771721f | 2002-09-12 10:32:59 +1000 | [diff] [blame] | 3 | * |
Damien Miller | 98225c2 | 2004-02-17 16:49:41 +1100 | [diff] [blame] | 4 | * Permission to use, copy, modify, and distribute this software for any |
| 5 | * purpose with or without fee is hereby granted, provided that the above |
| 6 | * copyright notice and this permission notice appear in all copies. |
Damien Miller | 771721f | 2002-09-12 10:32:59 +1000 | [diff] [blame] | 7 | * |
Damien Miller | 98225c2 | 2004-02-17 16:49:41 +1100 | [diff] [blame] | 8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| 9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| 10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| 11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| 12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| 13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
Damien Miller | 771721f | 2002-09-12 10:32:59 +1000 | [diff] [blame] | 15 | */ |
| 16 | |
| 17 | #include "includes.h" |
| 18 | |
Damien Miller | 771721f | 2002-09-12 10:32:59 +1000 | [diff] [blame] | 19 | #if !defined(HAVE_GETPEEREID) |
| 20 | |
Damien Miller | 0e5143e | 2006-08-07 11:26:36 +1000 | [diff] [blame] | 21 | #include <sys/types.h> |
| 22 | #include <sys/socket.h> |
| 23 | |
| 24 | #include <unistd.h> |
| 25 | |
Damien Miller | 771721f | 2002-09-12 10:32:59 +1000 | [diff] [blame] | 26 | #if defined(SO_PEERCRED) |
| 27 | int |
| 28 | getpeereid(int s, uid_t *euid, gid_t *gid) |
| 29 | { |
| 30 | struct ucred cred; |
Damien Miller | 68d893d | 2003-03-25 09:07:52 +1100 | [diff] [blame] | 31 | socklen_t len = sizeof(cred); |
Damien Miller | 771721f | 2002-09-12 10:32:59 +1000 | [diff] [blame] | 32 | |
| 33 | if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cred, &len) < 0) |
| 34 | return (-1); |
| 35 | *euid = cred.uid; |
| 36 | *gid = cred.gid; |
| 37 | |
| 38 | return (0); |
| 39 | } |
Darren Tucker | 164aa30 | 2007-03-21 21:39:57 +1100 | [diff] [blame] | 40 | #elif defined(HAVE_GETPEERUCRED) |
| 41 | |
| 42 | #ifdef HAVE_UCRED_H |
| 43 | # include <ucred.h> |
| 44 | #endif |
| 45 | |
| 46 | int |
| 47 | getpeereid(int s, uid_t *euid, gid_t *gid) |
| 48 | { |
| 49 | ucred_t *ucred = NULL; |
| 50 | |
| 51 | if (getpeerucred(s, &ucred) == -1) |
| 52 | return (-1); |
| 53 | if ((*euid = ucred_geteuid(ucred)) == -1) |
| 54 | return (-1); |
| 55 | if ((*gid = ucred_getrgid(ucred)) == -1) |
| 56 | return (-1); |
| 57 | |
| 58 | ucred_free(ucred); |
| 59 | |
| 60 | return (0); |
| 61 | } |
Damien Miller | 771721f | 2002-09-12 10:32:59 +1000 | [diff] [blame] | 62 | #else |
| 63 | int |
| 64 | getpeereid(int s, uid_t *euid, gid_t *gid) |
| 65 | { |
| 66 | *euid = geteuid(); |
| 67 | *gid = getgid(); |
| 68 | |
| 69 | return (0); |
| 70 | } |
| 71 | #endif /* defined(SO_PEERCRED) */ |
| 72 | |
| 73 | #endif /* !defined(HAVE_GETPEEREID) */ |