|
|
1.1 ! root 1: /* $Source: /newbits/usr/bin/pax/shipping/RCS/cpio.c,v $ ! 2: * ! 3: * $Revision: 1.3 $ ! 4: * ! 5: * cpio.c - Cpio specific functions for archive handling ! 6: * ! 7: * DESCRIPTION ! 8: * ! 9: * These function provide a cpio conformant interface to the pax ! 10: * program. ! 11: * ! 12: * AUTHOR ! 13: * ! 14: * Mark H. Colburn, NAPS International ([email protected]) ! 15: * ! 16: * Sponsored by The USENIX Association for public distribution. ! 17: * ! 18: * Copyright (c) 1989 Mark H. Colburn. ! 19: * All rights reserved. ! 20: * ! 21: * Redistribution and use in source and binary forms are permitted ! 22: * provided that the above copyright notice is duplicated in all such ! 23: * forms and that any documentation, advertising materials, and other ! 24: * materials related to such distribution and use acknowledge that the ! 25: * software was developed * by Mark H. Colburn and sponsored by The ! 26: * USENIX Association. ! 27: * ! 28: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 29: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 30: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 31: * ! 32: * $Log: cpio.c,v $ ! 33: * Revision 1.3 92/05/12 07:29:10 bin ! 34: * Vlad fix to fix bug preserving ownership of files ! 35: * ! 36: * Revision 1.2 91/06/19 09:55:20 bin ! 37: * udated by vlad for restoring ownership/permissions ! 38: * ! 39: * Revision 1.1 91/02/05 11:55:26 bin ! 40: * Initial revision ! 41: * ! 42: * Revision 1.2 89/02/12 10:04:13 mark ! 43: * 1.2 release fixes ! 44: * ! 45: * Revision 1.1 88/12/23 18:02:05 mark ! 46: * Initial revision ! 47: * ! 48: */ ! 49: ! 50: #ifndef lint ! 51: static char *ident = "$Id: cpio.c,v 1.3 92/05/12 07:29:10 bin Exp Locker: bin $"; ! 52: static char *copyright = "Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.\n"; ! 53: #endif /* ! lint */ ! 54: ! 55: ! 56: /* Headers */ ! 57: ! 58: #include "pax.h" ! 59: ! 60: ! 61: /* Function Prototypes */ ! 62: ! 63: #if __STDC__ ! 64: static void usage(void); ! 65: #else /* !__STDC__ */ ! 66: static void usage(); ! 67: #endif /* __STDC__ */ ! 68: ! 69: ! 70: /* do_cpio - handle cpio format archives ! 71: * ! 72: * DESCRIPTION ! 73: * ! 74: * Do_cpio provides a standard CPIO interface to the PAX program. All ! 75: * of the standard cpio flags are available, and the behavior of the ! 76: * program mimics traditonal cpio. ! 77: * ! 78: * PARAMETERS ! 79: * ! 80: * int argc - command line argument count ! 81: * char **argv - pointer to command line arguments ! 82: * ! 83: * RETURNS ! 84: * ! 85: * Nothing. ! 86: */ ! 87: ! 88: #if __STDC__ ! 89: ! 90: int do_cpio(int argc, char **argv) ! 91: ! 92: #else ! 93: ! 94: int do_cpio(argc, argv) ! 95: int argc; ! 96: char **argv; ! 97: ! 98: #endif ! 99: { ! 100: int c; ! 101: char *dirname; ! 102: Stat st; ! 103: ! 104: /* default input/output file for CPIO is STDIN/STDOUT */ ! 105: ar_file = "-"; ! 106: names_from_stdin = 1; ! 107: ! 108: /* set up the flags to reflect the default CPIO inteface. */ ! 109: blocksize = BLOCKSIZE; ! 110: ar_interface = CPIO; ! 111: ar_format = CPIO; ! 112: msgfile=stderr; ! 113: ! 114: while ((c = getopt(argc, argv, "D:BVacdfilmoprtuv")) != EOF) { ! 115: switch (c) { ! 116: case 'i': ! 117: f_extract = 1; ! 118: f_owner = 1; ! 119: break; ! 120: case 'o': ! 121: f_create = 1; ! 122: break; ! 123: case 'p': ! 124: f_pass = 1; ! 125: f_owner = 1; ! 126: dirname = argv[--argc]; ! 127: ! 128: /* check to make sure that the argument is a directory */ ! 129: if (LSTAT(dirname, &st) < 0) { ! 130: fatal(strerror()); ! 131: } ! 132: if ((st.sb_mode & S_IFMT) != S_IFDIR) { ! 133: fatal("Not a directory"); ! 134: } ! 135: break; ! 136: case 'B': ! 137: blocksize = BLOCK; ! 138: break; ! 139: case 'a': ! 140: f_access_time = 1; ! 141: break; ! 142: case 'c': ! 143: break; ! 144: case 'D': ! 145: ar_file = optarg; ! 146: break; ! 147: case 'd': ! 148: f_dir_create = 1; ! 149: break; ! 150: case 'f': ! 151: f_reverse_match = 1; ! 152: break; ! 153: case 'l': ! 154: f_link = 1; ! 155: break; ! 156: case 'm': ! 157: f_mtime = 1; ! 158: break; ! 159: case 'r': ! 160: f_interactive = 1; ! 161: break; ! 162: case 't': ! 163: f_list = 1; ! 164: break; ! 165: case 'u': ! 166: f_unconditional = 1; ! 167: break; ! 168: case 'v': ! 169: f_verbose = 1; ! 170: break; ! 171: default: ! 172: usage(); ! 173: } ! 174: } ! 175: ! 176: if (f_create + f_pass + f_extract != 1) { ! 177: usage(); ! 178: } ! 179: if (!f_pass) { ! 180: buf_allocate((OFFSET) blocksize); ! 181: } ! 182: if (f_extract) { ! 183: open_archive(AR_READ); /* Open for reading */ ! 184: read_archive(); ! 185: } else if (f_create) { ! 186: open_archive(AR_WRITE); ! 187: create_archive(); ! 188: } else if (f_pass) { ! 189: pass(dirname); ! 190: } ! 191: ! 192: /* print out the total block count transfered */ ! 193: fprintf(stderr, "%ld Blocks\n", ROUNDUP(total, BLOCKSIZE) / BLOCKSIZE); ! 194: ! 195: exit(0); ! 196: /* NOTREACHED */ ! 197: } ! 198: ! 199: ! 200: /* usage - print a helpful message and exit ! 201: * ! 202: * DESCRIPTION ! 203: * ! 204: * Usage prints out the usage message for the CPIO interface and then ! 205: * exits with a non-zero termination status. This is used when a user ! 206: * has provided non-existant or incompatible command line arguments. ! 207: * ! 208: * RETURNS ! 209: * ! 210: * Returns an exit status of 1 to the parent process. ! 211: * ! 212: */ ! 213: ! 214: #if __STDC__ ! 215: ! 216: static void usage(void) ! 217: ! 218: #else ! 219: ! 220: static void usage() ! 221: ! 222: #endif ! 223: { ! 224: fprintf(stderr, "Usage: %s -o[Bacv]\n", myname); ! 225: fprintf(stderr, " %s -i[Bcdmrtuvf] [pattern...]\n", myname); ! 226: fprintf(stderr, " %s -p[adlmruv] directory\n", myname); ! 227: exit(1); ! 228: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.