static void remove_headers(struct reenc_ctx *rc) { struct crypt_device *cd = NULL; log_dbg("Removing headers."); if (crypt_init(&cd, NULL)) return; crypt_set_log_callback(cd, _quiet_log, NULL); if (*rc->header_file_org) (void)crypt_deactivate(cd, rc->header_file_org); if (*rc->header_file_new) (void)crypt_deactivate(cd, rc->header_file_new); crypt_free(cd); }
int main(int argc, const char **argv) { static const char *null_action_argv[] = {NULL}; static struct poptOption popt_help_options[] = { { NULL, '\0', POPT_ARG_CALLBACK, help, 0, NULL, NULL }, { "help", '?', POPT_ARG_NONE, NULL, 0, N_("Show this help message"), NULL }, { "usage", '\0', POPT_ARG_NONE, NULL, 0, N_("Display brief usage"), NULL }, POPT_TABLEEND }; static struct poptOption popt_options[] = { { NULL, '\0', POPT_ARG_INCLUDE_TABLE, popt_help_options, 0, N_("Help options:"), NULL }, { "version", '\0', POPT_ARG_NONE, &opt_version_mode, 0, N_("Print package version"), NULL }, { "verbose", 'v', POPT_ARG_NONE, &opt_verbose, 0, N_("Shows more detailed error messages"), NULL }, { "debug", '\0', POPT_ARG_NONE, &opt_debug, 0, N_("Show debug messages"), NULL }, { "batch-mode", 'q', POPT_ARG_NONE, &opt_batch_mode, 0, N_("Do not ask for confirmation"), NULL }, { "progress-frequency", '\0', POPT_ARG_INT, &opt_progress_frequency, 0, N_("Progress line update (in seconds)"), N_("secs") }, { "no-wipe", '\0', POPT_ARG_NONE, &opt_no_wipe, 0, N_("Do not wipe device after format"), NULL }, { "data-device", '\0', POPT_ARG_STRING, &opt_data_device, 0, N_("Path to data device (if separated)"), N_("path") }, { "journal-size", 'j', POPT_ARG_STRING,&opt_journal_size_str, 0, N_("Journal size"), N_("bytes") }, { "interleave-sectors", '\0', POPT_ARG_INT, &opt_interleave_sectors, 0, N_("Interleave sectors"), N_("SECTORS") }, { "journal-watermark", '\0', POPT_ARG_INT, &opt_journal_watermark, 0, N_("Journal watermark"),N_("percent") }, { "journal-commit-time",'\0', POPT_ARG_INT, &opt_journal_commit_time,0, N_("Journal commit time"), N_("ms") }, { "bitmap-sectors-per-bit",'\0', POPT_ARG_INT,&opt_bitmap_sectors_per_bit, 0, N_("Number of 512-byte sectors per bit (bitmap mode)."), NULL }, { "bitmap-flush-time", '\0', POPT_ARG_INT, &opt_bitmap_flush_time, 0, N_("Bitmap mode flush time"), N_("ms") }, { "tag-size", 't', POPT_ARG_INT, &opt_tag_size, 0, N_("Tag size (per-sector)"), N_("bytes") }, { "sector-size", 's', POPT_ARG_INT, &opt_sector_size, 0, N_("Sector size"), N_("bytes") }, { "buffer-sectors", '\0', POPT_ARG_INT, &opt_buffer_sectors, 0, N_("Buffers size"), N_("SECTORS") }, { "integrity", 'I', POPT_ARG_STRING, &opt_integrity, 0, N_("Data integrity algorithm"), NULL }, { "integrity-key-size", '\0', POPT_ARG_INT, &opt_integrity_key_size, 0, N_("The size of the data integrity key"), N_("BITS") }, { "integrity-key-file", '\0', POPT_ARG_STRING, &opt_integrity_key_file, 0, N_("Read the integrity key from a file"), NULL }, { "journal-integrity", '\0', POPT_ARG_STRING, &opt_journal_integrity, 0, N_("Journal integrity algorithm"), NULL }, { "journal-integrity-key-size",'\0', POPT_ARG_INT, &opt_journal_integrity_key_size,0, N_("The size of the journal integrity key"), N_("BITS") }, { "journal-integrity-key-file",'\0', POPT_ARG_STRING, &opt_journal_integrity_key_file,0, N_("Read the journal integrity key from a file"), NULL }, { "journal-crypt", '\0', POPT_ARG_STRING, &opt_journal_crypt, 0, N_("Journal encryption algorithm"), NULL }, { "journal-crypt-key-size", '\0', POPT_ARG_INT, &opt_journal_crypt_key_size, 0, N_("The size of the journal encryption key"), N_("BITS") }, { "journal-crypt-key-file", '\0', POPT_ARG_STRING, &opt_journal_crypt_key_file, 0, N_("Read the journal encryption key from a file"), NULL }, { "integrity-no-journal", 'D', POPT_ARG_NONE, &opt_integrity_nojournal, 0, N_("Disable journal for integrity device"), NULL }, { "integrity-recovery-mode", 'R', POPT_ARG_NONE, &opt_integrity_recovery, 0, N_("Recovery mode (no journal, no tag checking)"), NULL }, { "integrity-bitmap-mode", 'B', POPT_ARG_NONE, &opt_integrity_bitmap, 0, N_("Use bitmap to track changes and disable journal for integrity device"), NULL }, { "integrity-recalculate", '\0', POPT_ARG_NONE, &opt_integrity_recalculate, 0, N_("Recalculate initial tags automatically."), NULL }, POPT_TABLEEND }; poptContext popt_context; struct action_type *action; const char *aname; int r; crypt_set_log_callback(NULL, tool_log, NULL); setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); popt_context = poptGetContext("integrity", argc, argv, popt_options, 0); poptSetOtherOptionHelp(popt_context, _("[OPTION...] <action> <action-specific>")); while ((r = poptGetNextOpt(popt_context)) >= 0) { } if (r < -1) usage(popt_context, EXIT_FAILURE, poptStrerror(r), poptBadOption(popt_context, POPT_BADOPTION_NOALIAS)); if (opt_version_mode) { log_std("%s %s\n", PACKAGE_INTEGRITY, PACKAGE_VERSION); poptFreeContext(popt_context); exit(EXIT_SUCCESS); } if (!(aname = poptGetArg(popt_context))) usage(popt_context, EXIT_FAILURE, _("Argument <action> missing."), poptGetInvocationName(popt_context)); action_argc = 0; action_argv = poptGetArgs(popt_context); /* Make return values of poptGetArgs more consistent in case of remaining argc = 0 */ if (!action_argv) action_argv = null_action_argv; /* Count args, somewhat unnice, change? */ while (action_argv[action_argc] != NULL) action_argc++; /* Handle aliases */ if (!strcmp(aname, "create") && action_argc > 1) { /* create command had historically switched arguments */ if (action_argv[0] && action_argv[1]) { const char *tmp = action_argv[0]; action_argv[0] = action_argv[1]; action_argv[1] = tmp; } aname = "open"; } else if (!strcmp(aname, "remove")) { aname = "close"; } for (action = action_types; action->type; action++) if (strcmp(action->type, aname) == 0) break; if (!action->type) usage(popt_context, EXIT_FAILURE, _("Unknown action."), poptGetInvocationName(popt_context)); if (action_argc < action->required_action_argc) { char buf[128]; snprintf(buf, 128,_("%s: requires %s as arguments"), action->type, action->arg_desc); usage(popt_context, EXIT_FAILURE, buf, poptGetInvocationName(popt_context)); } if (!strcmp(aname, "format") && opt_tag_size == 0) opt_tag_size = DEFAULT_TAG_SIZE; if (opt_integrity_recalculate && strcmp(aname, "open")) usage(popt_context, EXIT_FAILURE, _("Option --integrity-recalculate can be used only for open action."), poptGetInvocationName(popt_context)); if (opt_interleave_sectors < 0 || opt_journal_watermark < 0 || opt_journal_commit_time < 0 || opt_tag_size < 0 || opt_sector_size < 0 || opt_buffer_sectors < 0 || opt_integrity_key_size < 0 || opt_journal_integrity_key_size < 0 || opt_journal_crypt_key_size < 0 || opt_bitmap_flush_time < 0 || opt_bitmap_sectors_per_bit < 0) usage(popt_context, EXIT_FAILURE, _("Negative number for option not permitted."), poptGetInvocationName(popt_context)); if (strcmp(aname, "format") && (opt_journal_size_str || opt_interleave_sectors || opt_sector_size || opt_tag_size || opt_no_wipe )) usage(popt_context, EXIT_FAILURE, _("Options --journal-size, --interleave-sectors, --sector-size, --tag-size" " and --no-wipe can be used only for format action.\n"), poptGetInvocationName(popt_context)); if (opt_journal_size_str && tools_string_to_size(NULL, opt_journal_size_str, &opt_journal_size)) usage(popt_context, EXIT_FAILURE, _("Invalid journal size specification."), poptGetInvocationName(popt_context)); if ((opt_integrity_key_file && !opt_integrity_key_size) || (!opt_integrity_key_file && opt_integrity_key_size)) usage(popt_context, EXIT_FAILURE, _("Both key file and key size options must be specified."), poptGetInvocationName(popt_context)); if (!opt_integrity && opt_integrity_key_file) usage(popt_context, EXIT_FAILURE, _("Integrity algorithm must be specified if integrity key is used."), poptGetInvocationName(popt_context)); if ((opt_journal_integrity_key_file && !opt_journal_integrity_key_size) || (!opt_journal_integrity_key_file && opt_journal_integrity_key_size)) usage(popt_context, EXIT_FAILURE, _("Both journal integrity key file and key size options must be specified."), poptGetInvocationName(popt_context)); if (!opt_journal_integrity && opt_journal_integrity_key_file) usage(popt_context, EXIT_FAILURE, _("Journal integrity algorithm must be specified if journal integrity key is used."), poptGetInvocationName(popt_context)); if ((opt_journal_crypt_key_file && !opt_journal_crypt_key_size) || (!opt_journal_crypt_key_file && opt_journal_crypt_key_size)) usage(popt_context, EXIT_FAILURE, _("Both journal encryption key file and key size options must be specified."), poptGetInvocationName(popt_context)); if (!opt_journal_crypt && opt_journal_crypt_key_file) usage(popt_context, EXIT_FAILURE, _("Journal encryption algorithm must be specified if journal encryption key is used."), poptGetInvocationName(popt_context)); if (opt_integrity_recovery && opt_integrity_bitmap) usage(popt_context, EXIT_FAILURE, _("Recovery and bitmap mode options are mutually exclusive."), poptGetInvocationName(popt_context)); if (opt_integrity_bitmap && (opt_journal_integrity_key_file || opt_journal_crypt || opt_journal_watermark || opt_journal_commit_time)) usage(popt_context, EXIT_FAILURE, _("Journal options cannot be used in bitmap mode."), poptGetInvocationName(popt_context)); if (!opt_integrity_bitmap && (opt_bitmap_flush_time || opt_bitmap_sectors_per_bit)) usage(popt_context, EXIT_FAILURE, _("Bitmap options can be used only in bitmap mode."), poptGetInvocationName(popt_context)); if (opt_debug) { opt_verbose = 1; crypt_set_debug_level(-1); dbg_version_and_cmd(argc, argv); } r = run_action(action); poptFreeContext(popt_context); return r; }