diff options
Diffstat (limited to 'contrib/cpio/src/main.c')
-rw-r--r-- | contrib/cpio/src/main.c | 804 |
1 files changed, 0 insertions, 804 deletions
diff --git a/contrib/cpio/src/main.c b/contrib/cpio/src/main.c deleted file mode 100644 index 675f61e..0000000 --- a/contrib/cpio/src/main.c +++ /dev/null @@ -1,804 +0,0 @@ -/* $FreeBSD$ */ - -/* main.c - main program and argument processing for cpio. - Copyright (C) 1990, 1991, 1992, 2001, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - 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; if not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301 USA. */ - -/* Written by Phil Nelson <phil@cs.wwu.edu>, - David MacKenzie <djm@gnu.ai.mit.edu>, - John Oleynick <juo@klinzhai.rutgers.edu>, - and Sergey Poznyakoff <gray@mirddin.farlep.net> */ - -#include <system.h> -#include <paxlib.h> - -#include <stdio.h> -#include <getopt.h> -#include <argp.h> -#include <sys/types.h> -#include <sys/stat.h> - -#ifdef HAVE_LOCALE_H -# include <locale.h> -#endif - -#include "filetypes.h" -#include "cpiohdr.h" -#include "dstring.h" -#include "extern.h" -#include <rmt.h> -#include <rmt-command.h> - -enum cpio_options { - NO_ABSOLUTE_FILENAMES_OPTION=256, - ABSOLUTE_FILENAMES_OPTION, - NO_PRESERVE_OWNER_OPTION, - ONLY_VERIFY_CRC_OPTION, - RENAME_BATCH_FILE_OPTION, - RSH_COMMAND_OPTION, - QUIET_OPTION, - SPARSE_OPTION, - FORCE_LOCAL_OPTION, - DEBUG_OPTION, - BLOCK_SIZE_OPTION, - TO_STDOUT_OPTION, - - HANG_OPTION, - USAGE_OPTION, - LICENSE_OPTION, - VERSION_OPTION -}; - -const char *argp_program_version = "cpio (" PACKAGE_NAME ") " VERSION; -const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">"; -static char doc[] = N_("GNU `cpio' copies files to and from archives\n\ -\n\ -Examples:\n\ - # Copy files named in name-list to the archive\n\ - cpio -o < name-list [> archive]\n\ - # Extract files from the archive\n\ - cpio -i [< archive]\n\ - # Copy files named in name-list to destination-directory\n\ - cpio -p destination-directory < name-list\n"); - -/* Print usage error message and exit with error. */ - -#define CHECK_USAGE(cond, opt, mode_opt) \ - if (cond) \ - ERROR((PAXEXIT_FAILURE, 0, _("%s is meaningless with %s"), opt, mode_opt)); - -static struct argp_option options[] = { - /* ********** */ -#define GRID 10 - {NULL, 0, NULL, 0, - N_("Main operation mode:"), GRID }, - {"create", 'o', 0, 0, - N_("Create the archive (run in copy-out mode)"), GRID }, - {"extract", 'i', 0, 0, - N_("Extract files from an archive (run in copy-in mode)"), GRID }, - {"pass-through", 'p', 0, 0, - N_("Run in copy-pass mode"), GRID }, - {"list", 't', 0, 0, - N_("Print a table of contents of the input"), GRID }, -#undef GRID - - /* ********** */ -#define GRID 100 - {NULL, 0, NULL, 0, - N_("Operation modifiers valid in any mode:"), GRID }, - - {"file", 'F', N_("[[USER@]HOST:]FILE-NAME"), 0, - N_("Use this FILE-NAME instead of standard input or output. Optional USER and HOST specify the user and host names in case of a remote archive"), GRID+1 }, - {"force-local", FORCE_LOCAL_OPTION, 0, 0, - N_("Archive file is local, even if its name contains colons"), GRID+1 }, - {"format", 'H', N_("FORMAT"), 0, - N_("Use given archive FORMAT"), GRID+1 }, - {NULL, 'B', NULL, 0, - N_("Set the I/O block size to 5120 bytes"), GRID+1 }, - {"block-size", BLOCK_SIZE_OPTION, N_("BLOCK-SIZE"), 0, - N_("Set the I/O block size to BLOCK-SIZE * 512 bytes"), GRID+1 }, - {NULL, 'c', NULL, 0, - N_("Use the old portable (ASCII) archive format"), GRID+1 }, - {"dot", 'V', NULL, 0, - N_("Print a \".\" for each file processed"), GRID+1 }, - {"io-size", 'C', N_("NUMBER"), 0, - N_("Set the I/O block size to the given NUMBER of bytes"), GRID+1 }, - {"message", 'M', N_("STRING"), 0, - N_("Print STRING when the end of a volume of the backup media is reached"), - GRID+1 }, - {"nonmatching", 'f', 0, 0, - N_("Only copy files that do not match any of the given patterns"), GRID+1 }, - {"numeric-uid-gid", 'n', 0, 0, - N_("In the verbose table of contents listing, show numeric UID and GID"), - GRID+1 }, - {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0, - N_("Use remote COMMAND instead of rsh"), GRID+1 }, - {"quiet", QUIET_OPTION, NULL, 0, - N_("Do not print the number of blocks copied"), GRID+1 }, - {"verbose", 'v', NULL, 0, - N_("Verbosely list the files processed"), GRID+1 }, -#ifdef DEBUG_CPIO - {"debug", DEBUG_OPTION, NULL, 0, - N_("Enable debugging info"), GRID+1 }, -#endif - {"warning", 'W', N_("FLAG"), 0, - N_("Control warning display. Currently FLAG is one of 'none', 'truncate', 'all'. Multiple options accumulate."), GRID+1 }, -#undef GRID - - /* ********** */ -#define GRID 200 - {NULL, 0, NULL, 0, - N_("Operation modifiers valid only in copy-in mode:"), GRID }, - {"pattern-file", 'E', N_("FILE"), 0, - N_("Read additional patterns specifying filenames to extract or list from FILE"), 210}, - {"absolute-filenames", ABSOLUTE_FILENAMES_OPTION, 0, 0, - N_("do not strip leading file name components that contain \"..\" and leading slashes from file names"), 210}, - {"only-verify-crc", ONLY_VERIFY_CRC_OPTION, 0, 0, - N_("When reading a CRC format archive, only verify the CRC's of each file in the archive, don't actually extract the files"), 210}, - {"rename", 'r', 0, 0, - N_("Interactively rename files"), GRID+1 }, - {"rename-batch-file", RENAME_BATCH_FILE_OPTION, N_("FILE"), OPTION_HIDDEN, - "", GRID+1 }, - {"swap", 'b', NULL, 0, - N_("Swap both halfwords of words and bytes of halfwords in the data. Equivalent to -sS"), GRID+1 }, - {"swap-bytes", 's', NULL, 0, - N_("Swap the bytes of each halfword in the files"), GRID+1 }, - {"swap-halfwords", 'S', NULL, 0, - N_("Swap the halfwords of each word (4 bytes) in the files"), - GRID+1 }, - {"to-stdout", TO_STDOUT_OPTION, NULL, 0, - N_("Extract files to standard output"), GRID+1 }, -#undef GRID - - /* ********** */ -#define GRID 300 - {NULL, 0, NULL, 0, - N_("Operation modifiers valid only in copy-out mode:"), GRID }, - {"append", 'A', 0, 0, - N_("Append to an existing archive."), GRID+1 }, - {NULL, 'O', N_("[[USER@]HOST:]FILE-NAME"), 0, - N_("Archive filename to use instead of standard output. Optional USER and HOST specify the user and host names in case of a remote archive"), GRID+1 }, -#undef GRID - - /* ********** */ -#define GRID 400 - {NULL, 0, NULL, 0, - N_("Operation modifiers valid only in copy-pass mode:"), GRID}, - {"link", 'l', 0, 0, - N_("Link files instead of copying them, when possible"), GRID+1 }, - -#undef GRID - - /* ********** */ -#define GRID 500 - {NULL, 0, NULL, 0, - N_("Operation modifiers valid in copy-in and copy-out modes:"), GRID }, - {"absolute-filenames", ABSOLUTE_FILENAMES_OPTION, 0, 0, - N_("Do not strip file system prefix components from the file names"), - GRID+1 }, - {"no-absolute-filenames", NO_ABSOLUTE_FILENAMES_OPTION, 0, 0, - N_("Create all files relative to the current directory"), GRID+1 }, -#undef GRID - /* ********** */ -#define GRID 600 - {NULL, 0, NULL, 0, - N_("Operation modifiers valid in copy-out and copy-pass modes:"), GRID }, - {"null", '0', 0, 0, - N_("A list of filenames is terminated by a null character instead of a newline"), GRID+1 }, - {NULL, 'I', N_("[[USER@]HOST:]FILE-NAME"), 0, - N_("Archive filename to use instead of standard input. Optional USER and HOST specify the user and host names in case of a remote archive"), GRID+1 }, - {"dereference", 'L', 0, 0, - N_("Dereference symbolic links (copy the files that they point to instead of copying the links)."), GRID+1 }, - {"owner", 'R', N_("[USER][:.][GROUP]"), 0, - N_("Set the ownership of all files created to the specified USER and/or GROUP"), GRID+1 }, - {"reset-access-time", 'a', NULL, 0, - N_("Reset the access times of files after reading them"), GRID+1 }, - -#undef GRID - /* ********** */ -#define GRID 700 - {NULL, 0, NULL, 0, - N_("Operation modifiers valid in copy-in and copy-pass modes:"), GRID }, - {"preserve-modification-time", 'm', 0, 0, - N_("Retain previous file modification times when creating files"), GRID+1 }, - {"make-directories", 'd', 0, 0, - N_("Create leading directories where needed"), GRID+1 }, - {"no-preserve-owner", NO_PRESERVE_OWNER_OPTION, 0, 0, - N_("Do not change the ownership of the files"), GRID+1 }, - {"unconditional", 'u', NULL, 0, - N_("Replace all files unconditionally"), GRID+1 }, - {"sparse", SPARSE_OPTION, NULL, 0, - N_("Write files with large blocks of zeros as sparse files"), GRID+1 }, -#undef GRID - - /* ********** */ -#define GRID 800 - {NULL, 0, NULL, 0, - N_("Informative options:"), GRID }, - - {"help", '?', 0, 0, N_("Give this help list"), -1}, - {"usage", USAGE_OPTION, 0, 0, N_("Give a short usage message"), -1}, - {"license", LICENSE_OPTION, 0, 0, N_("Print license and exit"), -1}, - {"version", VERSION_OPTION, 0, 0, N_("Print program version"), -1}, - /* FIXME -V (--dot) conflicts with the default short option for - --version */ - {"HANG", HANG_OPTION, "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN, - N_("hang for SECS seconds (default 3600)"), 0}, -#undef GRID - {0, 0, 0, 0} -}; - -static char *input_archive_name = 0; -static char *output_archive_name = 0; - -static void -license () -{ - printf ("%s (%s) %s\n%s\n", program_name, PACKAGE_NAME, PACKAGE_VERSION, - "Copyright (C) 2004 Free Software Foundation, Inc.\n"); - printf (_(" GNU cpio is free software; you can redistribute it and/or modify\n" - " it under the terms of the GNU General Public License as published by\n" - " the Free Software Foundation; either version 2 of the License, or\n" - " (at your option) any later version.\n" - "\n" - " GNU cpio is distributed in the hope that it will be useful,\n" - " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - " GNU General Public License for more details.\n" - "\n" - " You should have received a copy of the GNU General Public License\n" - " along with GNU cpio; if not, write to the Free Software Foundation,\n" - " Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n\n")); - exit (0); -} - -static int -warn_control (char *arg) -{ - static struct warn_tab { - char *name; - int flag; - } warn_tab[] = { - { "none", CPIO_WARN_ALL }, - { "truncate", CPIO_WARN_TRUNCATE }, - { "all", CPIO_WARN_ALL }, - { NULL } - }; - struct warn_tab *wt; - int offset = 0; - - if (strcmp (arg, "none") == 0) - { - warn_option = 0; - return 0; - } - - if (strlen (arg) > 2 && memcmp (arg, "no-", 3) == 0) - offset = 3; - - for (wt = warn_tab; wt->name; wt++) - if (strcmp (arg + offset, wt->name) == 0) - { - if (offset) - warn_option &= ~wt->flag; - else - warn_option |= wt->flag; - return 0; - } - - return 1; -} - -static error_t -parse_opt (int key, char *arg, struct argp_state *state) -{ - static volatile int _argp_hang; - switch (key) - { - case '0': /* Read null-terminated filenames. */ - name_end = '\0'; - break; - - case 'a': /* Reset access times. */ - reset_time_flag = true; - break; - - case 'A': /* Append to the archive. */ - append_flag = true; - break; - - case 'b': /* Swap bytes and halfwords. */ - swap_bytes_flag = true; - swap_halfwords_flag = true; - break; - - case 'B': /* Set block size to 5120. */ - io_block_size = 5120; - break; - - case BLOCK_SIZE_OPTION: /* --block-size */ - io_block_size = atoi (arg); - if (io_block_size < 1) - error (2, 0, _("invalid block size")); - io_block_size *= 512; - break; - - case 'c': /* Use the old portable ASCII format. */ - if (archive_format != arf_unknown) - error (0, EXIT_FAILURE, _("Archive format multiply defined")); -#ifdef SVR4_COMPAT - archive_format = arf_newascii; /* -H newc. */ -#else - archive_format = arf_oldascii; /* -H odc. */ -#endif - break; - - case 'C': /* Block size. */ - io_block_size = atoi (arg); - if (io_block_size < 1) - error (2, 0, _("invalid block size")); - break; - - case 'd': /* Create directories where needed. */ - create_dir_flag = true; - break; - - case 'f': /* Only copy files not matching patterns. */ - copy_matching_files = false; - break; - - case 'E': /* Pattern file name. */ - pattern_file_name = arg; - break; - - case 'F': /* Archive file name. */ - archive_name = arg; - break; - - case 'H': /* Header format name. */ - if (archive_format != arf_unknown) - error (PAXEXIT_FAILURE, 0, _("Archive format multiply defined")); - if (!strcasecmp (arg, "crc")) - archive_format = arf_crcascii; - else if (!strcasecmp (arg, "newc")) - archive_format = arf_newascii; - else if (!strcasecmp (arg, "odc")) - archive_format = arf_oldascii; - else if (!strcasecmp (arg, "bin")) - archive_format = arf_binary; - else if (!strcasecmp (arg, "ustar")) - archive_format = arf_ustar; - else if (!strcasecmp (arg, "tar")) - archive_format = arf_tar; - else if (!strcasecmp (arg, "hpodc")) - archive_format = arf_hpoldascii; - else if (!strcasecmp (arg, "hpbin")) - archive_format = arf_hpbinary; - else - error (2, 0, _("\ -invalid archive format `%s'; valid formats are:\n\ -crc newc odc bin ustar tar (all-caps also recognized)"), arg); - break; - - case 'i': /* Copy-in mode. */ - if (copy_function != 0) - error (PAXEXIT_FAILURE, 0, _("Mode already defined")); - copy_function = process_copy_in; - break; - - case 'I': /* Input archive file name. */ - input_archive_name = arg; - break; - - case 'k': /* Handle corrupted archives. We always handle - corrupted archives, but recognize this - option for compatability. */ - break; - - case 'l': /* Link files when possible. */ - link_flag = true; - break; - - case 'L': /* Dereference symbolic links. */ - xstat = stat; - break; - - case 'm': /* Retain previous file modify times. */ - retain_time_flag = true; - break; - - case 'M': /* New media message. */ - set_new_media_message (arg); - break; - - case 'n': /* Long list owner and group as numbers. */ - numeric_uid = true; - break; - - case NO_ABSOLUTE_FILENAMES_OPTION: /* --no-absolute-filenames */ - abs_paths_flag = false; - break; - - case ABSOLUTE_FILENAMES_OPTION: /* --absolute-filenames */ - abs_paths_flag = true; - break; - - case NO_PRESERVE_OWNER_OPTION: /* --no-preserve-owner */ - if (set_owner_flag || set_group_flag) - error (PAXEXIT_FAILURE, 0, - _("--no-preserve-owner cannot be used with --owner")); - no_chown_flag = true; - break; - - case 'o': /* Copy-out mode. */ - if (copy_function != 0) - error (PAXEXIT_FAILURE, 0, _("Mode already defined")); - copy_function = process_copy_out; - break; - - case 'O': /* Output archive file name. */ - output_archive_name = arg; - break; - - case ONLY_VERIFY_CRC_OPTION: - only_verify_crc_flag = true; - break; - - case 'p': /* Copy-pass mode. */ - if (copy_function != 0) - error (PAXEXIT_FAILURE, 0, _("Mode already defined")); - copy_function = process_copy_pass; - break; - - case RSH_COMMAND_OPTION: - rsh_command_option = arg; - break; - - case 'r': /* Interactively rename. */ - rename_flag = true; - break; - - case RENAME_BATCH_FILE_OPTION: - rename_batch_file = arg; - break; - - case QUIET_OPTION: - quiet_flag = true; - break; - - case 'R': /* Set the owner. */ - if (no_chown_flag) - error (PAXEXIT_FAILURE, 0, - _("--owner cannot be used with --no-preserve-owner")); - else - { - char *e, *u, *g; - - e = parse_user_spec (arg, &set_owner, &set_group, &u, &g); - if (e) - error (PAXEXIT_FAILURE, 0, "%s: %s", arg, e); - if (u) - { - free (u); - set_owner_flag = true; - } - if (g) - { - free (g); - set_group_flag = true; - } - } - break; - - case 's': /* Swap bytes. */ - swap_bytes_flag = true; - break; - - case 'S': /* Swap halfwords. */ - swap_halfwords_flag = true; - break; - - case 't': /* Only print a list. */ - table_flag = true; - break; - - case 'u': /* Replace all! Unconditionally! */ - unconditional_flag = true; - break; - - case 'v': /* Verbose! */ - verbose_flag = true; - break; - - case 'V': /* Print `.' for each file. */ - dot_flag = true; - break; - - case 'W': - if (warn_control (arg)) - argp_error (state, _("Invalid value for --warning option: %s"), arg); - break; - - case SPARSE_OPTION: - sparse_flag = true; - break; - - case FORCE_LOCAL_OPTION: - force_local_option = 1; - break; - -#ifdef DEBUG_CPIO - case DEBUG_OPTION: - debug_flag = true; - break; -#endif - - case TO_STDOUT_OPTION: - to_stdout_option = true; - break; - - case HANG_OPTION: - _argp_hang = atoi (arg ? arg : "3600"); - while (_argp_hang-- > 0) - sleep (1); - break; - - case '?': - argp_state_help (state, state->out_stream, ARGP_HELP_STD_HELP); - break; - - case USAGE_OPTION: - argp_state_help (state, state->out_stream, - ARGP_HELP_USAGE | ARGP_HELP_EXIT_OK); - break; - - case VERSION_OPTION: - fprintf (state->out_stream, "%s\n", argp_program_version); - exit (0); - - case LICENSE_OPTION: - license (); - break; - - default: - return ARGP_ERR_UNKNOWN; - } - return 0; -} - -static struct argp argp = { - options, - parse_opt, - N_("[destination-directory]"), - doc, - NULL, - NULL, - NULL -}; - -/* Process the arguments. Set all options and set up the copy pass - directory or the copy in patterns. */ - -void -process_args (int argc, char *argv[]) -{ - void (*copy_in) (); /* Work around for pcc bug. */ - void (*copy_out) (); - int index; - - if (argc < 2) - error (PAXEXIT_FAILURE, 0, - _("You must specify one of -oipt options.\nTry `%s --help' or `%s --usage' for more information.\n"), - program_name, program_name); - - xstat = lstat; - - if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER|ARGP_NO_HELP, &index, NULL)) - exit (1); - - /* Do error checking and look at other args. */ - - if (copy_function == 0) - { - if (table_flag) - copy_function = process_copy_in; - else - error (PAXEXIT_FAILURE, 0, - _("You must specify one of -oipt options.\nTry `%s --help' or `%s --usage' for more information.\n"), - program_name, program_name); - } - - /* Work around for pcc bug. */ - copy_in = process_copy_in; - copy_out = process_copy_out; - - if (copy_function == copy_in) - { - archive_des = 0; - CHECK_USAGE(link_flag, "--link", "--extract"); - CHECK_USAGE(reset_time_flag, "--reset", "--extract"); - CHECK_USAGE(xstat != lstat, "--dereference", "--extract"); - CHECK_USAGE(append_flag, "--append", "--extract"); - CHECK_USAGE(output_archive_name, "-O", "--extract"); - if (to_stdout_option) - { - CHECK_USAGE(create_dir_flag, "--make-directories", "--to-stdout"); - CHECK_USAGE(rename_flag, "--rename", "--to-stdout"); - CHECK_USAGE(no_chown_flag, "--no-preserve-owner", "--to-stdout"); - CHECK_USAGE(set_owner_flag||set_group_flag, "--owner", "--to-stdout"); - CHECK_USAGE(retain_time_flag, "--preserve-modification-time", - "--to-stdout"); - } - - if (archive_name && input_archive_name) - error (PAXEXIT_FAILURE, 0, - _("Both -I and -F are used in copy-in mode")); - - if (archive_format == arf_crcascii) - crc_i_flag = true; - num_patterns = argc - index; - save_patterns = &argv[index]; - if (input_archive_name) - archive_name = input_archive_name; - } - else if (copy_function == copy_out) - { - if (index != argc) - error (PAXEXIT_FAILURE, 0, _("Too many arguments")); - - archive_des = 1; - CHECK_USAGE(create_dir_flag, "--make-directories", "--create"); - CHECK_USAGE(rename_flag, "--rename", "--create"); - CHECK_USAGE(table_flag, "--list", "--create"); - CHECK_USAGE(unconditional_flag, "--unconditional", "--create"); - CHECK_USAGE(link_flag, "--link", "--create"); - CHECK_USAGE(sparse_flag, "--sparse", "--create"); - CHECK_USAGE(retain_time_flag, "--preserve-modification-time", - "--create"); - CHECK_USAGE(no_chown_flag, "--no-preserve-owner", "--create"); - CHECK_USAGE(swap_bytes_flag, "--swap-bytes (--swap)", "--create"); - CHECK_USAGE(swap_halfwords_flag, "--swap-halfwords (--swap)", - "--create"); - CHECK_USAGE(to_stdout_option, "--to-stdout", "--create"); - - if (append_flag && !(archive_name || output_archive_name)) - error (PAXEXIT_FAILURE, 0, - _("--append is used but no archive file name is given (use -F or -O options)")); - - CHECK_USAGE(rename_batch_file, "--rename-batch-file", "--create"); - CHECK_USAGE(abs_paths_flag, "--absolute-pathnames", "--create"); - CHECK_USAGE(input_archive_name, "-I", "--create"); - if (archive_name && output_archive_name) - error (PAXEXIT_FAILURE, 0, - _("Both -O and -F are used in copy-out mode")); - - if (archive_format == arf_unknown) - archive_format = arf_binary; - if (output_archive_name) - archive_name = output_archive_name; - } - else - { - /* Copy pass. */ - if (index < argc - 1) - error (PAXEXIT_FAILURE, 0, _("Too many arguments")); - else if (index > argc - 1) - error (PAXEXIT_FAILURE, 0, _("Not enough arguments")); - - if (archive_format != arf_unknown) - error (PAXEXIT_FAILURE, 0, - _("Archive format is not specified in copy-pass mode (use --format option)")); - - CHECK_USAGE(swap_bytes_flag, "--swap-bytes (--swap)", "--pass-through"); - CHECK_USAGE(swap_halfwords_flag, "--swap-halfwords (--swap)", - "--pass-through"); - CHECK_USAGE(table_flag, "--list", "--pass-through"); - CHECK_USAGE(rename_flag, "--rename", "--pass-through"); - CHECK_USAGE(append_flag, "--append", "--pass-through"); - CHECK_USAGE(rename_batch_file, "--rename-batch-file", "--pass-through"); - CHECK_USAGE(abs_paths_flag, "--absolute-pathnames", - "--pass-through"); - CHECK_USAGE(to_stdout_option, "--to-stdout", "--pass-through"); - - directory_name = argv[index]; - } - - if (archive_name) - { - if (copy_function != copy_in && copy_function != copy_out) - error (PAXEXIT_FAILURE, 0, - _("-F can be used only with --create or --extract")); - archive_des = open_archive (archive_name); - if (archive_des < 0) - error (PAXEXIT_FAILURE, errno, _("Cannot open %s"), - quotearg_colon (archive_name)); - } - - /* Prevent SysV non-root users from giving away files inadvertantly. - This happens automatically on BSD, where only root can give - away files. */ - if (set_owner_flag == false && set_group_flag == false && geteuid ()) - no_chown_flag = true; -} - -/* Initialize the input and output buffers to their proper size and - initialize all variables associated with the input and output - buffers. */ - -void -initialize_buffers () -{ - int in_buf_size, out_buf_size; - - if (copy_function == process_copy_in) - { - /* Make sure the input buffer can always hold 2 blocks and that it - is big enough to hold 1 tar record (512 bytes) even if it - is not aligned on a block boundary. The extra buffer space - is needed by process_copyin and peek_in_buf to automatically - figure out what kind of archive it is reading. */ - if (io_block_size >= 512) - in_buf_size = 2 * io_block_size; - else - in_buf_size = 1024; - out_buf_size = DISK_IO_BLOCK_SIZE; - } - else if (copy_function == process_copy_out) - { - in_buf_size = DISK_IO_BLOCK_SIZE; - out_buf_size = io_block_size; - } - else - { - in_buf_size = DISK_IO_BLOCK_SIZE; - out_buf_size = DISK_IO_BLOCK_SIZE; - } - - input_buffer = (char *) xmalloc (in_buf_size); - in_buff = input_buffer; - input_buffer_size = in_buf_size; - input_size = 0; - input_bytes = 0; - - output_buffer = (char *) xmalloc (out_buf_size); - out_buff = output_buffer; - output_size = 0; - output_bytes = 0; -} - -int -main (int argc, char *argv[]) -{ - setlocale (LC_ALL, ""); - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - program_name = argv[0]; - - process_args (argc, argv); - umask (0); - - initialize_buffers (); - - (*copy_function) (); - - if (archive_des >= 0 && rmtclose (archive_des) == -1) - error (1, errno, _("error closing archive")); - - exit (0); -} |