home *** CD-ROM | disk | FTP | other *** search
- /* $Source: /u/mark/src/pax/RCS/cpio.c,v $
- *
- * $Revision: 1.2 $
- *
- * cpio.c - Cpio specific functions for archive handling
- *
- * DESCRIPTION
- *
- * These function provide a cpio conformant interface to the pax
- * program.
- *
- * AUTHOR
- *
- * Mark H. Colburn, NAPS International (mark@jhereg.mn.org)
- *
- * Sponsored by The USENIX Association for public distribution.
- *
- * Copyright (c) 1989 Mark H. Colburn.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice is duplicated in all such
- * forms and that any documentation, advertising materials, and other
- * materials related to such distribution and use acknowledge that the
- * software was developed * by Mark H. Colburn and sponsored by The
- * USENIX Association.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Log: cpio.c,v $
- * Revision 1.2 89/02/12 10:04:13 mark
- * 1.2 release fixes
- *
- * Revision 1.1 88/12/23 18:02:05 mark
- * Initial revision
- *
- */
-
- #ifndef lint
- static char *ident = "$Id: cpio.c,v 1.2 89/02/12 10:04:13 mark Exp $";
- static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n";
- #endif /* ! lint */
-
-
- /* Headers */
-
- #include "pax.h"
-
-
- /* Function Prototypes */
-
- #ifdef __STDC__
- static void usage(void);
- #else /* !__STDC__ */
- static void usage();
- #endif /* __STDC__ */
-
-
- /* do_cpio - handle cpio format archives
- *
- * DESCRIPTION
- *
- * Do_cpio provides a standard CPIO interface to the PAX program. All
- * of the standard cpio flags are available, and the behavior of the
- * program mimics traditonal cpio.
- *
- * PARAMETERS
- *
- * int argc - command line argument count
- * char **argv - pointer to command line arguments
- *
- * RETURNS
- *
- * Nothing.
- */
-
- #ifdef __STDC__
-
- void do_cpio(int argc, char **argv) /* Xn */
-
- #else
-
- void do_cpio(argc, argv) /* Xn */
- int argc;
- char **argv;
-
- #endif
- {
- int c;
- char *dirname;
- Stat st;
-
- /* default input/output file for CPIO is STDIN/STDOUT */
- ar_file = "-";
- names_from_stdin = 1;
-
- /* set up the flags to reflect the default CPIO inteface. */
- blocksize = BLOCKSIZE;
- ar_interface = CPIO;
- ar_format = CPIO;
- msgfile=stderr;
-
- #ifdef _POSIX2_SOURCE /* Xn */
- #ifdef DF_TRACE_DEBUG
- printf("DF_TRACE_DEBUG: void do_cpio() in cpio.c\n");
- #endif
- while ((c = getopt(argc, (const char * const *) argv, "D:Bacdfilmoprtuv")) != EOF) { /* Xn */
- #else /* Xn */
- while ((c = getopt(argc, argv, "D:Bacdfilmoprtuv")) != EOF) {
- #endif /* Xn */
- switch (c) {
- case 'i':
- f_extract = 1;
- break;
- case 'o':
- f_create = 1;
- break;
- case 'p':
- f_pass = 1;
- dirname = argv[--argc];
-
- /* check to make sure that the argument is a directory */
- if (LSTAT(dirname, &st) < 0) {
- fatal(strerror(errno)); /* Xn */
- }
- if ((st.sb_mode & S_IFMT) != S_IFDIR) {
- fatal("Not a directory");
- }
- break;
- case 'B':
- blocksize = BLOCK;
- break;
- case 'a':
- f_access_time = 1;
- break;
- case 'c':
- break;
- case 'D':
- ar_file = optarg;
- break;
- case 'd':
- f_dir_create = 1;
- break;
- case 'f':
- f_reverse_match = 1;
- break;
- case 'l':
- f_link = 1;
- break;
- case 'm':
- f_mtime = 1;
- break;
- case 'r':
- f_interactive = 1;
- break;
- case 't':
- f_list = 1;
- break;
- case 'u':
- f_unconditional = 1;
- break;
- case 'v':
- f_verbose = 1;
- break;
- default:
- usage();
- }
- }
-
- if (f_create + f_pass + f_extract != 1) {
- usage();
- }
- if (!f_pass) {
- buf_allocate((OFFSET) blocksize);
- }
- if (f_extract) {
- open_archive(AR_READ); /* Open for reading */
- read_archive();
- } else if (f_create) {
- open_archive(AR_WRITE);
- create_archive();
- } else if (f_pass) {
- pass(dirname);
- }
-
- /* print out the total block count transfered */
- fprintf(stderr, "%ld Blocks\n", ROUNDUP(total, BLOCKSIZE) / BLOCKSIZE);
-
- #if 1 && WIN_NT
- if (ppid == (pid_t) 1 && globulation == 0)
- deglobulate();
- #endif
- exit(0);
- /* NOTREACHED */
- }
-
-
- /* usage - print a helpful message and exit
- *
- * DESCRIPTION
- *
- * Usage prints out the usage message for the CPIO interface and then
- * exits with a non-zero termination status. This is used when a user
- * has provided non-existant or incompatible command line arguments.
- *
- * RETURNS
- *
- * Returns an exit status of 1 to the parent process.
- *
- */
-
- #ifdef __STDC__
-
- static void usage(void)
-
- #else
-
- static void usage()
-
- #endif
- {
- #ifdef DF_TRACE_DEBUG
- printf("DF_TRACE_DEBUG: static void usage() in cpio.c\n");
- #endif
- fprintf(stderr, "Usage: %s -o[Bacv]\n", myname);
- fprintf(stderr, " %s -i[Bcdmrtuvf] [pattern...]\n", myname);
- fprintf(stderr, " %s -p[adlmruv] directory\n", myname);
- #if 1 && WIN_NT
- if (ppid == (pid_t) 1 && globulation == 0)
- deglobulate();
- #endif
- exit(1);
- }
-