diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-06-18 02:28:35 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-06-18 02:28:35 +0200 |
commit | ef2f1067d0ca0e6d7346aa3e082048821b670b54 (patch) | |
tree | a7842328e351cf04affebfecfb516eb950e72cae /src/util.c | |
parent | 139be57d9441b5c890e1e4ee69e15aad03276fde (diff) |
systemctl: warn users via wall that the system goes down
Diffstat (limited to 'src/util.c')
-rw-r--r-- | src/util.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/util.c b/src/util.c index 4fdc8e57c5..0988675f09 100644 --- a/src/util.c +++ b/src/util.c @@ -44,6 +44,8 @@ #include <libgen.h> #include <ctype.h> #include <sys/prctl.h> +#include <sys/utsname.h> +#include <pwd.h> #include "macro.h" #include "util.h" @@ -2217,6 +2219,68 @@ void sigset_add_many(sigset_t *ss, ...) { va_end(ap); } +char* gethostname_malloc(void) { + struct utsname u; + + assert_se(uname(&u) >= 0); + + if (u.nodename[0]) + return strdup(u.nodename); + + return strdup(u.sysname); +} + +char* getlogname_malloc(void) { + uid_t uid; + long bufsize; + char *buf, *name; + 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 */ + if (uid == 0) + return strdup("root"); + + if ((bufsize = sysconf(_SC_GETPW_R_SIZE_MAX)) <= 0) + bufsize = 4096; + + if (!(buf = malloc(bufsize))) + return NULL; + + if (getpwuid_r(uid, &pwbuf, buf, bufsize, &pw) == 0 && pw) { + name = strdup(pw->pw_name); + free(buf); + return name; + } + + free(buf); + + if (asprintf(&name, "%lu", (unsigned long) uid) < 0) + return NULL; + + return name; +} + +char *getttyname_malloc(void) { + char path[PATH_MAX], *p; + + if (ttyname_r(STDIN_FILENO, path, sizeof(path)) < 0) + return strdup("unknown"); + + char_array_0(path); + + p = path; + if (startswith(path, "/dev/")) + p += 5; + + return strdup(p); +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime", |