diff options
| author | Lennart Poettering <lennart@poettering.net> | 2013-09-26 21:53:49 +0200 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2013-09-26 21:53:49 +0200 | 
| commit | 8c902327f91616af5e87fd2a6d4b7ea38bb3aa32 (patch) | |
| tree | c40cc7cdd4d6c13022aecfa8dbdd1ca508765eba | |
| parent | d550837387e4185ebcde1023702580e35eb441e7 (diff) | |
systemd: update sd-daemon.[ch]
| -rw-r--r-- | sd-daemon.c | 100 | ||||
| -rw-r--r-- | sd-daemon.h | 14 | 
2 files changed, 52 insertions, 62 deletions
diff --git a/sd-daemon.c b/sd-daemon.c index 763e079..485b301 100644 --- a/sd-daemon.c +++ b/sd-daemon.c @@ -25,18 +25,14 @@  ***/  #ifndef _GNU_SOURCE -#define _GNU_SOURCE +#  define _GNU_SOURCE  #endif  #include <sys/types.h>  #include <sys/stat.h>  #include <sys/socket.h>  #include <sys/un.h> -#ifdef __BIONIC__ -#include <linux/fcntl.h> -#else -#include <sys/fcntl.h> -#endif +#include <fcntl.h>  #include <netinet/in.h>  #include <stdlib.h>  #include <errno.h> @@ -47,22 +43,22 @@  #include <stddef.h>  #include <limits.h> -#if defined(__linux__) -#include <mqueue.h> +#if defined(__linux__) && !defined(SD_DAEMON_DISABLE_MQ) +#  include <mqueue.h>  #endif  #include "sd-daemon.h"  #if (__GNUC__ >= 4) -#ifdef SD_EXPORT_SYMBOLS +#  ifdef SD_EXPORT_SYMBOLS  /* Export symbols */ -#define _sd_export_ __attribute__ ((visibility("default"))) -#else +#    define _sd_export_ __attribute__ ((visibility("default"))) +#  else  /* Don't export the symbols */ -#define _sd_export_ __attribute__ ((visibility("hidden"))) -#endif +#    define _sd_export_ __attribute__ ((visibility("hidden"))) +#  endif  #else -#define _sd_export_ +#  define _sd_export_  #endif  _sd_export_ int sd_listen_fds(int unset_environment) { @@ -75,7 +71,8 @@ _sd_export_ int sd_listen_fds(int unset_environment) {          char *p = NULL;          unsigned long l; -        if (!(e = getenv("LISTEN_PID"))) { +        e = getenv("LISTEN_PID"); +        if (!e) {                  r = 0;                  goto finish;          } @@ -83,12 +80,12 @@ _sd_export_ int sd_listen_fds(int unset_environment) {          errno = 0;          l = strtoul(e, &p, 10); -        if (errno != 0) { +        if (errno > 0) {                  r = -errno;                  goto finish;          } -        if (!p || *p || l <= 0) { +        if (!p || p == e || *p || l <= 0) {                  r = -EINVAL;                  goto finish;          } @@ -99,7 +96,8 @@ _sd_export_ int sd_listen_fds(int unset_environment) {                  goto finish;          } -        if (!(e = getenv("LISTEN_FDS"))) { +        e = getenv("LISTEN_FDS"); +        if (!e) {                  r = 0;                  goto finish;          } @@ -107,12 +105,12 @@ _sd_export_ int sd_listen_fds(int unset_environment) {          errno = 0;          l = strtoul(e, &p, 10); -        if (errno != 0) { +        if (errno > 0) {                  r = -errno;                  goto finish;          } -        if (!p || *p) { +        if (!p || p == e || *p) {                  r = -EINVAL;                  goto finish;          } @@ -120,7 +118,8 @@ _sd_export_ int sd_listen_fds(int unset_environment) {          for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) l; fd ++) {                  int flags; -                if ((flags = fcntl(fd, F_GETFD)) < 0) { +                flags = fcntl(fd, F_GETFD); +                if (flags < 0) {                          r = -errno;                          goto finish;                  } @@ -152,7 +151,6 @@ _sd_export_ int sd_is_fifo(int fd, const char *path) {          if (fd < 0)                  return -EINVAL; -        memset(&st_fd, 0, sizeof(st_fd));          if (fstat(fd, &st_fd) < 0)                  return -errno; @@ -162,7 +160,6 @@ _sd_export_ int sd_is_fifo(int fd, const char *path) {          if (path) {                  struct stat st_path; -                memset(&st_path, 0, sizeof(st_path));                  if (stat(path, &st_path) < 0) {                          if (errno == ENOENT || errno == ENOTDIR) @@ -272,15 +269,13 @@ _sd_export_ int sd_is_socket(int fd, int family, int type, int listening) {          if (family < 0)                  return -EINVAL; -        if ((r = sd_is_socket_internal(fd, type, listening)) <= 0) +        r = sd_is_socket_internal(fd, type, listening); +        if (r <= 0)                  return r;          if (family > 0) { -                union sockaddr_union sockaddr; -                socklen_t l; - -                memset(&sockaddr, 0, sizeof(sockaddr)); -                l = sizeof(sockaddr); +                union sockaddr_union sockaddr = {}; +                socklen_t l = sizeof(sockaddr);                  if (getsockname(fd, &sockaddr.sa, &l) < 0)                          return -errno; @@ -295,19 +290,17 @@ _sd_export_ int sd_is_socket(int fd, int family, int type, int listening) {  }  _sd_export_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) { -        union sockaddr_union sockaddr; -        socklen_t l; +        union sockaddr_union sockaddr = {}; +        socklen_t l = sizeof(sockaddr);          int r;          if (family != 0 && family != AF_INET && family != AF_INET6)                  return -EINVAL; -        if ((r = sd_is_socket_internal(fd, type, listening)) <= 0) +        r = sd_is_socket_internal(fd, type, listening); +        if (r <= 0)                  return r; -        memset(&sockaddr, 0, sizeof(sockaddr)); -        l = sizeof(sockaddr); -          if (getsockname(fd, &sockaddr.sa, &l) < 0)                  return -errno; @@ -340,16 +333,14 @@ _sd_export_ int sd_is_socket_inet(int fd, int family, int type, int listening, u  }  _sd_export_ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) { -        union sockaddr_union sockaddr; -        socklen_t l; +        union sockaddr_union sockaddr = {}; +        socklen_t l = sizeof(sockaddr);          int r; -        if ((r = sd_is_socket_internal(fd, type, listening)) <= 0) +        r = sd_is_socket_internal(fd, type, listening); +        if (r <= 0)                  return r; -        memset(&sockaddr, 0, sizeof(sockaddr)); -        l = sizeof(sockaddr); -          if (getsockname(fd, &sockaddr.sa, &l) < 0)                  return -errno; @@ -360,10 +351,10 @@ _sd_export_ int sd_is_socket_unix(int fd, int type, int listening, const char *p                  return 0;          if (path) { -                if (length <= 0) +                if (length == 0)                          length = strlen(path); -                if (length <= 0) +                if (length == 0)                          /* Unnamed socket */                          return l == offsetof(struct sockaddr_un, sun_path); @@ -383,7 +374,7 @@ _sd_export_ int sd_is_socket_unix(int fd, int type, int listening, const char *p  }  _sd_export_ int sd_is_mq(int fd, const char *path) { -#if !defined(__linux__) +#if !defined(__linux__) || defined(SD_DAEMON_DISABLE_MQ)          return 0;  #else          struct mq_attr attr; @@ -434,7 +425,8 @@ _sd_export_ int sd_notify(int unset_environment, const char *state) {                  goto finish;          } -        if (!(e = getenv("NOTIFY_SOCKET"))) +        e = getenv("NOTIFY_SOCKET"); +        if (!e)                  return 0;          /* Must be an abstract socket, or an absolute path */ @@ -443,7 +435,8 @@ _sd_export_ int sd_notify(int unset_environment, const char *state) {                  goto finish;          } -        if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) { +        fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); +        if (fd < 0) {                  r = -errno;                  goto finish;          } @@ -513,18 +506,15 @@ _sd_export_ int sd_booted(void) {  #if defined(DISABLE_SYSTEMD) || !defined(__linux__)          return 0;  #else +        struct stat st; -        struct stat a, b; - -        /* We simply test whether the systemd cgroup hierarchy is -         * mounted */ - -        if (lstat("/sys/fs/cgroup", &a) < 0) -                return 0; +        /* We test whether the runtime unit file directory has been +         * created. This takes place in mount-setup.c, so is +         * guaranteed to happen very early during boot. */ -        if (lstat("/sys/fs/cgroup/systemd", &b) < 0) +        if (lstat("/run/systemd/system/", &st) < 0)                  return 0; -        return a.st_dev != b.st_dev; +        return !!S_ISDIR(st.st_mode);  #endif  } diff --git a/sd-daemon.h b/sd-daemon.h index fe51159..daa3f4c 100644 --- a/sd-daemon.h +++ b/sd-daemon.h @@ -59,20 +59,20 @@ extern "C" {    You may find an up-to-date version of these source files online:    http://cgit.freedesktop.org/systemd/systemd/plain/src/systemd/sd-daemon.h -  http://cgit.freedesktop.org/systemd/systemd/plain/src/sd-daemon.c +  http://cgit.freedesktop.org/systemd/systemd/plain/src/libsystemd-daemon/sd-daemon.c    This should compile on non-Linux systems, too, but with the    exception of the sd_is_xxx() calls all functions will become NOPs. -  See sd-daemon(7) for more information. +  See sd-daemon(3) for more information.  */  #ifndef _sd_printf_attr_ -#if __GNUC__ >= 4 -#define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b))) -#else -#define _sd_printf_attr_(a,b) -#endif +#  if __GNUC__ >= 4 +#    define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b))) +#  else +#    define _sd_printf_attr_(a,b) +#  endif  #endif  /*  | 
