util-lib: split out user/group/uid/gid calls into user-util.[ch]
This commit is contained in:
parent
c004493cde
commit
b1d4f8e154
|
@ -787,6 +787,8 @@ libbasic_la_SOURCES = \
|
||||||
src/basic/string-util.h \
|
src/basic/string-util.h \
|
||||||
src/basic/fd-util.c \
|
src/basic/fd-util.c \
|
||||||
src/basic/fd-util.h \
|
src/basic/fd-util.h \
|
||||||
|
src/basic/user-util.c \
|
||||||
|
src/basic/user-util.h \
|
||||||
src/basic/extract-word.c \
|
src/basic/extract-word.c \
|
||||||
src/basic/extract-word.h \
|
src/basic/extract-word.h \
|
||||||
src/basic/escape.c \
|
src/basic/escape.c \
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
int audit_session_from_pid(pid_t pid, uint32_t *id) {
|
int audit_session_from_pid(pid_t pid, uint32_t *id) {
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include "special.h"
|
#include "special.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
int cg_enumerate_processes(const char *controller, const char *path, FILE **_f) {
|
int cg_enumerate_processes(const char *controller, const char *path, FILE **_f) {
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
int get_process_state(pid_t pid) {
|
int get_process_state(pid_t pid) {
|
||||||
|
|
|
@ -0,0 +1,403 @@
|
||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2010 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <grp.h>
|
||||||
|
|
||||||
|
#include "user-util.h"
|
||||||
|
#include "macro.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "string-util.h"
|
||||||
|
#include "path-util.h"
|
||||||
|
|
||||||
|
bool uid_is_valid(uid_t uid) {
|
||||||
|
|
||||||
|
/* Some libc APIs use UID_INVALID as special placeholder */
|
||||||
|
if (uid == (uid_t) 0xFFFFFFFF)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* A long time ago UIDs where 16bit, hence explicitly avoid the 16bit -1 too */
|
||||||
|
if (uid == (uid_t) 0xFFFF)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_uid(const char *s, uid_t* ret_uid) {
|
||||||
|
unsigned long ul = 0;
|
||||||
|
uid_t uid;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
assert(s);
|
||||||
|
|
||||||
|
r = safe_atolu(s, &ul);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
uid = (uid_t) ul;
|
||||||
|
|
||||||
|
if ((unsigned long) uid != ul)
|
||||||
|
return -ERANGE;
|
||||||
|
|
||||||
|
if (!uid_is_valid(uid))
|
||||||
|
return -ENXIO; /* we return ENXIO instead of EINVAL
|
||||||
|
* here, to make it easy to distuingish
|
||||||
|
* invalid numeric uids invalid
|
||||||
|
* strings. */
|
||||||
|
|
||||||
|
if (ret_uid)
|
||||||
|
*ret_uid = uid;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *lookup_uid(uid_t uid) {
|
||||||
|
long bufsize;
|
||||||
|
char *name;
|
||||||
|
_cleanup_free_ char *buf = NULL;
|
||||||
|
struct passwd pwbuf, *pw = NULL;
|
||||||
|
|
||||||
|
/* Shortcut things to avoid NSS lookups */
|
||||||
|
if (uid == 0)
|
||||||
|
return strdup("root");
|
||||||
|
|
||||||
|
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
|
||||||
|
if (bufsize <= 0)
|
||||||
|
bufsize = 4096;
|
||||||
|
|
||||||
|
buf = malloc(bufsize);
|
||||||
|
if (!buf)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw)
|
||||||
|
return strdup(pw->pw_name);
|
||||||
|
|
||||||
|
if (asprintf(&name, UID_FMT, uid) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
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 get_user_creds(
|
||||||
|
const char **username,
|
||||||
|
uid_t *uid, gid_t *gid,
|
||||||
|
const char **home,
|
||||||
|
const char **shell) {
|
||||||
|
|
||||||
|
struct passwd *p;
|
||||||
|
uid_t u;
|
||||||
|
|
||||||
|
assert(username);
|
||||||
|
assert(*username);
|
||||||
|
|
||||||
|
/* We enforce some special rules for uid=0: in order to avoid
|
||||||
|
* NSS lookups for root we hardcode its data. */
|
||||||
|
|
||||||
|
if (streq(*username, "root") || streq(*username, "0")) {
|
||||||
|
*username = "root";
|
||||||
|
|
||||||
|
if (uid)
|
||||||
|
*uid = 0;
|
||||||
|
|
||||||
|
if (gid)
|
||||||
|
*gid = 0;
|
||||||
|
|
||||||
|
if (home)
|
||||||
|
*home = "/root";
|
||||||
|
|
||||||
|
if (shell)
|
||||||
|
*shell = "/bin/sh";
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parse_uid(*username, &u) >= 0) {
|
||||||
|
errno = 0;
|
||||||
|
p = getpwuid(u);
|
||||||
|
|
||||||
|
/* If there are multiple users with the same id, make
|
||||||
|
* sure to leave $USER to the configured value instead
|
||||||
|
* of the first occurrence in the database. However if
|
||||||
|
* the uid was configured by a numeric uid, then let's
|
||||||
|
* pick the real username from /etc/passwd. */
|
||||||
|
if (p)
|
||||||
|
*username = p->pw_name;
|
||||||
|
} else {
|
||||||
|
errno = 0;
|
||||||
|
p = getpwnam(*username);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!p)
|
||||||
|
return errno > 0 ? -errno : -ESRCH;
|
||||||
|
|
||||||
|
if (uid)
|
||||||
|
*uid = p->pw_uid;
|
||||||
|
|
||||||
|
if (gid)
|
||||||
|
*gid = p->pw_gid;
|
||||||
|
|
||||||
|
if (home)
|
||||||
|
*home = p->pw_dir;
|
||||||
|
|
||||||
|
if (shell)
|
||||||
|
*shell = p->pw_shell;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_group_creds(const char **groupname, gid_t *gid) {
|
||||||
|
struct group *g;
|
||||||
|
gid_t id;
|
||||||
|
|
||||||
|
assert(groupname);
|
||||||
|
|
||||||
|
/* We enforce some special rules for gid=0: in order to avoid
|
||||||
|
* NSS lookups for root we hardcode its data. */
|
||||||
|
|
||||||
|
if (streq(*groupname, "root") || streq(*groupname, "0")) {
|
||||||
|
*groupname = "root";
|
||||||
|
|
||||||
|
if (gid)
|
||||||
|
*gid = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parse_gid(*groupname, &id) >= 0) {
|
||||||
|
errno = 0;
|
||||||
|
g = getgrgid(id);
|
||||||
|
|
||||||
|
if (g)
|
||||||
|
*groupname = g->gr_name;
|
||||||
|
} else {
|
||||||
|
errno = 0;
|
||||||
|
g = getgrnam(*groupname);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g)
|
||||||
|
return errno > 0 ? -errno : -ESRCH;
|
||||||
|
|
||||||
|
if (gid)
|
||||||
|
*gid = g->gr_gid;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* uid_to_name(uid_t uid) {
|
||||||
|
struct passwd *p;
|
||||||
|
char *r;
|
||||||
|
|
||||||
|
if (uid == 0)
|
||||||
|
return strdup("root");
|
||||||
|
|
||||||
|
p = getpwuid(uid);
|
||||||
|
if (p)
|
||||||
|
return strdup(p->pw_name);
|
||||||
|
|
||||||
|
if (asprintf(&r, UID_FMT, uid) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* gid_to_name(gid_t gid) {
|
||||||
|
struct group *p;
|
||||||
|
char *r;
|
||||||
|
|
||||||
|
if (gid == 0)
|
||||||
|
return strdup("root");
|
||||||
|
|
||||||
|
p = getgrgid(gid);
|
||||||
|
if (p)
|
||||||
|
return strdup(p->gr_name);
|
||||||
|
|
||||||
|
if (asprintf(&r, GID_FMT, gid) < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
int in_gid(gid_t gid) {
|
||||||
|
gid_t *gids;
|
||||||
|
int ngroups_max, r, i;
|
||||||
|
|
||||||
|
if (getgid() == gid)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (getegid() == gid)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
ngroups_max = sysconf(_SC_NGROUPS_MAX);
|
||||||
|
assert(ngroups_max > 0);
|
||||||
|
|
||||||
|
gids = alloca(sizeof(gid_t) * ngroups_max);
|
||||||
|
|
||||||
|
r = getgroups(ngroups_max, gids);
|
||||||
|
if (r < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
for (i = 0; i < r; i++)
|
||||||
|
if (gids[i] == gid)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int in_group(const char *name) {
|
||||||
|
int r;
|
||||||
|
gid_t gid;
|
||||||
|
|
||||||
|
r = get_group_creds(&name, &gid);
|
||||||
|
if (r < 0)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return in_gid(gid);
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_home_dir(char **_h) {
|
||||||
|
struct passwd *p;
|
||||||
|
const char *e;
|
||||||
|
char *h;
|
||||||
|
uid_t u;
|
||||||
|
|
||||||
|
assert(_h);
|
||||||
|
|
||||||
|
/* Take the user specified one */
|
||||||
|
e = secure_getenv("HOME");
|
||||||
|
if (e && path_is_absolute(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 > 0 ? -errno : -ESRCH;
|
||||||
|
|
||||||
|
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 **_s) {
|
||||||
|
struct passwd *p;
|
||||||
|
const char *e;
|
||||||
|
char *s;
|
||||||
|
uid_t u;
|
||||||
|
|
||||||
|
assert(_s);
|
||||||
|
|
||||||
|
/* Take the user specified one */
|
||||||
|
e = getenv("SHELL");
|
||||||
|
if (e) {
|
||||||
|
s = strdup(e);
|
||||||
|
if (!s)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_s = s;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hardcode home directory for root to avoid NSS */
|
||||||
|
u = getuid();
|
||||||
|
if (u == 0) {
|
||||||
|
s = strdup("/bin/sh");
|
||||||
|
if (!s)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_s = s;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the database... */
|
||||||
|
errno = 0;
|
||||||
|
p = getpwuid(u);
|
||||||
|
if (!p)
|
||||||
|
return errno > 0 ? -errno : -ESRCH;
|
||||||
|
|
||||||
|
if (!path_is_absolute(p->pw_shell))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
s = strdup(p->pw_shell);
|
||||||
|
if (!s)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*_s = s;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int reset_uid_gid(void) {
|
||||||
|
|
||||||
|
if (setgroups(0, NULL) < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
if (setresgid(0, 0, 0) < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
if (setresuid(0, 0, 0) < 0)
|
||||||
|
return -errno;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
/***
|
||||||
|
This file is part of systemd.
|
||||||
|
|
||||||
|
Copyright 2010 Lennart Poettering
|
||||||
|
|
||||||
|
systemd is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
systemd is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
***/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
bool uid_is_valid(uid_t uid);
|
||||||
|
|
||||||
|
static inline bool gid_is_valid(gid_t gid) {
|
||||||
|
return uid_is_valid((uid_t) gid);
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_uid(const char *s, uid_t* ret_uid);
|
||||||
|
|
||||||
|
static inline int parse_gid(const char *s, gid_t *ret_gid) {
|
||||||
|
return parse_uid(s, (uid_t*) ret_gid);
|
||||||
|
}
|
||||||
|
|
||||||
|
char* lookup_uid(uid_t uid);
|
||||||
|
char* getlogname_malloc(void);
|
||||||
|
char* getusername_malloc(void);
|
||||||
|
|
||||||
|
int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
|
||||||
|
int get_group_creds(const char **groupname, gid_t *gid);
|
||||||
|
|
||||||
|
char* uid_to_name(uid_t uid);
|
||||||
|
char* gid_to_name(gid_t gid);
|
||||||
|
|
||||||
|
int in_gid(gid_t gid);
|
||||||
|
int in_group(const char *name);
|
||||||
|
|
||||||
|
int get_home_dir(char **ret);
|
||||||
|
int get_shell(char **_ret);
|
||||||
|
|
||||||
|
int reset_uid_gid(void);
|
375
src/basic/util.c
375
src/basic/util.c
|
@ -98,6 +98,7 @@
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "virt.h"
|
#include "virt.h"
|
||||||
|
@ -168,47 +169,6 @@ int parse_pid(const char *s, pid_t* ret_pid) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool uid_is_valid(uid_t uid) {
|
|
||||||
|
|
||||||
/* Some libc APIs use UID_INVALID as special placeholder */
|
|
||||||
if (uid == (uid_t) 0xFFFFFFFF)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* A long time ago UIDs where 16bit, hence explicitly avoid the 16bit -1 too */
|
|
||||||
if (uid == (uid_t) 0xFFFF)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int parse_uid(const char *s, uid_t* ret_uid) {
|
|
||||||
unsigned long ul = 0;
|
|
||||||
uid_t uid;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(s);
|
|
||||||
|
|
||||||
r = safe_atolu(s, &ul);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
uid = (uid_t) ul;
|
|
||||||
|
|
||||||
if ((unsigned long) uid != ul)
|
|
||||||
return -ERANGE;
|
|
||||||
|
|
||||||
if (!uid_is_valid(uid))
|
|
||||||
return -ENXIO; /* we return ENXIO instead of EINVAL
|
|
||||||
* here, to make it easy to distuingish
|
|
||||||
* invalid numeric uids invalid
|
|
||||||
* strings. */
|
|
||||||
|
|
||||||
if (ret_uid)
|
|
||||||
*ret_uid = uid;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int safe_atou(const char *s, unsigned *ret_u) {
|
int safe_atou(const char *s, unsigned *ret_u) {
|
||||||
char *x = NULL;
|
char *x = NULL;
|
||||||
unsigned long l;
|
unsigned long l;
|
||||||
|
@ -1437,55 +1397,6 @@ void rename_process(const char name[8]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *lookup_uid(uid_t uid) {
|
|
||||||
long bufsize;
|
|
||||||
char *name;
|
|
||||||
_cleanup_free_ char *buf = NULL;
|
|
||||||
struct passwd pwbuf, *pw = NULL;
|
|
||||||
|
|
||||||
/* Shortcut things to avoid NSS lookups */
|
|
||||||
if (uid == 0)
|
|
||||||
return strdup("root");
|
|
||||||
|
|
||||||
bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
|
|
||||||
if (bufsize <= 0)
|
|
||||||
bufsize = 4096;
|
|
||||||
|
|
||||||
buf = malloc(bufsize);
|
|
||||||
if (!buf)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw)
|
|
||||||
return strdup(pw->pw_name);
|
|
||||||
|
|
||||||
if (asprintf(&name, UID_FMT, uid) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
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());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_fs_type(const struct statfs *s, statfs_f_type_t magic_value) {
|
bool is_fs_type(const struct statfs *s, statfs_f_type_t magic_value) {
|
||||||
assert(s);
|
assert(s);
|
||||||
assert_cc(sizeof(statfs_f_type_t) >= sizeof(s->f_type));
|
assert_cc(sizeof(statfs_f_type_t) >= sizeof(s->f_type));
|
||||||
|
@ -2074,182 +1985,6 @@ int socket_from_display(const char *display, char **path) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_user_creds(
|
|
||||||
const char **username,
|
|
||||||
uid_t *uid, gid_t *gid,
|
|
||||||
const char **home,
|
|
||||||
const char **shell) {
|
|
||||||
|
|
||||||
struct passwd *p;
|
|
||||||
uid_t u;
|
|
||||||
|
|
||||||
assert(username);
|
|
||||||
assert(*username);
|
|
||||||
|
|
||||||
/* We enforce some special rules for uid=0: in order to avoid
|
|
||||||
* NSS lookups for root we hardcode its data. */
|
|
||||||
|
|
||||||
if (streq(*username, "root") || streq(*username, "0")) {
|
|
||||||
*username = "root";
|
|
||||||
|
|
||||||
if (uid)
|
|
||||||
*uid = 0;
|
|
||||||
|
|
||||||
if (gid)
|
|
||||||
*gid = 0;
|
|
||||||
|
|
||||||
if (home)
|
|
||||||
*home = "/root";
|
|
||||||
|
|
||||||
if (shell)
|
|
||||||
*shell = "/bin/sh";
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parse_uid(*username, &u) >= 0) {
|
|
||||||
errno = 0;
|
|
||||||
p = getpwuid(u);
|
|
||||||
|
|
||||||
/* If there are multiple users with the same id, make
|
|
||||||
* sure to leave $USER to the configured value instead
|
|
||||||
* of the first occurrence in the database. However if
|
|
||||||
* the uid was configured by a numeric uid, then let's
|
|
||||||
* pick the real username from /etc/passwd. */
|
|
||||||
if (p)
|
|
||||||
*username = p->pw_name;
|
|
||||||
} else {
|
|
||||||
errno = 0;
|
|
||||||
p = getpwnam(*username);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!p)
|
|
||||||
return errno > 0 ? -errno : -ESRCH;
|
|
||||||
|
|
||||||
if (uid)
|
|
||||||
*uid = p->pw_uid;
|
|
||||||
|
|
||||||
if (gid)
|
|
||||||
*gid = p->pw_gid;
|
|
||||||
|
|
||||||
if (home)
|
|
||||||
*home = p->pw_dir;
|
|
||||||
|
|
||||||
if (shell)
|
|
||||||
*shell = p->pw_shell;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* uid_to_name(uid_t uid) {
|
|
||||||
struct passwd *p;
|
|
||||||
char *r;
|
|
||||||
|
|
||||||
if (uid == 0)
|
|
||||||
return strdup("root");
|
|
||||||
|
|
||||||
p = getpwuid(uid);
|
|
||||||
if (p)
|
|
||||||
return strdup(p->pw_name);
|
|
||||||
|
|
||||||
if (asprintf(&r, UID_FMT, uid) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* gid_to_name(gid_t gid) {
|
|
||||||
struct group *p;
|
|
||||||
char *r;
|
|
||||||
|
|
||||||
if (gid == 0)
|
|
||||||
return strdup("root");
|
|
||||||
|
|
||||||
p = getgrgid(gid);
|
|
||||||
if (p)
|
|
||||||
return strdup(p->gr_name);
|
|
||||||
|
|
||||||
if (asprintf(&r, GID_FMT, gid) < 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_group_creds(const char **groupname, gid_t *gid) {
|
|
||||||
struct group *g;
|
|
||||||
gid_t id;
|
|
||||||
|
|
||||||
assert(groupname);
|
|
||||||
|
|
||||||
/* We enforce some special rules for gid=0: in order to avoid
|
|
||||||
* NSS lookups for root we hardcode its data. */
|
|
||||||
|
|
||||||
if (streq(*groupname, "root") || streq(*groupname, "0")) {
|
|
||||||
*groupname = "root";
|
|
||||||
|
|
||||||
if (gid)
|
|
||||||
*gid = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (parse_gid(*groupname, &id) >= 0) {
|
|
||||||
errno = 0;
|
|
||||||
g = getgrgid(id);
|
|
||||||
|
|
||||||
if (g)
|
|
||||||
*groupname = g->gr_name;
|
|
||||||
} else {
|
|
||||||
errno = 0;
|
|
||||||
g = getgrnam(*groupname);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!g)
|
|
||||||
return errno > 0 ? -errno : -ESRCH;
|
|
||||||
|
|
||||||
if (gid)
|
|
||||||
*gid = g->gr_gid;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int in_gid(gid_t gid) {
|
|
||||||
gid_t *gids;
|
|
||||||
int ngroups_max, r, i;
|
|
||||||
|
|
||||||
if (getgid() == gid)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (getegid() == gid)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
ngroups_max = sysconf(_SC_NGROUPS_MAX);
|
|
||||||
assert(ngroups_max > 0);
|
|
||||||
|
|
||||||
gids = alloca(sizeof(gid_t) * ngroups_max);
|
|
||||||
|
|
||||||
r = getgroups(ngroups_max, gids);
|
|
||||||
if (r < 0)
|
|
||||||
return -errno;
|
|
||||||
|
|
||||||
for (i = 0; i < r; i++)
|
|
||||||
if (gids[i] == gid)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int in_group(const char *name) {
|
|
||||||
int r;
|
|
||||||
gid_t gid;
|
|
||||||
|
|
||||||
r = get_group_creds(&name, &gid);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
return in_gid(gid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int glob_exists(const char *path) {
|
int glob_exists(const char *path) {
|
||||||
_cleanup_globfree_ glob_t g = {};
|
_cleanup_globfree_ glob_t g = {};
|
||||||
int k;
|
int k;
|
||||||
|
@ -2864,100 +2599,6 @@ bool in_initrd(void) {
|
||||||
return saved;
|
return saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_home_dir(char **_h) {
|
|
||||||
struct passwd *p;
|
|
||||||
const char *e;
|
|
||||||
char *h;
|
|
||||||
uid_t u;
|
|
||||||
|
|
||||||
assert(_h);
|
|
||||||
|
|
||||||
/* Take the user specified one */
|
|
||||||
e = secure_getenv("HOME");
|
|
||||||
if (e && path_is_absolute(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 > 0 ? -errno : -ESRCH;
|
|
||||||
|
|
||||||
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 **_s) {
|
|
||||||
struct passwd *p;
|
|
||||||
const char *e;
|
|
||||||
char *s;
|
|
||||||
uid_t u;
|
|
||||||
|
|
||||||
assert(_s);
|
|
||||||
|
|
||||||
/* Take the user specified one */
|
|
||||||
e = getenv("SHELL");
|
|
||||||
if (e) {
|
|
||||||
s = strdup(e);
|
|
||||||
if (!s)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*_s = s;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Hardcode home directory for root to avoid NSS */
|
|
||||||
u = getuid();
|
|
||||||
if (u == 0) {
|
|
||||||
s = strdup("/bin/sh");
|
|
||||||
if (!s)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*_s = s;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check the database... */
|
|
||||||
errno = 0;
|
|
||||||
p = getpwuid(u);
|
|
||||||
if (!p)
|
|
||||||
return errno > 0 ? -errno : -ESRCH;
|
|
||||||
|
|
||||||
if (!path_is_absolute(p->pw_shell))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
s = strdup(p->pw_shell);
|
|
||||||
if (!s)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*_s = s;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool filename_is_valid(const char *p) {
|
bool filename_is_valid(const char *p) {
|
||||||
|
|
||||||
if (isempty(p))
|
if (isempty(p))
|
||||||
|
@ -4631,20 +4272,6 @@ int mount_move_root(const char *path) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int reset_uid_gid(void) {
|
|
||||||
|
|
||||||
if (setgroups(0, NULL) < 0)
|
|
||||||
return -errno;
|
|
||||||
|
|
||||||
if (setresgid(0, 0, 0) < 0)
|
|
||||||
return -errno;
|
|
||||||
|
|
||||||
if (setresuid(0, 0, 0) < 0)
|
|
||||||
return -errno;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getxattr_malloc(const char *path, const char *name, char **value, bool allow_symlink) {
|
int getxattr_malloc(const char *path, const char *name, char **value, bool allow_symlink) {
|
||||||
char *v;
|
char *v;
|
||||||
size_t l;
|
size_t l;
|
||||||
|
|
|
@ -91,14 +91,7 @@ int parse_size(const char *t, uint64_t base, uint64_t *size);
|
||||||
|
|
||||||
int parse_boolean(const char *v) _pure_;
|
int parse_boolean(const char *v) _pure_;
|
||||||
int parse_pid(const char *s, pid_t* ret_pid);
|
int parse_pid(const char *s, pid_t* ret_pid);
|
||||||
int parse_uid(const char *s, uid_t* ret_uid);
|
|
||||||
#define parse_gid(s, ret_gid) parse_uid(s, ret_gid)
|
|
||||||
|
|
||||||
bool uid_is_valid(uid_t uid);
|
|
||||||
|
|
||||||
static inline bool gid_is_valid(gid_t gid) {
|
|
||||||
return uid_is_valid((uid_t) gid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int safe_atou(const char *s, unsigned *ret_u);
|
int safe_atou(const char *s, unsigned *ret_u);
|
||||||
int safe_atoi(const char *s, int *ret_i);
|
int safe_atoi(const char *s, int *ret_i);
|
||||||
|
@ -252,10 +245,6 @@ static inline int dir_is_populated(const char *path) {
|
||||||
return !r;
|
return !r;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* lookup_uid(uid_t uid);
|
|
||||||
char* getlogname_malloc(void);
|
|
||||||
char* getusername_malloc(void);
|
|
||||||
|
|
||||||
int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
|
int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);
|
||||||
int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
|
int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid);
|
||||||
|
|
||||||
|
@ -304,15 +293,6 @@ int fchmod_umask(int fd, mode_t mode);
|
||||||
bool display_is_local(const char *display) _pure_;
|
bool display_is_local(const char *display) _pure_;
|
||||||
int socket_from_display(const char *display, char **path);
|
int socket_from_display(const char *display, char **path);
|
||||||
|
|
||||||
int get_user_creds(const char **username, uid_t *uid, gid_t *gid, const char **home, const char **shell);
|
|
||||||
int get_group_creds(const char **groupname, gid_t *gid);
|
|
||||||
|
|
||||||
int in_gid(gid_t gid);
|
|
||||||
int in_group(const char *name);
|
|
||||||
|
|
||||||
char* uid_to_name(uid_t uid);
|
|
||||||
char* gid_to_name(gid_t gid);
|
|
||||||
|
|
||||||
int glob_exists(const char *path);
|
int glob_exists(const char *path);
|
||||||
int glob_extend(char ***strv, const char *path);
|
int glob_extend(char ***strv, const char *path);
|
||||||
|
|
||||||
|
@ -378,9 +358,6 @@ bool http_etag_is_valid(const char *etag);
|
||||||
|
|
||||||
bool in_initrd(void);
|
bool in_initrd(void);
|
||||||
|
|
||||||
int get_home_dir(char **ret);
|
|
||||||
int get_shell(char **_ret);
|
|
||||||
|
|
||||||
static inline void freep(void *p) {
|
static inline void freep(void *p) {
|
||||||
free(*(void**) p);
|
free(*(void**) p);
|
||||||
}
|
}
|
||||||
|
@ -720,8 +697,6 @@ int parse_mode(const char *s, mode_t *ret);
|
||||||
|
|
||||||
int mount_move_root(const char *path);
|
int mount_move_root(const char *path);
|
||||||
|
|
||||||
int reset_uid_gid(void);
|
|
||||||
|
|
||||||
int getxattr_malloc(const char *path, const char *name, char **value, bool allow_symlink);
|
int getxattr_malloc(const char *path, const char *name, char **value, bool allow_symlink);
|
||||||
int fgetxattr_malloc(int fd, const char *name, char **value);
|
int fgetxattr_malloc(int fd, const char *name, char **value);
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include "proxy.h"
|
#include "proxy.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static char *arg_address = NULL;
|
static char *arg_address = NULL;
|
||||||
|
|
|
@ -22,14 +22,15 @@
|
||||||
#include "sd-login.h"
|
#include "sd-login.h"
|
||||||
|
|
||||||
#include "bus-internal.h"
|
#include "bus-internal.h"
|
||||||
|
#include "bus-xml-policy.h"
|
||||||
#include "conf-files.h"
|
#include "conf-files.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "formats-util.h"
|
#include "formats-util.h"
|
||||||
#include "set.h"
|
#include "set.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "xml.h"
|
#include "xml.h"
|
||||||
#include "bus-xml-policy.h"
|
|
||||||
|
|
||||||
static void policy_item_free(PolicyItem *i) {
|
static void policy_item_free(PolicyItem *i) {
|
||||||
assert(i);
|
assert(i);
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "proxy.h"
|
#include "proxy.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static char *arg_address = NULL;
|
static char *arg_address = NULL;
|
||||||
|
|
|
@ -19,10 +19,11 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "kdbus.h"
|
|
||||||
#include "util.h"
|
|
||||||
#include "bus-kernel.h"
|
#include "bus-kernel.h"
|
||||||
#include "bus-policy.h"
|
#include "bus-policy.h"
|
||||||
|
#include "kdbus.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
int bus_kernel_translate_access(BusPolicyAccess access) {
|
int bus_kernel_translate_access(BusPolicyAccess access) {
|
||||||
assert(access >= 0);
|
assert(access >= 0);
|
||||||
|
|
|
@ -90,6 +90,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "utmp-wtmp.h"
|
#include "utmp-wtmp.h"
|
||||||
|
|
||||||
|
|
|
@ -76,6 +76,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "switch-root.h"
|
#include "switch-root.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "virt.h"
|
#include "virt.h"
|
||||||
#include "watchdog.h"
|
#include "watchdog.h"
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
#include "unit-printf.h"
|
#include "unit-printf.h"
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
|
static const UnitActiveState state_translation_table[_SOCKET_STATE_MAX] = {
|
||||||
[SOCKET_DEAD] = UNIT_INACTIVE,
|
[SOCKET_DEAD] = UNIT_INACTIVE,
|
||||||
|
|
|
@ -26,9 +26,10 @@
|
||||||
#include "dbus-timer.h"
|
#include "dbus-timer.h"
|
||||||
#include "special.h"
|
#include "special.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
|
#include "timer.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
#include "timer.h"
|
#include "user-util.h"
|
||||||
|
|
||||||
static const UnitActiveState state_translation_table[_TIMER_STATE_MAX] = {
|
static const UnitActiveState state_translation_table[_TIMER_STATE_MAX] = {
|
||||||
[TIMER_DEAD] = UNIT_INACTIVE,
|
[TIMER_DEAD] = UNIT_INACTIVE,
|
||||||
|
|
|
@ -26,8 +26,9 @@
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
#include "unit.h"
|
|
||||||
#include "unit-printf.h"
|
#include "unit-printf.h"
|
||||||
|
#include "unit.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
|
static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
|
||||||
Unit *u = userdata;
|
Unit *u = userdata;
|
||||||
|
|
|
@ -51,8 +51,9 @@
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
#include "virt.h"
|
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
#include "virt.h"
|
||||||
|
|
||||||
const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
|
const UnitVTable * const unit_vtable[_UNIT_TYPE_MAX] = {
|
||||||
[UNIT_SERVICE] = &service_vtable,
|
[UNIT_SERVICE] = &service_vtable,
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "time-util.h"
|
#include "time-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#define DEFAULT_MAX_USE_LOWER (uint64_t) (1ULL*1024ULL*1024ULL) /* 1 MiB */
|
#define DEFAULT_MAX_USE_LOWER (uint64_t) (1ULL*1024ULL*1024ULL) /* 1 MiB */
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#include "stacktrace.h"
|
#include "stacktrace.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
/* The maximum size up to which we process coredumps */
|
/* The maximum size up to which we process coredumps */
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
static enum {
|
static enum {
|
||||||
ACTION_NONE,
|
ACTION_NONE,
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
#define DEFAULT_FSS_INTERVAL_USEC (15*USEC_PER_MINUTE)
|
#define DEFAULT_FSS_INTERVAL_USEC (15*USEC_PER_MINUTE)
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "missing.h"
|
#include "missing.h"
|
||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "set.h"
|
#include "set.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static bool arg_no_pager = false;
|
static bool arg_no_pager = false;
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
/* Error codes:
|
/* Error codes:
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "path-util.h"
|
#include "path-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static int from_environment(const char *envname, const char *fallback, const char **ret) {
|
static int from_environment(const char *envname, const char *fallback, const char **ret) {
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static const char* arg_what = "idle:sleep:shutdown";
|
static const char* arg_what = "idle:sleep:shutdown";
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include "sysfs-show.h"
|
#include "sysfs-show.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "verbs.h"
|
#include "verbs.h"
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "formats-util.h"
|
#include "formats-util.h"
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
int manager_handle_action(
|
int manager_handle_action(
|
||||||
Manager *m,
|
Manager *m,
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "udev-util.h"
|
#include "udev-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
int manager_add_device(Manager *m, const char *sysfs, bool master, Device **_device) {
|
int manager_add_device(Manager *m, const char *sysfs, bool master, Device **_device) {
|
||||||
Device *d;
|
Device *d;
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "udev-util.h"
|
#include "udev-util.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "utmp-wtmp.h"
|
#include "utmp-wtmp.h"
|
||||||
|
|
||||||
int manager_get_session_from_creds(Manager *m, sd_bus_message *message, const char *name, sd_bus_error *error, Session **ret) {
|
int manager_get_session_from_creds(Manager *m, sd_bus_message *message, const char *name, sd_bus_error *error, Session **ret) {
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "logind-inhibit.h"
|
#include "logind-inhibit.h"
|
||||||
#include "mkdir.h"
|
#include "mkdir.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
Inhibitor* inhibitor_new(Manager *m, const char* id) {
|
Inhibitor* inhibitor_new(Manager *m, const char* id) {
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include "mkdir.h"
|
#include "mkdir.h"
|
||||||
#include "path-util.h"
|
#include "path-util.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#define RELEASE_USEC (20*USEC_PER_SEC)
|
#define RELEASE_USEC (20*USEC_PER_SEC)
|
||||||
|
|
|
@ -22,11 +22,12 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "strv.h"
|
|
||||||
#include "bus-util.h"
|
#include "bus-util.h"
|
||||||
#include "logind.h"
|
|
||||||
#include "logind-user.h"
|
|
||||||
#include "formats-util.h"
|
#include "formats-util.h"
|
||||||
|
#include "logind-user.h"
|
||||||
|
#include "logind.h"
|
||||||
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
static int property_get_display(
|
static int property_get_display(
|
||||||
sd_bus *bus,
|
sd_bus *bus,
|
||||||
|
|
|
@ -25,15 +25,17 @@
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
|
|
||||||
#include "sd-messages.h"
|
#include "sd-messages.h"
|
||||||
#include "strv.h"
|
|
||||||
#include "special.h"
|
|
||||||
#include "unit-name.h"
|
|
||||||
#include "audit.h"
|
#include "audit.h"
|
||||||
#include "bus-util.h"
|
|
||||||
#include "bus-error.h"
|
|
||||||
#include "bus-common-errors.h"
|
#include "bus-common-errors.h"
|
||||||
#include "logind.h"
|
#include "bus-error.h"
|
||||||
|
#include "bus-util.h"
|
||||||
#include "formats-util.h"
|
#include "formats-util.h"
|
||||||
|
#include "logind.h"
|
||||||
|
#include "special.h"
|
||||||
|
#include "strv.h"
|
||||||
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "utmp-wtmp.h"
|
#include "utmp-wtmp.h"
|
||||||
|
|
||||||
_const_ static usec_t when_wall(usec_t n, usec_t elapse) {
|
_const_ static usec_t when_wall(usec_t n, usec_t elapse) {
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
static int property_get_pool_path(
|
static int property_get_pool_path(
|
||||||
sd_bus *bus,
|
sd_bus *bus,
|
||||||
|
|
|
@ -23,8 +23,9 @@
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <linux/if_tun.h>
|
#include <linux/if_tun.h>
|
||||||
|
|
||||||
#include "networkd-netdev-tuntap.h"
|
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
|
#include "networkd-netdev-tuntap.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
#define TUN_DEV "/dev/net/tun"
|
#define TUN_DEV "/dev/net/tun"
|
||||||
|
|
||||||
|
|
|
@ -20,9 +20,11 @@
|
||||||
***/
|
***/
|
||||||
|
|
||||||
#include "sd-daemon.h"
|
#include "sd-daemon.h"
|
||||||
|
|
||||||
#include "capability.h"
|
#include "capability.h"
|
||||||
#include "signal-util.h"
|
|
||||||
#include "networkd.h"
|
#include "networkd.h"
|
||||||
|
#include "signal-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
_cleanup_manager_free_ Manager *m = NULL;
|
_cleanup_manager_free_ Manager *m = NULL;
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "process-util.h"
|
#include "process-util.h"
|
||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
static int spawn_getent(const char *database, const char *key, pid_t *rpid) {
|
static int spawn_getent(const char *database, const char *key, pid_t *rpid) {
|
||||||
|
|
|
@ -90,6 +90,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "udev-util.h"
|
#include "udev-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
typedef enum ContainerStatus {
|
typedef enum ContainerStatus {
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "nss-util.h"
|
#include "nss-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
NSS_GETHOSTBYNAME_PROTOTYPES(mymachines);
|
NSS_GETHOSTBYNAME_PROTOTYPES(mymachines);
|
||||||
|
|
|
@ -19,15 +19,16 @@
|
||||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
***/
|
***/
|
||||||
|
|
||||||
#include "sd-event.h"
|
|
||||||
#include "sd-daemon.h"
|
#include "sd-daemon.h"
|
||||||
#include "mkdir.h"
|
#include "sd-event.h"
|
||||||
|
|
||||||
#include "capability.h"
|
#include "capability.h"
|
||||||
|
#include "mkdir.h"
|
||||||
|
#include "resolved-conf.h"
|
||||||
|
#include "resolved-manager.h"
|
||||||
#include "selinux-util.h"
|
#include "selinux-util.h"
|
||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "resolved-manager.h"
|
|
||||||
#include "resolved-conf.h"
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
_cleanup_(manager_freep) Manager *m = NULL;
|
_cleanup_(manager_freep) Manager *m = NULL;
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
static bool arg_ask_password = true;
|
static bool arg_ask_password = true;
|
||||||
static bool arg_scope = false;
|
static bool arg_scope = false;
|
||||||
|
|
|
@ -22,10 +22,11 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "acl-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "acl-util.h"
|
|
||||||
|
|
||||||
int acl_find_uid(acl_t acl, uid_t uid, acl_entry_t *entry) {
|
int acl_find_uid(acl_t acl, uid_t uid, acl_entry_t *entry) {
|
||||||
acl_entry_t i;
|
acl_entry_t i;
|
||||||
|
|
|
@ -21,11 +21,12 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "formats-util.h"
|
||||||
|
#include "install-printf.h"
|
||||||
#include "specifier.h"
|
#include "specifier.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "install-printf.h"
|
|
||||||
#include "formats-util.h"
|
|
||||||
|
|
||||||
static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
|
static int specifier_prefix_and_instance(char specifier, void *data, void *userdata, char **ret) {
|
||||||
UnitFileInstallInfo *i = userdata;
|
UnitFileInstallInfo *i = userdata;
|
||||||
|
|
|
@ -19,8 +19,9 @@
|
||||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
***/
|
***/
|
||||||
|
|
||||||
#include "util.h"
|
|
||||||
#include "uid-range.h"
|
#include "uid-range.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
static bool uid_range_intersect(UidRange *range, uid_t start, uid_t nr) {
|
static bool uid_range_intersect(UidRange *range, uid_t start, uid_t nr) {
|
||||||
assert(range);
|
assert(range);
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "path-util.h"
|
#include "path-util.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "utmp-wtmp.h"
|
#include "utmp-wtmp.h"
|
||||||
|
|
||||||
int utmp_get_runlevel(int *runlevel, int *previous) {
|
int utmp_get_runlevel(int *runlevel, int *previous) {
|
||||||
|
|
|
@ -73,6 +73,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "terminal-util.h"
|
#include "terminal-util.h"
|
||||||
#include "unit-name.h"
|
#include "unit-name.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "utmp-wtmp.h"
|
#include "utmp-wtmp.h"
|
||||||
#include "verbs.h"
|
#include "verbs.h"
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "utf8.h"
|
#include "utf8.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
typedef enum ItemType {
|
typedef enum ItemType {
|
||||||
ADD_USER = 'u',
|
ADD_USER = 'u',
|
||||||
|
|
|
@ -19,8 +19,9 @@
|
||||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
***/
|
***/
|
||||||
|
|
||||||
#include "util.h"
|
|
||||||
#include "clean-ipc.h"
|
#include "clean-ipc.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "virt.h"
|
#include "virt.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
static void test_streq_ptr(void) {
|
static void test_streq_ptr(void) {
|
||||||
assert_se(streq_ptr(NULL, NULL));
|
assert_se(streq_ptr(NULL, NULL));
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "signal-util.h"
|
#include "signal-util.h"
|
||||||
#include "timesyncd-conf.h"
|
#include "timesyncd-conf.h"
|
||||||
#include "timesyncd-manager.h"
|
#include "timesyncd-manager.h"
|
||||||
|
#include "user-util.h"
|
||||||
|
|
||||||
static int load_clock_timestamp(uid_t uid, gid_t gid) {
|
static int load_clock_timestamp(uid_t uid, gid_t gid) {
|
||||||
_cleanup_close_ int fd = -1;
|
_cleanup_close_ int fd = -1;
|
||||||
|
|
|
@ -59,6 +59,7 @@
|
||||||
#include "specifier.h"
|
#include "specifier.h"
|
||||||
#include "string-util.h"
|
#include "string-util.h"
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
/* This reads all files listed in /etc/tmpfiles.d/?*.conf and creates
|
/* This reads all files listed in /etc/tmpfiles.d/?*.conf and creates
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "strv.h"
|
#include "strv.h"
|
||||||
#include "sysctl-util.h"
|
#include "sysctl-util.h"
|
||||||
#include "udev.h"
|
#include "udev.h"
|
||||||
|
#include "user-util.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#define PREALLOC_TOKEN 2048
|
#define PREALLOC_TOKEN 2048
|
||||||
|
|
Loading…
Reference in New Issue