mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-24 21:34:08 +03:00
util: add getusername_malloc(), get_shell(), get_home_dir()
This commit is contained in:
parent
49f43d5f91
commit
7c5f152aca
@ -3078,26 +3078,22 @@ bool hostname_is_set(void) {
|
|||||||
return !isempty(u.nodename) && !streq(u.nodename, "(none)");
|
return !isempty(u.nodename) && !streq(u.nodename, "(none)");
|
||||||
}
|
}
|
||||||
|
|
||||||
char* getlogname_malloc(void) {
|
|
||||||
uid_t uid;
|
static char *lookup_uid(uid_t uid) {
|
||||||
long bufsize;
|
long bufsize;
|
||||||
char *buf, *name;
|
char *buf, *name;
|
||||||
struct passwd pwbuf, *pw = NULL;
|
struct passwd pwbuf, *pw = NULL;
|
||||||
struct stat st;
|
|
||||||
|
|
||||||
if (isatty(STDIN_FILENO) && fstat(STDIN_FILENO, &st) >= 0)
|
|
||||||
uid = st.st_uid;
|
|
||||||
else
|
|
||||||
uid = getuid();
|
|
||||||
|
|
||||||
/* Shortcut things to avoid NSS lookups */
|
/* Shortcut things to avoid NSS lookups */
|
||||||
if (uid == 0)
|
if (uid == 0)
|
||||||
return strdup("root");
|
return strdup("root");
|
||||||
|
|
||||||
if ((bufsize = sysconf(_SC_GETPW_R_SIZE_MAX)) <= 0)
|
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
|
||||||
|
if (bufsize <= 0)
|
||||||
bufsize = 4096;
|
bufsize = 4096;
|
||||||
|
|
||||||
if (!(buf = malloc(bufsize)))
|
buf = malloc(bufsize);
|
||||||
|
if (!buf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw) {
|
if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw) {
|
||||||
@ -3114,6 +3110,28 @@ char* getlogname_malloc(void) {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* getlogname_malloc(void) {
|
||||||
|
uid_t uid;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (isatty(STDIN_FILENO) && fstat(STDIN_FILENO, &st) >= 0)
|
||||||
|
uid = st.st_uid;
|
||||||
|
else
|
||||||
|
uid = getuid();
|
||||||
|
|
||||||
|
return lookup_uid(uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *getusername_malloc(void) {
|
||||||
|
const char *e;
|
||||||
|
|
||||||
|
e = getenv("USER");
|
||||||
|
if (e)
|
||||||
|
return strdup(e);
|
||||||
|
|
||||||
|
return lookup_uid(getuid());
|
||||||
|
}
|
||||||
|
|
||||||
int getttyname_malloc(int fd, char **r) {
|
int getttyname_malloc(int fd, char **r) {
|
||||||
char path[PATH_MAX], *c;
|
char path[PATH_MAX], *c;
|
||||||
int k;
|
int k;
|
||||||
@ -5875,3 +5893,97 @@ int make_console_stdio(void) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int get_home_dir(char **_h) {
|
||||||
|
char *h;
|
||||||
|
const char *e;
|
||||||
|
uid_t u;
|
||||||
|
struct passwd *p;
|
||||||
|
|
||||||
|
assert(_h);
|
||||||
|
|
||||||
|
/* Take the user specified one */
|
||||||
|
e = getenv("HOME");
|
||||||
|
if (e) {
|
||||||
|
h = strdup(e);
|
||||||
|
if (!h)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_h = h;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hardcode home directory for root to avoid NSS */
|
||||||
|
u = getuid();
|
||||||
|
if (u == 0) {
|
||||||
|
h = strdup("/root");
|
||||||
|
if (!h)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_h = h;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the database... */
|
||||||
|
errno = 0;
|
||||||
|
p = getpwuid(u);
|
||||||
|
if (!p)
|
||||||
|
return errno ? -errno : -ENOENT;
|
||||||
|
|
||||||
|
if (!path_is_absolute(p->pw_dir))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
h = strdup(p->pw_dir);
|
||||||
|
if (!h)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_h = h;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_shell(char **_sh) {
|
||||||
|
char *sh;
|
||||||
|
const char *e;
|
||||||
|
uid_t u;
|
||||||
|
struct passwd *p;
|
||||||
|
|
||||||
|
assert(_sh);
|
||||||
|
|
||||||
|
/* Take the user specified one */
|
||||||
|
e = getenv("SHELL");
|
||||||
|
if (e) {
|
||||||
|
sh = strdup(e);
|
||||||
|
if (!sh)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_sh = sh;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hardcode home directory for root to avoid NSS */
|
||||||
|
u = getuid();
|
||||||
|
if (u == 0) {
|
||||||
|
sh = strdup("/bin/sh");
|
||||||
|
if (!sh)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_sh = sh;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the database... */
|
||||||
|
errno = 0;
|
||||||
|
p = getpwuid(u);
|
||||||
|
if (!p)
|
||||||
|
return errno ? -errno : -ESRCH;
|
||||||
|
|
||||||
|
if (!path_is_absolute(p->pw_shell))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
sh = strdup(p->pw_shell);
|
||||||
|
if (!sh)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_sh = sh;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -345,9 +345,11 @@ void rename_process(const char name[8]);
|
|||||||
|
|
||||||
void sigset_add_many(sigset_t *ss, ...);
|
void sigset_add_many(sigset_t *ss, ...);
|
||||||
|
|
||||||
char* gethostname_malloc(void);
|
|
||||||
bool hostname_is_set(void);
|
bool hostname_is_set(void);
|
||||||
|
|
||||||
|
char* gethostname_malloc(void);
|
||||||
char* getlogname_malloc(void);
|
char* getlogname_malloc(void);
|
||||||
|
char* getusername_malloc(void);
|
||||||
|
|
||||||
int getttyname_malloc(int fd, char **r);
|
int getttyname_malloc(int fd, char **r);
|
||||||
int getttyname_harder(int fd, char **r);
|
int getttyname_harder(int fd, char **r);
|
||||||
@ -527,4 +529,7 @@ bool in_initrd(void);
|
|||||||
|
|
||||||
void warn_melody(void);
|
void warn_melody(void);
|
||||||
|
|
||||||
|
int get_shell(char **ret);
|
||||||
|
int get_home_dir(char **ret);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user