PostgreSQL Source Code  git master
getpeereid.c File Reference
#include "c.h"
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
Include dependency graph for getpeereid.c:

Go to the source code of this file.

Functions

int getpeereid (int sock, uid_t *uid, gid_t *gid)
 

Function Documentation

◆ getpeereid()

int getpeereid ( int  sock,
uid_t uid,
gid_t gid 
)

Definition at line 33 of file getpeereid.c.

34 {
35 #if defined(SO_PEERCRED)
36  /* Linux: use getsockopt(SO_PEERCRED) */
37  struct ucred peercred;
38  socklen_t so_len = sizeof(peercred);
39 
40  if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &peercred, &so_len) != 0 ||
41  so_len != sizeof(peercred))
42  return -1;
43  *uid = peercred.uid;
44  *gid = peercred.gid;
45  return 0;
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);
50 
51  if (getsockopt(sock, 0, LOCAL_PEERCRED, &peercred, &so_len) != 0 ||
52  so_len != sizeof(peercred) ||
53  peercred.cr_version != XUCRED_VERSION)
54  return -1;
55  *uid = peercred.cr_uid;
56  *gid = peercred.cr_gid;
57  return 0;
58 #elif defined(HAVE_GETPEERUCRED)
59  /* Solaris: use getpeerucred() */
60  ucred_t *ucred;
61 
62  ucred = NULL; /* must be initialized to NULL */
63  if (getpeerucred(sock, &ucred) == -1)
64  return -1;
65 
66  *uid = ucred_geteuid(ucred);
67  *gid = ucred_getegid(ucred);
68  ucred_free(ucred);
69 
70  if (*uid == (uid_t) (-1) || *gid == (gid_t) (-1))
71  return -1;
72  return 0;
73 #else
74  /* No implementation available on this platform */
75  errno = ENOSYS;
76  return -1;
77 #endif
78 }
unsigned int socklen_t
Definition: port.h:40
int gid_t
Definition: win32_port.h:247
int uid_t
Definition: win32_port.h:246

Referenced by auth_peer(), and PQconnectPoll().