PostgreSQL Source Code  git master
username.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * username.c
4  * get user name
5  *
6  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * IDENTIFICATION
10  * src/common/username.c
11  *
12  *-------------------------------------------------------------------------
13  */
14 
15 #ifndef FRONTEND
16 #include "postgres.h"
17 #else
18 #include "postgres_fe.h"
19 #endif
20 
21 #include <pwd.h>
22 #include <unistd.h>
23 
24 #include "common/username.h"
25 
26 /*
27  * Returns the current user name in a static buffer
28  * On error, returns NULL and sets *errstr to point to a palloc'd message
29  */
30 const char *
31 get_user_name(char **errstr)
32 {
33 #ifndef WIN32
34  struct passwd *pw;
35  uid_t user_id = geteuid();
36 
37  *errstr = NULL;
38 
39  errno = 0; /* clear errno before call */
40  pw = getpwuid(user_id);
41  if (!pw)
42  {
43  *errstr = psprintf(_("could not look up effective user ID %ld: %s"),
44  (long) user_id,
45  errno ? strerror(errno) : _("user does not exist"));
46  return NULL;
47  }
48 
49  return pw->pw_name;
50 #else
51  /* Microsoft recommends buffer size of UNLEN+1, where UNLEN = 256 */
52  /* "static" variable remains after function exit */
53  static char username[256 + 1];
54  DWORD len = sizeof(username);
55 
56  *errstr = NULL;
57 
58  if (!GetUserName(username, &len))
59  {
60  *errstr = psprintf(_("user name lookup failure: error code %lu"),
61  GetLastError());
62  return NULL;
63  }
64 
65  return username;
66 #endif
67 }
68 
69 
70 /*
71  * Returns the current user name in a static buffer or exits
72  */
73 const char *
75 {
76  const char *user_name;
77  char *errstr;
78 
79  user_name = get_user_name(&errstr);
80 
81  if (!user_name)
82  {
83  fprintf(stderr, "%s: %s\n", progname, errstr);
84  exit(1);
85  }
86  return user_name;
87 }
#define _(x)
Definition: elog.c:90
exit(1)
const char * progname
Definition: main.c:44
const void size_t len
const char * username
Definition: pgbench.c:296
#define strerror
Definition: port.h:251
#define fprintf
Definition: port.h:242
char * psprintf(const char *fmt,...)
Definition: psprintf.c:46
const char * get_user_name_or_exit(const char *progname)
Definition: username.c:74
const char * get_user_name(char **errstr)
Definition: username.c:31
int uid_t
Definition: win32_port.h:244