diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/ape/cmd/pax/cpio.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/ape/cmd/pax/cpio.c')
-rwxr-xr-x | sys/src/ape/cmd/pax/cpio.c | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/sys/src/ape/cmd/pax/cpio.c b/sys/src/ape/cmd/pax/cpio.c new file mode 100755 index 000000000..89d8f4c80 --- /dev/null +++ b/sys/src/ape/cmd/pax/cpio.c @@ -0,0 +1,217 @@ +/* $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__ + +int do_cpio(int argc, char **argv) + +#else + +int do_cpio(argc, argv) +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; + + while ((c = getopt(argc, argv, "D:Bacdfilmoprtuv")) != EOF) { + 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()); + } + 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 +{ + 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); +} |