1 /*-------------------------------------------------------------------------
2 *
3 * username.c
4 * get user name
5 *
6 * Portions Copyright (c) 1996-2020, 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 *
get_user_name(char ** errstr)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 *
get_user_name_or_exit(const char * progname)74 get_user_name_or_exit(const char *progname)
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 }
88