mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
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:
parent
8003c705f2
commit
4160ec67ba
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user