X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsd-daemon.c;h=a2ec74cceb59a744f9bec7486972832896cdb2ff;hb=e9816c4859454d341279f1c9e77df4af4bacd534;hp=b30db5d5b33ab259a4649108b049798b78424930;hpb=916abb21d0a6653e0187b91591e492026886b0a4;p=elogind.git diff --git a/src/sd-daemon.c b/src/sd-daemon.c index b30db5d5b..a2ec74cce 100644 --- a/src/sd-daemon.c +++ b/src/sd-daemon.c @@ -49,7 +49,13 @@ #include "sd-daemon.h" -int sd_listen_fds(int unset_environment) { +#if (__GNUC__ >= 4) && !defined(SD_EXPORT_SYMBOLS) +#define _sd_hidden_ __attribute__ ((visibility("hidden"))) +#else +#define _sd_hidden_ +#endif + +_sd_hidden_ int sd_listen_fds(int unset_environment) { #if defined(DISABLE_SYSTEMD) || !defined(__linux__) return 0; @@ -130,7 +136,7 @@ finish: #endif } -int sd_is_fifo(int fd, const char *path) { +_sd_hidden_ int sd_is_fifo(int fd, const char *path) { struct stat st_fd; if (fd < 0) @@ -163,6 +169,42 @@ int sd_is_fifo(int fd, const char *path) { return 1; } +_sd_hidden_ int sd_is_special(int fd, const char *path) { + struct stat st_fd; + + if (fd < 0) + return -EINVAL; + + if (fstat(fd, &st_fd) < 0) + return -errno; + + if (!S_ISREG(st_fd.st_mode) && !S_ISCHR(st_fd.st_mode)) + return 0; + + if (path) { + struct stat st_path; + + if (stat(path, &st_path) < 0) { + + if (errno == ENOENT || errno == ENOTDIR) + return 0; + + return -errno; + } + + if (S_ISREG(st_fd.st_mode) && S_ISREG(st_path.st_mode)) + return + st_path.st_dev == st_fd.st_dev && + st_path.st_ino == st_fd.st_ino; + else if (S_ISCHR(st_fd.st_mode) && S_ISCHR(st_path.st_mode)) + return st_path.st_rdev == st_fd.st_rdev; + else + return 0; + } + + return 1; +} + static int sd_is_socket_internal(int fd, int type, int listening) { struct stat st_fd; @@ -214,7 +256,7 @@ union sockaddr_union { struct sockaddr_storage storage; }; -int sd_is_socket(int fd, int family, int type, int listening) { +_sd_hidden_ int sd_is_socket(int fd, int family, int type, int listening) { int r; if (family < 0) @@ -242,7 +284,7 @@ int sd_is_socket(int fd, int family, int type, int listening) { return 1; } -int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) { +_sd_hidden_ int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) { union sockaddr_union sockaddr; socklen_t l; int r; @@ -287,7 +329,7 @@ int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port return 1; } -int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) { +_sd_hidden_ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) { union sockaddr_union sockaddr; socklen_t l; int r; @@ -330,7 +372,7 @@ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t return 1; } -int sd_is_mq(int fd, const char *path) { +_sd_hidden_ int sd_is_mq(int fd, const char *path) { #if !defined(__linux__) return 0; #else @@ -367,7 +409,7 @@ int sd_is_mq(int fd, const char *path) { #endif } -int sd_notify(int unset_environment, const char *state) { +_sd_hidden_ int sd_notify(int unset_environment, const char *state) { #if defined(DISABLE_SYSTEMD) || !defined(__linux__) || !defined(SOCK_CLOEXEC) return 0; #else @@ -435,7 +477,7 @@ finish: #endif } -int sd_notifyf(int unset_environment, const char *format, ...) { +_sd_hidden_ int sd_notifyf(int unset_environment, const char *format, ...) { #if defined(DISABLE_SYSTEMD) || !defined(__linux__) return 0; #else @@ -457,7 +499,7 @@ int sd_notifyf(int unset_environment, const char *format, ...) { #endif } -int sd_booted(void) { +_sd_hidden_ int sd_booted(void) { #if defined(DISABLE_SYSTEMD) || !defined(__linux__) return 0; #else