Annotation of 43BSD/contrib/ansi/ansitape.c, revision 1.1

1.1     ! root        1: #include <sys/types.h>
        !             2: #include <sys/time.h>
        !             3: #include <sys/mtio.h>
        !             4: #include <sys/ioctl.h>
        !             5: #include <sys/file.h>
        !             6: #include <sys/stat.h>
        !             7: #include <a.out.h>
        !             8: #include <stdio.h>
        !             9: #include <ctype.h>
        !            10: 
        !            11: char *malloc();
        !            12: int wflag;
        !            13: int xflag;
        !            14: int tflag;
        !            15: int cflag;
        !            16: int vflag;
        !            17: int dflag;
        !            18: int totalreadfiles = 0 ;
        !            19: int totalreadblocks = 0 ;
        !            20: int totalreadlines = 0 ;
        !            21: int totalreadchars = 0 ;
        !            22: int totalwritefiles = 0 ;
        !            23: int totalwriteblocks = 0 ;
        !            24: int totalwritelines = 0 ;
        !            25: int totalwritechars = 0 ;
        !            26: 
        !            27: main(argc,argv)
        !            28:        int argc;
        !            29:        char *argv[];
        !            30: {
        !            31:        struct tm *tm;
        !            32:        long timetemp;
        !            33:        int year;
        !            34:        int day;
        !            35:        char *tapename;
        !            36:        char *filename;
        !            37:        char *namelist=NULL;
        !            38:        char *device = "/dev/rmt12";
        !            39:        int tape;
        !            40:        int file;
        !            41:        int filenum;
        !            42:        int argnum;
        !            43:        char line[1001];
        !            44:        char vmsname[1000];
        !            45:        char unixname[1000];
        !            46:        FILE *names;
        !            47:        int count;
        !            48:        int tmp;
        !            49:        char blockchar;
        !            50:        int blocksize=2048;
        !            51: 
        !            52:        char *key;
        !            53: 
        !            54:        timetemp = time(0);
        !            55:        tm = localtime(&timetemp);
        !            56:        year = tm->tm_year;
        !            57:        day = tm->tm_yday;
        !            58:        tapename = malloc(10);
        !            59:        gethostname(tapename,6);
        !            60:        tapename[7]='\0';
        !            61: 
        !            62:        /* parse command line */
        !            63:        if (argc < 2)
        !            64:                usage();
        !            65: 
        !            66:        argv++;
        !            67:        argc--;
        !            68:        /* loop through first argument (key) */
        !            69:        argc--;
        !            70:        for (key = *argv++; *key; key++) 
        !            71:                switch(*key) {
        !            72: 
        !            73:                case 'f':
        !            74:                        if (*argv == NULL || argc <1) {
        !            75:                                fprintf(stderr,
        !            76:                        "ansitape: 'f' option requires tape name \n");
        !            77:                                usage();
        !            78:                        }
        !            79:                        device = *argv++;
        !            80:                        argc--;
        !            81:                        break;
        !            82: 
        !            83:                case 'n':
        !            84:                        if (*argv == NULL || argc <1) {
        !            85:                                fprintf(stderr,
        !            86:                        "ansitape: 'n' option requires file name\n");
        !            87:                                usage();
        !            88:                        }
        !            89:                        namelist = *argv++;
        !            90:                        argc--;
        !            91:                        break;
        !            92: 
        !            93:                case 'l':
        !            94:                        if (*argv == NULL || argc<1) {
        !            95:                                fprintf(stderr,
        !            96:                        "ansitape: 'l' option requires label\n");
        !            97:                                usage();
        !            98:                        }
        !            99:                        tapename = *argv++;
        !           100:                        argc--;
        !           101:                        break;
        !           102: 
        !           103:                case 'b':
        !           104:                        if (*argv == NULL) {
        !           105:                                fprintf(stderr,
        !           106:                        "ansitape: 'b' option requires blocksize specifier \n");
        !           107:                                usage();
        !           108:                        }
        !           109:                        tmp = sscanf(*argv++," %d%c ",&blocksize,&blockchar);
        !           110:                        argc--;
        !           111:                        if(tmp<1) { 
        !           112:                                fprintf(stderr,"illegal blocksize: blocksize set to 2048\n");
        !           113:                                blocksize=2048;
        !           114:                        } else if(tmp>1) {
        !           115:                                if(blockchar == 'b') blocksize *= 512;
        !           116:                                if(blockchar == 'k') blocksize *= 1024;
        !           117:                        }
        !           118:                        if(blocksize <18) blocksize=18;
        !           119:                        if(blocksize >62*1024) blocksize=62*1024;
        !           120:                        break;
        !           121: 
        !           122:                case 'c':
        !           123:                        cflag++;
        !           124:                        wflag++;
        !           125:                        break;
        !           126: 
        !           127:                case 'r':
        !           128:                        /*I know, this should be rflag, but I just don't like r for write*/
        !           129:                        wflag++;
        !           130:                        break;
        !           131: 
        !           132:                case 'v':
        !           133:                        vflag++;
        !           134:                        break;
        !           135: 
        !           136:                case 'x':
        !           137:                        xflag++;
        !           138:                        break;
        !           139: 
        !           140:                case 't':
        !           141:                        tflag++;
        !           142:                        break;
        !           143: 
        !           144:                case '-':
        !           145:                        break;
        !           146: 
        !           147:                default:
        !           148:                        fprintf(stderr, "ansitape: %c: unknown option\n", *key);
        !           149:                        usage();
        !           150:                }
        !           151: 
        !           152:        if (!wflag && !xflag && !tflag)
        !           153:                usage();
        !           154: 
        !           155:        tape = open(device,wflag?O_RDWR:O_RDONLY,NULL);
        !           156:        if(tape<0) {
        !           157:                perror(device);
        !           158:                printf(stderr,"tape not accessable - check if drive online and write ring present\n");
        !           159:                exit(1);
        !           160:        }
        !           161:        rewind(tape);
        !           162:        filenum=1;
        !           163:        casefix(tapename);
        !           164: 
        !           165:        if(cflag) { 
        !           166:                writevol(tapename,tape);
        !           167:        } else {
        !           168:                getvol(tapename,tape);
        !           169:                while(1) {
        !           170:                        /* read files */
        !           171:                        if( readfile(tape,argc,argv) ) break;
        !           172:                        filenum++;
        !           173:                }
        !           174:                backspace(tape);
        !           175:        }
        !           176: 
        !           177:        if(wflag) {
        !           178:                if(namelist) {
        !           179:                        if(*namelist == '-') {
        !           180:                                names = stdin;
        !           181:                        } else {
        !           182:                                names=fopen(namelist,"r");
        !           183:                                if(names == NULL) {
        !           184:                                        fprintf(stderr,"unable to open namelist file - no files added to tape\n");
        !           185:                                }
        !           186:                        }
        !           187:                        while(1) {
        !           188:                                fgets(line,1000,names);
        !           189:                                if(feof(names)) break;
        !           190:                                count = sscanf(line,"%s %s",unixname,vmsname);
        !           191:                                if(count<1) continue; /* blank line */
        !           192:                                if(count==1) strcpy(vmsname,unixname);
        !           193:                                casefix(vmsname);
        !           194:                                if(filecheck(&file,unixname)) continue;
        !           195:                                writefile(tape,file,vmsname,tapename,filenum,year,day,blocksize);
        !           196:                                filenum++;
        !           197:                                close(file);
        !           198:                        }
        !           199:                } else {
        !           200:                        for(argnum=0;argnum<argc;argnum++) {
        !           201:                                filename = argv[argnum];
        !           202:                                if(filecheck(&file,filename)) continue;
        !           203:                                casefix(filename);
        !           204:                                writefile(tape,file,filename,tapename,filenum,year,day,blocksize);
        !           205:                                filenum++;
        !           206:                                close(file);
        !           207:                        }
        !           208:                }
        !           209:                writetm(tape);
        !           210:                writetm(tape);
        !           211:                writetm(tape);
        !           212:                writetm(tape);
        !           213:        }
        !           214:        rewind(tape);
        !           215:        close(tape);
        !           216:        if(vflag && (tflag || xflag)) {
        !           217:                fprintf(stdout," read  %d files in %d blocks (%d lines, %d chars)\n",
        !           218:                        totalreadfiles,totalreadblocks,totalreadlines,totalreadchars);
        !           219:        }
        !           220:        if(vflag && wflag) {
        !           221:                fprintf(stdout," wrote  %d files in %d blocks (%d lines, %d chars)\n",
        !           222:                        totalwritefiles,totalwriteblocks,totalwritelines,totalwritechars);
        !           223:        }
        !           224: }
        !           225: usage() {
        !           226:        fprintf(stderr,
        !           227:                        "ansitape: usage: ansitape -{rxtc}[flnvb] [filename] [label] [filename] [blocksize] [files]\n");
        !           228:        exit();
        !           229: }
        !           230: 
        !           231: writefile(tape,file,filename,tapename,filenum,year,day,blocksize)
        !           232:        int tape;
        !           233:        int file;
        !           234:        char *filename;
        !           235:        char *tapename;
        !           236:        int filenum;
        !           237:        int year;
        !           238:        int day;
        !           239:        int blocksize;
        !           240: 
        !           241: {
        !           242:        int blocks;
        !           243:        writehdr1(tape,filename,tapename,filenum,year,day);
        !           244:        writehdr2(tape,blocksize);
        !           245:        writehdr3(tape);
        !           246:        writetm(tape);
        !           247:        writedata(tape,file,filename,&blocks,blocksize);
        !           248:        writetm(tape);
        !           249:        writeeof1(tape,filename,tapename,filenum,year,day,blocks);
        !           250:        writeeof2(tape);
        !           251:        writeeof3(tape);
        !           252:        writetm(tape);
        !           253:        totalwritefiles++;
        !           254: }
        !           255: 
        !           256: writedata(tape,file,filename,blocks,blocksize)
        !           257:        int tape;
        !           258:        int file;
        !           259:        char *filename;
        !           260:        int *blocks;
        !           261:        int blocksize;
        !           262: {
        !           263: char *ibuf;
        !           264: char *ibufstart;
        !           265: char *obuf;
        !           266: char *obufstart;
        !           267: char sizebuf[5];
        !           268: char *endibuf;
        !           269: char *endobuf;
        !           270: int got;
        !           271: int i;
        !           272: char *j;
        !           273: int numchar = 0 ;
        !           274: int numline = 0 ;
        !           275: int numblock = 0;
        !           276: int success;
        !           277: 
        !           278:        ibufstart = ibuf = malloc(blocksize<4096?8200:(2*blocksize+10));
        !           279:        obufstart = obuf = malloc(blocksize+10);
        !           280:        endobuf = obuf + blocksize;
        !           281:        endibuf = ibuf;
        !           282: 
        !           283: 
        !           284:        i=0;
        !           285:        while(1) {
        !           286:                if(ibuf+i>=endibuf) {   /* end of input buffer */
        !           287:                        strncpy(ibufstart,ibuf,endibuf-ibuf); /* copy leftover to start */
        !           288:                        ibuf = ibufstart+(endibuf-ibuf);        /* point to end of valid data */
        !           289:                        got = read(file,ibuf,blocksize<4096?4096:2*blocksize);  /* read in a chunk */
        !           290:                        endibuf = ibuf + got;
        !           291:                        ibuf = ibufstart;       /* point to beginning of data */
        !           292:                        if(got == 0) { /* end of input */
        !           293:                                if(ibuf==ibufstart){ /* no leftovers */
        !           294:                                        break; /* done */
        !           295:                                } else {
        !           296:                                        ibuf[i]='\n'; /* fake extra newline */
        !           297:                                }
        !           298:                        }
        !           299:                }
        !           300: 
        !           301:                if(obuf+i+4 > endobuf) {  /* end of output buffer */
        !           302:                        if(i>blocksize-4) { 
        !           303:                                printf("record exceeds blocksize - file truncated\n");
        !           304:                                break;
        !           305:                        }
        !           306:                        /* filled up output record - have to fill,output,restart*/
        !           307:                        for(j=obuf;j<endobuf;j++) {
        !           308:                                *j = '^';
        !           309:                        }
        !           310:                        success = write(tape,obufstart,blocksize);
        !           311:                        if(success != blocksize) {
        !           312:                                perror("tape");
        !           313:                                fprintf(stderr," hard write error:  write aborted\n");
        !           314:                                rewind(tape);
        !           315:                                exit(1);
        !           316:                        }
        !           317:                        obuf=obufstart;
        !           318:                        numchar -= i;
        !           319:                        i=0;
        !           320:                        numblock++;
        !           321:                        continue;
        !           322:                }
        !           323: 
        !           324:                if(ibuf[i] == '\n') { /* end of line */
        !           325:                        /*sprintf(sizebuf,"%4.4d",i+4); /* make length string */
        !           326:                        /*strncpy(obuf,sizebuf,4); /* put in length field */
        !           327:                        obuf[0] = ((i+4)/1000) + '0';
        !           328:                        obuf[1] = (((i+4)/100)%10) + '0';
        !           329:                        obuf[2] = (((i+4)/10)%10) + '0';
        !           330:                        obuf[3] = (((i+4)/1)%10) + '0';
        !           331:                        obuf += (4+i); /* size + strlen */
        !           332:                        ibuf += (1+i); /* newline + strlen */
        !           333:                        i=0;
        !           334:                        numline++;
        !           335:                        continue; /* back to the top */
        !           336:                }
        !           337: 
        !           338:                obuf[i+4]=ibuf[i];
        !           339:                numchar++;
        !           340:                i++;
        !           341: 
        !           342:        }
        !           343:        /* exited - write last record and go for lunch */
        !           344:        if(obuf != obufstart) {
        !           345:                for(j=obuf;j<endobuf;j++) {
        !           346:                        *j = '^';
        !           347:                }
        !           348:                success = write(tape,obufstart,blocksize);
        !           349:                if(success != blocksize) {
        !           350:                        perror("tape");
        !           351:                        fprintf(stderr," hard write error:  write aborted\n");
        !           352:                        rewind(tape);
        !           353:                        exit(1);
        !           354:                }
        !           355:                numblock++;
        !           356:        }
        !           357:        free(ibufstart);
        !           358:        free(obufstart);
        !           359:        if(vflag) {
        !           360:                fprintf(stdout,"r - %s:  %d lines (%d chars) in %d tape blocks\n",
        !           361:                                filename,numline,numchar,numblock);
        !           362:        }
        !           363:        totalwritechars += numchar;
        !           364:        totalwritelines += numline;
        !           365:        totalwriteblocks += numblock;
        !           366:        *blocks = numblock;
        !           367: }
        !           368: 
        !           369: writetm(tape)
        !           370:        int tape;
        !           371: {
        !           372:        struct mtop mtop;
        !           373:        mtop.mt_op = MTWEOF;
        !           374:        mtop.mt_count = 1;
        !           375:        ioctl(tape,MTIOCTOP,&mtop);
        !           376: }
        !           377: 
        !           378: rewind(tape)
        !           379:        int tape;
        !           380: {
        !           381:        struct mtop mtop;
        !           382:        mtop.mt_op = MTREW;
        !           383:        mtop.mt_count = 1;
        !           384:        ioctl(tape,MTIOCTOP,&mtop);
        !           385: }
        !           386: 
        !           387: skipfile(tape)
        !           388:        int tape;
        !           389: {
        !           390:        struct mtop mtop;
        !           391:        mtop.mt_op = MTFSF;
        !           392:        mtop.mt_count = 1;
        !           393:        ioctl(tape,MTIOCTOP,&mtop);
        !           394: }
        !           395: 
        !           396: backspace(tape)
        !           397:        int tape;
        !           398: {
        !           399:        struct mtop mtop;
        !           400:        mtop.mt_op = MTBSF;
        !           401:        mtop.mt_count = 1;
        !           402:        ioctl(tape,MTIOCTOP,&mtop);
        !           403: }
        !           404: 
        !           405: writehdr1(tape,filename,tapename,filenum,year,day)
        !           406:        int tape;
        !           407:        char *filename;
        !           408:        char *tapename;
        !           409:        int filenum;
        !           410:        int year;
        !           411:        int day;
        !           412: {
        !           413:        char buf[81];
        !           414:        sprintf(buf,
        !           415: "HDR1%-17.17s%-6.6s0001%4.4d000101 %2.2d%3.3d %2.2d%3.3d 000000DECFILE11A          "
        !           416:                ,filename,tapename,filenum,year,day,year,day);
        !           417:        write(tape,buf,80);
        !           418: }
        !           419: 
        !           420: writeeof1(tape,filename,tapename,filenum,year,day,blocks)
        !           421:        int tape;
        !           422:        char *filename;
        !           423:        char *tapename;
        !           424:        int filenum;
        !           425:        int year;
        !           426:        int day;
        !           427:        int blocks;
        !           428: {
        !           429:        char buf[81];
        !           430:        sprintf(buf,
        !           431: "EOF1%-17.17s%-6.6s0001%4.4d000101 %2.2d%3.3d %2.2d%3.3d %6.6dDECFILE11A          "
        !           432:                ,filename,tapename,filenum,year,day,year,day,blocks);
        !           433:        write(tape,buf,80);
        !           434: }
        !           435: 
        !           436: writehdr2(tape,blocksize)
        !           437:        int tape;
        !           438:        int blocksize;
        !           439: {
        !           440:        char buf[81];
        !           441:        sprintf(buf, "HDR2D%5.5d%5.5d%35.35s00%28.28s",blocksize,blocksize," "," ");
        !           442:        write(tape,buf,80);
        !           443: }
        !           444: 
        !           445: writeeof2(tape,blocksize)
        !           446:        int tape;
        !           447:        int blocksize;
        !           448: {
        !           449:        char buf[81];
        !           450:        sprintf(buf, "EOF2D%5.5d%5.5d%35.35s00%28.28s",blocksize,blocksize," "," ");
        !           451:        write(tape,buf,80);
        !           452: }
        !           453: 
        !           454: writehdr3(tape)
        !           455:        int tape;
        !           456: {
        !           457:        char buf[81];
        !           458:        sprintf(buf, "HDR3%76.76s"," ");
        !           459:        write(tape,buf,80);
        !           460: }
        !           461: 
        !           462: writeeof3(tape)
        !           463:        int tape;
        !           464: {
        !           465:        char buf[81];
        !           466:        sprintf(buf, "EOF3%76.76s"," ");
        !           467:        write(tape,buf,80);
        !           468: }
        !           469: 
        !           470: writevol(tapename,tape)
        !           471:        int tape;
        !           472:        char *tapename;
        !           473: {
        !           474:        char buf[81];
        !           475:        sprintf(buf,"VOL1%-6.6s %26.26sD%%C%10.10s1%28.28s3",tapename," "," "," ");
        !           476:        write(tape,buf,80);
        !           477:        if(vflag) {
        !           478:                fprintf(stdout," tape labeled %-6.6s\n",tapename);
        !           479:        }
        !           480: }
        !           481: 
        !           482: getvol(tapename,tape)
        !           483:        int tape;
        !           484:        char *tapename;
        !           485: {
        !           486:        char buf[81];
        !           487:        read(tape,buf,80);
        !           488:        sscanf(buf,"VOL1%6s",tapename);
        !           489:        if(vflag) {
        !           490:                fprintf(stdout," tape was labeled %-6.6s\n",tapename);
        !           491:        }
        !           492: }
        !           493: 
        !           494: casefix(string)
        !           495:     register char *string;
        !           496: {
        !           497:     while(*string) {
        !           498:         if(islower(*string)) {
        !           499:             *string = toupper(*string);
        !           500:         }
        !           501:         string++;
        !           502:     }
        !           503: }
        !           504: 
        !           505: #define getsize(a) ((a[0]-'0')*1000)+((a[1]-'0')*100)+((a[2]-'0')*10)+(a[3]-'0')
        !           506: int
        !           507: readfile(tape,argc,argv)
        !           508:        int tape;
        !           509:        int argc;
        !           510:        char *argv[];
        !           511: {
        !           512: char buf[80];
        !           513: char mode;
        !           514: char filename[18];
        !           515: FILE *file;
        !           516: int extract;
        !           517: char *ibuf;
        !           518: char *ibufstart;
        !           519: char *endibuf;
        !           520: int i;
        !           521: int size;
        !           522: int numblock = 0 ;
        !           523: int numchar = 0 ;
        !           524: int numline = 0 ;
        !           525: int argnum;
        !           526: int ok;
        !           527: int blocksize;
        !           528: int recordsize;
        !           529: int writeblock;
        !           530: 
        !           531:        if(!(read(tape,buf,80))) return(1); /* no hdr record, so second eof */
        !           532:        sscanf(buf,"HDR1%17s",filename);
        !           533:        read(tape,buf,80);
        !           534:        sscanf(buf,"HDR2%c%5d%5d",&mode,&blocksize,&recordsize);
        !           535:        blocksize = blocksize>recordsize?blocksize:recordsize;
        !           536:        skipfile(tape); /* throw away rest of header(s) - not interesting */
        !           537:        ibufstart=ibuf=malloc(blocksize+10);
        !           538:        endibuf=ibufstart+blocksize;
        !           539:        extract=0;
        !           540:        if(tflag || xflag) {
        !           541:                ok=0;
        !           542:                if(!argc) {
        !           543:                        ok=1;
        !           544:                } else for(argnum=0;argnum<argc;argnum++) {
        !           545:                        casefix(argv[argnum]);
        !           546:                        if(!strcmp(filename,argv[argnum])) {
        !           547:                                ok=1;
        !           548:                                break;
        !           549:                        }
        !           550:                }
        !           551:                if(mode == 'D') {
        !           552:                        if(xflag && ok) {
        !           553:                                file = fopen(filename,"w");
        !           554:                                if(file == NULL) {
        !           555:                                        perror(filename);
        !           556:                                } else {
        !           557:                                        extract = 1;
        !           558:                                }
        !           559:                        }
        !           560:                        while(read(tape,ibufstart,blocksize)) {
        !           561:                                numblock++;
        !           562:                                ibuf = ibufstart;
        !           563:                                while(strncmp("^^^^",ibuf,4)) {
        !           564:                                        size = getsize(ibuf);
        !           565:                                        if(extract) {
        !           566:                                                fwrite(ibuf+4,sizeof(char),size-4,file);
        !           567:                                                fwrite("\n",1,1,file);
        !           568:                                        }
        !           569:                                        ibuf += (size);
        !           570:                                        numline++;
        !           571:                                        numchar += (size-4);
        !           572:                                        if(ibuf > endibuf+1) {
        !           573:                                                fprintf(stderr,"error:  bad tape records(s) - file may be corrupted\n");
        !           574:                                                break;
        !           575:                                        }
        !           576:                                        if(ibuf>endibuf-4) break;
        !           577:                                }
        !           578:                        }
        !           579:                        if(extract) {
        !           580:                                fclose(file);
        !           581:                        }
        !           582:                } else if (mode == 'F') {
        !           583:                        if(xflag && ok) {
        !           584:                                file = fopen(filename,"w");
        !           585:                                if(file == NULL) {
        !           586:                                        perror(filename);
        !           587:                                } else {
        !           588:                                        extract = 1;
        !           589:                                }
        !           590:                        }
        !           591:                        while(read(tape,ibufstart,blocksize)) {
        !           592:                                numblock++;
        !           593:                                ibuf = ibufstart;
        !           594:                                while(ibuf+recordsize <= endibuf) {
        !           595:                                        if(extract) {
        !           596:                                                fwrite(ibuf,sizeof(char),recordsize,file);
        !           597:                                                fwrite("\n",1,1,file);
        !           598:                                        }
        !           599:                                        ibuf += recordsize;
        !           600:                                        numline++;
        !           601:                                        numchar += recordsize;
        !           602:                                }
        !           603:                        }
        !           604:                        if(extract) {
        !           605:                                fclose(file);
        !           606:                        }
        !           607:                } else {
        !           608:                        fprintf(stderr,"unknown record mode (%c) - file %s skipped\n",
        !           609:                                        mode,filename);
        !           610:                        skipfile(tape); /* throw away actual file */
        !           611:                }
        !           612:        } else {
        !           613:                /* not interested in contents of file, so move fast */
        !           614:                skipfile(tape);
        !           615:        }
        !           616:        skipfile(tape); /* throw away eof stuff - not interesting */
        !           617:        totalreadchars += numchar;
        !           618:        totalreadlines += numline;
        !           619:        totalreadblocks += numblock;
        !           620:        totalreadfiles ++;
        !           621:        if(xflag && vflag && ok) {
        !           622:                fprintf(stdout,"x - %s:  %d lines (%d chars) in %d tape blocks\n",
        !           623:                                filename,numline,numchar,numblock);
        !           624:        } else if(tflag && ok) {
        !           625:                fprintf(stdout,"t - %s:  %d lines (%d chars) in %d tape blocks\n",
        !           626:                                filename,numline,numchar,numblock);
        !           627:        }
        !           628:        free(ibufstart);
        !           629:        return(0);
        !           630: }
        !           631: 
        !           632: filecheck(file,name)
        !           633:        int *file;
        !           634:        char *name;
        !           635: 
        !           636: {
        !           637: 
        !           638:        struct stat buf;
        !           639:        struct exec sample;
        !           640: 
        !           641:        stat(name,&buf);
        !           642:        if ((buf.st_mode & S_IFDIR)==S_IFDIR) { 
        !           643:                fprintf(stderr,"%s: directory - skipped\n",name);
        !           644:                return(1);
        !           645:        }
        !           646:        if ((buf.st_mode & S_IFCHR)==S_IFCHR) { 
        !           647:                fprintf(stderr,"%s: character device - skipped\n",name);
        !           648:                return(1);
        !           649:        }
        !           650:        if ((buf.st_mode & S_IFBLK)==S_IFBLK) {
        !           651:                fprintf(stderr,"%s: block device - skipped\n",name);
        !           652:                return(1);
        !           653:        }
        !           654:        if ((buf.st_mode & S_IFLNK)==S_IFLNK) {
        !           655:                fprintf(stderr,"%s: symbolic link - skipped\n",name);
        !           656:                return(1);
        !           657:        }
        !           658:        if ((buf.st_mode & S_IFSOCK)==S_IFSOCK) {
        !           659:                fprintf(stderr,"%s: socket - skipped\n",name);
        !           660:                return(1);
        !           661:        }
        !           662:        *file = open(name,O_RDONLY,NULL);
        !           663:        if(*file <0) { 
        !           664:                perror(name);
        !           665:                return(1);
        !           666:        }
        !           667:        if(read(*file,&sample,sizeof(struct exec))>= sizeof(struct exec)) {
        !           668:                if(!(N_BADMAG(sample))) {
        !           669:                        /* executable */
        !           670:                        /* the format requires either fixed blocked records,
        !           671:                         * or variable format records with each record remaining
        !           672:                         * entirely within a tape block - this limits the
        !           673:                         * distance between \n's to 2044 bytes, something
        !           674:                         * which is VERY rarely true of executables, so
        !           675:                         * we don't even try with them....
        !           676:                         */
        !           677:                        close(*file);
        !           678:                        fprintf(stderr,"%s: executable - skipped\n",name);
        !           679:                        return(1);
        !           680:                }
        !           681:        }
        !           682:        /* either couldn't read sizeof(struct exec) or wasn't executable */
        !           683:        /* so we assume it is a reasonable file until proven otherwise */
        !           684:        lseek(*file,0l,0);
        !           685:        return(0);
        !           686: }

unix.superglobalmegacorp.com

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