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;
+ mode_t mode;
+ int r = get_mode (path, &mode);
+ if (r <= 0) return r;
+ return S_ISREG (mode);
+}
- CHROOT_IN;
- r = lstat (path, &buf);
- CHROOT_OUT;
+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);
+}
- if (r == -1) {
- if (errno != ENOENT && errno != ENOTDIR) {
- reply_with_perror ("stat: %s", path);
- return -1;
- }
- else
- return 0; /* Not a file. */
- }
+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);
+}
- return S_ISREG (buf.st_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_dir (const char *path)
+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;
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;
}
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