PostgreSQL Source Code: src/port/getpeereid.c Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15#include "c.h"

16

21#ifdef HAVE_UCRED_H

22#include <ucred.h>

23#endif

24#ifdef HAVE_SYS_UCRED_H

25#include <sys/ucred.h>

26#endif

27

28

29

30

31

32int

34{

35#if defined(SO_PEERCRED)

36

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

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

60 ucred_t *ucred;

61

62 ucred = 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

75 errno = ENOSYS;

76 return -1;

77#endif

78}

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