update sd-daemon.[ch]
This commit is contained in:
+92
-8
@@ -41,10 +41,21 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#include <limits.h>
|
||||
|
||||
#if defined(__linux__)
|
||||
#include <mqueue.h>
|
||||
#endif
|
||||
|
||||
#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;
|
||||
@@ -125,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)
|
||||
@@ -158,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;
|
||||
|
||||
@@ -209,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)
|
||||
@@ -237,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;
|
||||
@@ -282,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;
|
||||
@@ -325,7 +372,44 @@ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t
|
||||
return 1;
|
||||
}
|
||||
|
||||
int sd_notify(int unset_environment, const char *state) {
|
||||
_sd_hidden_ int sd_is_mq(int fd, const char *path) {
|
||||
#if !defined(__linux__)
|
||||
return 0;
|
||||
#else
|
||||
struct mq_attr attr;
|
||||
|
||||
if (fd < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (mq_getattr(fd, &attr) < 0)
|
||||
return -errno;
|
||||
|
||||
if (path) {
|
||||
char fpath[PATH_MAX];
|
||||
struct stat a, b;
|
||||
|
||||
if (path[0] != '/')
|
||||
return -EINVAL;
|
||||
|
||||
if (fstat(fd, &a) < 0)
|
||||
return -errno;
|
||||
|
||||
strncpy(stpcpy(fpath, "/dev/mqueue"), path, sizeof(fpath) - 12);
|
||||
fpath[sizeof(fpath)-1] = 0;
|
||||
|
||||
if (stat(fpath, &b) < 0)
|
||||
return -errno;
|
||||
|
||||
if (a.st_dev != b.st_dev ||
|
||||
a.st_ino != b.st_ino)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
_sd_hidden_ int sd_notify(int unset_environment, const char *state) {
|
||||
#if defined(DISABLE_SYSTEMD) || !defined(__linux__) || !defined(SOCK_CLOEXEC)
|
||||
return 0;
|
||||
#else
|
||||
@@ -393,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
|
||||
@@ -415,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
|
||||
|
||||
+28
-16
@@ -75,14 +75,6 @@ extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _sd_hidden_
|
||||
#if (__GNUC__ >= 4) && !defined(SD_EXPORT_SYMBOLS)
|
||||
#define _sd_hidden_ __attribute__ ((visibility("hidden")))
|
||||
#else
|
||||
#define _sd_hidden_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
Log levels for usage on stderr:
|
||||
|
||||
@@ -117,7 +109,7 @@ extern "C" {
|
||||
|
||||
See sd_listen_fds(3) for more information.
|
||||
*/
|
||||
int sd_listen_fds(int unset_environment) _sd_hidden_;
|
||||
int sd_listen_fds(int unset_environment);
|
||||
|
||||
/*
|
||||
Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
@@ -129,7 +121,19 @@ int sd_listen_fds(int unset_environment) _sd_hidden_;
|
||||
|
||||
See sd_is_fifo(3) for more information.
|
||||
*/
|
||||
int sd_is_fifo(int fd, const char *path) _sd_hidden_;
|
||||
int sd_is_fifo(int fd, const char *path);
|
||||
|
||||
/*
|
||||
Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
the file descriptor is a special character device on the file
|
||||
system stored under the specified path, 0 otherwise.
|
||||
If path is NULL a path name check will not be done and the call
|
||||
only verifies if the file descriptor refers to a special character.
|
||||
Returns a negative errno style error code on failure.
|
||||
|
||||
See sd_is_special(3) for more information.
|
||||
*/
|
||||
int sd_is_special(int fd, const char *path);
|
||||
|
||||
/*
|
||||
Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
@@ -145,7 +149,7 @@ int sd_is_fifo(int fd, const char *path) _sd_hidden_;
|
||||
|
||||
See sd_is_socket(3) for more information.
|
||||
*/
|
||||
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);
|
||||
|
||||
/*
|
||||
Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
@@ -159,7 +163,7 @@ int sd_is_socket(int fd, int family, int type, int listening) _sd_hidden_;
|
||||
|
||||
See sd_is_socket_inet(3) for more information.
|
||||
*/
|
||||
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);
|
||||
|
||||
/*
|
||||
Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
@@ -175,7 +179,15 @@ int sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port
|
||||
|
||||
See sd_is_socket_unix(3) for more information.
|
||||
*/
|
||||
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);
|
||||
|
||||
/*
|
||||
Helper call for identifying a passed file descriptor. Returns 1 if
|
||||
the file descriptor is a POSIX Message Queue of the specified name,
|
||||
0 otherwise. If path is NULL a message queue name check is not
|
||||
done. Returns a negative errno style error code on failure.
|
||||
*/
|
||||
int sd_is_mq(int fd, const char *path);
|
||||
|
||||
/*
|
||||
Informs systemd about changed daemon state. This takes a number of
|
||||
@@ -221,7 +233,7 @@ int sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t
|
||||
|
||||
See sd_notify(3) for more information.
|
||||
*/
|
||||
int sd_notify(int unset_environment, const char *state) _sd_hidden_;
|
||||
int sd_notify(int unset_environment, const char *state);
|
||||
|
||||
/*
|
||||
Similar to sd_notify() but takes a format string.
|
||||
@@ -243,7 +255,7 @@ int sd_notify(int unset_environment, const char *state) _sd_hidden_;
|
||||
|
||||
See sd_notifyf(3) for more information.
|
||||
*/
|
||||
int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3) _sd_hidden_;
|
||||
int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3);
|
||||
|
||||
/*
|
||||
Returns > 0 if the system was booted with systemd. Returns < 0 on
|
||||
@@ -256,7 +268,7 @@ int sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(
|
||||
|
||||
See sd_booted(3) for more information.
|
||||
*/
|
||||
int sd_booted(void) _sd_hidden_;
|
||||
int sd_booted(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user