summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sd-daemon.c36
-rw-r--r--src/sd-daemon.h12
2 files changed, 48 insertions, 0 deletions
diff --git a/src/sd-daemon.c b/src/sd-daemon.c
index d9f23d677b..a2ec74cceb 100644
--- a/src/sd-daemon.c
+++ b/src/sd-daemon.c
@@ -169,6 +169,42 @@ _sd_hidden_ 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;
diff --git a/src/sd-daemon.h b/src/sd-daemon.h
index 884c36107d..46dc7fd7e5 100644
--- a/src/sd-daemon.h
+++ b/src/sd-daemon.h
@@ -125,6 +125,18 @@ 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
the file descriptor is a socket of the specified family (AF_INET,
...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If
family is 0 a socket family check will not be done. If type is 0 a