mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
New APIs: is-chardev, is-blockdev, is-fifo, is-symlink, is-socket
These complement the existing is-file and is-dir APIs.
This commit is contained in:
82
daemon/is.c
82
daemon/is.c
@@ -41,30 +41,73 @@ do_exists (const char *path)
|
||||
return r == 0;
|
||||
}
|
||||
|
||||
static int get_mode (const char *path, mode_t *mode);
|
||||
|
||||
int
|
||||
do_is_file (const char *path)
|
||||
{
|
||||
int r;
|
||||
struct stat buf;
|
||||
|
||||
CHROOT_IN;
|
||||
r = lstat (path, &buf);
|
||||
CHROOT_OUT;
|
||||
|
||||
if (r == -1) {
|
||||
if (errno != ENOENT && errno != ENOTDIR) {
|
||||
reply_with_perror ("stat: %s", path);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
return 0; /* Not a file. */
|
||||
}
|
||||
|
||||
return S_ISREG (buf.st_mode);
|
||||
mode_t mode;
|
||||
int r = get_mode (path, &mode);
|
||||
if (r <= 0) return r;
|
||||
return S_ISREG (mode);
|
||||
}
|
||||
|
||||
int
|
||||
do_is_dir (const char *path)
|
||||
{
|
||||
mode_t mode;
|
||||
int r = get_mode (path, &mode);
|
||||
if (r <= 0) return r;
|
||||
return S_ISDIR (mode);
|
||||
}
|
||||
|
||||
int
|
||||
do_is_chardev (const char *path)
|
||||
{
|
||||
mode_t mode;
|
||||
int r = get_mode (path, &mode);
|
||||
if (r <= 0) return r;
|
||||
return S_ISCHR (mode);
|
||||
}
|
||||
|
||||
int
|
||||
do_is_blockdev (const char *path)
|
||||
{
|
||||
mode_t mode;
|
||||
int r = get_mode (path, &mode);
|
||||
if (r <= 0) return r;
|
||||
return S_ISBLK (mode);
|
||||
}
|
||||
|
||||
int
|
||||
do_is_fifo (const char *path)
|
||||
{
|
||||
mode_t mode;
|
||||
int r = get_mode (path, &mode);
|
||||
if (r <= 0) return r;
|
||||
return S_ISFIFO (mode);
|
||||
}
|
||||
|
||||
int
|
||||
do_is_symlink (const char *path)
|
||||
{
|
||||
mode_t mode;
|
||||
int r = get_mode (path, &mode);
|
||||
if (r <= 0) return r;
|
||||
return S_ISLNK (mode);
|
||||
}
|
||||
|
||||
int
|
||||
do_is_socket (const char *path)
|
||||
{
|
||||
mode_t mode;
|
||||
int r = get_mode (path, &mode);
|
||||
if (r <= 0) return r;
|
||||
return S_ISSOCK (mode);
|
||||
}
|
||||
|
||||
static int
|
||||
get_mode (const char *path, mode_t *mode)
|
||||
{
|
||||
int r;
|
||||
struct stat buf;
|
||||
@@ -79,8 +122,9 @@ do_is_dir (const char *path)
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
return 0; /* Not a directory. */
|
||||
return 0; /* Doesn't exist, means return false. */
|
||||
}
|
||||
|
||||
return S_ISDIR (buf.st_mode);
|
||||
*mode = buf.st_mode;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
266
|
||||
271
|
||||
|
||||
@@ -5356,6 +5356,68 @@ filesystem can be found.
|
||||
|
||||
To find the label of a filesystem, use C<guestfs_vfs_label>.");
|
||||
|
||||
("is_chardev", (RBool "flag", [Pathname "path"]), 267, [],
|
||||
[InitISOFS, Always, TestOutputFalse (
|
||||
[["is_chardev"; "/directory"]]);
|
||||
InitBasicFS, Always, TestOutputTrue (
|
||||
[["mknod_c"; "0o777"; "99"; "66"; "/test"];
|
||||
["is_chardev"; "/test"]])],
|
||||
"test if character device",
|
||||
"\
|
||||
This returns C<true> if and only if there is a character device
|
||||
with the given C<path> name.
|
||||
|
||||
See also C<guestfs_stat>.");
|
||||
|
||||
("is_blockdev", (RBool "flag", [Pathname "path"]), 268, [],
|
||||
[InitISOFS, Always, TestOutputFalse (
|
||||
[["is_blockdev"; "/directory"]]);
|
||||
InitBasicFS, Always, TestOutputTrue (
|
||||
[["mknod_b"; "0o777"; "99"; "66"; "/test"];
|
||||
["is_blockdev"; "/test"]])],
|
||||
"test if block device",
|
||||
"\
|
||||
This returns C<true> if and only if there is a block device
|
||||
with the given C<path> name.
|
||||
|
||||
See also C<guestfs_stat>.");
|
||||
|
||||
("is_fifo", (RBool "flag", [Pathname "path"]), 269, [],
|
||||
[InitISOFS, Always, TestOutputFalse (
|
||||
[["is_fifo"; "/directory"]]);
|
||||
InitBasicFS, Always, TestOutputTrue (
|
||||
[["mkfifo"; "0o777"; "/test"];
|
||||
["is_fifo"; "/test"]])],
|
||||
"test if FIFO (named pipe)",
|
||||
"\
|
||||
This returns C<true> if and only if there is a FIFO (named pipe)
|
||||
with the given C<path> name.
|
||||
|
||||
See also C<guestfs_stat>.");
|
||||
|
||||
("is_symlink", (RBool "flag", [Pathname "path"]), 270, [],
|
||||
[InitISOFS, Always, TestOutputFalse (
|
||||
[["is_symlink"; "/directory"]]);
|
||||
InitISOFS, Always, TestOutputTrue (
|
||||
[["is_symlink"; "/abssymlink"]])],
|
||||
"test if symbolic link",
|
||||
"\
|
||||
This returns C<true> if and only if there is a symbolic link
|
||||
with the given C<path> name.
|
||||
|
||||
See also C<guestfs_stat>.");
|
||||
|
||||
("is_socket", (RBool "flag", [Pathname "path"]), 271, [],
|
||||
(* XXX Need a positive test for sockets. *)
|
||||
[InitISOFS, Always, TestOutputFalse (
|
||||
[["is_socket"; "/directory"]])],
|
||||
"test if socket",
|
||||
"\
|
||||
This returns C<true> if and only if there is a Unix domain socket
|
||||
with the given C<path> name.
|
||||
|
||||
See also C<guestfs_stat>.");
|
||||
|
||||
]
|
||||
|
||||
let all_functions = non_daemon_functions @ daemon_functions
|
||||
|
||||
Reference in New Issue
Block a user