Annotation of 43BSD/bin/tp/tp3.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)tp3.c      4.1 12/18/82";
        !             3: #endif
        !             4: 
        !             5: #include "tp.h"
        !             6: 
        !             7: gettape(how)
        !             8: int (*how)();
        !             9: {
        !            10:        register char *ptr0, *ptr1;
        !            11:        register struct dent *d;
        !            12:        int count;
        !            13: 
        !            14:        do {
        !            15:                d = &dir[0];
        !            16:                count = 0;
        !            17:                do {
        !            18:                        if (d->d_namep == 0)  continue;
        !            19:                        decode(name,d);
        !            20:                        if (rnarg > 2) {
        !            21:                                ptr0 = name;
        !            22:                                ptr1 = *parg;
        !            23:                                while (*ptr1)
        !            24:                                        if (*ptr0++ != *ptr1++)  goto cont;
        !            25:                                if (*ptr0 && *ptr0 != '/')       goto cont;
        !            26:                        }
        !            27:                        (*how)(d);  /* delete, extract, or taboc */
        !            28:                        ++count;
        !            29: cont:                  continue;
        !            30:                }  while (++d <= lastd);
        !            31:                if (count == 0 && rnarg > 2)
        !            32:                        printf("%s  not found\n", *parg);
        !            33:                ++parg;
        !            34:        } while (--narg > 2);
        !            35: }
        !            36: 
        !            37: delete(dd)
        !            38: struct dent *dd;
        !            39: {
        !            40:        if (verify('d') >= 0)
        !            41:                clrent(dd);
        !            42: }
        !            43: 
        !            44: 
        !            45: update()
        !            46: {
        !            47:        register struct dent *d;
        !            48:        register b, last;
        !            49:        int first, size;
        !            50: 
        !            51: 
        !            52:        bitmap();
        !            53:        d = &dir[0];
        !            54:        do {
        !            55:                if(d->d_namep == 0 || (d->d_mode&OK) == 0) continue;
        !            56:                if (d->d_size == 0)       continue;
        !            57: /* find a place on the tape for this file */
        !            58:                size = (d->d_size+BSIZE-1)/BSIZE;
        !            59:                first = ndentb;
        !            60: toosmall:      ++first;
        !            61:                if ((last = first + size) >= tapsiz)    maperr();
        !            62:                for (b = first; b < last; ++b)
        !            63:                        if (map[(b>>3) & MAPMASK] & (1<<(b&7))) {
        !            64:                                first = b;
        !            65:                                goto toosmall;
        !            66:                        };
        !            67:                d->d_tapea = first;
        !            68:                setmap(d);
        !            69:        }  while (++d <= lastd);
        !            70:        wrdir();
        !            71:        update1();
        !            72: }
        !            73: 
        !            74: 
        !            75: update1()
        !            76: {
        !            77:        register struct dent *d, *id;
        !            78:        register index;
        !            79:        int f;
        !            80: 
        !            81:        for (;;) {
        !            82:                d = &dir[0];
        !            83:                index = MTSIZ;
        !            84:                id = 0;
        !            85:                do {    /* find new dent with lowest tape address */
        !            86:                        if(d->d_namep == 0 || (d->d_mode&OK) == 0) continue;
        !            87:                        if (d->d_tapea < index) {
        !            88:                                index = d->d_tapea;
        !            89:                                id = d;
        !            90:                        }
        !            91:                } while (++d <= lastd);
        !            92:                if ((d = id) == 0)      return;
        !            93:                d->d_mode &= ~OK;  /* change from new to old */
        !            94:                if (d->d_size == 0)  continue;
        !            95:                decode(name,d);
        !            96:                wseek(index);
        !            97:                if ((f = open(name,0)) < 0) {
        !            98:                        printf("Can't open %s\n", name);
        !            99:                        continue;
        !           100:                }
        !           101:                for (index = d->d_size/BSIZE; index != 0; --index)  {
        !           102:                        if (read(f,(char *)tapeb,BSIZE) != BSIZE)           phserr();
        !           103:                        twrite();
        !           104:                }
        !           105:                if (index = d->d_size % BSIZE) {
        !           106:                        if (read(f,(char *)tapeb,index) != index)  phserr();
        !           107:                        twrite();
        !           108:                }
        !           109:                if (read(f,(char *)tapeb,1) != 0)                   phserr();
        !           110:                close(f);
        !           111:        }
        !           112: }
        !           113: 
        !           114: phserr()
        !           115: {      printf("%s -- Phase error \n", name);  }
        !           116: 
        !           117: 
        !           118: bitmap()       /* place old files in the map */
        !           119: {
        !           120:        register char *m;
        !           121:        register count;
        !           122:        register struct dent *d;
        !           123: 
        !           124:        for(m=map;m<&map[MAPSIZE];) *m++ = 0;
        !           125:        count = ndirent;
        !           126:        d = dir;
        !           127:        do {
        !           128:                if(d->d_namep != 0 && (d->d_mode&OK) == 0
        !           129:                   && d->d_size != 0) setmap(d);
        !           130:                d++;
        !           131:        }  while (--count);
        !           132: }
        !           133: 
        !           134: setmap(d)
        !           135: register struct dent *d;
        !           136: {
        !           137:        unsigned c, block;
        !           138:        char bit;
        !           139:        int i;
        !           140: 
        !           141:        c = d->d_size/BSIZE;
        !           142:        if (d->d_size % BSIZE)  c++;
        !           143:        block = d->d_tapea;
        !           144:        if ((c += block) >= tapsiz)             maperr();
        !           145:        do {
        !           146:                bit = 1 << (block & 7);
        !           147:                i = (block>>3) & MAPMASK;
        !           148:                if (bit & map[i])               maperr();
        !           149:                map[i] |= bit;
        !           150:        } while (++block < c);
        !           151: }
        !           152: 
        !           153: maperr()
        !           154: {
        !           155:        printf("Tape overflow\n");
        !           156:        done();
        !           157: }
        !           158: 
        !           159: 
        !           160: usage()
        !           161: {
        !           162:        register reg,count;
        !           163:        int     nused, nentr, nfree;
        !           164:        static lused;
        !           165: 
        !           166:        bitmap();
        !           167:        for(count=0,nentr=0;count<ndirent;count++)
        !           168:                if(dir[count].d_namep != 0) nentr++;
        !           169:        nused = nfree = 0;
        !           170:        reg = ndentb;
        !           171:        ++reg;          /* address of first non-directory tape block */
        !           172:        count = tapsiz - reg;
        !           173:        do {
        !           174:                if (reg >= tapsiz) {
        !           175:                        printf("Tape overflow\n");
        !           176:                        done();
        !           177:                }
        !           178:                if (map[(reg>>3) & MAPMASK] & (1 << (reg&7))) {
        !           179:                        nused++;
        !           180:                        lused = reg;
        !           181:                } else {
        !           182:                        if (flags & flm)   break;
        !           183:                        nfree++;
        !           184:                }
        !           185:                reg++;
        !           186:        } while (--count);
        !           187:        printf("%4d entries\n%4d used\n", nentr, nused);
        !           188:        if ((flags & flm)==0)
        !           189:                printf("%4d free\n", nfree);
        !           190:        printf("%4d last\n", lused);
        !           191: }
        !           192: 
        !           193: 
        !           194: taboc(dd)
        !           195: struct dent *dd;
        !           196: {
        !           197:        register  mode;
        !           198:        register *m;
        !           199:        register char *s;
        !           200:        int count, *localtime();
        !           201:        char work[20];
        !           202: 
        !           203:        if (flags & flv)  {
        !           204:                mode = dd->d_mode;
        !           205:                s = &work[19];
        !           206:                *s = 0;
        !           207:                for (count = 3; count; --count) {
        !           208:                        if (mode&1)     *--s = 'x';
        !           209:                          else          *--s = '-';
        !           210:                        if (mode&2)     *--s = 'w';
        !           211:                          else          *--s = '-';
        !           212:                        if (mode&4)     *--s = 'r';
        !           213:                          else          *--s = '-';
        !           214:                        mode >>= 3;
        !           215:                }
        !           216:                if (mode&4)             s[2] = 's';
        !           217:                if (mode&2)             s[5] = 's';
        !           218:                printf("%s%4d%4d%5d%9D ",s,dd->d_uid, dd->d_gid,dd->d_tapea,dd->d_size);
        !           219:                m = localtime(&dd->d_time);
        !           220:                printf("%2d/%2d/%2d %2d:%2d ",m[5],m[4]+1,m[3],m[2],m[1]);
        !           221:        }
        !           222:        printf("%s\n", name);
        !           223: }
        !           224: 
        !           225: 
        !           226: extract(d)
        !           227: register struct dent *d;
        !           228: {
        !           229:        register count, id;
        !           230: 
        !           231:        if (d->d_size==0)       return;
        !           232:        if (verify('x') < 0)                    return;
        !           233:        rseek(d->d_tapea);
        !           234:        unlink(name);
        !           235:        if ((id = creat(name,d->d_mode)) < 0)
        !           236:                printf("%s -- create error\n", name);
        !           237:        count = d->d_size/BSIZE;
        !           238:        while (count--) {
        !           239:                tread();
        !           240:                if (write(id, (char *)tapeb, BSIZE) != BSIZE)   goto ng;
        !           241:        }
        !           242:        if (count = d->d_size % BSIZE) {
        !           243:                tread();
        !           244:                if (write(id, (char *)tapeb, count) != count) {
        !           245: ng:                    printf("%s -- write error\n", name);
        !           246:                        close(id);
        !           247:                        return;
        !           248:                }
        !           249:        }
        !           250:        close(id);
        !           251:        chown(name,d->d_uid & 0377, d->d_gid&0377);
        !           252: }

unix.superglobalmegacorp.com

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