]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_io: refactor stat functions, add raw dump
authorEric Sandeen <sandeen@sandeen.net>
Mon, 10 Apr 2017 22:33:38 +0000 (17:33 -0500)
committerEric Sandeen <sandeen@redhat.com>
Mon, 10 Apr 2017 22:33:38 +0000 (17:33 -0500)
This adds a "-r" raw structure dump to stat options, and
factors the code a bit; statx will also use print_file_info
and print_xfs_info.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
io/stat.c
man/man8/xfs_io.8

index 3ae99039b14de6c6fac1eab4a224b8c6417ace73..770f3c7860dbafd8163a2e5e64b33d65343e5b83 100644 (file)
--- a/io/stat.c
+++ b/io/stat.c
@@ -59,16 +59,32 @@ filetype(mode_t mode)
        return NULL;
 }
 
-int
-stat_f(
-       int             argc,
-       char            **argv)
+static int
+dump_raw_stat(struct stat *st)
 {
-       struct dioattr  dio;
-       struct fsxattr  fsx, fsxa;
-       struct stat     st;
-       int             verbose = (argc == 2 && !strcmp(argv[1], "-v"));
+       printf("stat.blksize = %lu\n", st->st_blksize);
+       printf("stat.nlink = %lu\n", st->st_nlink);
+       printf("stat.uid = %u\n", st->st_uid);
+       printf("stat.gid = %u\n", st->st_gid);
+       printf("stat.mode: 0%o\n", st->st_mode);
+       printf("stat.ino = %lu\n", st->st_ino);
+       printf("stat.size = %lu\n", st->st_size);
+       printf("stat.blocks = %lu\n", st->st_blocks);
+       printf("stat.atime.tv_sec = %ld\n", st->st_atim.tv_sec);
+       printf("stat.atime.tv_nsec = %ld\n", st->st_atim.tv_nsec);
+       printf("stat.ctime.tv_sec = %ld\n", st->st_ctim.tv_sec);
+       printf("stat.ctime.tv_nsec = %ld\n", st->st_ctim.tv_nsec);
+       printf("stat.mtime.tv_sec = %ld\n", st->st_mtim.tv_sec);
+       printf("stat.mtime.tv_nsec = %ld\n", st->st_mtim.tv_nsec);
+       printf("stat.rdev_major = %u\n", major(st->st_rdev));
+       printf("stat.rdev_minor = %u\n", minor(st->st_rdev));
+       printf("stat.dev_major = %u\n", major(st->st_dev));
+       printf("stat.dev_minor = %u\n", minor(st->st_dev));
+       return 0;
+}
 
+void print_file_info(void)
+{
        printf(_("fd.path = \"%s\"\n"), file->name);
        printf(_("fd.flags = %s,%s,%s%s%s%s%s\n"),
                file->flags & IO_OSYNC ? _("sync") : _("non-sync"),
@@ -78,21 +94,13 @@ stat_f(
                file->flags & IO_APPEND ? _(",append-only") : "",
                file->flags & IO_NONBLOCK ? _(",non-block") : "",
                file->flags & IO_TMPFILE ? _(",tmpfile") : "");
-       if (fstat(file->fd, &st) < 0) {
-               perror("fstat");
-       } else {
-               printf(_("stat.ino = %lld\n"), (long long)st.st_ino);
-               printf(_("stat.type = %s\n"), filetype(st.st_mode));
-               printf(_("stat.size = %lld\n"), (long long)st.st_size);
-               printf(_("stat.blocks = %lld\n"), (long long)st.st_blocks);
-               if (verbose) {
-                       printf(_("stat.atime = %s"), ctime(&st.st_atime));
-                       printf(_("stat.mtime = %s"), ctime(&st.st_mtime));
-                       printf(_("stat.ctime = %s"), ctime(&st.st_ctime));
-               }
-       }
-       if (file->flags & IO_FOREIGN)
-               return 0;
+}
+
+void print_xfs_info(int verbose)
+{
+       struct dioattr  dio;
+       struct fsxattr  fsx, fsxa;
+
        if ((xfsctl(file->name, file->fd, FS_IOC_FSGETXATTR, &fsx)) < 0 ||
            (xfsctl(file->name, file->fd, XFS_IOC_FSGETXATTRA, &fsxa)) < 0) {
                perror("FS_IOC_FSGETXATTR");
@@ -112,6 +120,57 @@ stat_f(
                printf(_("dioattr.miniosz = %u\n"), dio.d_miniosz);
                printf(_("dioattr.maxiosz = %u\n"), dio.d_maxiosz);
        }
+}
+
+int
+stat_f(
+       int             argc,
+       char            **argv)
+{
+       struct stat     st;
+       int             c, verbose = 0, raw = 0;
+
+       while ((c = getopt(argc, argv, "rv")) != EOF) {
+               switch (c) {
+               case 'r':
+                       raw = 1;
+                       break;
+               case 'v':
+                       verbose = 1;
+                       break;
+               default:
+                       return command_usage(&stat_cmd);
+               }
+       }
+
+       if (raw && verbose)
+               return command_usage(&stat_cmd);
+
+       if (fstat(file->fd, &st) < 0) {
+               perror("fstat");
+               return 0;
+       }
+
+       if (raw)
+               return dump_raw_stat(&st);
+
+       print_file_info();
+
+       printf(_("stat.ino = %lld\n"), (long long)st.st_ino);
+       printf(_("stat.type = %s\n"), filetype(st.st_mode));
+       printf(_("stat.size = %lld\n"), (long long)st.st_size);
+       printf(_("stat.blocks = %lld\n"), (long long)st.st_blocks);
+       if (verbose) {
+               printf(_("stat.atime = %s"), ctime(&st.st_atime));
+               printf(_("stat.mtime = %s"), ctime(&st.st_mtime));
+               printf(_("stat.ctime = %s"), ctime(&st.st_ctime));
+       }
+
+       if (file->flags & IO_FOREIGN)
+               return 0;
+
+       print_xfs_info(verbose);
+
        return 0;
 }
 
@@ -175,7 +234,7 @@ stat_init(void)
        stat_cmd.argmin = 0;
        stat_cmd.argmax = 1;
        stat_cmd.flags = CMD_NOMAP_OK | CMD_FOREIGN_OK;
-       stat_cmd.args = _("[-v]");
+       stat_cmd.args = _("[-v|-r]");
        stat_cmd.oneline = _("statistics on the currently open file");
 
        statfs_cmd.name = "statfs";
index 19e1ae4968955d7e6abc1fbcfe23bcd6a5eda1fc..e3843276c3d5a9c05e13ecfa955e40b34dbb5d3f 100644 (file)
@@ -872,13 +872,15 @@ Only available in expert mode and requires privileges.
 Force the filesystem to shutdown (with or without flushing the log).
 Only available in expert mode and requires privileges.
 .TP
-.BR stat " [ " \-v " ]"
+.BR stat " [ " \-v "|" \-r " ]"
 Selected statistics from
 .BR stat (2)
 and the XFS_IOC_GETXATTR system call on the current file. If the
 .B \-v
 option is specified, the atime (last access), mtime
-(last modify), and ctime (last change) timestamps are also displayed.
+(last modify), and ctime (last change) timestamps are also displayed.  The
+.B \-r
+option dumps raw fields from the stat structure.
 .TP
 .B statfs
 Selected statistics from