Annotation of 3BSD/cmd/tp/tp3.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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