// SPDX-License-Identifier: CDDL-1.0 /* * This file and its contents are supplied under the terms of the * Common Development and Distribution License ("CDDL"), version 1.0. * You may only use this file in accordance with the terms of version * 1.0 of the CDDL. * * A full copy of the text of the CDDL should have accompanied this * source. A copy of the CDDL is also available via the Internet at * https://opensource.org/license/CDDL-1.0. */ /* * Copyright (c) 2020 by Delphix. All rights reserved. * Copyright (c) 2020 by Datto Inc. All rights reserved. */ #include #include #include #include #include "zstream.h" #include "zstream_util.h" void zstream_usage(void) { (void) fprintf(stderr, "usage: zstream command args ...\n" "Available commands are:\n" "\n" "\tzstream decompress [-v] [object,offset[,compress_type]...] " "[file]\n" "\n" "\tzstream drop_records [-v] [object,offset...] [file]\n" "\n" "\tzstream dump [-Cvd] [file]\n" "\n" "\tzstream raw [-v] [-b max_buffers] [-g fromguid] " "image|device [file]\n" "\n" "\tzstream recompress [-t num_threads] compress_type [file]\n" "\n" "\tzstream redup [-v] file\n" "\n" "\tzstream token resume_token\n"); exit(1); } /* * Set the signal mask to allow THREAD_BACKTRACE_SIGNAL. WATCHDOG_SIGNAL * must be blocked in all threads so that its intended recipient can listen * for it with sigwait(), which detects only pending signals. */ static void set_signal_mask(void) { sigset_t mask; safe_pthread_sigmask(SIG_SETMASK, NULL, &mask); sigaddset(&mask, WATCHDOG_SIGNAL); sigdelset(&mask, THREAD_BACKTRACE_SIGNAL); safe_pthread_sigmask(SIG_SETMASK, &mask, NULL); } int main(int argc, char *argv[]) { set_signal_mask(); char *basename = strrchr(argv[0], '/'); basename = basename ? (basename + 1) : argv[0]; if (argc >= 1 && strcmp(basename, "zstreamdump") == 0) return (zstream_do_dump(argc, argv)); if (argc < 2) zstream_usage(); char *subcommand = argv[1]; if (strcmp(subcommand, "decompress") == 0) { return (zstream_do_decompress(argc - 1, argv + 1)); } else if (strcmp(subcommand, "drop_records") == 0 || strcmp(subcommand, "drop_record") == 0) { /* "drop_record" is the original name, kept for compatibility */ return (zstream_do_drop_records(argc - 1, argv + 1)); } else if (strcmp(subcommand, "dump") == 0) { return (zstream_do_dump(argc - 1, argv + 1)); } else if (strcmp(subcommand, "raw") == 0) { return (zstream_do_raw(argc - 1, argv + 1)); } else if (strcmp(subcommand, "recompress") == 0) { return (zstream_do_recompress(argc - 1, argv + 1)); } else if (strcmp(subcommand, "redup") == 0) { return (zstream_do_redup(argc - 1, argv + 1)); } else if (strcmp(subcommand, "selftest") == 0) { /* Undocumented; used by the ZFS test suite */ return (zstream_do_selftest(argc - 1, argv + 1)); } else if (strcmp(subcommand, "token") == 0) { return (zstream_do_token(argc - 1, argv + 1)); } else { zstream_usage(); } }