Annotation of coherent/d/usr/bin/pax/shipping/ustar.c, revision 1.1

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

unix.superglobalmegacorp.com

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