Annotation of coherent/e/bin/pax/tar.c, revision 1.1

1.1     ! root        1: /* $Source: /src386/usr/bin/pax/RCS/tar.c,v $
        !             2:  *
        !             3:  * $Revision: 1.2 $
        !             4:  *
        !             5:  * tar.c - tar specific functions for archive handling
        !             6:  *
        !             7:  * DESCRIPTION
        !             8:  *
        !             9:  *     These routines provide a tar conforming 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:       tar.c,v $
        !            33:  * Revision 1.2  92/09/04  07:36:25  bin
        !            34:  * vlad bug fixes
        !            35:  * 
        !            36:  * Revision 1.1  89/02/14  16:48:49  jep
        !            37:  * Initial revision
        !            38:  * 
        !            39:  * Revision 1.1  88/12/23  18:02:38  mark
        !            40:  * Initial revision
        !            41:  * 
        !            42:  */
        !            43: 
        !            44: #ifndef lint
        !            45: static char *ident = "$Id: tar.c,v 1.2 92/09/04 07:36:25 bin Exp Locker: bin $";
        !            46: static char *copyright ="Copyright (c) 1989 Mark H. Colburn.\nAll rights reserved.";
        !            47: #endif /* not lint */
        !            48: 
        !            49: /* Headers */
        !            50: 
        !            51: #include "pax.h"
        !            52: 
        !            53: 
        !            54: /* Defines */
        !            55: 
        !            56: #define DEF_BLOCKING   20      /* default blocking factor for extract */
        !            57: 
        !            58: 
        !            59: /* Function Prototypes */
        !            60: 
        !            61: #if __STDC__
        !            62: 
        !            63: static int taropt(int , char **, char *);
        !            64: static void usage(void);
        !            65: 
        !            66: #else /* !__STDC__ */
        !            67: 
        !            68: static int taropt();
        !            69: static void usage();
        !            70: 
        !            71: #endif /* __STDC__ */
        !            72: 
        !            73: 
        !            74: /* do_tar - main routine for tar. 
        !            75:  *
        !            76:  * DESCRIPTION
        !            77:  *
        !            78:  *     Provides a tar interface to the PAX program.  All tar standard
        !            79:  *     command line options are supported.
        !            80:  *
        !            81:  * PARAMETERS
        !            82:  *
        !            83:  *     int argc        - argument count (argc from main) 
        !            84:  *     char **argv     - argument list (argv from main) 
        !            85:  *
        !            86:  * RETURNS
        !            87:  *
        !            88:  *     zero
        !            89:  */
        !            90: 
        !            91: #if __STDC__
        !            92: 
        !            93: int do_tar(int argc, char **argv)
        !            94: 
        !            95: #else
        !            96: 
        !            97: int do_tar(argc, argv)
        !            98: int             argc;          /* argument count (argc from main) */
        !            99: char          **argv;          /* argument list (argv from main) */
        !           100: 
        !           101: #endif
        !           102: {
        !           103:     int             c;         /* Option letter */
        !           104: 
        !           105:     /* Set default option values */
        !           106:     names_from_stdin = 0;
        !           107:     ar_file = getenv("TAPE");  /* From environment, or */
        !           108:     if (ar_file == 0) {
        !           109:        ar_file = DEF_AR_FILE;  /* From Makefile */
        !           110:     }
        !           111: 
        !           112:     /*
        !           113:      * set up the flags to reflect the default pax inteface.  Unfortunately
        !           114:      * the pax interface has several options which are completely opposite
        !           115:      * of the tar and/or cpio interfaces...
        !           116:      */
        !           117:     f_unconditional = 1;
        !           118:     f_mtime = 1;
        !           119:     f_owner = 1;
        !           120:     f_dir_create = 1;
        !           121:     blocking = 0;
        !           122:     ar_interface = TAR;
        !           123:     ar_format = TAR;
        !           124:     msgfile=stderr;    /* VLAD */
        !           125: 
        !           126:     /* Parse options */
        !           127:     while ((c = taropt(argc, argv, "b:cf:hlmortuvwx")) != EOF) {
        !           128:        switch (c) {
        !           129:        case 'b':               /* specify blocking factor */
        !           130:            /* 
        !           131:             * FIXME - we should use a conversion routine that does
        !           132:             * some kind of reasonable error checking, but...
        !           133:             */
        !           134:            blocking = atoi(optarg);
        !           135:            break;
        !           136:        case 'c':               /* create a new archive */
        !           137:            f_create = 1;
        !           138:            break;
        !           139:        case 'f':               /* specify input/output file */
        !           140:            ar_file = optarg;
        !           141:            break;
        !           142:        case 'h':
        !           143:            f_follow_links = 1; /* follow symbolic links */
        !           144:            break;
        !           145:        case 'l':               /* report unresolved links */
        !           146:            f_linksleft = 1;
        !           147:            break;
        !           148:        case 'm':               /* don't restore modification times */
        !           149:            f_modified = 1;
        !           150:            break;
        !           151:        case 'o':               /* take on user's group rather than */
        !           152:            f_owner = 0;        /* archives */
        !           153:            break;
        !           154:        case 'r':               /* named files are appended to archive */
        !           155:            f_append = 1;
        !           156:            break;
        !           157:        case 't':
        !           158:            f_list = 1;         /* list files in archive */
        !           159:            break;
        !           160:        case 'u':               /* named files are added to archive */
        !           161:            f_newer = 1;
        !           162:            break;
        !           163:        case 'v':               /* verbose mode */
        !           164:            f_verbose = 1;
        !           165:            break;
        !           166:        case 'w':               /* user interactive mode */
        !           167:            f_disposition = 1;
        !           168:            break;
        !           169:        case 'x':               /* named files are extracted from archive */
        !           170:            f_extract = 1;
        !           171:            break;
        !           172:        case '?':
        !           173:            usage();
        !           174:            exit(EX_ARGSBAD);
        !           175:        }
        !           176:     }
        !           177: 
        !           178:     /* check command line argument sanity */
        !           179:     if (f_create + f_extract + f_list + f_append + f_newer != 1) {
        !           180:        (void) fprintf(stderr,
        !           181:           "%s: you must specify exactly one of the c, t, r, u or x options\n",
        !           182:                       myname);
        !           183:        usage();
        !           184:        exit(EX_ARGSBAD);
        !           185:     }
        !           186: 
        !           187:     /* set the blocking factor, if not set by the user */
        !           188:     if (blocking == 0) {
        !           189: #ifdef USG
        !           190:        if (f_extract || f_list) {
        !           191:            blocking = DEF_BLOCKING;
        !           192:            fprintf(msgfile, "Tar: blocksize = %d\n", blocking);
        !           193:        } else {
        !           194:            blocking = 1;
        !           195:        }
        !           196: #else /* !USG */
        !           197:        blocking = 20;
        !           198: #endif /* USG */
        !           199:     }
        !           200:     blocksize = blocking * BLOCKSIZE;
        !           201:     buf_allocate((OFFSET) blocksize);
        !           202: 
        !           203:     if (f_create) {
        !           204:        open_archive(AR_WRITE);
        !           205:        create_archive();       /* create the archive */
        !           206:     } else if (f_extract) {
        !           207:        open_archive(AR_READ);
        !           208:        read_archive();         /* extract files from archive */
        !           209:     } else if (f_list) {
        !           210:        open_archive(AR_READ);
        !           211:        read_archive();         /* read and list contents of archive */
        !           212:     } else if (f_append) {
        !           213:        open_archive(AR_APPEND);
        !           214:        append_archive();       /* append files to archive */
        !           215:     }
        !           216:     
        !           217:     if (f_linksleft) {         
        !           218:        linkleft();             /* report any unresolved links */ 
        !           219:     }
        !           220:     
        !           221:     return (0);
        !           222: }
        !           223: 
        !           224: 
        !           225: /* taropt -  tar specific getopt
        !           226:  *
        !           227:  * DESCRIPTION
        !           228:  *
        !           229:  *     Plug-compatible replacement for getopt() for parsing tar-like
        !           230:  *     arguments.  If the first argument begins with "-", it uses getopt;
        !           231:  *     otherwise, it uses the old rules used by tar, dump, and ps.
        !           232:  *
        !           233:  * PARAMETERS
        !           234:  *
        !           235:  *     int argc        - argument count (argc from main) 
        !           236:  *     char **argv     - argument list (argv from main) 
        !           237:  *     char *optstring - sring which describes allowable options
        !           238:  *
        !           239:  * RETURNS
        !           240:  *
        !           241:  *     Returns the next option character in the option string(s).  If the
        !           242:  *     option requires an argument and an argument was given, the argument
        !           243:  *     is pointed to by "optarg".  If no option character was found,
        !           244:  *     returns an EOF.
        !           245:  *
        !           246:  */
        !           247: 
        !           248: #if __STDC__
        !           249: 
        !           250: static int taropt(int argc, char **argv, char *optstring)
        !           251: 
        !           252: #else
        !           253: 
        !           254: static int taropt(argc, argv, optstring)
        !           255: int             argc;
        !           256: char          **argv;
        !           257: char           *optstring;
        !           258: 
        !           259: #endif
        !           260: {
        !           261:     extern char    *optarg;    /* Points to next arg */
        !           262:     extern int      optind;    /* Global argv index */
        !           263:     static char    *key;       /* Points to next keyletter */
        !           264:     static char     use_getopt;        /* !=0 if argv[1][0] was '-' */
        !           265:     char            c;
        !           266:     char           *place;
        !           267: 
        !           268:     optarg = (char *)NULL;
        !           269: 
        !           270:     if (key == (char *)NULL) {         /* First time */
        !           271:        if (argc < 2)
        !           272:            return EOF;
        !           273:        key = argv[1];
        !           274:        if (*key == '-')
        !           275:            use_getopt++;
        !           276:        else
        !           277:            optind = 2;
        !           278:     }
        !           279:     if (use_getopt) {
        !           280:        return getopt(argc, argv, optstring);
        !           281:     }
        !           282: 
        !           283:     c = *key++;
        !           284:     if (c == '\0') {
        !           285:        key--;
        !           286:        return EOF;
        !           287:     }
        !           288:     place = strchr(optstring, c);
        !           289: 
        !           290:     if (place == (char *)NULL || c == ':') {
        !           291:        fprintf(stderr, "%s: unknown option %c\n", argv[0], c);
        !           292:        return ('?');
        !           293:     }
        !           294:     place++;
        !           295:     if (*place == ':') {
        !           296:        if (optind < argc) {
        !           297:            optarg = argv[optind];
        !           298:            optind++;
        !           299:        } else {
        !           300:            fprintf(stderr, "%s: %c argument missing\n",
        !           301:                    argv[0], c);
        !           302:            return ('?');
        !           303:        }
        !           304:     }
        !           305:     return (c);
        !           306: }
        !           307: 
        !           308: 
        !           309: /* usage - print a helpful message and exit
        !           310:  *
        !           311:  * DESCRIPTION
        !           312:  *
        !           313:  *     Usage prints out the usage message for the TAR interface and then
        !           314:  *     exits with a non-zero termination status.  This is used when a user
        !           315:  *     has provided non-existant or incompatible command line arguments.
        !           316:  *
        !           317:  * RETURNS
        !           318:  *
        !           319:  *     Returns an exit status of 1 to the parent process.
        !           320:  *
        !           321:  */
        !           322: 
        !           323: #if __STDC__
        !           324: 
        !           325: static void usage(void)
        !           326: 
        !           327: #else
        !           328: 
        !           329: static void usage()
        !           330: 
        !           331: #endif
        !           332: {
        !           333:     fprintf(stderr, "Usage: %s -c[bfvw] device block filename..\n", myname);
        !           334:     fprintf(stderr, "       %s -r[bvw] device block [filename...]\n", myname);
        !           335:     fprintf(stderr, "       %s -t[vf] device\n", myname);
        !           336:     fprintf(stderr, "       %s -u[bvw] device block [filename...]\n", myname);
        !           337:     fprintf(stderr, "       %s -x[flmovw] device [filename...]\n", myname);
        !           338:     exit(1);
        !           339: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.