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 * 31 276 : get_user_name(char **errstr) 32 : { 33 : #ifndef WIN32 34 : struct passwd *pw; 35 276 : uid_t user_id = geteuid(); 36 : 37 276 : *errstr = NULL; 38 : 39 276 : errno = 0; /* clear errno before call */ 40 276 : pw = getpwuid(user_id); 41 276 : if (!pw) 42 : { 43 0 : *errstr = psprintf(_("could not look up effective user ID %ld: %s"), 44 : (long) user_id, 45 0 : errno ? strerror(errno) : _("user does not exist")); 46 0 : return NULL; 47 : } 48 : 49 276 : 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 250 : get_user_name_or_exit(const char *progname) 75 : { 76 : const char *user_name; 77 : char *errstr; 78 : 79 250 : user_name = get_user_name(&errstr); 80 : 81 250 : if (!user_name) 82 : { 83 0 : fprintf(stderr, "%s: %s\n", progname, errstr); 84 0 : exit(1); 85 : } 86 250 : return user_name; 87 : }