diff options
author | William Douglas <william.r.douglas@gmail.com> | 2011-06-16 14:21:11 -0700 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2011-06-20 17:54:17 +0200 |
commit | 4160ec67ba40eee5d14c5b96d37c89a3a5356f34 (patch) | |
tree | 89859eae2e7fff8f4b95d3355926a6936e47cec1 /src | |
parent | 8003c705f2d1000abaf87ebe56f022b8324d78cc (diff) |
sd-daemon: Add sd_is_special for special file descriptors
With the addition of ListenSpecial as a socket option we need the
the usual sd_is_ functions for special files. This patch does
that.
Diffstat (limited to 'src')
-rw-r--r-- | src/sd-daemon.c | 36 | ||||
-rw-r--r-- | src/sd-daemon.h | 12 |
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 |