|
|
/* $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); 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); exit(1); }
|