Age Owner Branch data TLA Line data Source code
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 *
3770 bruce@momjian.us 31 :CBC 126 : get_user_name(char **errstr)
32 : : {
33 : : #ifndef WIN32
34 : : struct passwd *pw;
3728 tgl@sss.pgh.pa.us 35 : 126 : uid_t user_id = geteuid();
36 : :
3770 bruce@momjian.us 37 : 126 : *errstr = NULL;
38 : :
3728 tgl@sss.pgh.pa.us 39 : 126 : errno = 0; /* clear errno before call */
3770 bruce@momjian.us 40 : 126 : pw = getpwuid(user_id);
41 [ - + ]: 126 : if (!pw)
42 : : {
3536 peter_e@gmx.net 43 :UBC 0 : *errstr = psprintf(_("could not look up effective user ID %ld: %s"),
44 : : (long) user_id,
2489 tgl@sss.pgh.pa.us 45 [ # # ]: 0 : errno ? strerror(errno) : _("user does not exist"));
3770 bruce@momjian.us 46 : 0 : return NULL;
47 : : }
48 : :
3770 bruce@momjian.us 49 :CBC 126 : 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 *
74 : 113 : get_user_name_or_exit(const char *progname)
75 : : {
76 : : const char *user_name;
77 : : char *errstr;
78 : :
79 : 113 : user_name = get_user_name(&errstr);
80 : :
81 [ - + ]: 113 : if (!user_name)
82 : : {
3770 bruce@momjian.us 83 :UBC 0 : fprintf(stderr, "%s: %s\n", progname, errstr);
84 : 0 : exit(1);
85 : : }
3770 bruce@momjian.us 86 :CBC 113 : return user_name;
87 : : }
|