mirror of
https://github.com/kdave/btrfs-progs
synced 2025-01-03 12:12:05 +00:00
btrfs-progs: inspect rootid: Allow a file to be specified
Since cmd_inspect_rootid() calls btrfs_open_dir(), it rejects a file to be specified. But as the document says, a file should be supported. This patch introduces btrfs_open_file_or_dir(), which is a counterpart of btrfs_open_dir(), to safely check and open btrfs file or directory. The original btrfs_open_dir() content is moved to btrfs_open() and shared by both function. Signed-off-by: Tomohiro Misono <misono.tomohiro@jp.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
f47587d83d
commit
88ef0b8397
@ -318,7 +318,7 @@ static int cmd_inspect_rootid(int argc, char **argv)
|
||||
if (check_argc_exact(argc - optind, 1))
|
||||
usage(cmd_inspect_rootid_usage);
|
||||
|
||||
fd = btrfs_open_dir(argv[optind], &dirstream, 1);
|
||||
fd = btrfs_open_file_or_dir(argv[optind], &dirstream, 1);
|
||||
if (fd < 0) {
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
|
16
utils.c
16
utils.c
@ -568,9 +568,9 @@ int open_path_or_dev_mnt(const char *path, DIR **dirstream, int verbose)
|
||||
/*
|
||||
* Do the following checks before calling open_file_or_dir():
|
||||
* 1: path is in a btrfs filesystem
|
||||
* 2: path is a directory
|
||||
* 2: path is a directory if dir_only is 1
|
||||
*/
|
||||
int btrfs_open_dir(const char *path, DIR **dirstream, int verbose)
|
||||
int btrfs_open(const char *path, DIR **dirstream, int verbose, int dir_only)
|
||||
{
|
||||
struct statfs stfs;
|
||||
struct stat st;
|
||||
@ -593,7 +593,7 @@ int btrfs_open_dir(const char *path, DIR **dirstream, int verbose)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!S_ISDIR(st.st_mode)) {
|
||||
if (dir_only && !S_ISDIR(st.st_mode)) {
|
||||
error_on(verbose, "not a directory: %s", path);
|
||||
return -3;
|
||||
}
|
||||
@ -607,6 +607,16 @@ int btrfs_open_dir(const char *path, DIR **dirstream, int verbose)
|
||||
return ret;
|
||||
}
|
||||
|
||||
int btrfs_open_dir(const char *path, DIR **dirstream, int verbose)
|
||||
{
|
||||
return btrfs_open(path, dirstream, verbose, 1);
|
||||
}
|
||||
|
||||
int btrfs_open_file_or_dir(const char *path, DIR **dirstream, int verbose)
|
||||
{
|
||||
return btrfs_open(path, dirstream, verbose, 0);
|
||||
}
|
||||
|
||||
/* checks if a device is a loop device */
|
||||
static int is_loop_device (const char* device) {
|
||||
struct stat statbuf;
|
||||
|
2
utils.h
2
utils.h
@ -108,7 +108,9 @@ int is_block_device(const char *file);
|
||||
int is_mount_point(const char *file);
|
||||
int check_arg_type(const char *input);
|
||||
int open_path_or_dev_mnt(const char *path, DIR **dirstream, int verbose);
|
||||
int btrfs_open(const char *path, DIR **dirstream, int verbose, int dir_only);
|
||||
int btrfs_open_dir(const char *path, DIR **dirstream, int verbose);
|
||||
int btrfs_open_file_or_dir(const char *path, DIR **dirstream, int verbose);
|
||||
u64 btrfs_device_size(int fd, struct stat *st);
|
||||
/* Helper to always get proper size of the destination string */
|
||||
#define strncpy_null(dest, src) __strncpy_null(dest, src, sizeof(dest))
|
||||
|
Loading…
Reference in New Issue
Block a user