mirror of
https://github.com/systemd/systemd.git
synced 2024-12-26 03:22:00 +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;
|
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) {
|
static int sd_is_socket_internal(int fd, int type, int listening) {
|
||||||
struct stat st_fd;
|
struct stat st_fd;
|
||||||
|
|
||||||
|
@ -123,6 +123,18 @@ int sd_listen_fds(int unset_environment);
|
|||||||
*/
|
*/
|
||||||
int sd_is_fifo(int fd, const char *path);
|
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
|
Helper call for identifying a passed file descriptor. Returns 1 if
|
||||||
the file descriptor is a socket of the specified family (AF_INET,
|
the file descriptor is a socket of the specified family (AF_INET,
|
||||||
|
Loading…
Reference in New Issue
Block a user