Annotation of researchv8dc/cmd/cpio.c, revision 1.1

1.1     ! root        1: /*     @(#)cpio.c      1.7     */
        !             2: /*     cpio    COMPILE:        cc -O cpio.c -s -i -o cpio 
        !             3:        cpio -- copy file collections
        !             4: 
        !             5: */
        !             6: #include <stdio.h>
        !             7: #include <signal.h>
        !             8: #ifdef RT
        !             9: #include <rt/macro.h>
        !            10: #include <rt/types.h>
        !            11: #include <rt/stat.h>
        !            12: #else
        !            13: #include <sys/types.h>
        !            14: #include <sys/stat.h>
        !            15: #endif
        !            16: #define EQ(x,y)        (strcmp(x,y)==0)
        !            17: /* for VAX, Interdata, ... */
        !            18: #define MKSHORT(v,lv) {U.l=1L;if(U.c[0]) U.l=lv,v[0]=U.s[1],v[1]=U.s[0]; else U.l=lv,v[0]=U.s[0],v[1]=U.s[1];}
        !            19: #define MAGIC  070707          /* cpio magic number */
        !            20: #define IN     1               /* copy in */
        !            21: #define OUT    2               /* copy out */
        !            22: #define PASS   3               /* direct copy */
        !            23: #define HDRSIZE        (Hdr.h_name - (char *)&Hdr)     /* header size minus filename field */
        !            24: #define LINKS  1000            /* max no. of links allowed */
        !            25: #define CHARS  76              /* ASCII header size minus filename field */
        !            26: #undef BUFSIZE
        !            27: #define BUFSIZE 512            /* In u370, can't use BUFSIZ nor BSIZE */
        !            28: #define CPIOBSZ 4096           /* file read/write */
        !            29: #ifdef RT
        !            30: extern long filespace;
        !            31: #endif
        !            32: 
        !            33: struct stat    Statb, Xstatb;
        !            34: 
        !            35:        /* Cpio header format */
        !            36: struct header {
        !            37:        short   h_magic,
        !            38:                h_dev;
        !            39:        unsigned
        !            40:        short   h_ino,
        !            41:                h_mode,
        !            42:                h_uid,
        !            43:                h_gid;
        !            44:        short   h_nlink,
        !            45:                h_rdev,
        !            46:                h_mtime[2],
        !            47:                h_namesize,
        !            48:                h_filesize[2];
        !            49:        char    h_name[256];
        !            50: } Hdr;
        !            51: 
        !            52: unsigned       Bufsize = BUFSIZE;              /* default record size */
        !            53: short  Buf[CPIOBSZ/2], *Dbuf;
        !            54: char   BBuf[CPIOBSZ], *Cbuf;
        !            55: int    Wct, Wc;
        !            56: short  *Wp;
        !            57: char   *Cp;
        !            58: 
        !            59: #ifdef RT
        !            60: short  Actual_size[2];
        !            61: #endif
        !            62: 
        !            63: short  Option,
        !            64:        Dir,
        !            65:        Uncond,
        !            66:        Link,
        !            67:        Rename,
        !            68:        Toc,
        !            69:        Verbose,
        !            70:        Select,
        !            71:        Mod_time,
        !            72:        Acc_time,
        !            73:        Cflag,
        !            74:        fflag,
        !            75: #ifdef RT
        !            76:        Extent,
        !            77: #endif
        !            78:        Swap,
        !            79:        byteswap,
        !            80:        bothswap,
        !            81:        halfswap;
        !            82: 
        !            83: int    Ifile,
        !            84:        Ofile,
        !            85:        Input = 0,
        !            86:        Output = 1;
        !            87: long   Blocks,
        !            88:        Longfile,
        !            89:        Longtime;
        !            90: 
        !            91: char   Fullname[256],
        !            92:        Name[256];
        !            93: int    Pathend;
        !            94: 
        !            95: FILE   *Rtty,
        !            96:        *Wtty;
        !            97: 
        !            98: char   *Pattern[100];
        !            99: char   Strhdr[500];
        !           100: char   *Chdr = Strhdr;
        !           101: short  Dev,
        !           102:        Uid,
        !           103:        Gid,
        !           104:        A_directory,
        !           105:        A_special,
        !           106: #ifdef RT
        !           107:        One_extent,
        !           108:        Multi_extent,
        !           109: #endif
        !           110:        Filetype = S_IFMT;
        !           111: 
        !           112: extern errno;
        !           113: char   *malloc();
        !           114: char   *cd();
        !           115: /*     char    *Cd_name;       */
        !           116: FILE   *popen();
        !           117: 
        !           118: union { long l; short s[2]; char c[4]; } U;
        !           119: 
        !           120: /* for VAX, Interdata, ... */
        !           121: long mklong(v)
        !           122: short v[];
        !           123: {
        !           124:        U.l = 1;
        !           125:        if(U.c[0])
        !           126:                U.s[0] = v[1], U.s[1] = v[0];
        !           127:        else
        !           128:                U.s[0] = v[0], U.s[1] = v[1];
        !           129:        return U.l;
        !           130: }
        !           131: 
        !           132: main(argc, argv)
        !           133: char **argv;
        !           134: {
        !           135:        register ct;
        !           136:        long    filesz;
        !           137:        register char *fullp;
        !           138:        register i;
        !           139:        int ans;
        !           140: 
        !           141:        signal(SIGSYS, 1);
        !           142:        if(*argv[1] != '-')
        !           143:                usage();
        !           144:        Uid = getuid();
        !           145:        umask(0);
        !           146:        Gid = getgid();
        !           147:        Pattern[0] = "*";
        !           148: 
        !           149:        while(*++argv[1]) {
        !           150:                switch(*argv[1]) {
        !           151:                case 'a':               /* reset access time */
        !           152:                        Acc_time++;
        !           153:                        break;
        !           154:                case 'B':               /* change record size to 5120 bytes */
        !           155:                        Bufsize = 5120;
        !           156:                        break;
        !           157:                case 'i':
        !           158:                        Option = IN;
        !           159:                        if(argc > 2 ) { /* save patterns, if any */
        !           160:                                for(i = 0; (i+2) < argc; ++i)
        !           161:                                        Pattern[i] = argv[i+2];
        !           162:                        }
        !           163:                        break;
        !           164:                case 'f':       /* do not consider patterns in cmd line */
        !           165:                        fflag++;
        !           166:                        break;
        !           167:                case 'o':
        !           168:                        if(argc != 2)
        !           169:                                usage();
        !           170:                        Option = OUT;
        !           171:                        break;
        !           172:                case 'p':
        !           173:                        if(argc != 3)
        !           174:                                usage();
        !           175:                        if(access(argv[2], 2) == -1) {
        !           176: accerr:
        !           177:                                fprintf(stderr,"cannot write in <%s>\n", argv[2]);
        !           178:                                exit(2);
        !           179:                        }
        !           180:                        strcpy(Fullname, argv[2]);      /* destination directory */
        !           181:                        strcat(Fullname, "/");
        !           182:                        stat(Fullname, &Xstatb);
        !           183:                        if((Xstatb.st_mode&S_IFMT) != S_IFDIR)
        !           184:                                goto accerr;
        !           185:                        Option = PASS;
        !           186:                        Dev = Xstatb.st_dev;
        !           187:                        break;
        !           188:                case 'c':               /* ASCII header */
        !           189:                        Cflag++;
        !           190:                        break;
        !           191:                case 'd':               /* create directories when needed */
        !           192:                        Dir++;
        !           193:                        break;
        !           194:                case 'l':               /* link files, when necessary */
        !           195:                        Link++;
        !           196:                        break;
        !           197:                case 'm':               /* retain mod time */
        !           198:                        Mod_time++;
        !           199:                        break;
        !           200:                case 'r':               /* rename files interactively */
        !           201:                        Rename++;
        !           202:                        Rtty = fopen("/dev/tty", "r");
        !           203:                        Wtty = fopen("/dev/tty", "w");
        !           204:                        if(Rtty==NULL || Wtty==NULL) {
        !           205:                                fprintf(stderr,
        !           206:                                  "Cannot rename (/dev/tty missing)\n");
        !           207:                                exit(2);
        !           208:                        }
        !           209:                        break;
        !           210:                case 'S':               /* swap halfwords */
        !           211:                        halfswap++;
        !           212:                        Swap++;
        !           213:                        break;
        !           214:                case 's':               /* swap bytes */
        !           215:                        byteswap++;
        !           216:                        Swap++;
        !           217:                        break;
        !           218:                case 'b':
        !           219:                        bothswap++;
        !           220:                        Swap++;
        !           221:                        break;
        !           222:                case 't':               /* table of contents */
        !           223:                        Toc++;
        !           224:                        break;
        !           225:                case 'u':               /* copy unconditionally */
        !           226:                        Uncond++;
        !           227:                        break;
        !           228:                case 'v':               /* verbose table of contents */
        !           229:                        Verbose++;
        !           230:                        break;
        !           231:                case '6':               /* for old, sixth-edition files */
        !           232:                        Filetype = 060000;
        !           233:                        break;
        !           234: #ifdef RT
        !           235:                case 'e':
        !           236:                        Extent++;
        !           237:                        break;
        !           238: #endif
        !           239:                default:
        !           240:                        usage();
        !           241:                }
        !           242:        }
        !           243:        if(!Option) {
        !           244:                fprintf(stderr,"Options must include o|i|p\n");
        !           245:                exit(2);
        !           246:        }
        !           247: #ifdef RT
        !           248:                setio(-1,1);    /* turn on physio */
        !           249: #endif
        !           250: 
        !           251:        if(Option == PASS) {
        !           252:                if(Rename) {
        !           253:                        fprintf(stderr,"Pass and Rename cannot be used together\n");
        !           254:                        exit(2);
        !           255:                }
        !           256:                if(Bufsize == 5120) {
        !           257:                        printf("`B' option is irrelevant with the '-p' option\n");
        !           258:                        Bufsize = BUFSIZE;
        !           259:                }
        !           260: 
        !           261:        }else  {
        !           262:                if(Cflag)
        !           263:                    Cp = Cbuf = (char *)malloc(Bufsize);
        !           264:                else
        !           265:                    Wp = Dbuf = (short *)malloc(Bufsize);
        !           266:        }
        !           267:        Wct = Bufsize >> 1;
        !           268:        Wc = Bufsize;
        !           269: 
        !           270:        switch(Option) {
        !           271: 
        !           272:        case OUT:               /* get filename, copy header and file out */
        !           273:                while(getname()) {
        !           274:                        if( mklong(Hdr.h_filesize) == 0L) {
        !           275:                           if( Cflag )
        !           276:                                writehdr(Chdr,CHARS+Hdr.h_namesize);
        !           277:                           else
        !           278:                                bwrite(&Hdr, HDRSIZE+Hdr.h_namesize);
        !           279: #ifdef RT
        !           280:                        if (One_extent || Multi_extent) {
        !           281:                           actsize(0);
        !           282:                           if( Cflag )
        !           283:                                writehdr(Chdr,CHARS+Hdr.h_namesize);
        !           284:                           else
        !           285:                                bwrite(&Hdr, HDRSIZE+Hdr.h_namesize);
        !           286:                        }
        !           287: #endif
        !           288:                                continue;
        !           289:                        }
        !           290:                        if((Ifile = open(Hdr.h_name, 0)) < 0) {
        !           291:                                fprintf(stderr,"<%s> ?\n", Hdr.h_name);
        !           292:                                continue;
        !           293:                        }
        !           294:                        if ( Cflag )
        !           295:                                writehdr(Chdr,CHARS+Hdr.h_namesize);
        !           296:                        else
        !           297:                                bwrite(&Hdr, HDRSIZE+Hdr.h_namesize);
        !           298: #ifdef RT
        !           299:                        if (One_extent || Multi_extent) {
        !           300:                           actsize(Ifile);
        !           301:                           if(Cflag)
        !           302:                                writehdr(Chdr,CHARS+Hdr.h_namesize);
        !           303:                           else
        !           304:                                bwrite(&Hdr, HDRSIZE+Hdr.h_namesize);
        !           305:                           Hdr.h_filesize[0] = Actual_size[0];
        !           306:                           Hdr.h_filesize[1] = Actual_size[1];
        !           307:                        }
        !           308: #endif
        !           309:                        for(filesz=mklong(Hdr.h_filesize); filesz>0; filesz-= CPIOBSZ){
        !           310:                                ct = filesz>CPIOBSZ? CPIOBSZ: filesz;
        !           311:                                if(read(Ifile, Cflag? BBuf: (char *)Buf, ct) < 0) {
        !           312:                                        fprintf(stderr,"Cannot read %s\n", Hdr.h_name);
        !           313:                                        continue;
        !           314:                                }
        !           315:                                Cflag? writehdr(BBuf,ct): bwrite(Buf,ct);
        !           316:                        }
        !           317:                        close(Ifile);
        !           318:                        if(Acc_time)
        !           319:                                utime(Hdr.h_name, &Statb.st_atime);
        !           320:                        if(Verbose)
        !           321:                                fprintf(stderr,"%s\n", Hdr.h_name);
        !           322:                }
        !           323: 
        !           324:        /* copy trailer, after all files have been copied */
        !           325:                strcpy(Hdr.h_name, "TRAILER!!!");
        !           326:                Hdr.h_magic = MAGIC;
        !           327:                MKSHORT(Hdr.h_filesize, 0L);
        !           328:                Hdr.h_namesize = strlen("TRAILER!!!") + 1;
        !           329:                if ( Cflag )  {
        !           330:                        bintochar(0L);
        !           331:                        writehdr(Chdr,CHARS+Hdr.h_namesize);
        !           332:                }
        !           333:                else
        !           334:                        bwrite(&Hdr, HDRSIZE+Hdr.h_namesize);
        !           335:                Cflag? writehdr(Cbuf, Bufsize): bwrite(Dbuf, Bufsize);
        !           336:                break;
        !           337: 
        !           338:        case IN:
        !           339:                pwd();
        !           340:                while(gethdr()) {
        !           341:                        Ofile = ckname(Hdr.h_name)? openout(Hdr.h_name): 0;
        !           342:                        for(filesz=mklong(Hdr.h_filesize); filesz>0; filesz-= CPIOBSZ){
        !           343:                                ct = filesz>CPIOBSZ? CPIOBSZ: filesz;
        !           344:                                Cflag? readhdr(BBuf,ct): bread(Buf, ct);
        !           345:                                if(Ofile) {
        !           346:                                        if(Swap)
        !           347:                                           Cflag? swap(BBuf,ct): swap(Buf,ct);
        !           348:                                        if(write(Ofile, Cflag? BBuf: (char *)Buf, ct) < 0) {
        !           349:                                         fprintf(stderr,"Cannot write %s\n", Hdr.h_name);
        !           350:                                         continue;
        !           351:                                        }
        !           352:                                }
        !           353:                        }
        !           354:                        if(Ofile) {
        !           355:                                close(Ofile);
        !           356:                                if(chmod(Hdr.h_name, Hdr.h_mode) < 0) {
        !           357:                                        fprintf(stderr,"Cannot chmod <%s> (errno:%d)\n", Hdr.h_name, errno);
        !           358:                                }
        !           359:                                set_time(Hdr.h_name, mklong(Hdr.h_mtime), mklong(Hdr.h_mtime));
        !           360:                        }
        !           361:                        if(!Select)
        !           362:                                continue;
        !           363:                        if(Verbose)
        !           364:                                if(Toc)
        !           365:                                        pentry(Hdr.h_name);
        !           366:                                else
        !           367:                                        puts(Hdr.h_name);
        !           368:                        else if(Toc)
        !           369:                                puts(Hdr.h_name);
        !           370:                }
        !           371:                break;
        !           372: 
        !           373:        case PASS:              /* move files around */
        !           374:                fullp = Fullname + strlen(Fullname);
        !           375: 
        !           376:                while(getname()) {
        !           377:                        if (A_directory && !Dir)
        !           378:                                fprintf(stderr,"Use `-d' option to copy <%s>\n",Hdr.h_name);
        !           379:                        if(!ckname(Hdr.h_name))
        !           380:                                continue;
        !           381:                        i = 0;
        !           382:                        while(Hdr.h_name[i] == '/')
        !           383:                                i++;
        !           384:                        strcpy(fullp, &(Hdr.h_name[i]));
        !           385: 
        !           386:                        if(Link
        !           387:                        && !A_directory
        !           388:                        && Dev == Statb.st_dev)  {
        !           389: /* ???                 && (Uid == Statb.st_uid || !Uid)) {*/
        !           390:                                if(link(Hdr.h_name, Fullname) < 0) { /* missing dir.? */
        !           391:                                        unlink(Fullname);
        !           392:                                        missdir(Fullname);
        !           393:                                        if(link(Hdr.h_name, Fullname) < 0) {
        !           394:                                                fprintf(stderr,
        !           395:                                                 "Cannot link <%s> & <%s>\n",
        !           396:                                                 Hdr.h_name, Fullname);
        !           397:                                                continue;
        !           398:                                        }
        !           399:                                }
        !           400: 
        !           401: /* try creating (only twice) */
        !           402:                                ans = 0;
        !           403:                                do {
        !           404:                                        if(link(Hdr.h_name, Fullname) < 0) { /* missing dir.? */
        !           405:                                                unlink(Fullname);
        !           406:                                                ans += 1;
        !           407:                                        }else {
        !           408:                                                ans = 0;
        !           409:                                                break;
        !           410:                                        }
        !           411:                                }while(ans < 2 && missdir(Fullname) == 0);
        !           412:                                if(ans == 1) {
        !           413:                                        fprintf(stderr,"Cannot create directory for <%s> (errno:%d)\n", Fullname, errno);
        !           414:                                        exit(0);
        !           415:                                }else if(ans == 2) {
        !           416:                                        fprintf(stderr,"Cannot link <%s> & <%s>\n", Hdr.h_name, Fullname);
        !           417:                                        exit(0);
        !           418:                                }
        !           419: 
        !           420:                                if(chmod(Hdr.h_name, Hdr.h_mode) < 0) {
        !           421:                                        fprintf(stderr,"Cannot chmod <%s> (errno:%d)\n", Hdr.h_name, errno);
        !           422:                                }
        !           423:                                set_time(Hdr.h_name, mklong(Hdr.h_mtime), mklong(Hdr.h_mtime));
        !           424:                                goto ckverbose;
        !           425:                        }
        !           426: #ifdef RT
        !           427:                        if (One_extent || Multi_extent)
        !           428:                                actsize(0);
        !           429: #endif
        !           430:                        if(!(Ofile = openout(Fullname)))
        !           431:                                continue;
        !           432:                        if((Ifile = open(Hdr.h_name, 0)) < 0) {
        !           433:                                fprintf(stderr,"<%s> ?\n", Hdr.h_name);
        !           434:                                close(Ofile);
        !           435:                                continue;
        !           436:                        }
        !           437:                        filesz = Statb.st_size;
        !           438:                        for(; filesz > 0; filesz -= CPIOBSZ) {
        !           439:                                ct = filesz>CPIOBSZ? CPIOBSZ: filesz;
        !           440:                                if(read(Ifile, Buf, ct) < 0) {
        !           441:                                        fprintf(stderr,"Cannot read %s\n", Hdr.h_name);
        !           442:                                        break;
        !           443:                                }
        !           444:                                if(Ofile)
        !           445:                                        if(write(Ofile, Buf, ct) < 0) {
        !           446:                                         fprintf(stderr,"Cannot write %s\n", Hdr.h_name);
        !           447:                                         break;
        !           448:                                        }
        !           449: #ifndef u370
        !           450:                                Blocks += ((ct + (BUFSIZE - 1)) / BUFSIZE);
        !           451: #else
        !           452:                                ++Blocks;
        !           453: #endif
        !           454:                        }
        !           455:                        close(Ifile);
        !           456:                        if(Acc_time)
        !           457:                                utime(Hdr.h_name, &Statb.st_atime);
        !           458:                        if(Ofile) {
        !           459:                                close(Ofile);
        !           460:                                if(chmod(Fullname, Hdr.h_mode) < 0) {
        !           461:                                        fprintf(stderr,"Cannot chmod <%s> (errno:%d)\n", Fullname, errno);
        !           462:                                }
        !           463:                                set_time(Fullname, Statb.st_atime, mklong(Hdr.h_mtime));
        !           464: ckverbose:
        !           465:                                if(Verbose)
        !           466:                                        puts(Fullname);
        !           467:                        }
        !           468:                }
        !           469:        }
        !           470:        /* print number of blocks actually copied */
        !           471:           fprintf(stderr,"%ld blocks\n", Blocks * (Bufsize>>9));
        !           472:        exit(0);
        !           473: }
        !           474: usage()
        !           475: {
        !           476:        fprintf(stderr,"Usage: cpio -o[acvB] <name-list >collection\n%s\n%s\n",
        !           477:        "       cpio -i[cdmrstuvfB6] [pattern ...] <collection",
        !           478:        "       cpio -p[adlmruv] directory <name-list");
        !           479:        exit(2);
        !           480: }
        !           481: 
        !           482: getname()              /* get file name, get info for header */
        !           483: {
        !           484:        register char *namep = Name;
        !           485:        register unsigned short ftype;
        !           486:        long tlong;
        !           487: 
        !           488:        for(;;) {
        !           489:                if(gets(namep) == NULL)
        !           490:                        return 0;
        !           491:                if(*namep == '.' && namep[1] == '/')
        !           492:                        namep += 2;
        !           493:                strcpy(Hdr.h_name, namep);
        !           494:                if(stat(namep, &Statb) < 0) {
        !           495:                        fprintf(stderr,"< %s > ?\n", Hdr.h_name);
        !           496:                        continue;
        !           497:                }
        !           498:                ftype = Statb.st_mode & Filetype;
        !           499:                A_directory = (ftype == S_IFDIR);
        !           500:                A_special = (ftype == S_IFBLK)
        !           501:                        || (ftype == S_IFCHR)
        !           502: #ifdef UX3
        !           503:                        || (ftype == S_IFIFO)
        !           504: #endif
        !           505:                        ;
        !           506: #ifdef RT
        !           507:                A_special |= (ftype == S_IFREC);
        !           508:                One_extent = (ftype == S_IF1EXT);
        !           509:                Multi_extent = (ftype == S_IFEXT);
        !           510: #endif
        !           511:                Hdr.h_magic = MAGIC;
        !           512:                Hdr.h_namesize = strlen(Hdr.h_name) + 1;
        !           513:                Hdr.h_uid = Statb.st_uid;
        !           514:                Hdr.h_gid = Statb.st_gid;
        !           515:                Hdr.h_dev = Statb.st_dev;
        !           516:                Hdr.h_ino = Statb.st_ino;
        !           517:                Hdr.h_mode = Statb.st_mode;
        !           518:                MKSHORT(Hdr.h_mtime, Statb.st_mtime);
        !           519:                Hdr.h_nlink = Statb.st_nlink;
        !           520:                tlong = (Hdr.h_mode&S_IFMT) == S_IFREG? Statb.st_size: 0L;
        !           521: #ifdef RT
        !           522:                if (One_extent || Multi_extent) tlong = Statb.st_size;
        !           523: #endif
        !           524:                MKSHORT(Hdr.h_filesize, tlong);
        !           525:                Hdr.h_rdev = Statb.st_rdev;
        !           526:                if( Cflag )
        !           527:                   bintochar(tlong);
        !           528:                return 1;
        !           529:        }
        !           530: }
        !           531: 
        !           532: bintochar(t)           /* ASCII header write */
        !           533: long t;
        !           534: {
        !           535:        sprintf(Chdr,"%.6o%.6ho%.6ho%.6ho%.6ho%.6ho%.6ho%.6ho%.11lo%.6ho%.11lo%s",
        !           536:                MAGIC,Statb.st_dev,Statb.st_ino,Statb.st_mode,Statb.st_uid,
        !           537:                Statb.st_gid,Statb.st_nlink,Statb.st_rdev & 00000177777,
        !           538:                Statb.st_mtime,(short)strlen(Hdr.h_name)+1,t,Hdr.h_name);
        !           539: }
        !           540: 
        !           541: chartobin()            /* ASCII header read */
        !           542: {
        !           543:        sscanf(Chdr,"%6ho%6ho%6ho%6ho%6ho%6ho%6ho%6ho%11lo%6ho%11lo",
        !           544:                &Hdr.h_magic,&Hdr.h_dev,&Hdr.h_ino,&Hdr.h_mode,&Hdr.h_uid,
        !           545:                &Hdr.h_gid,&Hdr.h_nlink,&Hdr.h_rdev,&Longtime,&Hdr.h_namesize,
        !           546:                &Longfile);
        !           547:        MKSHORT(Hdr.h_filesize, Longfile);
        !           548:        MKSHORT(Hdr.h_mtime, Longtime);
        !           549: }
        !           550: 
        !           551: gethdr()               /* get file headers */
        !           552: {
        !           553:        register unsigned short ftype;
        !           554: 
        !           555:        if (Cflag)  {
        !           556:                readhdr(Chdr,CHARS);
        !           557:                chartobin();
        !           558:        }
        !           559:        else
        !           560:                bread(&Hdr, HDRSIZE);
        !           561: 
        !           562:        if(Hdr.h_magic != MAGIC) {
        !           563:                fprintf(stderr,"Out of phase--get help\n");
        !           564:                exit(2);
        !           565:        }
        !           566:        if(Cflag)
        !           567:                readhdr(Hdr.h_name, Hdr.h_namesize);
        !           568:        else
        !           569:                bread(Hdr.h_name, Hdr.h_namesize);
        !           570:        if(EQ(Hdr.h_name, "TRAILER!!!"))
        !           571:                return 0;
        !           572:        ftype = Hdr.h_mode & Filetype;
        !           573:        A_directory = (ftype == S_IFDIR);
        !           574:        A_special =(ftype == S_IFBLK)
        !           575:                || (ftype == S_IFCHR)
        !           576: #ifdef UX3
        !           577:                || (ftype == S_IFIFO)
        !           578: #endif
        !           579:                ;
        !           580: #ifdef RT
        !           581:        A_special |= (ftype == S_IFREC);
        !           582:        One_extent = (ftype == S_IF1EXT);
        !           583:        Multi_extent = (ftype == S_IFEXT);
        !           584:        if (One_extent || Multi_extent) {
        !           585:                Actual_size[0] = Hdr.h_filesize[0];
        !           586:                Actual_size[1] = Hdr.h_filesize[1];
        !           587:                if (Cflag)  {
        !           588:                        readhdr(Chdr,CHARS);
        !           589:                        chartobin();
        !           590:                }
        !           591:                else
        !           592:                        bread(&Hdr, HDRSIZE);
        !           593:        
        !           594:                if(Hdr.h_magic != MAGIC) {
        !           595:                        fprintf(stderr,"Out of phase--get RT help\n");
        !           596:                        exit(2);
        !           597:                }
        !           598:                if(Cflag)
        !           599:                        readhdr(Hdr.h_name, Hdr.h_namesize);
        !           600:                else
        !           601:                        bread(Hdr.h_name, Hdr.h_namesize);
        !           602:        }
        !           603: #endif
        !           604:        return 1;
        !           605: }
        !           606: 
        !           607: ckname(namep)  /* check filenames with patterns given on cmd line */
        !           608: register char *namep;
        !           609: {
        !           610:        ++Select;
        !           611:        if(fflag ^ !nmatch(namep, Pattern)) {
        !           612:                Select = 0;
        !           613:                return 0;
        !           614:        }
        !           615:        if(Rename && !A_directory) {    /* rename interactively */
        !           616:                fprintf(Wtty, "Rename <%s>\n", namep);
        !           617:                fflush(Wtty);
        !           618:                fgets(namep, 128, Rtty);
        !           619:                if(feof(Rtty))
        !           620:                        exit(2);
        !           621:                namep[strlen(namep) - 1] = '\0';
        !           622:                if(EQ(namep, "")) {
        !           623:                        printf("Skipped\n");
        !           624:                        return 0;
        !           625:                }
        !           626:        }
        !           627:        return !Toc;
        !           628: }
        !           629: 
        !           630: openout(namep) /* open files for writing, set all necessary info */
        !           631: register char *namep;
        !           632: {
        !           633:        register f;
        !           634:        register char *np;
        !           635:        int ans;
        !           636: 
        !           637:        if(!strncmp(namep, "./", 2))
        !           638:                namep += 2;
        !           639:        np = namep;
        !           640: /*
        !           641:        if(Option == IN)
        !           642:                Cd_name = namep = cd(namep);
        !           643: */
        !           644:        if(A_directory) {
        !           645:                if(!Dir
        !           646:                || Rename
        !           647:                || EQ(namep, ".")
        !           648:                || EQ(namep, ".."))     /* do not consider . or .. files */
        !           649:                        return 0;
        !           650:                if(stat(namep, &Xstatb) == -1) {
        !           651: 
        !           652: /* try creating (only twice) */
        !           653:                        ans = 0;
        !           654:                        do {
        !           655:                                if(makdir(namep) != 0) {
        !           656:                                        ans += 1;
        !           657:                                }else {
        !           658:                                        ans = 0;
        !           659:                                        break;
        !           660:                                }
        !           661:                        }while(ans < 2 && missdir(namep) == 0);
        !           662:                        if(ans == 1) {
        !           663:                                fprintf(stderr,"Cannot create directory for <%s> (errno:%d)\n", namep, errno);
        !           664:                                return(0);
        !           665:                        }else if(ans == 2) {
        !           666:                                fprintf(stderr,"Cannot create directory <%s> (errno:%d)\n", namep, errno);
        !           667:                                return(0);
        !           668:                        }
        !           669:                }
        !           670: 
        !           671: ret:
        !           672:                if(chmod(namep, Hdr.h_mode) < 0) {
        !           673:                        fprintf(stderr,"Cannot chmod <%s> (errno:%d)\n", namep, errno);
        !           674:                }
        !           675:                if(Uid == 0)
        !           676:                        if(chown(namep, Hdr.h_uid, Hdr.h_gid) < 0) {
        !           677:                                fprintf(stderr,"Cannot chown <%s> (errno:%d)\n", namep, errno);
        !           678:                        }
        !           679:                set_time(namep, mklong(Hdr.h_mtime), mklong(Hdr.h_mtime));
        !           680:                return 0;
        !           681:        }
        !           682:        if(Hdr.h_nlink > 1)
        !           683:                if(!postml(namep, np))
        !           684:                        return 0;
        !           685:        if(stat(namep, &Xstatb) == 0) {
        !           686:                if(Uncond && !((!(Xstatb.st_mode & S_IWRITE) || A_special) && (Uid != 0))) {
        !           687:                        if(unlink(namep) < 0) {
        !           688:                                fprintf(stderr,"cannot unlink current <%s> (errno:%d)\n", namep, errno);
        !           689:                        }
        !           690:                }
        !           691:                if(!Uncond && (mklong(Hdr.h_mtime) <= Xstatb.st_mtime)) {
        !           692:                /* There's a newer version of file on destination */
        !           693:                        if(mklong(Hdr.h_mtime) < Xstatb.st_mtime)
        !           694:                                fprintf(stderr,"current <%s> newer\n", np);
        !           695:                        return 0;
        !           696:                }
        !           697:        }
        !           698:        if(Option == PASS
        !           699:        && Hdr.h_ino == Xstatb.st_ino
        !           700:        && Hdr.h_dev == Xstatb.st_dev) {
        !           701:                fprintf(stderr,"Attempt to pass file to self!\n");
        !           702:                exit(2);
        !           703:        }
        !           704:        if(A_special) {
        !           705: #ifdef UX3
        !           706:                if((Hdr.h_mode & Filetype) == S_IFIFO)
        !           707:                        Hdr.h_rdev = 0;
        !           708: #endif
        !           709: 
        !           710: /* try creating (only twice) */
        !           711:                ans = 0;
        !           712:                do {
        !           713:                        if(mknod(namep, Hdr.h_mode, Hdr.h_rdev) < 0) {
        !           714:                                ans += 1;
        !           715:                        }else {
        !           716:                                ans = 0;
        !           717:                                break;
        !           718:                        }
        !           719:                }while(ans < 2 && missdir(np) == 0);
        !           720:                if(ans == 1) {
        !           721:                        fprintf(stderr,"Cannot create directory for <%s> (errno:%d)\n", namep, errno);
        !           722:                        return(0);
        !           723:                }else if(ans == 2) {
        !           724:                        fprintf(stderr,"Cannot mknod <%s> (errno:%d)\n", namep, errno);
        !           725:                        return(0);
        !           726:                }
        !           727: 
        !           728:                goto ret;
        !           729:        }
        !           730: #ifdef RT
        !           731:        if(One_extent || Multi_extent) {
        !           732: 
        !           733: /* try creating (only twice) */
        !           734:                ans = 0;
        !           735:                do {
        !           736:                        if((f = falloc(namep, Hdr.h_mode, longword(Hdr.h_filesize[0]))) < 0) {
        !           737:                                ans += 1;
        !           738:                        }else {
        !           739:                                ans = 0;
        !           740:                                break;
        !           741:                        }
        !           742:                }while(ans < 2 && missdir(np) == 0);
        !           743:                if(ans == 1) {
        !           744:                        fprintf(stderr,"Cannot create directory for <%s> (errno:%d)\n", namep, errno);
        !           745:                        return(0);
        !           746:                }else if(ans == 2) {
        !           747:                        fprintf(stderr,"Cannot create <%s> (errno:%d)\n", namep, errno);
        !           748:                        return(0);
        !           749:                }
        !           750: 
        !           751:                if(filespace < longword(Hdr.h_filesize[0])){
        !           752:                        fprintf(stderr,"Cannot create contiguous file <%s> proper size\n", namep);
        !           753:                        fprintf(stderr,"    <%s> will be created as a regular file\n", namep);
        !           754:                        if(unlink(Fullname) != 0)
        !           755:                                fprintf(stderr,"<%s> not removed\n", namep);
        !           756:                        Hdr.h_mode = (Hdr.h_mode & !S_IFMT) | S_IFREG;
        !           757:                        One_extent = Multi_extent = 0;
        !           758:                }
        !           759:        Hdr.h_filesize[0] = Actual_size[0];
        !           760:        Hdr.h_filesize[1] = Actual_size[1];
        !           761:        }
        !           762:        if (!(One_extent || Multi_extent)) {
        !           763: #endif
        !           764: 
        !           765: /* try creating (only twice) */
        !           766:        ans = 0;
        !           767:        do {
        !           768:                if((f = creat(namep, Hdr.h_mode)) < 0) {
        !           769:                        ans += 1;
        !           770:                }else {
        !           771:                        ans = 0;
        !           772:                        break;
        !           773:                }
        !           774:        }while(ans < 2 && missdir(np) == 0);
        !           775:        if(ans == 1) {
        !           776:                fprintf(stderr,"Cannot create directory for <%s> (errno:%d)\n", namep, errno);
        !           777:                return(0);
        !           778:        }else if(ans == 2) {
        !           779:                fprintf(stderr,"Cannot create <%s> (errno:%d)\n", namep, errno);
        !           780:                return(0);
        !           781:        }
        !           782: 
        !           783: #ifdef RT
        !           784:        }
        !           785: #endif
        !           786:        if(Uid == 0)
        !           787:                chown(namep, Hdr.h_uid, Hdr.h_gid);
        !           788:        return f;
        !           789: }
        !           790: 
        !           791: bread(b, c)
        !           792: register c;
        !           793: register short *b;
        !           794: {
        !           795:        static nleft = 0;
        !           796:        static short *ip;
        !           797:        register int rv;
        !           798:        register short *p = ip;
        !           799:        register int in;
        !           800: 
        !           801:        c = (c+1)>>1;
        !           802:        while(c--) {
        !           803:                if(nleft == 0) {
        !           804:                        in = 0;
        !           805:                        while((rv=read(Input, &(((char *)Dbuf)[in]), Bufsize - in)) != Bufsize - in) {
        !           806:                                if(rv <= 0) {
        !           807:                                        Input = chgreel(0, Input);
        !           808:                                        continue;
        !           809:                                }
        !           810:                                in += rv;
        !           811:                                nleft += (rv >> 1);
        !           812:                        }
        !           813:                        nleft += (rv >> 1);
        !           814:                        p = Dbuf;
        !           815:                        ++Blocks;
        !           816:                }
        !           817:                *b++ = *p++;
        !           818:                --nleft;
        !           819:        }
        !           820:        ip = p;
        !           821: }
        !           822: 
        !           823: readhdr(b, c)
        !           824: register c;
        !           825: register char *b;
        !           826: {
        !           827:        static nleft = 0;
        !           828:        static char *ip;
        !           829:        register int rv;
        !           830:        register char *p = ip;
        !           831:        register int in;
        !           832: 
        !           833:        while(c--)  {
        !           834:                if(nleft == 0) {
        !           835:                        in = 0;
        !           836:                        while((rv=read(Input, &(((char *)Cbuf)[in]), Bufsize - in)) != Bufsize - in) {
        !           837:                                if(rv <= 0) {
        !           838:                                        Input = chgreel(0, Input);
        !           839:                                        continue;
        !           840:                                }
        !           841:                                in += rv;
        !           842:                                nleft += rv;
        !           843:                        }
        !           844:                        nleft += rv;
        !           845:                        p = Cbuf;
        !           846:                        ++Blocks;
        !           847:                }
        !           848:                *b++ = *p++;
        !           849:                --nleft;
        !           850:        }
        !           851:        ip = p;
        !           852: }
        !           853: 
        !           854: bwrite(rp, c)
        !           855: register short *rp;
        !           856: register c;
        !           857: {
        !           858:        register short *wp = Wp;
        !           859: 
        !           860:        c = (c+1) >> 1;
        !           861:        while(c--) {
        !           862:                if(!Wct) {
        !           863: again:
        !           864:                        if(write(Output, Dbuf, Bufsize)<0) {
        !           865:                                Output = chgreel(1, Output);
        !           866:                                goto again;
        !           867:                        }
        !           868:                        Wct = Bufsize >> 1;
        !           869:                        wp = Dbuf;
        !           870:                        ++Blocks;
        !           871:                }
        !           872:                *wp++ = *rp++;
        !           873:                --Wct;
        !           874:        }
        !           875:        Wp = wp;
        !           876: }
        !           877: 
        !           878: writehdr(rp, c)
        !           879: register char *rp;
        !           880: register c;
        !           881: {
        !           882:        register char *cp = Cp;
        !           883: 
        !           884:        while(c--)  {
        !           885:                if(!Wc)  {
        !           886: again:
        !           887:                        if(write(Output,Cbuf,Bufsize)<0)  {
        !           888:                                Output = chgreel(1,Output);
        !           889:                                goto again;
        !           890:                        }
        !           891:                        Wc = Bufsize;
        !           892:                        cp = Cbuf;
        !           893:                        ++Blocks;
        !           894:                }
        !           895:                *cp++ = *rp++;
        !           896:                --Wc;
        !           897:        }
        !           898:        Cp = cp;
        !           899: }
        !           900: 
        !           901: postml(namep, np)              /* linking funtion */
        !           902: register char *namep, *np;
        !           903: {
        !           904:        register i;
        !           905:        static struct ml {
        !           906:                short   m_dev,
        !           907:                        m_ino;
        !           908:                char    m_name[2];
        !           909:        } *ml[LINKS];
        !           910:        static  mlinks = 0;
        !           911:        char *mlp;
        !           912:        int ans;
        !           913: 
        !           914:        for(i = 0; i < mlinks; ++i) {
        !           915:                if(mlinks == LINKS) break;
        !           916:                if(ml[i]->m_ino==Hdr.h_ino &&
        !           917:                        ml[i]->m_dev==Hdr.h_dev) {
        !           918:                        if(Verbose)
        !           919:                          printf("%s linked to %s\n", ml[i]->m_name,
        !           920:                                np);
        !           921:                        unlink(namep);
        !           922:                        if(Option == IN && *ml[i]->m_name != '/') {
        !           923:                                Fullname[Pathend] = '\0';
        !           924:                                strcat(Fullname, ml[i]->m_name);
        !           925:                                mlp = Fullname;
        !           926:                        }
        !           927:                        mlp = ml[i]->m_name;
        !           928: 
        !           929: /* try linking (only twice) */
        !           930:                        ans = 0;
        !           931:                        do {
        !           932:                                if(link(mlp, namep) < 0) {
        !           933:                                        ans += 1;
        !           934:                                }else {
        !           935:                                        ans = 0;
        !           936:                                        break;
        !           937:                                }
        !           938:                        }while(ans < 2 && missdir(np) == 0);
        !           939:                        if(ans == 1) {
        !           940:                                fprintf(stderr,"Cannot create directory for <%s> (errno:%d)\n", np, errno);
        !           941:                                return(0);
        !           942:                        }else if(ans == 2) {
        !           943:                                fprintf(stderr,"Cannot link <%s> & <%s>.\n", ml[i]->m_name, np);
        !           944:                                return(0);
        !           945:                        }
        !           946: 
        !           947:                        set_time(namep, mklong(Hdr.h_mtime), mklong(Hdr.h_mtime));
        !           948:                        return 0;
        !           949:                }
        !           950:        }
        !           951:        if(mlinks == LINKS
        !           952:        || !(ml[mlinks] = (struct ml *)malloc(strlen(np) + 2 + sizeof(struct ml)))) {
        !           953:                static int first=1;
        !           954: 
        !           955:                if(first)
        !           956:                        if(mlinks == LINKS)
        !           957:                                fprintf(stderr,"Too many links\n");
        !           958:                        else
        !           959:                                fprintf(stderr,"No memory for links\n");
        !           960:                mlinks = LINKS;
        !           961:                first = 0;
        !           962:                return 1;
        !           963:        }
        !           964:        ml[mlinks]->m_dev = Hdr.h_dev;
        !           965:        ml[mlinks]->m_ino = Hdr.h_ino;
        !           966:        strcpy(ml[mlinks]->m_name, np);
        !           967:        ++mlinks;
        !           968:        return 1;
        !           969: }
        !           970: 
        !           971: pentry(namep)          /* print verbose table of contents */
        !           972: register char *namep;
        !           973: {
        !           974: 
        !           975:        static short lastid = -1;
        !           976: #include <pwd.h>
        !           977:        static struct passwd *pw;
        !           978:        struct passwd *getpwuid();
        !           979:        static char tbuf[32];
        !           980:        char *ctime();
        !           981: 
        !           982:        printf("%-7o", Hdr.h_mode & 0177777);
        !           983:        if(lastid != -1 && lastid == Hdr.h_uid)
        !           984:                printf("%-6s", pw->pw_name);
        !           985:        else {
        !           986:                setpwent();
        !           987:                if(pw = getpwuid((int)Hdr.h_uid)) {
        !           988:                        lastid = Hdr.h_uid;
        !           989:                        printf("%-6s", pw->pw_name);
        !           990:                } else {
        !           991:                        printf("%-6d", Hdr.h_uid);
        !           992:                        lastid = -1;
        !           993:                }
        !           994:        }
        !           995:        printf("%7ld ", mklong(Hdr.h_filesize));
        !           996:        U.l = mklong(Hdr.h_mtime);
        !           997:        strcpy(tbuf, ctime((long *)&U.l));
        !           998:        tbuf[24] = '\0';
        !           999:        printf(" %s  %s\n", &tbuf[4], namep);
        !          1000: }
        !          1001: 
        !          1002:                /* pattern matching functions */
        !          1003: nmatch(s, pat)
        !          1004: char *s, **pat;
        !          1005: {
        !          1006:        if(EQ(*pat, "*"))
        !          1007:                return 1;
        !          1008:        while(*pat) {
        !          1009:                if((**pat == '!' && !gmatch(s, *pat+1))
        !          1010:                || gmatch(s, *pat))
        !          1011:                        return 1;
        !          1012:                ++pat;
        !          1013:        }
        !          1014:        return 0;
        !          1015: }
        !          1016: gmatch(s, p)
        !          1017: register char *s, *p;
        !          1018: {
        !          1019:        register int c;
        !          1020:        register cc, ok, lc, scc;
        !          1021: 
        !          1022:        scc = *s;
        !          1023:        lc = 077777;
        !          1024:        switch (c = *p) {
        !          1025: 
        !          1026:        case '[':
        !          1027:                ok = 0;
        !          1028:                while (cc = *++p) {
        !          1029:                        switch (cc) {
        !          1030: 
        !          1031:                        case ']':
        !          1032:                                if (ok)
        !          1033:                                        return(gmatch(++s, ++p));
        !          1034:                                else
        !          1035:                                        return(0);
        !          1036: 
        !          1037:                        case '-':
        !          1038:                                ok |= ((lc <= scc) && (scc <= (cc=p[1])));
        !          1039:                        }
        !          1040:                        if (scc==(lc=cc)) ok++;
        !          1041:                }
        !          1042:                return(0);
        !          1043: 
        !          1044:        case '?':
        !          1045:        caseq:
        !          1046:                if(scc) return(gmatch(++s, ++p));
        !          1047:                return(0);
        !          1048:        case '*':
        !          1049:                return(umatch(s, ++p));
        !          1050:        case 0:
        !          1051:                return(!scc);
        !          1052:        }
        !          1053:        if (c==scc) goto caseq;
        !          1054:        return(0);
        !          1055: }
        !          1056: 
        !          1057: umatch(s, p)
        !          1058: register char *s, *p;
        !          1059: {
        !          1060:        if(*p==0) return(1);
        !          1061:        while(*s)
        !          1062:                if (gmatch(s++,p)) return(1);
        !          1063:        return(0);
        !          1064: }
        !          1065: 
        !          1066: makdir(namep)          /* make needed directories */
        !          1067: register char *namep;
        !          1068: {
        !          1069:        static status;
        !          1070:        register pid;
        !          1071: 
        !          1072:        if(pid = fork())
        !          1073:                while(wait(&status) != pid);
        !          1074:        else {
        !          1075:                close(2);
        !          1076:                execl("/bin/mkdir", "mkdir", namep, 0);
        !          1077:                exit(2);
        !          1078:        }
        !          1079:        return ((status>>8) & 0377)? 1: 0;
        !          1080: }
        !          1081: 
        !          1082: swap(buf, ct)          /* swap halfwords, bytes or both */
        !          1083: register ct;
        !          1084: register char *buf;
        !          1085: {
        !          1086:        register char c;
        !          1087:        register union swp { long       longw; short    shortv[2]; char charv[4]; } *pbuf;
        !          1088:        int savect, n, i;
        !          1089:        char *savebuf;
        !          1090:        short cc;
        !          1091: 
        !          1092:        savect = ct;    savebuf = buf;
        !          1093:        if(byteswap || bothswap) {
        !          1094:                if (ct % 2) buf[ct] = 0;
        !          1095:                ct = (ct + 1) / 2;
        !          1096:                while (ct--) {
        !          1097:                        c = *buf;
        !          1098:                        *buf = *(buf + 1);
        !          1099:                        *(buf + 1) = c;
        !          1100:                        buf += 2;
        !          1101:                }
        !          1102:                if (bothswap) {
        !          1103:                        ct = savect;
        !          1104:                        pbuf = (union swp *)savebuf;
        !          1105:                        if (n = ct % sizeof(union swp)) {
        !          1106:                                if(n % 2)
        !          1107:                                        for(i = ct + 1; i <= ct + (sizeof(union swp) - n); i++) pbuf->charv[i] = 0;
        !          1108:                                else
        !          1109:                                        for (i = ct; i < ct + (sizeof(union swp) - n); i++) pbuf->charv[i] = 0;
        !          1110:                        }
        !          1111:                        ct = (ct + (sizeof(union swp) -1)) / sizeof(union swp);
        !          1112:                        while(ct--) {
        !          1113:                                cc = pbuf->shortv[0];
        !          1114:                                pbuf->shortv[0] = pbuf->shortv[1];
        !          1115:                                pbuf->shortv[1] = cc;
        !          1116:                                ++pbuf;
        !          1117:                        }
        !          1118:                }
        !          1119:        }
        !          1120:        else if (halfswap) {
        !          1121:                pbuf = (union swp *)buf;
        !          1122:                if (n = ct % sizeof(union swp))
        !          1123:                        for (i = ct; i < ct + (sizeof(union swp) - n); i++) pbuf->charv[i] = 0;
        !          1124:                ct = (ct + (sizeof(union swp) -1)) / sizeof(union swp);
        !          1125:                while (ct--) {
        !          1126:                        cc = pbuf->shortv[0];
        !          1127:                        pbuf->shortv[0] = pbuf->shortv[1];
        !          1128:                        pbuf->shortv[1] = cc;
        !          1129:                        ++pbuf;
        !          1130:                }
        !          1131:        }
        !          1132: }
        !          1133: set_time(namep, atime, mtime)  /* set access and modification times */
        !          1134: register *namep;
        !          1135: long atime, mtime;
        !          1136: {
        !          1137:        static long timevec[2];
        !          1138: 
        !          1139:        if(!Mod_time)
        !          1140:                return;
        !          1141:        timevec[0] = atime;
        !          1142:        timevec[1] = mtime;
        !          1143:        utime(namep, timevec);
        !          1144: }
        !          1145: chgreel(x, fl)
        !          1146: {
        !          1147:        register f;
        !          1148:        char str[22];
        !          1149:        FILE *devtty;
        !          1150:        struct stat statb;
        !          1151: 
        !          1152:        fprintf(stderr,"errno: %d, ", errno);
        !          1153:        fprintf(stderr,"Can't %s\n", x? "write output": "read input");
        !          1154:        fstat(fl, &statb);
        !          1155: #ifndef RT
        !          1156:        if((statb.st_mode&S_IFMT) != S_IFCHR)
        !          1157:                exit(2);
        !          1158: #else
        !          1159:        if((statb.st_mode & (S_IFBLK|S_IFREC))==0)
        !          1160:                exit(2);
        !          1161: #endif
        !          1162: again:
        !          1163:        fprintf(stderr,"If you want to go on, type device/file name when ready\n");
        !          1164:        devtty = fopen("/dev/tty", "r");
        !          1165:        fgets(str, 20, devtty);
        !          1166:        str[strlen(str) - 1] = '\0';
        !          1167:        if(!*str)
        !          1168:                exit(2);
        !          1169:        close(fl);
        !          1170:        if((f = open(str, x? 1: 0)) < 0) {
        !          1171:                fprintf(stderr,"That didn't work");
        !          1172:                fclose(devtty);
        !          1173:                goto again;
        !          1174:        }
        !          1175:        return f;
        !          1176: }
        !          1177: missdir(namep)
        !          1178: register char *namep;
        !          1179: {
        !          1180:        register char *np;
        !          1181:        register ct = 2;
        !          1182: 
        !          1183:        for(np = namep; *np; ++np)
        !          1184:                if(*np == '/') {
        !          1185:                        if(np == namep) continue;       /* skip over 'root slash' */
        !          1186:                        *np = '\0';
        !          1187:                        if(stat(namep, &Xstatb) == -1) {
        !          1188:                                if(Dir) {
        !          1189:                                        if((ct = makdir(namep)) != 0) {
        !          1190:                                                *np = '/';
        !          1191:                                                return(ct);
        !          1192:                                        }
        !          1193:                                }else {
        !          1194:                                        fprintf(stderr,"missing 'd' option\n");
        !          1195:                                        return(-1);
        !          1196:                                }
        !          1197:                        }
        !          1198:                        *np = '/';
        !          1199:                }
        !          1200:        if (ct == 2) ct = 0;            /* the file already exists */
        !          1201:        return ct;
        !          1202: }
        !          1203: 
        !          1204: pwd()          /* get working directory */
        !          1205: {
        !          1206:        FILE *dir;
        !          1207: 
        !          1208:        dir = popen("pwd", "r");
        !          1209:        fgets(Fullname, 256, dir);
        !          1210:        if(pclose(dir))
        !          1211:                exit(2);
        !          1212:        Pathend = strlen(Fullname);
        !          1213:        Fullname[Pathend - 1] = '/';
        !          1214: }
        !          1215: char * cd(n)           /* change directories */
        !          1216: register char *n;
        !          1217: {
        !          1218:        char *p_save = Name, *n_save = n, *p_end = 0;
        !          1219:        register char *p = Name;
        !          1220:        static char dotdot[]="../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../";
        !          1221:        int slashes, ans;
        !          1222: 
        !          1223:        if(*n == '/') /* don't try to chdir on full pathnames */
        !          1224:                return n;
        !          1225:        for(; *p && *n == *p; ++p, ++n) { /* whatever part of strings == */
        !          1226:                if(*p == '/')
        !          1227:                        p_save = p+1, n_save = n+1;
        !          1228:        }
        !          1229: 
        !          1230:        p = p_save;
        !          1231:        *p++ = '\0';
        !          1232:        for(slashes = 0; *p; ++p) { /* if prev is longer, chdir("..") */
        !          1233:                if(*p == '/')
        !          1234:                        ++slashes;
        !          1235:        }
        !          1236:        p = p_save;
        !          1237:        if(slashes) {
        !          1238:                slashes = slashes * 3 - 1;
        !          1239:                dotdot[slashes] = '\0';
        !          1240:                chdir(dotdot);
        !          1241:                dotdot[slashes] = '/';
        !          1242:        }
        !          1243: 
        !          1244:        n = n_save;
        !          1245:        for(; *n; ++n, ++p) {
        !          1246:                *p = *n;
        !          1247:                if(*n == '/')
        !          1248:                        p_end = p+1, n_save = n+1;
        !          1249:        }
        !          1250:        *p = '\0';
        !          1251: 
        !          1252:        if(p_end) {
        !          1253:                *p_end = '\0';
        !          1254:                if(chdir(p_save) == -1) {
        !          1255:                        if((ans = missdir(p_save)) == -1) {
        !          1256:                                fprintf(stderr,"Cannot chdir (no `d' option)\n");
        !          1257:                                exit(2);
        !          1258:                        } else if (ans > 0)  {
        !          1259:                                fprintf(stderr,"Cannot chdir - no write permission\n");
        !          1260:                                exit(2);
        !          1261:                        } else if(chdir(p_save) == -1)  {
        !          1262:                                fprintf(stderr,"Cannot chdir\n");
        !          1263:                                exit(2);
        !          1264:                        }
        !          1265:                }
        !          1266:        } else
        !          1267:                *p_save = '\0';
        !          1268:        return n_save;
        !          1269: }
        !          1270: #ifdef RT
        !          1271: actsize(file)
        !          1272: register int file;
        !          1273: {
        !          1274:        long tlong;
        !          1275:        long fsize();
        !          1276:        register int tfile;
        !          1277: 
        !          1278:        Actual_size[0] = Hdr.h_filesize[0];
        !          1279:        Actual_size[1] = Hdr.h_filesize[1];
        !          1280:        if (!Extent)
        !          1281:                return;
        !          1282:        if (file)
        !          1283:                tfile = file;
        !          1284:        else if ((tfile = open(Hdr.h_name,0)) < 0)
        !          1285:                return;
        !          1286:        tlong = fsize(tfile);
        !          1287:        MKSHORT(Hdr.h_filesize,tlong);
        !          1288:        if (Cflag)
        !          1289:                bintochar(tlong);
        !          1290:        if (!file)
        !          1291:                close(tfile);
        !          1292: }
        !          1293: #endif

unix.superglobalmegacorp.com

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