diff --git a/.gitignore b/.gitignore index 3085816..0db515f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,24 +10,7 @@ cachegrind.* \#*\# core -thin_check -thin_delta -thin_dump -thin_restore -thin_repair -thin_rmap -thin_metadata_size - -cache_check -cache_dump -cache_restore -cache_repair -cache_metadata_size - -era_check -era_dump -era_invalidate -era_restore +bin/pdata_tools *.metadata bad-metadata diff --git a/Makefile.in b/Makefile.in index e846b26..47bb267 100644 --- a/Makefile.in +++ b/Makefile.in @@ -19,69 +19,54 @@ .PHONY: all V=@ -PROGRAMS=\ - cache_check \ - cache_dump \ - cache_restore \ - cache_repair \ - cache_metadata_size \ - \ - era_check \ - era_dump \ - era_invalidate \ - era_restore \ - \ - thin_check \ - thin_delta \ - thin_dump \ - thin_restore \ - thin_repair \ - thin_rmap \ - thin_metadata_size -all: $(PROGRAMS) +all: bin/pdata_tools SOURCE=\ - block-cache/block_cache.cc \ - \ + base/application.cc \ base/base64.cc \ base/endian_utils.cc \ base/error_state.cc \ base/progress_monitor.cc \ base/xml_utils.cc \ - \ + block-cache/block_cache.cc \ + caching/cache_check.cc \ + caching/cache_dump.cc \ + caching/cache_metadata_size.cc \ + caching/cache_repair.cc \ + caching/cache_restore.cc \ caching/hint_array.cc \ - caching/superblock.cc \ caching/mapping_array.cc \ caching/metadata.cc \ caching/metadata_dump.cc \ caching/restore_emitter.cc \ + caching/superblock.cc \ caching/xml_format.cc \ - \ era/era_array.cc \ + era/era_check.cc \ era/era_detail.cc \ - era/superblock.cc \ - era/writeset_tree.cc \ + era/era_dump.cc \ + era/era_invalidate.cc \ + era/era_restore.cc \ era/metadata.cc \ era/metadata_dump.cc \ era/restore_emitter.cc \ + era/superblock.cc \ + era/writeset_tree.cc \ era/xml_format.cc \ - \ + main.cc \ persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/transaction_manager.cc \ - \ persistent-data/data-structures/bitset.cc \ persistent-data/data-structures/bloom_filter.cc \ persistent-data/data-structures/btree.cc \ - \ - persistent-data/space_map.cc \ + persistent-data/error_set.cc \ + persistent-data/file_utils.cc \ + persistent-data/hex_dump.cc \ + persistent-data/space-maps/careful_alloc.cc \ persistent-data/space-maps/disk.cc \ persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - \ + persistent-data/space_map.cc \ + persistent-data/transaction_manager.cc \ thin-provisioning/device_tree.cc \ thin-provisioning/human_readable_format.cc \ thin-provisioning/mapping_tree.cc \ @@ -91,33 +76,15 @@ SOURCE=\ thin-provisioning/restore_emitter.cc \ thin-provisioning/rmap_visitor.cc \ thin-provisioning/superblock.cc \ - thin-provisioning/thin_pool.cc \ - thin-provisioning/xml_format.cc - -PDATA_OBJECTS=$(subst .cc,.o,$(SOURCE)) - -CXX_PROGRAM_SOURCE=\ - caching/cache_check.cc \ - caching/cache_dump.cc \ - caching/cache_restore.cc \ - caching/cache_metadata_size.cc \ - caching/cache_repair.cc \ - \ - era/era_check.cc \ - era/era_dump.cc \ - era/era_invalidate.cc \ - era/era_restore.cc \ - \ thin-provisioning/thin_check.cc \ thin-provisioning/thin_delta.cc \ thin-provisioning/thin_dump.cc \ - thin-provisioning/thin_restore.cc \ + thin-provisioning/thin_metadata_size.cc \ + thin-provisioning/thin_pool.cc \ thin-provisioning/thin_repair.cc \ + thin-provisioning/thin_restore.cc \ thin-provisioning/thin_rmap.cc \ - thin-provisioning/thin_metadata_size.cc - -C_PROGRAM_SOURCE=\ - thin-provisioning/thin_metadata_size.c + thin-provisioning/xml_format.cc CC:=@CC@ CXX:=@CXX@ @@ -129,8 +96,7 @@ CXXFLAGS+=-g -Wall -fno-strict-aliasing CXXFLAGS+=@CXXOPTIMISE_FLAG@ CXXFLAGS+=@CXXDEBUG_FLAG@ INCLUDES+=-I$(TOP_BUILDDIR) -I$(TOP_DIR) -I$(TOP_DIR)/thin-provisioning -LIBS:=-lstdc++ -laio -LIBEXPAT:=-lexpat +LIBS:=-lstdc++ -laio -lexpat INSTALL:=@INSTALL@ PREFIX:=@prefix@ BINDIR:=$(DESTDIR)$(PREFIX)/sbin @@ -153,14 +119,6 @@ endif .SUFFIXES: .d -%.o: %.c - @echo " [CC] $<" - $(V) $(CC) -c $(INCLUDES) $(CFLAGS) -o $@ $< - @echo " [DEP] $<" - $(V) $(CC) -MM -MT $(subst .c,.o,$<) $(INCLUDES) $(CFLAGS) $< > $*.$$$$; \ - sed 's,\([^ :]*\)\.o[ :]*,\1.o \1.gmo $* : Makefile ,g' < $*.$$$$ > $*.d; \ - $(RM) $*.$$$$ - %.o: %.cc @echo " [CXX] $<" $(V) $(CXX) -c $(INCLUDES) $(CXXFLAGS) -o $@ $< @@ -171,334 +129,14 @@ endif #---------------------------------------------------------------- -lib/libpdata.a: $(PDATA_OBJECTS) +lib/libpdata.a: $(OBJECTS) @echo " [AR] $<" - $(V)ar -rv $@ $(PDATA_OBJECTS) > /dev/null 2>&1 + $(V)ar -rv $@ $(OBJECTS) > /dev/null 2>&1 -#---------------------------------------------------------------- -# Thin provisioning tools - -THIN_DEBUG_SOURCE=$(SOURCE) -THIN_DUMP_SOURCE=$(SOURCE) -THIN_REPAIR_SOURCE=$(SOURCE) -THIN_RESTORE_SOURCE=$(SOURCE) -THIN_CHECK_SOURCE=\ - block-cache/block_cache.cc \ - \ - base/error_state.cc \ - base/endian_utils.cc \ - base/progress_monitor.cc \ - base/xml_utils.cc \ - \ - persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/data-structures/btree.cc \ - persistent-data/space_map.cc \ - persistent-data/space-maps/disk.cc \ - persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - persistent-data/transaction_manager.cc \ - \ - thin-provisioning/device_tree.cc \ - thin-provisioning/mapping_tree.cc \ - thin-provisioning/metadata.cc \ - thin-provisioning/metadata_checker.cc \ - thin-provisioning/superblock.cc - -THIN_DELTA_SOURCE=\ - block-cache/block_cache.cc \ - \ - base/error_state.cc \ - base/endian_utils.cc \ - base/progress_monitor.cc \ - base/xml_utils.cc \ - \ - persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/data-structures/btree.cc \ - persistent-data/space_map.cc \ - persistent-data/space-maps/disk.cc \ - persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - persistent-data/transaction_manager.cc \ - \ - thin-provisioning/device_tree.cc \ - thin-provisioning/mapping_tree.cc \ - thin-provisioning/metadata.cc \ - thin-provisioning/metadata_checker.cc \ - thin-provisioning/superblock.cc - -THIN_RMAP_SOURCE=\ - block-cache/block_cache.cc \ - \ - base/endian_utils.cc \ - \ - persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/data-structures/btree.cc \ - persistent-data/space_map.cc \ - persistent-data/space-maps/disk.cc \ - persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - persistent-data/transaction_manager.cc \ - thin-provisioning/device_tree.cc \ - thin-provisioning/mapping_tree.cc \ - thin-provisioning/metadata.cc \ - thin-provisioning/metadata_checker.cc \ - thin-provisioning/rmap_visitor.cc \ - thin-provisioning/superblock.cc - -THIN_DEBUG_OBJECTS=$(subst .cc,.o,$(THIN_DEBUG_SOURCE)) -THIN_DUMP_OBJECTS=$(subst .cc,.o,$(THIN_DUMP_SOURCE)) -THIN_REPAIR_OBJECTS=$(subst .cc,.o,$(THIN_REPAIR_SOURCE)) -THIN_RESTORE_OBJECTS=$(subst .cc,.o,$(THIN_RESTORE_SOURCE)) -THIN_CHECK_OBJECTS=$(subst .cc,.o,$(THIN_CHECK_SOURCE)) -THIN_DELTA_OBJECTS=$(subst .cc,.o,$(THIN_DELTA_SOURCE)) -THIN_RMAP_OBJECTS=$(subst .cc,.o,$(THIN_RMAP_SOURCE)) - -thin_debug: $(THIN_DEBUG_OBJECTS) thin-provisioning/thin_debug.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -thin_repair: $(THIN_REPAIR_OBJECTS) thin-provisioning/thin_repair.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -thin_dump: $(THIN_DUMP_OBJECTS) thin-provisioning/thin_dump.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -thin_restore: $(THIN_RESTORE_OBJECTS) thin-provisioning/thin_restore.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -thin_check: $(THIN_CHECK_OBJECTS) thin-provisioning/thin_check.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -thin_delta: $(THIN_DELTA_OBJECTS) thin-provisioning/thin_delta.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -thin_rmap: $(THIN_RMAP_OBJECTS) thin-provisioning/thin_rmap.o +bin/pdata_tools: $(OBJECTS) @echo " [LD] $@" $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) -thin_metadata_size: thin-provisioning/thin_metadata_size.o - @echo " [LD] $@" - $(V) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $+ -lm - -#---------------------------------------------------------------- -# Cache tools - -CACHE_CHECK_SOURCE=\ - block-cache/block_cache.cc \ - \ - base/base64.cc \ - base/error_state.cc \ - base/endian_utils.cc \ - base/progress_monitor.cc \ - base/xml_utils.cc \ - \ - persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/data-structures/btree.cc \ - persistent-data/data-structures/bitset.cc \ - persistent-data/space_map.cc \ - persistent-data/space-maps/disk.cc \ - persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - persistent-data/transaction_manager.cc \ - \ - caching/hint_array.cc \ - caching/superblock.cc \ - caching/mapping_array.cc \ - caching/metadata.cc \ - caching/metadata_dump.cc \ - caching/restore_emitter.cc \ - caching/xml_format.cc - -CACHE_CHECK_OBJECTS=$(subst .cc,.o,$(CACHE_CHECK_SOURCE)) - -CACHE_DUMP_SOURCE=$(SOURCE) -CACHE_DUMP_OBJECTS=$(subst .cc,.o,$(CACHE_DUMP_SOURCE)) - -CACHE_REPAIR_SOURCE=$(SOURCE) -CACHE_REPAIR_OBJECTS=$(subst .cc,.o,$(CACHE_REPAIR_SOURCE)) - -CACHE_RESTORE_SOURCE=$(SOURCE) -CACHE_RESTORE_OBJECTS=$(subst .cc,.o,$(CACHE_RESTORE_SOURCE)) - -cache_check: $(CACHE_CHECK_OBJECTS) caching/cache_check.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -cache_dump: $(CACHE_DUMP_OBJECTS) caching/cache_dump.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -cache_repair: $(CACHE_REPAIR_OBJECTS) caching/cache_repair.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -cache_restore: $(CACHE_RESTORE_OBJECTS) caching/cache_restore.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -cache_metadata_size: caching/cache_metadata_size.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) - -#---------------------------------------------------------------- -# Era tools - -ERA_CHECK_SOURCE=\ - block-cache/block_cache.cc \ - \ - base/base64.cc \ - base/error_state.cc \ - base/endian_utils.cc \ - base/progress_monitor.cc \ - base/xml_utils.cc \ - \ - era/writeset_tree.cc \ - era/era_detail.cc \ - era/era_array.cc \ - era/metadata.cc \ - era/superblock.cc \ - \ - persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/data-structures/btree.cc \ - persistent-data/data-structures/bitset.cc \ - persistent-data/space_map.cc \ - persistent-data/space-maps/disk.cc \ - persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - persistent-data/transaction_manager.cc \ - -ERA_CHECK_OBJECTS=$(subst .cc,.o,$(ERA_CHECK_SOURCE)) - -era_check: $(ERA_CHECK_OBJECTS) era/era_check.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -ERA_DUMP_SOURCE=\ - block-cache/block_cache.cc \ - \ - base/base64.cc \ - base/error_state.cc \ - base/endian_utils.cc \ - base/progress_monitor.cc \ - base/xml_utils.cc \ - \ - era/writeset_tree.cc \ - era/era_detail.cc \ - era/era_array.cc \ - era/metadata.cc \ - era/metadata_dump.cc \ - era/superblock.cc \ - era/xml_format.cc \ - \ - persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/data-structures/btree.cc \ - persistent-data/data-structures/bitset.cc \ - persistent-data/space_map.cc \ - persistent-data/space-maps/disk.cc \ - persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - persistent-data/transaction_manager.cc \ - -ERA_DUMP_OBJECTS=$(subst .cc,.o,$(ERA_DUMP_SOURCE)) - -era_dump: $(ERA_DUMP_OBJECTS) era/era_dump.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -ERA_INVALIDATE_SOURCE=\ - block-cache/block_cache.cc \ - \ - base/base64.cc \ - base/error_state.cc \ - base/endian_utils.cc \ - base/progress_monitor.cc \ - base/xml_utils.cc \ - \ - era/writeset_tree.cc \ - era/era_detail.cc \ - era/era_array.cc \ - era/metadata.cc \ - era/metadata_dump.cc \ - era/superblock.cc \ - era/xml_format.cc \ - \ - persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/data-structures/btree.cc \ - persistent-data/data-structures/bitset.cc \ - persistent-data/space_map.cc \ - persistent-data/space-maps/disk.cc \ - persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - persistent-data/transaction_manager.cc \ - -ERA_INVALIDATE_OBJECTS=$(subst .cc,.o,$(ERA_INVALIDATE_SOURCE)) - -era_invalidate: $(ERA_INVALIDATE_OBJECTS) era/era_invalidate.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - -ERA_RESTORE_SOURCE=\ - block-cache/block_cache.cc \ - \ - base/base64.cc \ - base/error_state.cc \ - base/endian_utils.cc \ - base/progress_monitor.cc \ - base/xml_utils.cc \ - \ - era/writeset_tree.cc \ - era/era_detail.cc \ - era/era_array.cc \ - era/metadata.cc \ - era/metadata_dump.cc \ - era/restore_emitter.cc \ - era/superblock.cc \ - era/xml_format.cc \ - \ - persistent-data/checksum.cc \ - persistent-data/error_set.cc \ - persistent-data/file_utils.cc \ - persistent-data/hex_dump.cc \ - persistent-data/data-structures/btree.cc \ - persistent-data/data-structures/bitset.cc \ - persistent-data/space_map.cc \ - persistent-data/space-maps/disk.cc \ - persistent-data/space-maps/recursive.cc \ - persistent-data/space-maps/careful_alloc.cc \ - persistent-data/transaction_manager.cc \ - -ERA_RESTORE_OBJECTS=$(subst .cc,.o,$(ERA_RESTORE_SOURCE)) - -era_restore: $(ERA_RESTORE_OBJECTS) era/era_restore.o - @echo " [LD] $@" - $(V) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $+ $(LIBS) $(LIBEXPAT) - #---------------------------------------------------------------- DEPEND_FILES=\ @@ -518,21 +156,24 @@ clean: distclean: clean $(RM) config.cache config.log config.status configure.h version.h Makefile unit-tests/Makefile -install: $(PROGRAMS) +install: bin/pdata_tools $(INSTALL_DIR) $(BINDIR) - $(INSTALL_PROGRAM) cache_check $(BINDIR) - $(INSTALL_PROGRAM) cache_dump $(BINDIR) - $(INSTALL_PROGRAM) cache_repair $(BINDIR) - $(INSTALL_PROGRAM) cache_restore $(BINDIR) - $(INSTALL_PROGRAM) thin_check $(BINDIR) - $(INSTALL_PROGRAM) thin_dump $(BINDIR) - $(INSTALL_PROGRAM) thin_repair $(BINDIR) - $(INSTALL_PROGRAM) thin_restore $(BINDIR) - $(INSTALL_PROGRAM) thin_rmap $(BINDIR) - $(INSTALL_PROGRAM) thin_metadata_size $(BINDIR) - $(INSTALL_PROGRAM) era_check $(BINDIR) - $(INSTALL_PROGRAM) era_dump $(BINDIR) - $(INSTALL_PROGRAM) era_invalidate $(BINDIR) + $(INSTALL_PROGRAM) bin/pdata_tools $(BINDIR) + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/cache_check + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/cache_dump + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/cache_metadata_size + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/cache_repair + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/cache_restore + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/thin_check + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/thin_dump + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/thin_repair + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/thin_restore + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/thin_rmap + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/thin_metadata_size + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/era_check + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/era_dump + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/era_invalidate + ln -s -f $(BINDIR)/pdata_tools $(BINDIR)/era_restore $(INSTALL_DIR) $(MANPATH)/man8 $(INSTALL_DATA) man8/cache_check.8 $(MANPATH)/man8 $(INSTALL_DATA) man8/cache_dump.8 $(MANPATH)/man8 @@ -548,6 +189,8 @@ install: $(PROGRAMS) $(INSTALL_DATA) man8/era_dump.8 $(MANPATH)/man8 $(INSTALL_DATA) man8/era_invalidate.8 $(MANPATH)/man8 +# $(INSTALL_DATA) man8/era_restore.8 $(MANPATH)/man8 + .PHONY: install ifeq ("@TESTING@", "yes") @@ -555,7 +198,7 @@ include unit-tests/Makefile .PHONEY: features -features: $(PROGRAMS) +features: pdata_tools cucumber --no-color --format progress test: features unit-test diff --git a/base/application.cc b/base/application.cc new file mode 100644 index 0000000..fa4a0b6 --- /dev/null +++ b/base/application.cc @@ -0,0 +1,62 @@ +#include "base/application.h" + +#include +#include + +using namespace base; +using namespace std; + +//---------------------------------------------------------------- + +int +application::run(int argc, char **argv) +{ + string cmd = basename(argv[0]); + + if (cmd == string("pdata-tools")) { + argc--; + argv++; + + if (!argc) { + usage(); + return 1; + } + + cmd = argv[0]; + } + + std::list::const_iterator it; + for (it = cmds_.begin(); it != cmds_.end(); ++it) { + if (cmd == (*it)->get_name()) + return (*it)->run(argc, argv); + } + + std::cerr << "Unknown command '" << cmd << "'\n"; + usage(); + return 1; +} + +void +application::usage() +{ + std::cerr << "Usage: \n" + << "commands:\n"; + + std::list::const_iterator it; + for (it = cmds_.begin(); it != cmds_.end(); ++it) { + std::cerr << " " << (*it)->get_name() << "\n"; + } +} + +std::string +application::basename(std::string const &path) const +{ + char buffer[PATH_MAX + 1]; + + memset(buffer, 0, sizeof(buffer)); + strncpy(buffer, path.c_str(), PATH_MAX); + + return ::basename(buffer); +} + +//---------------------------------------------------------------- diff --git a/base/application.h b/base/application.h new file mode 100644 index 0000000..8585129 --- /dev/null +++ b/base/application.h @@ -0,0 +1,52 @@ +#ifndef BASE_APPLICATION_H +#define BASE_APPLICATION_H + +#include +#include +#include +#include + +//---------------------------------------------------------------- + +namespace base { + class command { + public: + typedef int (*cmd_fn)(int, char **); + + command(std::string const &name, cmd_fn fn) + : name_(name), + fn_(fn) { + } + + std::string const &get_name() const { + return name_; + } + + int run(int argc, char **argv) const { + return fn_(argc, argv); + } + + private: + std::string name_; + cmd_fn fn_; + }; + + class application { + public: + void add_cmd(command const &c) { + cmds_.push_back(&c); + } + + int run(int argc, char **argv); + + private: + void usage(); + std::string basename(std::string const &path) const; + + std::list cmds_; + }; +} + +//---------------------------------------------------------------- + +#endif diff --git a/bin/cache_check b/bin/cache_check new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/cache_check @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/cache_dump b/bin/cache_dump new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/cache_dump @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/cache_metadata_size b/bin/cache_metadata_size new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/cache_metadata_size @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/cache_repair b/bin/cache_repair new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/cache_repair @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/cache_restore b/bin/cache_restore new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/cache_restore @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/era_check b/bin/era_check new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/era_check @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/era_dump b/bin/era_dump new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/era_dump @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/era_invalidate b/bin/era_invalidate new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/era_invalidate @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/era_restore b/bin/era_restore new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/era_restore @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/thin_check b/bin/thin_check new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/thin_check @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/thin_delta b/bin/thin_delta new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/thin_delta @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/thin_dump b/bin/thin_dump new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/thin_dump @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/thin_metadata_size b/bin/thin_metadata_size new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/thin_metadata_size @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/thin_repair b/bin/thin_repair new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/thin_repair @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/thin_restore b/bin/thin_restore new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/thin_restore @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/bin/thin_rmap b/bin/thin_rmap new file mode 120000 index 0000000..84c01e7 --- /dev/null +++ b/bin/thin_rmap @@ -0,0 +1 @@ +pdata_tools \ No newline at end of file diff --git a/caching/cache_check.cc b/caching/cache_check.cc index 593ba4e..400b214 100644 --- a/caching/cache_check.cc +++ b/caching/cache_check.cc @@ -14,6 +14,7 @@ #include "base/error_state.h" #include "base/nested_output.h" +#include "caching/commands.h" #include "caching/metadata.h" #include "persistent-data/block.h" #include "persistent-data/file_utils.h" @@ -322,7 +323,7 @@ namespace { //---------------------------------------------------------------- -int main(int argc, char **argv) +int cache_check_main(int argc, char **argv) { int c; flags fs; @@ -384,4 +385,6 @@ int main(int argc, char **argv) return check_with_exception_handling(argv[optind], fs); } +base::command caching::cache_check_cmd("cache_check", cache_check_main); + //---------------------------------------------------------------- diff --git a/caching/cache_dump.cc b/caching/cache_dump.cc index 938ddd5..117f86d 100644 --- a/caching/cache_dump.cc +++ b/caching/cache_dump.cc @@ -4,6 +4,7 @@ #include #include "version.h" +#include "caching/commands.h" #include "caching/mapping_array.h" #include "caching/metadata.h" #include "caching/metadata_dump.h" @@ -66,7 +67,7 @@ namespace { //---------------------------------------------------------------- -int main(int argc, char **argv) +int cache_dump_main(int argc, char **argv) { int c; flags fs; @@ -114,4 +115,6 @@ int main(int argc, char **argv) return dump(argv[optind], output, fs); } +base::command caching::cache_dump_cmd("cache_dump", cache_dump_main); + //---------------------------------------------------------------- diff --git a/caching/cache_metadata_size.cc b/caching/cache_metadata_size.cc index 5792c49..3fb1bf1 100644 --- a/caching/cache_metadata_size.cc +++ b/caching/cache_metadata_size.cc @@ -1,5 +1,7 @@ #include "version.h" +#include "caching/commands.h" + #include #include #include @@ -132,7 +134,7 @@ namespace { } } -int main(int argc, char **argv) +int cache_metadata_size_main(int argc, char **argv) { flags fs; @@ -156,4 +158,6 @@ int main(int argc, char **argv) return 0; } +base::command caching::cache_metadata_size_cmd("cache_metadata_size", cache_metadata_size_main); + //---------------------------------------------------------------- diff --git a/caching/cache_repair.cc b/caching/cache_repair.cc index 77e5ff6..8419796 100644 --- a/caching/cache_repair.cc +++ b/caching/cache_repair.cc @@ -2,6 +2,7 @@ #include #include +#include "caching/commands.h" #include "caching/metadata.h" #include "caching/metadata_dump.h" #include "caching/restore_emitter.h" @@ -52,7 +53,7 @@ namespace { //---------------------------------------------------------------- -int main(int argc, char **argv) +int cache_repair_main(int argc, char **argv) { int c; boost::optional input_path, output_path; @@ -105,4 +106,6 @@ int main(int argc, char **argv) return repair(*input_path, *output_path); } +base::command caching::cache_repair_cmd("cache_repair", cache_repair_main); + //---------------------------------------------------------------- diff --git a/caching/cache_restore.cc b/caching/cache_restore.cc index f9290d6..b0a6437 100644 --- a/caching/cache_restore.cc +++ b/caching/cache_restore.cc @@ -1,5 +1,6 @@ #include "version.h" +#include "caching/commands.h" #include "caching/metadata.h" #include "caching/restore_emitter.h" #include "caching/xml_format.h" @@ -95,7 +96,7 @@ namespace { } } -int main(int argc, char **argv) +int cache_restore_main(int argc, char **argv) { int c; flags fs; @@ -169,4 +170,6 @@ int main(int argc, char **argv) return restore(fs); } +base::command caching::cache_restore_cmd("cache_restore", cache_restore_main); + //---------------------------------------------------------------- diff --git a/caching/commands.h b/caching/commands.h new file mode 100644 index 0000000..1396b9b --- /dev/null +++ b/caching/commands.h @@ -0,0 +1,18 @@ +#ifndef CACHING_COMMANDS_H +#define CACHING_COMMANDS_H + +#include "base/application.h" + +//---------------------------------------------------------------- + +namespace caching { + extern base::command cache_check_cmd; + extern base::command cache_dump_cmd; + extern base::command cache_metadata_size_cmd; + extern base::command cache_restore_cmd; + extern base::command cache_repair_cmd; +} + +//---------------------------------------------------------------- + +#endif diff --git a/era/commands.h b/era/commands.h new file mode 100644 index 0000000..f556fbf --- /dev/null +++ b/era/commands.h @@ -0,0 +1,17 @@ +#ifndef ERA_COMMANDS_H +#define ERA_COMMANDS_H + +#include "base/application.h" + +//---------------------------------------------------------------- + +namespace era { + extern base::command era_check_cmd; + extern base::command era_dump_cmd; + extern base::command era_invalidate_cmd; + extern base::command era_restore_cmd; +} + +//---------------------------------------------------------------- + +#endif diff --git a/era/era_check.cc b/era/era_check.cc index 25c4d20..fed199e 100644 --- a/era/era_check.cc +++ b/era/era_check.cc @@ -14,6 +14,7 @@ #include "base/error_state.h" #include "base/nested_output.h" +#include "era/commands.h" #include "era/writeset_tree.h" #include "era/era_array.h" #include "era/superblock.h" @@ -276,7 +277,7 @@ namespace { //---------------------------------------------------------------- -int main(int argc, char **argv) +int era_check_main(int argc, char **argv) { int c; flags fs; @@ -322,4 +323,6 @@ int main(int argc, char **argv) return check_with_exception_handling(argv[optind], fs); } +base::command era::era_check_cmd("era_check", era_check_main); + //---------------------------------------------------------------- diff --git a/era/era_dump.cc b/era/era_dump.cc index 760ebff..c279cd1 100644 --- a/era/era_dump.cc +++ b/era/era_dump.cc @@ -4,6 +4,7 @@ #include #include "version.h" +#include "era/commands.h" #include "era/era_array.h" #include "era/writeset_tree.h" #include "era/metadata.h" @@ -70,7 +71,7 @@ namespace { //---------------------------------------------------------------- -int main(int argc, char **argv) +int era_dump_main(int argc, char **argv) { int c; flags fs; @@ -123,4 +124,6 @@ int main(int argc, char **argv) return dump(argv[optind], output, fs); } +base::command era::era_dump_cmd("era_dump", era_dump_main); + //---------------------------------------------------------------- diff --git a/era/era_invalidate.cc b/era/era_invalidate.cc index 6f109b3..45ae784 100644 --- a/era/era_invalidate.cc +++ b/era/era_invalidate.cc @@ -5,6 +5,7 @@ #include "version.h" #include "base/indented_stream.h" +#include "era/commands.h" #include "era/era_array.h" #include "era/writeset_tree.h" #include "era/metadata.h" @@ -189,7 +190,7 @@ namespace { //---------------------------------------------------------------- -int main(int argc, char **argv) +int era_invalidate_main(int argc, char **argv) { int c; flags fs; @@ -248,4 +249,6 @@ int main(int argc, char **argv) return invalidate(argv[optind], output, fs); } +base::command era::era_invalidate_cmd("era_invalidate", era_invalidate_main); + //---------------------------------------------------------------- diff --git a/era/era_restore.cc b/era/era_restore.cc index 7d11c8c..761f920 100644 --- a/era/era_restore.cc +++ b/era/era_restore.cc @@ -1,5 +1,6 @@ #include "version.h" +#include "era/commands.h" #include "era/metadata.h" #include "era/restore_emitter.h" #include "era/xml_format.h" @@ -57,7 +58,7 @@ namespace { } } -int main(int argc, char **argv) +int era_restore_main(int argc, char **argv) { int c; flags fs; @@ -120,4 +121,6 @@ int main(int argc, char **argv) return restore(fs, fs.quiet); } +base::command era::era_restore_cmd("era_restore", era_restore_main); + //---------------------------------------------------------------- diff --git a/features/cache_restore.feature b/features/cache_restore.feature index ebe5300..7008966 100644 --- a/features/cache_restore.feature +++ b/features/cache_restore.feature @@ -1,4 +1,4 @@ -Feature: thin_restore +Feature: cache_restore Scenario: print version (-V flag) When I run cache_restore with -V Then it should pass with version @@ -84,15 +84,15 @@ Feature: thin_restore Then it should pass Scenario: --quiet is accepted - Given valid metadata - When I run thin_restore with -i metadata.xml -o metadata.bin --quiet + Given valid cache metadata + When I run cache_restore with -i metadata.xml -o metadata.bin --quiet Then it should pass with: """ """ Scenario: -q is accepted - Given valid metadata - When I run thin_restore with -i metadata.xml -o metadata.bin -q + Given valid cache metadata + When I run cache_restore with -i metadata.xml -o metadata.bin -q Then it should pass with: """ """ diff --git a/features/era_restore.feature b/features/era_restore.feature index bf7a45c..22f002c 100644 --- a/features/era_restore.feature +++ b/features/era_restore.feature @@ -1,4 +1,4 @@ -Feature: thin_restore +Feature: era_restore Scenario: print version (-V flag) When I run era_restore with -V Then it should pass with version @@ -67,15 +67,15 @@ Feature: thin_restore And the metadata should be valid Scenario: --quiet is accepted - Given valid metadata - When I run thin_restore with -i metadata.xml -o metadata.bin --quiet + Given valid era metadata + When I run era_restore with -i metadata.xml -o metadata.bin --quiet Then it should pass with: """ """ Scenario: -q is accepted - Given valid metadata - When I run thin_restore with -i metadata.xml -o metadata.bin -q + Given valid era metadata + When I run era_restore with -i metadata.xml -o metadata.bin -q Then it should pass with: """ """ diff --git a/features/step_definitions/era_steps.rb b/features/step_definitions/era_steps.rb index bbdbb2a..42aa3b0 100644 --- a/features/step_definitions/era_steps.rb +++ b/features/step_definitions/era_steps.rb @@ -29,3 +29,11 @@ Then(/^the metadata should be valid$/) do run_simple("era_check #{dev_file}", true) end +Given(/^valid era metadata$/) do + in_current_dir do + system("era_xml create --nr-blocks 100 --nr-writesets 2 --current-era 1000 > #{xml_file}") + end + + run_simple("dd if=/dev/zero of=#{dev_file} bs=4k count=1024") + run_simple("era_restore -i #{xml_file} -o #{dev_file}") +end diff --git a/features/step_definitions/thin_steps.rb b/features/step_definitions/thin_steps.rb index 38fe6a3..d6674a6 100644 --- a/features/step_definitions/thin_steps.rb +++ b/features/step_definitions/thin_steps.rb @@ -1,4 +1,4 @@ -Given(/^valid metadata$/) do +Given(/^valid thin metadata$/) do in_current_dir do system("thinp_xml create --nr-thins uniform[4..9] --nr-mappings uniform[1000..10000] > #{xml_file}") end @@ -58,7 +58,7 @@ Then(/^dumps ([0-9]+) and ([0-9]+) should be identical$/) do |d1, d2| run_simple("diff -ub #{dump_files[d1.to_i]} #{dump_files[d2.to_i]}", true) end -Given(/^small metadata$/) do +Given(/^small thin metadata$/) do in_current_dir do system("thinp_xml create --nr-thins 2 --nr-mappings 1 > #{xml_file}") end diff --git a/features/support/aruba.rb b/features/support/aruba.rb index 1ad857e..de4d203 100644 --- a/features/support/aruba.rb +++ b/features/support/aruba.rb @@ -1,3 +1,3 @@ require 'aruba/cucumber' -ENV['PATH'] = "#{Dir::pwd}:#{ENV['PATH']}" +ENV['PATH'] = "#{Dir::pwd}/bin:#{ENV['PATH']}" diff --git a/features/thin_check.feature b/features/thin_check.feature index 8b910af..8a8324b 100644 --- a/features/thin_check.feature +++ b/features/thin_check.feature @@ -44,7 +44,7 @@ Feature: thin_check Then it should fail Scenario: --super-block-only check passes on valid metadata - Given valid metadata + Given valid thin metadata When I run thin_check with --super-block-only Then it should pass @@ -59,12 +59,12 @@ Feature: thin_check """ Scenario: --skip-mappings check passes on valid metadata - Given valid metadata + Given valid thin metadata When I run thin_check with --skip-mappings Then it should pass Scenario: --ignore-non-fatal-errors check passes on valid metadata - Given valid metadata + Given valid thin metadata When I run thin_check with --ignore-non-fatal-errors Then it should pass @@ -81,6 +81,6 @@ Feature: thin_check And it should give no output Scenario: Accepts --clear-needs-check-flag - Given valid metadata + Given valid thin metadata When I run thin_check with --clear-needs-check-flag Then it should pass diff --git a/features/thin_restore.feature b/features/thin_restore.feature index c931649..036daf7 100644 --- a/features/thin_restore.feature +++ b/features/thin_restore.feature @@ -56,32 +56,32 @@ Feature: thin_restore """ Scenario: --quiet is accepted - Given valid metadata + Given valid thin metadata When I run thin_restore with -i metadata.xml -o metadata.bin --quiet Then it should pass with: """ """ Scenario: -q is accepted - Given valid metadata + Given valid thin metadata When I run thin_restore with -i metadata.xml -o metadata.bin -q Then it should pass with: """ """ Scenario: dump/restore is a noop - Given valid metadata + Given valid thin metadata When I dump And I restore And I dump Then dumps 1 and 2 should be identical Scenario: dump matches original metadata - Given valid metadata + Given valid thin metadata When I dump Then dumps 0 and 1 should be identical Scenario: dump matches original metadata (small) - Given small metadata + Given small thin metadata When I dump Then dumps 0 and 1 should be identical diff --git a/features/thin_rmap.feature b/features/thin_rmap.feature index 97a3073..2d44e0d 100644 --- a/features/thin_rmap.feature +++ b/features/thin_rmap.feature @@ -42,56 +42,56 @@ Feature: thin_rmap @announce Scenario: Valid region format should pass - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region 23..7890 Then it should pass Scenario: Invalid region format should fail (comma instean of dots) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region 23,7890 Then it should fail Scenario: Invalid region format should fail (second number a word) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region 23..six Then it should fail Scenario: Invalid region format should fail (first number a word) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region four..7890 Then it should fail Scenario: Invalid region format should fail (end is lower than begin) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region 89..88 Then it should fail Scenario: Invalid region format should fail (end is equal to begin) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region 89..89 Then it should fail Scenario: Invalid region format should fail (no begin) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region ..89 Then it should fail Scenario: Invalid region format should fail (no end) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region 89.. Then it should fail Scenario: Invalid region format should fail (no region at all) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region Then it should fail Scenario: Invalid region format should fail (three dots) - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region 89...99 Then it should fail Scenario: Multiple regions should pass - Given valid metadata + Given valid thin metadata When I run thin_rmap with --region 1..23 --region 45..78 Then it should pass diff --git a/main.cc b/main.cc new file mode 100644 index 0000000..ed69ba9 --- /dev/null +++ b/main.cc @@ -0,0 +1,42 @@ +#include + +#include "base/application.h" + +#include "caching/commands.h" +#include "era/commands.h" +#include "thin-provisioning/commands.h" + +//---------------------------------------------------------------- + +int main(int argc, char **argv) +{ + using namespace base; + + application app; + + app.add_cmd(caching::cache_check_cmd); + app.add_cmd(caching::cache_dump_cmd); + app.add_cmd(caching::cache_metadata_size_cmd); + app.add_cmd(caching::cache_restore_cmd); + app.add_cmd(caching::cache_repair_cmd); + + app.add_cmd(era::era_check_cmd); + app.add_cmd(era::era_dump_cmd); + app.add_cmd(era::era_invalidate_cmd); + app.add_cmd(era::era_restore_cmd); + + app.add_cmd(thin_provisioning::thin_check_cmd); + app.add_cmd(thin_provisioning::thin_delta_cmd); + app.add_cmd(thin_provisioning::thin_dump_cmd); + app.add_cmd(thin_provisioning::thin_metadata_size_cmd); + app.add_cmd(thin_provisioning::thin_restore_cmd); + app.add_cmd(thin_provisioning::thin_repair_cmd); + app.add_cmd(thin_provisioning::thin_rmap_cmd); + + // FIXME: convert thin_metadata_size to c++ + //app.add_cmd(thin_provisioning::thin_metadata_size_cmd); + + return app.run(argc, argv); +} + +//---------------------------------------------------------------- diff --git a/thin-provisioning/commands.h b/thin-provisioning/commands.h new file mode 100644 index 0000000..5635665 --- /dev/null +++ b/thin-provisioning/commands.h @@ -0,0 +1,21 @@ +#ifndef THIN_PROVISIONING_COMMANDS_H +#define THIN_PROVISIONING_COMMANDS_H + +#include "base/application.h" + +//---------------------------------------------------------------- + +namespace thin_provisioning { + extern base::command thin_check_cmd; + extern base::command thin_delta_cmd; + extern base::command thin_dump_cmd; + extern base::command thin_metadata_size_cmd; + extern base::command thin_restore_cmd; + extern base::command thin_repair_cmd; + extern base::command thin_rmap_cmd; + extern base::command thin_metadata_size_cmd; +} + +//---------------------------------------------------------------- + +#endif diff --git a/thin-provisioning/thin_check.cc b/thin-provisioning/thin_check.cc index 9e90699..a01fe8b 100644 --- a/thin-provisioning/thin_check.cc +++ b/thin-provisioning/thin_check.cc @@ -22,6 +22,7 @@ #include "version.h" +#include "base/application.h" #include "base/error_state.h" #include "base/nested_output.h" #include "persistent-data/space-maps/core.h" @@ -29,6 +30,7 @@ #include "thin-provisioning/device_tree.h" #include "thin-provisioning/mapping_tree.h" #include "thin-provisioning/superblock.h" +#include "thin-provisioning/commands.h" using namespace base; using namespace std; @@ -272,7 +274,7 @@ namespace { } } -int main(int argc, char **argv) +int thin_check_main(int argc, char **argv) { int c; flags fs; @@ -342,3 +344,7 @@ int main(int argc, char **argv) return check(argv[optind], fs); } + +base::command thin_provisioning::thin_check_cmd("thin_check", thin_check_main); + +//---------------------------------------------------------------- diff --git a/thin-provisioning/thin_delta.cc b/thin-provisioning/thin_delta.cc index 21ecd01..da3a890 100644 --- a/thin-provisioning/thin_delta.cc +++ b/thin-provisioning/thin_delta.cc @@ -12,13 +12,14 @@ #include "persistent-data/file_utils.h" #include "thin-provisioning/superblock.h" #include "thin-provisioning/mapping_tree.h" +#include "thin-provisioning/commands.h" using namespace std; using namespace thin_provisioning; //---------------------------------------------------------------- -namespace { +namespace local { class application { public: application(string const &cmd) @@ -503,11 +504,13 @@ namespace { // FIXME: add metadata snap switch -int main(int argc, char **argv) +int thin_delta_main(int argc, char **argv) { + using namespace local; + int c; flags fs; - application app(basename(argv[0])); + local::application app(basename(argv[0])); char const shortopts[] = "hV"; option const longopts[] = { @@ -565,4 +568,6 @@ int main(int argc, char **argv) return delta(app, fs); } +base::command thin_provisioning::thin_delta_cmd("thin_delta", thin_delta_main); + //---------------------------------------------------------------- diff --git a/thin-provisioning/thin_dump.cc b/thin-provisioning/thin_dump.cc index 3d0e8eb..853a512 100644 --- a/thin-provisioning/thin_dump.cc +++ b/thin-provisioning/thin_dump.cc @@ -26,6 +26,7 @@ #include "metadata.h" #include "xml_format.h" #include "version.h" +#include "thin-provisioning/commands.h" using namespace persistent_data; using namespace std; @@ -95,7 +96,7 @@ namespace { } } -int main(int argc, char **argv) +int thin_dump_main(int argc, char **argv) { int c; char const *output = NULL; @@ -165,3 +166,7 @@ int main(int argc, char **argv) return dump(argv[optind], output, format, flags, metadata_snap); } + +base::command thin_provisioning::thin_dump_cmd("thin_dump", thin_dump_main); + +//---------------------------------------------------------------- diff --git a/thin-provisioning/thin_metadata_size.c b/thin-provisioning/thin_metadata_size.cc similarity index 88% rename from thin-provisioning/thin_metadata_size.c rename to thin-provisioning/thin_metadata_size.cc index c98abc5..8ea3eba 100644 --- a/thin-provisioning/thin_metadata_size.c +++ b/thin-provisioning/thin_metadata_size.cc @@ -23,6 +23,8 @@ * */ +#include "thin-provisioning/commands.h" + #include #include #include @@ -38,8 +40,13 @@ enum numeric_options { BLOCKSIZE, POOLSIZE, MAXTHINS, NUMERIC, OPT_END}; enum return_units { RETURN_BYTES, RETURN_SECTORS }; enum numeric_type { NO_NUMBER, NUMBER, NUMBER_SHORT, NUMBER_LONG }; -typedef unsigned bool; -enum bool_value { false = 0, true = 1}; + +struct options_ { + unsigned unit_idx; + char *s[OPT_END]; + unsigned long long n[OPT_END]; +}; + struct global { char *prg; /* program name */ @@ -51,11 +58,7 @@ struct global { } unit; /* Command line option properties. */ - struct options { - unsigned unit_idx; - char *s[OPT_END]; - unsigned long long n[OPT_END]; - } options; + options_ options; }; static void exit_prg(struct global *g, int ret) @@ -80,7 +83,7 @@ static void abort_prg(struct global *g, const char *msg) exit_prg(g, 1); } -static int unit_index(struct global *g, char *unit_string) +static int unit_index(struct global *g, char const *unit_string) { unsigned len; @@ -109,14 +112,14 @@ static int unit_index(struct global *g, char *unit_string) static struct global *init_prg(char *prg_path) { unsigned u; - static char *unit_chars = "bskKmMgGtTpPeEzZyY"; - static char *unit_strings[] = { "bytes", "sectors", - "kibibytes", "kilobytes", "mebibytes", "megabytes", - "gibibytes", "gigabytes", "tebibytes", "terabytes", - "pebibytes", "petabytes", "ebibytes", "exabytes", - "zebibytes", "zetabytes", "yobibytes", "yottabytes", NULL }; + static char const *unit_chars = "bskKmMgGtTpPeEzZyY"; + static char const *unit_strings[] = { "bytes", "sectors", + "kibibytes", "kilobytes", "mebibytes", "megabytes", + "gibibytes", "gigabytes", "tebibytes", "terabytes", + "pebibytes", "petabytes", "ebibytes", "exabytes", + "zebibytes", "zetabytes", "yobibytes", "yottabytes", NULL }; static unsigned long long unit_factors[ARRAY_SIZE(unit_strings) - 1] = { 1, 512, 1024, 1000 }; - struct global *r = malloc(sizeof(*r)); + struct global *r = static_cast(malloc(sizeof(*r))); if (!r) abort_prg(r, "failed to allocate global context!"); @@ -129,8 +132,8 @@ static struct global *init_prg(char *prg_path) } r->prg = basename(prg_path); - r->unit.chars = unit_chars; - r->unit.strings = unit_strings; + r->unit.chars = const_cast(unit_chars); + r->unit.strings = const_cast(unit_strings); r->unit.factors = unit_factors; r->options.unit_idx = unit_index(r, NULL); @@ -144,7 +147,7 @@ static unsigned long long bytes_per_sector(struct global *g) static void check_opts(struct global *g) { - struct options *o = &g->options; + options_ *o = &g->options; if (!o->n[BLOCKSIZE]) abort_prg(g, "block size required!"); @@ -183,7 +186,7 @@ static unsigned long long to_bytes(struct global *g, char *sz, enum return_units return (!us || unit == RETURN_SECTORS) ? r / bytes_per_sector(g) : r; } -static void printf_aligned(struct global *g, char *a, char *b, char *c, bool units, bool mandatory) +static void printf_aligned(struct global *g, char const *a, char const *b, char const *c, bool units, bool mandatory) { char buf[80]; @@ -254,7 +257,7 @@ static void check_size(struct global *g, enum numeric_options o, char *arg) idx = g->options.unit_idx; } - g->options.s[o] = malloc(strlen(arg) + strlen(g->unit.strings[idx]) + 1); + g->options.s[o] = static_cast(malloc(strlen(arg) + strlen(g->unit.strings[idx]) + 1)); if (!g->options.s[o]) abort_prg(g, "failed to allocate string!"); @@ -359,7 +362,7 @@ static void print_estimated_result(struct global *g) print_precision(g, r, g->options.unit_idx); } -int main(int argc, char **argv) +int thin_metadata_size_main(int argc, char **argv) { struct global *g = init_prg(*argv); @@ -368,3 +371,5 @@ int main(int argc, char **argv) exit_prg(g, 0); return 0; /* Doesn't get here... */ } + +base::command thin_provisioning::thin_metadata_size_cmd("thin_metadata_size", thin_metadata_size_main); diff --git a/thin-provisioning/thin_repair.cc b/thin-provisioning/thin_repair.cc index f1b078a..7ba58a5 100644 --- a/thin-provisioning/thin_repair.cc +++ b/thin-provisioning/thin_repair.cc @@ -2,6 +2,7 @@ #include #include +#include "thin-provisioning/commands.h" #include "human_readable_format.h" #include "metadata_dumper.h" #include "metadata.h" @@ -40,7 +41,7 @@ namespace { } } -int main(int argc, char **argv) +int thin_repair_main(int argc, char **argv) { int c; boost::optional input_path, output_path; @@ -92,3 +93,7 @@ int main(int argc, char **argv) return repair(*input_path, *output_path); } + +base::command thin_provisioning::thin_repair_cmd("thin_repair", thin_repair_main); + +//---------------------------------------------------------------- diff --git a/thin-provisioning/thin_restore.cc b/thin-provisioning/thin_restore.cc index e75cfb6..57b82c3 100644 --- a/thin-provisioning/thin_restore.cc +++ b/thin-provisioning/thin_restore.cc @@ -17,6 +17,7 @@ // . #include "persistent-data/file_utils.h" +#include "thin-provisioning/commands.h" #include "thin-provisioning/emitter.h" #include "thin-provisioning/human_readable_format.h" #include "thin-provisioning/metadata.h" @@ -68,7 +69,7 @@ namespace { } } -int main(int argc, char **argv) +int thin_restore_main(int argc, char **argv) { int c; char const *prog_name = basename(argv[0]); @@ -132,4 +133,6 @@ int main(int argc, char **argv) return restore(input, output, quiet); } +base::command thin_provisioning::thin_restore_cmd("thin_restore", thin_restore_main); + //---------------------------------------------------------------- diff --git a/thin-provisioning/thin_rmap.cc b/thin-provisioning/thin_rmap.cc index 71180b3..9083c6f 100644 --- a/thin-provisioning/thin_rmap.cc +++ b/thin-provisioning/thin_rmap.cc @@ -10,6 +10,7 @@ #include "persistent-data/run.h" #include "persistent-data/space-maps/core.h" #include "persistent-data/file_utils.h" +#include "thin-provisioning/commands.h" #include "thin-provisioning/superblock.h" #include "thin-provisioning/mapping_tree.h" #include "thin-provisioning/rmap_visitor.h" @@ -125,7 +126,7 @@ namespace { //---------------------------------------------------------------- -int main(int argc, char **argv) +int thin_rmap_main(int argc, char **argv) { int c; vector regions; @@ -174,4 +175,6 @@ int main(int argc, char **argv) return rmap(argv[optind], regions); } +base::command thin_provisioning::thin_rmap_cmd("thin_rmap", thin_rmap_main); + //----------------------------------------------------------------