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.
This commit is contained in:
William Douglas 2011-06-16 14:21:11 -07:00 committed by Lennart Poettering
parent 8003c705f2
commit 4160ec67ba
2 changed files with 48 additions and 0 deletions

View File

@ -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;

View File

@ -123,6 +123,18 @@ int sd_listen_fds(int unset_environment);
*/
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,