Introduce a new subcommand "dump-send-stream" for "inspect-internal"
command group.
It will exam and output all operations inside a send stream.
It's quite a useful tool to learn and dig kernel send stream.
Signed-off-by: Qu Wenruo <quwenruo@xxxxxxxxxxxxxx>
---
Documentation/btrfs-inspect-internal.asciidoc | 8 +++
Makefile.in | 3 +-
cmds-inspect-dump-send.c | 84 +++++++++++++++++++++++++++
cmds-inspect-dump-send.h | 24 ++++++++
cmds-inspect.c | 3 +
5 files changed, 121 insertions(+), 1 deletion(-)
create mode 100644 cmds-inspect-dump-send.c
create mode 100644 cmds-inspect-dump-send.h
diff --git a/Documentation/btrfs-inspect-internal.asciidoc b/Documentation/btrfs-inspect-internal.asciidoc
index 74f6dea..8ba768d 100644
--- a/Documentation/btrfs-inspect-internal.asciidoc
+++ b/Documentation/btrfs-inspect-internal.asciidoc
@@ -146,6 +146,14 @@ Print sizes and statistics of trees.
-b::::
Print raw numbers in bytes.
+*dump-send-stream [options]*::
+exam and output all operations inside a send stream. Read from 'stdin' by default.
++
+`Options`
++
+-f|--file <file>::::
+Read from file instead of 'stdin'.
+
EXIT STATUS
-----------
*btrfs inspect-internal* returns a zero exit status if it succeeds. Non zero is
diff --git a/Makefile.in b/Makefile.in
index 97caf95..00bf639 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -86,7 +86,8 @@ cmds_objects = cmds-subvolume.o cmds-filesystem.o cmds-device.o cmds-scrub.o \
cmds-quota.o cmds-qgroup.o cmds-replace.o cmds-check.o \
cmds-restore.o cmds-rescue.o chunk-recover.o super-recover.o \
cmds-property.o cmds-fi-usage.o cmds-inspect-dump-tree.o \
- cmds-inspect-dump-super.o cmds-inspect-tree-stats.o cmds-fi-du.o
+ cmds-inspect-dump-super.o cmds-inspect-tree-stats.o \
+ cmds-fi-du.o cmds-inspect-dump-send.o
libbtrfs_objects = send-stream.o send-utils.o rbtree.o btrfs-list.o crc32c.o \
uuid-tree.o utils-lib.o rbtree-utils.o
libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \
diff --git a/cmds-inspect-dump-send.c b/cmds-inspect-dump-send.c
new file mode 100644
index 0000000..46a3cd6
--- /dev/null
+++ b/cmds-inspect-dump-send.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2016 Fujitsu. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License v2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <getopt.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "kerncompat.h"
+#include "ctree.h"
+#include "send-dump.h"
+#include "send-stream.h"
+#include "utils.h"
+#include "commands.h"
+
+const char * const cmd_inspect_dump_send_usage[] = {
+ "btrfs inspect-internal dump-send-stream [options]",
+ "Dump the operations of a send stream from stdin",
+ "-f|--file <file> read send stream from file",
+ "-h|--help print this message",
+ NULL
+};
+
+int cmd_inspect_dump_send(int argc, char **argv)
+{
+ struct btrfs_dump_send_args dump_args;
+ int fd = 0;
+ int ret;
+
+ while (1) {
+ int c;
+ static const struct option long_options[] = {
+ { "file", required_argument, NULL, 'f' },
+ { "help", no_argument, NULL, 'h' },
+ { NULL, 0, NULL, 0 }
+ };
+
+ c = getopt_long(argc, argv, "f:h", long_options, NULL);
+ if (c < 0)
+ break;
+ switch(c) {
+ case 'f':
+ fd = open(optarg, O_RDONLY, 0666);
+ if (fd < 0) {
+ error("cannot open %s: %s", optarg,
+ strerror(errno));
+ exit(1);
+ }
+ break;
+ case 'h':
+ default:
+ usage(cmd_inspect_dump_send_usage);
+ break;
+ }
+ }
+ dump_args.root_path = malloc(PATH_MAX);
+ dump_args.root_path[0] = '.';
+ dump_args.root_path[1] = '\0';
+ dump_args.full_subvol_path = malloc(PATH_MAX);
+ dump_args.full_subvol_path[0] = '.';
+ dump_args.full_subvol_path[1] = '\0';
+
+ ret = btrfs_read_and_process_send_stream(fd, &btrfs_print_send_ops,
+ &dump_args, 0, 0);
+ if (ret < 0)
+ error("failed to read the send stream: %s\n", strerror(-ret));
+ close(fd);
+ return ret;
+}
diff --git a/cmds-inspect-dump-send.h b/cmds-inspect-dump-send.h
new file mode 100644
index 0000000..49c8034
--- /dev/null
+++ b/cmds-inspect-dump-send.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2016 Fujitsu. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License v2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program.
+ */
+
+#ifndef __CMDS_INSPECT_DUMP_SEND_H__
+#define __CMDS_INSPECT_DUMP_SEND_H__
+
+int cmd_inspect_dump_send(int argc, char **argv);
+
+extern const char * const cmd_inspect_dump_send_usage[];
+
+#endif
diff --git a/cmds-inspect.c b/cmds-inspect.c
index 4b7cea0..98653d5 100644
--- a/cmds-inspect.c
+++ b/cmds-inspect.c
@@ -34,6 +34,7 @@
#include "cmds-inspect-dump-tree.h"
#include "cmds-inspect-dump-super.h"
#include "cmds-inspect-tree-stats.h"
+#include "cmds-inspect-dump-send.h"
static const char * const inspect_cmd_group_usage[] = {
"btrfs inspect-internal <command> <args>",
@@ -642,6 +643,8 @@ const struct cmd_group inspect_cmd_group = {
cmd_inspect_dump_super_usage, NULL, 0 },
{ "tree-stats", cmd_inspect_tree_stats,
cmd_inspect_tree_stats_usage, NULL, 0 },
+ { "dump-send-stream", cmd_inspect_dump_send,
+ cmd_inspect_dump_send_usage, NULL, 0 },
NULL_CMD_STRUCT
}
};
--
2.9.0
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html