X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Futil.c;h=3bcce2f019bcf6af535d5f4942d135185da4a870;hp=c4ff5aa575d4ea45d6b69cb42c1560354fef7acc;hb=618e02c7b7f8e11fdb954a019342d745937baf55;hpb=1e59887dc92e163163051e627817e1675374cd22 diff --git a/src/util.c b/src/util.c index c4ff5aa57..3bcce2f01 100644 --- a/src/util.c +++ b/src/util.c @@ -1,4 +1,4 @@ -/*-*- Mode: C; c-basic-offset: 8 -*-*/ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ /*** This file is part of systemd. @@ -48,6 +48,7 @@ #include #include #include +#include #include "macro.h" #include "util.h" @@ -2530,11 +2531,12 @@ char* getlogname_malloc(void) { int getttyname_malloc(char **r) { char path[PATH_MAX], *p, *c; + int k; assert(r); - if (ttyname_r(STDIN_FILENO, path, sizeof(path)) < 0) - return -errno; + if ((k = ttyname_r(STDIN_FILENO, path, sizeof(path))) != 0) + return -k; char_array_0(path); @@ -2979,6 +2981,35 @@ char *ellipsize(const char *s, unsigned length, unsigned percent) { return r; } +void nss_disable_nscd(void) { + + void (*func)(void); + + /* This is an internal glibc function call. We are not + * supposed to call this, because we are not nscd. However + * sometimes we feel really dangerous and do it + * nonetheless. Muahahah! But at least we protect this with a + * dlsym() just in case glibc takes this away from us. */ + + if ((func = dlsym(RTLD_DEFAULT, "__nss_disable_nscd"))) { + log_debug("Disabling nscd."); + func(); + } else + log_debug("Cannot disable nscd."); +} + +int touch(const char *path) { + int fd; + + assert(path); + + if ((fd = open(path, O_WRONLY|O_CREAT|O_CLOEXEC|O_NOCTTY, 0666)) < 0) + return -errno; + + close_nointr_nofail(fd); + return 0; +} + static const char *const ioprio_class_table[] = { [IOPRIO_CLASS_NONE] = "none", [IOPRIO_CLASS_RT] = "realtime",