1 /*-------------------------------------------------------------------------
4 * get peer userid for UNIX-domain socket connection
6 * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
10 * src/port/getpeereid.c
12 *-------------------------------------------------------------------------
17 #include <sys/param.h>
18 #include <sys/socket.h>
24 #ifdef HAVE_SYS_UCRED_H
25 #include <sys/ucred.h>
30 * BSD-style getpeereid() for platforms that lack it.
33 getpeereid(int sock
, uid_t
*uid
, gid_t
*gid
)
35 #if defined(SO_PEERCRED)
36 /* Linux: use getsockopt(SO_PEERCRED) */
37 struct ucred peercred
;
38 socklen_t so_len
= sizeof(peercred
);
40 if (getsockopt(sock
, SOL_SOCKET
, SO_PEERCRED
, &peercred
, &so_len
) != 0 ||
41 so_len
!= sizeof(peercred
))
46 #elif defined(LOCAL_PEERCRED)
47 /* Debian with FreeBSD kernel: use getsockopt(LOCAL_PEERCRED) */
48 struct xucred peercred
;
49 socklen_t so_len
= sizeof(peercred
);
51 if (getsockopt(sock
, 0, LOCAL_PEERCRED
, &peercred
, &so_len
) != 0 ||
52 so_len
!= sizeof(peercred
) ||
53 peercred
.cr_version
!= XUCRED_VERSION
)
55 *uid
= peercred
.cr_uid
;
56 *gid
= peercred
.cr_gid
;
58 #elif defined(HAVE_GETPEERUCRED)
59 /* Solaris: use getpeerucred() */
62 ucred
= NULL
; /* must be initialized to NULL */
63 if (getpeerucred(sock
, &ucred
) == -1)
66 *uid
= ucred_geteuid(ucred
);
67 *gid
= ucred_getegid(ucred
);
70 if (*uid
== (uid_t
) (-1) || *gid
== (gid_t
) (-1))
74 /* No implementation available on this platform */