Annotation of 43BSD/bin/tp/tp3.c, revision 1.1.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.