Annotation of 42BSD/etc/arff.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)arff.c     4.16 (Berkeley) 83/07/10";
        !             3: #endif
        !             4: 
        !             5: #include <sys/types.h>
        !             6: #include <sys/stat.h>
        !             7: #include <sys/time.h>
        !             8: #include <signal.h>
        !             9: #include <stdio.h>
        !            10: #include <sys/file.h>
        !            11: 
        !            12: #define dbprintf printf
        !            13: 
        !            14: struct rt_dat {
        !            15:        u_short rt_yr:5;        /* year-1972 */
        !            16:        u_short rt_dy:5;        /* day */
        !            17:        u_short rt_mo:5;        /* month */
        !            18: };
        !            19: 
        !            20: struct rt_axent {
        !            21:        char    rt_sent[14];
        !            22: };
        !            23: 
        !            24: struct rt_ent {
        !            25:        char    rt_pad;         /* unusued */
        !            26:        char    rt_stat;        /* type of entry, or end of seg */
        !            27:        u_short rt_name[3];     /* name, 3 words in rad50 form */
        !            28:        u_short rt_len;         /* length of file */
        !            29:        char    rt_chan;        /* only used in temporary files */
        !            30:        char    rt_job;         /* only used in temporary files */
        !            31:        struct  rt_dat rt_date; /* creation date */
        !            32: };
        !            33: 
        !            34: #define RT_TEMP                1
        !            35: #define RT_NULL                2
        !            36: #define RT_FILE                4
        !            37: #define RT_ESEG                8
        !            38: 
        !            39: #define RT_BLOCK       512     /* block size */
        !            40: #define RT_DIRSIZE     31      /* max # of directory segments */
        !            41: 
        !            42: struct rt_head {
        !            43:        short   rt_numseg;      /* # of segments available */
        !            44:        short   rt_nxtseg;      /* # of next logical segment */
        !            45:        short   rt_lstseg;      /* highest seg currently open */
        !            46:        u_short rt_entpad;      /* extra words/directory entry */
        !            47:        short   rt_stfile;      /* block # where files begin */
        !            48: };
        !            49: 
        !            50: struct rt_dir {
        !            51:        struct rt_head  rt_axhead;
        !            52:        struct rt_ent   rt_ents[72];
        !            53:        char            _dirpad[6];
        !            54: };
        !            55: 
        !            56: typedef struct fldope {
        !            57:        int     startad;
        !            58:        int     count;
        !            59: struct rt_ent  *rtdope;
        !            60: } FLDOPE;
        !            61: 
        !            62: FLDOPE *lookup();
        !            63: 
        !            64: #define        rt(p)   ((struct rt_ent *) p )
        !            65: #define        Ain1    03100
        !            66: #define        Ain2    050
        !            67: #define        flag(c) (flg[('c') - 'a'])
        !            68: 
        !            69: char   *man = "rxtd";
        !            70: char   zeroes[512];
        !            71: 
        !            72: extern char *val;
        !            73: extern char table[256];
        !            74: struct rt_dir rt_dir[RT_DIRSIZE] = {
        !            75:        { 4, 0, 1, 0, 14 },
        !            76:        { { 0, RT_NULL, { 0, 0, 0 }, 494, 0 },
        !            77:          { 0, RT_ESEG } }
        !            78: };
        !            79: 
        !            80: int    rt_entsiz;
        !            81: int    rt_nleft;
        !            82: struct rt_ent *rt_curend[RT_DIRSIZE];
        !            83: int    floppydes;
        !            84: int    dirdirty;
        !            85: char   *rt_last;
        !            86: char   *defdev = "/dev/floppy";
        !            87: 
        !            88: char *opt = "vf";
        !            89: 
        !            90: int    signum[] = {SIGHUP, SIGINT, SIGQUIT, 0};
        !            91: extern long lseek();
        !            92: int    rcmd(), dcmd(), xcmd(), tcmd();
        !            93: 
        !            94: int    (*comfun)();
        !            95: char   flg[26];
        !            96: char   **namv;
        !            97: int    namc;
        !            98: int    file;
        !            99: 
        !           100: main(argc, argv)
        !           101:        char *argv[];
        !           102: {
        !           103:        register char *cp;
        !           104: 
        !           105:        if (argc < 2)
        !           106:                usage();
        !           107:        for (cp = argv[1]; *cp; cp++)
        !           108:                switch (*cp) {
        !           109: 
        !           110:                case 'm':
        !           111:                case 'v':
        !           112:                case 'u':
        !           113:                case 'w':
        !           114:                        flg[*cp-'a']++;
        !           115:                        continue;
        !           116:                case 'c':
        !           117:                        flag(c)++;
        !           118:                        dirdirty++;
        !           119:                        continue;
        !           120: 
        !           121:                case 'r':
        !           122:                        setcom(rcmd);
        !           123:                        flag(r)++;
        !           124:                        continue;
        !           125: 
        !           126:                case 'd':
        !           127:                        setcom(dcmd);
        !           128:                        flag(d)++;
        !           129:                        continue;
        !           130: 
        !           131:                case 'x':
        !           132:                        setcom(xcmd);
        !           133:                        continue;
        !           134: 
        !           135:                case 't':
        !           136:                        setcom(tcmd);
        !           137:                        continue;
        !           138: 
        !           139:                case 'f':
        !           140:                        defdev = argv[2];
        !           141:                        argv++;
        !           142:                        argc--;
        !           143:                        continue;
        !           144: 
        !           145:                default:
        !           146:                        fprintf(stderr, "arff: bad option `%c'\n", *cp);
        !           147:                        exit(1);
        !           148:                }
        !           149: 
        !           150:        namv = argv+2;
        !           151:        namc = argc-2;
        !           152:        if (comfun == 0) {
        !           153:                if (flag(u) == 0) {
        !           154:                        fprintf(stderr, "arff: one of [%s] must be specified\n",
        !           155:                                man);
        !           156:                        exit(1);
        !           157:                }
        !           158:                setcom(rcmd);
        !           159:        }
        !           160:        (*comfun)();
        !           161:        exit(notfound());
        !           162: }
        !           163: 
        !           164: setcom(fun)
        !           165:        int (*fun)();
        !           166: {
        !           167:        if (comfun != 0) {
        !           168:                fprintf(stderr, "arff: only one of [%s] allowed\n", man);
        !           169:                exit(1);
        !           170:        }
        !           171:        comfun = fun;
        !           172: }
        !           173: 
        !           174: usage()
        !           175: {
        !           176:        fprintf(stderr, "usage: ar [%s][%s] archive files ...\n", opt, man);
        !           177:        exit(1);
        !           178: }
        !           179: 
        !           180: notfound()
        !           181: {
        !           182:        register i, n = 0;
        !           183: 
        !           184:        for (i = 0; i < namc; i++)
        !           185:                if (namv[i]) {
        !           186:                        fprintf(stderr, "arff: %s not found\n", namv[i]);
        !           187:                        n++;
        !           188:                }
        !           189:        return (n);
        !           190: }
        !           191: 
        !           192: mesg(c)
        !           193: {
        !           194:        if (flag(v))
        !           195:                if (c != 'c' || flag(v) > 1)
        !           196:                        printf("%c - %s\n", c, file);
        !           197: }
        !           198: 
        !           199: tcmd()
        !           200: {
        !           201:        register char *de, *last;
        !           202:        FLDOPE *lookup(), *dope;
        !           203:        int segnum, nleft;
        !           204:        register i;
        !           205:        register struct rt_ent *rde;
        !           206: 
        !           207:        rt_init();
        !           208:        if (namc != 0) {
        !           209:                for (i = 0; i < namc; i++)
        !           210:                        if (dope = lookup(namv[i])) {
        !           211:                                rde = dope->rtdope;
        !           212:                                rtls(rde);
        !           213:                                namv[i] = 0;
        !           214:                        }
        !           215:                return;
        !           216:        }
        !           217:        for (segnum = 0; segnum != -1;
        !           218:          segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
        !           219:                last = rt_last + segnum*2*RT_BLOCK;
        !           220:                for (de = ((char *)&rt_dir[segnum])+10; de <= last; 
        !           221:                    de += rt_entsiz)
        !           222:                        if (rtls(rt(de))) {
        !           223:                                nleft = (last-de)/rt_entsiz;
        !           224: #define ENTRIES "\n%d entries remaining in directory segment %d.\n"
        !           225:                                printf(ENTRIES, nleft, segnum+1);
        !           226:                                break;
        !           227:                        }
        !           228:        }
        !           229: }
        !           230: 
        !           231: rtls(de)
        !           232:        register struct rt_ent *de;
        !           233: {
        !           234:        int month, day, year;
        !           235:        char name[12], ext[4];
        !           236: 
        !           237:        switch (de->rt_stat) {
        !           238: 
        !           239:        case RT_TEMP:
        !           240:                if (flag(v))
        !           241:                        printf("Tempfile:\n");
        !           242:                /* fall thru...*/
        !           243: 
        !           244:        case RT_FILE:
        !           245:                if (!flag(v)) {
        !           246:                        sunrad50(name, de->rt_name);
        !           247:                        printf("%s\n", name);
        !           248:                        break;
        !           249:                }
        !           250:                unrad50(2, de->rt_name, name);
        !           251:                unrad50(1, &(de->rt_name[2]), ext);
        !           252:                day = de->rt_date.rt_dy;
        !           253:                year = de->rt_date.rt_yr+72;
        !           254:                month = de->rt_date.rt_mo;
        !           255:                printf("%6.6s  %3.3s    %02d/%02d/%02d  %d\n",name,
        !           256:                        ext, month, day, year, de->rt_len);
        !           257:                break;
        !           258: 
        !           259:        case RT_NULL:
        !           260:                printf("%-25.9s %d\n","<UNUSED>", de->rt_len);
        !           261:                break;
        !           262: 
        !           263:        case RT_ESEG:
        !           264:                return (1);
        !           265:        }
        !           266:        return (0);
        !           267: }
        !           268: 
        !           269: xcmd()
        !           270: {
        !           271:        register char *de, *last;
        !           272:        int segnum;
        !           273:        char name[12];
        !           274:        register int i;
        !           275: 
        !           276:        rt_init();
        !           277:        if (namc != 0) {
        !           278:                for (i = 0; i < namc; i++)
        !           279:                        if (rtx(namv[i]) == 0)
        !           280:                                namv[i] = 0;
        !           281:                return;
        !           282:        }
        !           283:        for (segnum = 0; segnum != -1;
        !           284:             segnum = rt_dir[segnum].rt_axhead.rt_nxtseg-1)
        !           285:                for (last = rt_last+(segnum*2*RT_BLOCK),
        !           286:                     de = ((char *)&rt_dir[segnum])+10; de <= last; 
        !           287:                     de += rt_entsiz)
        !           288:                        switch (rt(de)->rt_stat) {
        !           289: 
        !           290:                        case RT_ESEG:
        !           291:                                return;
        !           292: 
        !           293:                        case RT_TEMP:
        !           294:                        case RT_FILE:
        !           295:                                sunrad50(name,rt(de)->rt_name);
        !           296:                                rtx(name);
        !           297: 
        !           298:                        case RT_NULL:
        !           299:                                break;
        !           300:                        }
        !           301: }
        !           302: 
        !           303: rtx(name)
        !           304:        char *name;
        !           305: {
        !           306:        register FLDOPE *dope;
        !           307:        FLDOPE *lookup();
        !           308:        register startad, count;
        !           309:        int file;
        !           310:        char buff[512];
        !           311: 
        !           312: 
        !           313:        if (dope = lookup(name)) {
        !           314:                if (flag(v))
        !           315:                        rtls(dope->rtdope);
        !           316:                else
        !           317:                        printf("x - %s\n",name);
        !           318: 
        !           319:                if ((file = creat(name, 0666)) < 0)
        !           320:                        return (1);
        !           321:                count = dope->count;
        !           322:                startad = dope->startad;
        !           323:                for( ; count > 0 ; count -= 512) {
        !           324:                        lread(startad, 512, buff);
        !           325:                        write(file, buff, 512);
        !           326:                        startad += 512;
        !           327:                }
        !           328:                close(file);
        !           329:                return (0);
        !           330:        }
        !           331:        return (1);
        !           332: }
        !           333: 
        !           334: rt_init()
        !           335: {
        !           336:        static initized = 0;
        !           337:        register char *de, *last;
        !           338:        register i;
        !           339:        int dirnum;
        !           340:        char *mode;
        !           341:        FILE *temp_floppydes;
        !           342: 
        !           343:        if (initized)
        !           344:                return;
        !           345:        initized = 1;
        !           346:        if (flag(c)) {
        !           347:                struct stat sb;
        !           348:                char response[128];
        !           349:                int tty;
        !           350: 
        !           351:                if (stat(defdev, &sb) >= 0 && (sb.st_mode & S_IFMT) == S_IFREG)
        !           352:                        goto ignore;
        !           353:                tty = open("/dev/tty", O_RDWR);
        !           354: #define SURE   "Are you sure you want to clobber the floppy? "
        !           355:                write(tty, SURE, sizeof (SURE));
        !           356:                read(tty, response, sizeof (response));
        !           357:                if (*response != 'y')
        !           358:                        exit(50);
        !           359:                close(tty);
        !           360: ignore:
        !           361:                ;
        !           362:        }
        !           363:        if (flag(c) || flag(d) || flag(r))
        !           364:                mode = "r+";
        !           365:        else
        !           366:                mode = "r";
        !           367:        if ((temp_floppydes = fopen(defdev, mode)) == NULL) {
        !           368:                perror(defdev);
        !           369:                exit(1);
        !           370:        } else
        !           371:                floppydes = fileno(temp_floppydes);
        !           372:        if (!flag(c)) {
        !           373:                lread(6*RT_BLOCK, 2*RT_BLOCK, (char *)&rt_dir[0]);
        !           374:                dirnum = rt_dir[0].rt_axhead.rt_numseg;
        !           375:                /* check for blank/uninitialized diskette */
        !           376:                if (dirnum <= 0) {
        !           377:                        fprintf(stderr,"arff: bad directory format\n");
        !           378:                        exit(1);
        !           379:                }
        !           380:                if (dirnum > RT_DIRSIZE) {
        !           381:                        fprintf(stderr,"arff: too many directory segments\n");
        !           382:                        exit(1);
        !           383:                }
        !           384:                for (i = 1; i < dirnum; i++)
        !           385:                        lread((6+2*i)*RT_BLOCK, 2*RT_BLOCK, (char *)&rt_dir[i]);
        !           386:        } else
        !           387:                dirnum = 1;
        !           388: 
        !           389:        rt_entsiz = 2*rt_dir[0].rt_axhead.rt_entpad + 14;
        !           390:        rt_entsiz = 14;                 /* assume rt_entpad = 0 ??? */
        !           391:        rt_last = ((char *) &rt_dir[0]) + 10 + 1014/rt_entsiz*rt_entsiz; 
        !           392:        rt_nleft = 0;
        !           393:        
        !           394:        for (i = 0; i < dirnum; i++) {
        !           395:                last = rt_last + i*2*RT_BLOCK;
        !           396:                for (de = ((char *)&rt_dir[i])+10; de <= last; de += rt_entsiz)
        !           397:                        if (rt(de)->rt_stat == RT_ESEG)
        !           398:                                break;
        !           399:                rt_curend[i] = rt(de);
        !           400:                rt_nleft += (last-de)/rt_entsiz;
        !           401:        }
        !           402: }
        !           403: 
        !           404: static FLDOPE result;
        !           405: 
        !           406: FLDOPE *
        !           407: lookup(name)
        !           408:        char *name;
        !           409: {
        !           410:        unsigned short rname[3];
        !           411:        register char *de, *last;
        !           412:        int segnum;
        !           413:        register index;
        !           414: 
        !           415:        srad50(name,rname);
        !           416: 
        !           417:        /* 
        !           418:         *  Search for name, accumulate blocks in index
        !           419:         */
        !           420:        rt_init();
        !           421:        for (segnum = 0; segnum != -1;
        !           422:             segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1)
        !           423:        {
        !           424:                index = 0;
        !           425:                last = rt_last + segnum*2*RT_BLOCK;
        !           426:                for (de=((char *)&rt_dir[segnum])+10; 
        !           427:                     rt(de)->rt_stat != RT_ESEG; de += rt_entsiz)
        !           428:                        switch(rt(de)->rt_stat) {
        !           429: 
        !           430:                        case RT_FILE:
        !           431:                        case RT_TEMP:
        !           432:                                if(samename(rname,rt(de)->rt_name)) {
        !           433:                                        result.count = rt(de)->rt_len * 512;
        !           434:                                        result.startad = 512*
        !           435:                                                (rt_dir[segnum].rt_axhead.rt_stfile + index);
        !           436:                                        result.rtdope = (struct rt_ent *) de;
        !           437:                                        return (&result);
        !           438:                                }
        !           439: 
        !           440:                        case RT_NULL:
        !           441:                                index += rt(de)->rt_len;
        !           442:                        }
        !           443:         }
        !           444:        return ((FLDOPE *) 0);
        !           445: 
        !           446: }
        !           447: 
        !           448: static
        !           449: samename(a, b)
        !           450:        u_short a[], b[];
        !           451: {
        !           452:        return (*a == *b && a[1] == b[1] && a[2] == b[2] );
        !           453: }
        !           454: 
        !           455: rad50(cp, out)
        !           456:        register u_char *cp;
        !           457:        u_short *out;
        !           458: {
        !           459:        register index, temp;
        !           460: 
        !           461:        for (index = 0; *cp; index++) {
        !           462:                temp = Ain1 * table[*cp++];
        !           463:                if (*cp!=0) {
        !           464:                        temp += Ain2 * table[*cp++];
        !           465:                        if(*cp!=0) 
        !           466:                                temp += table[*cp++];
        !           467:                }
        !           468:                out[index] = temp;
        !           469:        }
        !           470: }
        !           471: 
        !           472: #define reduce(x, p, q) (x = v[p/q], p %= q);
        !           473: 
        !           474: unrad50(count, in, cp)
        !           475:        u_short *in;
        !           476:        register char *cp;
        !           477: {
        !           478:        register i, temp;
        !           479:        register u_char *v = (u_char *) val;
        !           480:        
        !           481:        for (i = 0; i < count; i++) {
        !           482:                temp = in[i];
        !           483:                reduce(*cp++, temp, Ain1);
        !           484:                reduce(*cp++, temp, Ain2);
        !           485:                reduce(*cp++, temp, 1);
        !           486:        }
        !           487:        *cp=0;
        !           488: }
        !           489: 
        !           490: srad50(name, rname)
        !           491:        register char *name;
        !           492:        register u_short *rname;
        !           493: {
        !           494:        register index;
        !           495:        register char *cp;
        !           496:        char file[7], ext[4];
        !           497: 
        !           498:        /* 
        !           499:         * Find end of pathname
        !           500:         */
        !           501:        for (cp = name; *cp++; )
        !           502:                ;
        !           503:        while (cp >= name && *--cp != '/')
        !           504:                ;
        !           505:        cp++;
        !           506:        /* 
        !           507:         * Change to rad50
        !           508:         */
        !           509:        for (index = 0; *cp; ) {
        !           510:                file[index++] = *cp++;
        !           511:                if (*cp == '.') {
        !           512:                        cp++;
        !           513:                        break;
        !           514:                }
        !           515:                if (index >= 6) {
        !           516:                        break;
        !           517:                }
        !           518:        }
        !           519:        file[index] = 0;
        !           520:        for (index = 0; *cp; ) {
        !           521:                ext[index++] = *cp++;
        !           522:                if (*cp == '.' || index >= 3)
        !           523:                        break;
        !           524:        }
        !           525:        ext[index]=0;
        !           526:        rname[0] = rname[1] = rname[2] = 0;
        !           527:        rad50((u_char *)file, rname);
        !           528:        rad50((u_char *)ext, rname+2);
        !           529: }
        !           530: 
        !           531: sunrad50(name, rname)
        !           532:        u_short rname[];
        !           533:        register char *name;
        !           534: {
        !           535:        register char *cp, *cp2;
        !           536:        char ext[4];
        !           537: 
        !           538:        unrad50(2, rname, name);
        !           539:        unrad50(1, rname + 2, ext);
        !           540:        /*
        !           541:         * Jam name and extension together with a dot
        !           542:         * deleting white space
        !           543:         */
        !           544:        for (cp = name; *cp++;)
        !           545:                ;
        !           546:        --cp;
        !           547:        while (*--cp == ' ' && cp >= name)
        !           548:                ;
        !           549:        *++cp = '.';
        !           550:        cp++;
        !           551:        for (cp2 = ext; *cp2 != ' ' && cp2 < ext+3;)
        !           552:                *cp++ = *cp2++;
        !           553:        *cp=0;
        !           554:        if (cp[-1] == '.')
        !           555:                cp[-1] = 0;
        !           556: }
        !           557: 
        !           558: static char *oval = " ABCDEFGHIJKLMNOPQRSTUVWXYZ$.@0123456789";
        !           559: static char *val = " abcdefghijklmnopqrstuvwxyz$.@0123456789";
        !           560: 
        !           561: static char table[256] = {
        !           562: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 
        !           563: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 
        !           564: 0, 29, 29, 29, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 29, 
        !           565: 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 29, 29, 29, 29, 29, 29, 
        !           566: 29, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
        !           567: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29, 
        !           568: 29, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
        !           569: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29, 
        !           570: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 
        !           571: 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 
        !           572: 0, 29, 29, 29, 27, 29, 29, 29, 29, 29, 29, 29, 29, 29, 28, 29, 
        !           573: 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 29, 29, 29, 29, 29, 29, 
        !           574: 29, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
        !           575: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29, 29, 
        !           576: 29, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 
        !           577: 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 29, 29, 29 };
        !           578:                
        !           579: /*
        !           580:  * Logical to physical adress translation
        !           581:  */
        !           582: long
        !           583: trans(logical)
        !           584:        register int logical;
        !           585: {
        !           586:        register int sector, bytes, track;
        !           587: 
        !           588:        logical += 26*128;
        !           589:        bytes = (logical&127);
        !           590:        logical >>= 7;
        !           591:        sector = logical%26;
        !           592:        if(sector >= 13)
        !           593:                sector = sector*2+1;
        !           594:        else
        !           595:                sector *= 2;
        !           596:        sector += 26 + ((track = (logical/26))-1)*6;
        !           597:        sector %= 26;
        !           598:        return ((((track*26)+sector) << 7) + bytes);
        !           599: }
        !           600: 
        !           601: lread(startad, count, obuff)
        !           602:        register startad, count;
        !           603:        register char *obuff;
        !           604: {
        !           605:        long trans();
        !           606:        extern floppydes;
        !           607:        register int size = flag(m) ? 512 : 128;
        !           608: 
        !           609:        rt_init();
        !           610:        while ((count -= size) >= 0) {
        !           611:                lseek(floppydes, flag(m) ?
        !           612:                        (long)startad : trans(startad), 0);
        !           613:                if (read(floppydes, obuff, size) != size)
        !           614:                        fprintf(stderr, "arff: read error block %d\n",
        !           615:                                startad/size);
        !           616:                obuff += size;
        !           617:                startad += size;
        !           618:        }
        !           619: }
        !           620: 
        !           621: lwrite(startad, count, obuff)
        !           622:        register startad, count;
        !           623:        register char *obuff;
        !           624: {
        !           625:        long trans();
        !           626:        extern floppydes;
        !           627:        register int size = flag(m) ? 512 : 128;
        !           628: 
        !           629:        rt_init();
        !           630:        while ((count -= size) >= 0) {
        !           631:                lseek(floppydes, flag(m) ?
        !           632:                        (long)startad : trans(startad), 0);
        !           633:                if (write(floppydes, obuff, size) != size)
        !           634:                        fprintf(stderr, "arff: write error block %d\n",
        !           635:                                startad/size);
        !           636:                obuff += size;
        !           637:                startad += size;
        !           638:        }
        !           639: }
        !           640: 
        !           641: rcmd()
        !           642: {
        !           643:        register int i;
        !           644: 
        !           645:        rt_init();
        !           646:        if (namc > 0)
        !           647:                for (i = 0; i < namc; i++)
        !           648:                        if (rtr(namv[i]) == 0)
        !           649:                                namv[i] = 0;
        !           650: }
        !           651: 
        !           652: rtr(name)
        !           653:        char *name;
        !           654: {
        !           655:        register FLDOPE *dope;
        !           656:        register struct rt_ent *de;
        !           657:        struct stat buf;
        !           658:        register struct stat *bufp = &buf;
        !           659:        int segnum;
        !           660:        register char *last;
        !           661: 
        !           662:        if (stat(name, bufp) < 0) {
        !           663:                perror(name);
        !           664:                return (-1);
        !           665:        }
        !           666:        if (dope = lookup(name)) {
        !           667:                /* can replace, no problem */
        !           668:                de = dope->rtdope;
        !           669:                if (bufp->st_size <= (de->rt_len * 512))
        !           670:                        printf("r - %s\n",name),
        !           671:                        toflop(name, bufp->st_size, dope);
        !           672:                else {
        !           673:                        fprintf(stderr,
        !           674:                          "%s will not fit in currently used file on floppy\n",
        !           675:                          name);
        !           676:                        return (-1);
        !           677:                }
        !           678:                goto found;
        !           679:        }
        !           680:        /*
        !           681:         * Search for vacant spot
        !           682:         */
        !           683:        for (segnum = 0; segnum != -1;
        !           684:             segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1)
        !           685:        {
        !           686:                last = rt_last + segnum*2*RT_BLOCK;
        !           687:                for (de = rt_dir[segnum].rt_ents;
        !           688:                    rt(de)->rt_stat != RT_ESEG; de++)
        !           689:                        if ((de)->rt_stat == RT_NULL) {
        !           690:                                if (bufp->st_size <= (de->rt_len*512)) {
        !           691:                                        printf("a - %s\n",name),
        !           692:                                        mkent(de, segnum, bufp,name);
        !           693:                                        goto found;
        !           694:                                }
        !           695:                                continue;
        !           696:                        }
        !           697:        }
        !           698:        printf("%s: no slot for file\n", name);
        !           699:        return (-1);
        !           700: 
        !           701: found:
        !           702:        if (dope = lookup(name)) {
        !           703:                toflop(name, bufp->st_size, dope);
        !           704:                return (0);
        !           705:        }
        !           706:        printf("%s: internal error, added then not found\n", name);
        !           707:        return (-1);
        !           708: }
        !           709: 
        !           710: mkent(de, segnum, bufp, name)
        !           711:        register struct rt_ent *de;
        !           712:        int segnum;
        !           713:        register struct stat *bufp;
        !           714:        char *name;
        !           715: {
        !           716:        struct tm *localtime();
        !           717:        register struct tm *timp;
        !           718:        register struct rt_ent *workp;
        !           719:        int count;
        !           720:        
        !           721:        count = (((bufp->st_size -1) >>9) + 1);
        !           722:        /* make sure there is room */
        !           723:        if (de->rt_len == count)
        !           724:                goto overwrite;
        !           725:        if ((char *)rt_curend[segnum] == (rt_last + (segnum*2*RT_BLOCK))) {
        !           726:                /* no entries left on segment */
        !           727:                if (flag(o))
        !           728:                        goto overwrite;
        !           729:                fprintf(stderr, "Directory segment #%d full on  %s\n",
        !           730:                        segnum+1, defdev);
        !           731:                exit(1);
        !           732:        }       
        !           733:        /* copy directory entries up */
        !           734:        for (workp = rt_curend[segnum]+1; workp > de; workp--)
        !           735:                *workp = workp[-1];
        !           736:        de[1].rt_len -= count;
        !           737:        de->rt_len = count;
        !           738:        rt_curend[segnum]++;
        !           739:        rt_nleft--;
        !           740: 
        !           741: overwrite:
        !           742:        srad50(name,de->rt_name);
        !           743:        timp = localtime(&bufp->st_mtime);
        !           744:        de->rt_date.rt_dy = timp->tm_mday;
        !           745:        de->rt_date.rt_mo = timp->tm_mon + 1;
        !           746:        de->rt_date.rt_yr = timp->tm_year - 72;
        !           747:        de->rt_stat = RT_FILE;
        !           748:        de->rt_pad = 0;
        !           749:        de->rt_chan = 0;
        !           750:        de->rt_job = 0;
        !           751:        lwrite((6+segnum*2)*RT_BLOCK, 2*RT_BLOCK, (char *)&rt_dir[segnum]);
        !           752: }
        !           753: 
        !           754: toflop(name, ocount, dope)
        !           755:        char *name;
        !           756:        register FLDOPE *dope;
        !           757:        long ocount;
        !           758: {
        !           759:        register file, n, startad = dope->startad, count = ocount;
        !           760:        char buff[512];
        !           761:        
        !           762:        file = open(name, 0);
        !           763:        if (file < 0) {
        !           764:                fprintf(stderr, "arff: couldn't open %s\n",name);
        !           765:                exit(1);
        !           766:        }
        !           767:        for( ; count >= 512; count -= 512) {
        !           768:                read(file, buff, 512);
        !           769:                lwrite(startad, 512, buff);
        !           770:                startad += 512;
        !           771:        }
        !           772:        read(file, buff, count);
        !           773:        close(file);
        !           774:        if (count <= 0)
        !           775:                return;
        !           776:        for (n = count; n < 512; n ++)
        !           777:                buff[n] = 0;
        !           778:        lwrite(startad, 512, buff);
        !           779:        count = (dope->rtdope->rt_len*512-ocount)/512 ;
        !           780:        if (count <= 0)
        !           781:                return;
        !           782:        for ( ; count > 0 ; count--) {
        !           783:                startad += 512;
        !           784:                lwrite(startad, 512, zeroes);
        !           785:        }
        !           786: }
        !           787: 
        !           788: dcmd()
        !           789: {
        !           790:        register int i;
        !           791: 
        !           792:        rt_init();
        !           793:        if (namc)
        !           794:                for (i = 0; i < namc; i++)
        !           795:                        if (rtk(namv[i])==0)
        !           796:                                namv[i]=0;
        !           797:        if (dirdirty)
        !           798:                scrunch();
        !           799: }
        !           800: 
        !           801: rtk(name)
        !           802:        char *name;
        !           803: {
        !           804:        register FLDOPE *dope;
        !           805:        register struct rt_ent *de;
        !           806:        FLDOPE *lookup();
        !           807: 
        !           808:        if (dope = lookup(name)) {
        !           809:                printf("d - %s\n",name);
        !           810:                de = dope->rtdope;
        !           811:                de->rt_stat = RT_NULL;
        !           812:                de->rt_name[0] = 0;
        !           813:                de->rt_name[1] = 0;
        !           814:                de->rt_name[2] = 0;
        !           815:                *((u_short *)&(de->rt_date)) = 0;
        !           816:                dirdirty = 1;
        !           817:                return (0);
        !           818:        }
        !           819:        return (1);
        !           820: }
        !           821: 
        !           822: scrunch()
        !           823: {
        !           824:        register struct rt_ent *de , *workp;
        !           825:        register segnum;
        !           826: 
        !           827:        for (segnum = 0; segnum != -1;
        !           828:             segnum = rt_dir[segnum].rt_axhead.rt_nxtseg - 1) {
        !           829:                for (de = rt_dir[segnum].rt_ents; de <= rt_curend[segnum]; de++)
        !           830:                        if (de->rt_stat == RT_NULL &&
        !           831:                            (de+1)->rt_stat == RT_NULL) {
        !           832:                                (de+1)->rt_len += de->rt_len;
        !           833:                                for (workp=de; workp<rt_curend[segnum]; workp++)
        !           834:                                        *workp = workp[1];
        !           835:                                de--;
        !           836:                                rt_curend[segnum]--;
        !           837:                                rt_nleft++;
        !           838:                        }
        !           839:                lwrite((6+segnum*2)*RT_BLOCK, 2*RT_BLOCK,
        !           840:                        (char *)&rt_dir[segnum]);
        !           841:        }
        !           842:        dirdirty = 0;
        !           843: }

unix.superglobalmegacorp.com

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