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: }

Defined functions

bitmap defined in line 114; used 3 times
delete defined in line 33; used 2 times
extract defined in line 222; used 2 times
gettape defined in line 3; used 3 times
maperr defined in line 149; used 3 times
phserr defined in line 110; used 3 times
setmap defined in line 130; used 2 times
taboc defined in line 190; used 2 times
update defined in line 41; used 1 times
update1 defined in line 71; used 1 times
  • in line 67
usage defined in line 156; used 1 times
Last modified: 1981-07-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1014
Valid CSS Valid XHTML 1.0 Strict