Annotation of 41BSD/cmd/tp/tp2.c, revision 1.1

1.1     ! root        1: #include "tp.h"
        !             2: #include <stdio.h>
        !             3: #include <sys/types.h>
        !             4: #include <sys/stat.h>
        !             5: #include <sys/dir.h>
        !             6: 
        !             7: struct direct  direct;
        !             8: struct stat    statb;
        !             9: 
        !            10: clrdir()
        !            11: {
        !            12:        register j, *p;
        !            13: 
        !            14:        j = ndirent * (DIRSZ/sizeof(int));
        !            15:        p = (int *)dir;
        !            16:        do (*p++ = 0);  while (--j);
        !            17:        lastd = 0;
        !            18: }
        !            19: 
        !            20: clrent(ptr)
        !            21: struct dent *ptr;
        !            22: {
        !            23:        register *p, j;
        !            24: 
        !            25:        p  = (int *)ptr;
        !            26:        j = DIRSZ/sizeof(int);
        !            27:        do *p++ = 0;
        !            28:           while (--j);
        !            29:        if (++ptr == lastd) do {
        !            30:                if (--lastd < dir) {
        !            31:                        lastd = 0;
        !            32:                        return;
        !            33:                }
        !            34:        } while (lastd->d_namep == 0);
        !            35: }
        !            36: 
        !            37: 
        !            38: rddir()
        !            39: {
        !            40:        register struct tent *tp;
        !            41:        register struct dent *p1;
        !            42:        struct dent  *dptr;
        !            43:        struct tent  *tptr;
        !            44:        int     count, i, sum;
        !            45:        short   reg, *sp;
        !            46: 
        !            47:        sum = 0;
        !            48:        clrdir();
        !            49:        rseek(0);
        !            50:        tread();        /* Read the bootstrap block */
        !            51:        if ((tpentry[TPB-1].cksum != 0) && (flags & flm)) {
        !            52:                ndirent = tpentry[TPB-1].cksum;
        !            53:                if(flags & fls) swab((char *)&ndirent, (char *)&ndirent, sizeof(ndirent));
        !            54:                if(ndirent < 0 || ndirent > MDIRENT) ndirent = MDIRENT;
        !            55:                ndentb = ndirent/TPB;
        !            56:        }
        !            57:        dptr = &dir[0];
        !            58:        count = ndirent;
        !            59:        do {
        !            60:                if ((count % TPB) == 0) {       /* next block */
        !            61:                        tread();
        !            62:                        tptr = &tpentry[0];
        !            63:                }
        !            64:                if(flags & fls)
        !            65:                        swab((char *)tptr, (char *)tptr, sizeof(*tptr));
        !            66:                sp = (short *)tptr;
        !            67:                reg = 0;
        !            68:                for(i=0;i<sizeof(struct tent)/sizeof(short);i++)
        !            69:                        reg += *sp++;
        !            70:                if(flags & fls) {
        !            71:                        swab((char *)tptr, (char *)tptr, sizeof(*tptr));
        !            72:                        swabdir(tptr);
        !            73:                }
        !            74:                sum |= reg;
        !            75:                p1 = dptr;
        !            76:                if (reg == 0) {
        !            77:                        tp = tptr;
        !            78:                        if(tp->pathnam[0] != '\0') {
        !            79:                                lastd = p1;
        !            80:                                encode(tp->pathnam,p1);
        !            81:                                p1->d_mode = tp->mode;
        !            82:                                p1->d_uid = tp->uid;
        !            83:                                p1->d_gid = tp->gid;
        !            84:                                p1->d_size = (((long)tp->size0&0377L)<<16)+(tp->size1&0177777L);
        !            85:                                p1->d_time = tp->time;
        !            86:                                p1->d_tapea = tp->tapea;
        !            87:                        }
        !            88:                }
        !            89:                ++tptr;         /* bump to next tent */
        !            90:                (dptr++)->d_mode &= ~OK;
        !            91:        } while (--count);
        !            92:        if(sum != 0)
        !            93:                if(flags & (fls|fli)) {
        !            94:                        printf("Directory checksum\n");
        !            95:                        if ((flags & fli) == 0)         done();
        !            96:                } else {
        !            97:                        flags |= fls;
        !            98:                        rddir();
        !            99:                        printf("Warning: swabbing required\n");
        !           100:                        return;
        !           101:                }
        !           102:        bitmap();
        !           103: }
        !           104: 
        !           105: 
        !           106: wrdir()
        !           107: {
        !           108:        register struct tent *tp;
        !           109:        register struct dent *dp;
        !           110:        struct dent *dptr;
        !           111:        int     count, i;
        !           112:        short   reg, *sp;
        !           113: 
        !           114:        wseek(0);
        !           115:        if (flags & flm)
        !           116:                reg = open(mheader,0);
        !           117:        else    reg = open(theader,0);
        !           118:        if (reg >= 0) {
        !           119:                read(reg,(char *)tapeb,BSIZE);
        !           120:                close(reg);
        !           121:                if(flags & fls)
        !           122:                        swab((char *)&ndirent, (char *)&tpentry[TPB-1].cksum, sizeof(ndirent));
        !           123:                else
        !           124:                        tpentry[TPB-1].cksum = ndirent;
        !           125:        } else
        !           126:                printf("\7\7\7Warning: cannot read prototype boot block.\n");
        !           127:        dptr = &dir[0];
        !           128:        count = ndirent;
        !           129:        for (;;) {
        !           130:                twrite();
        !           131:                if (count == 0)  return;
        !           132:                tp = &tpentry[0];
        !           133:                do {
        !           134:                        dp = dptr++;    /* dptr set to next entry */
        !           135:                        if (dp->d_namep)  {
        !           136:                                decode(tp->pathnam,dp);
        !           137:                                tp->mode = dp->d_mode;
        !           138:                                tp->uid = dp->d_uid;
        !           139:                                tp->gid = dp->d_gid;
        !           140:                                tp->time = dp->d_time;
        !           141:                                tp->size0 = dp->d_size >> 16;
        !           142:                                tp->size1 = dp->d_size;
        !           143:                                tp->tapea = dp->d_tapea;
        !           144:                                if(flags & fls) {
        !           145:                                        swabdir(tp);
        !           146:                                        swab((char *)tp, (char *)tp, sizeof(*tp));
        !           147:                                }
        !           148:                                reg = 0;
        !           149:                                sp = (short *)tp;
        !           150:                                for(i=0;i<sizeof(struct tent)/sizeof(short)-1;i++)
        !           151:                                        reg -= *sp++;
        !           152:                                *sp = reg;
        !           153:                                if(flags & fls)
        !           154:                                        swab((char *)tp, (char *)tp, sizeof(*tp));
        !           155:                        } else {
        !           156:                                sp = (short *)tp;
        !           157:                                for(i=0;i<sizeof(struct tent)/sizeof(short);i++)
        !           158:                                        *sp++ = 0;
        !           159:                        }
        !           160:                tp++;
        !           161:                } while (--count % TPB);
        !           162:        }
        !           163: }
        !           164: 
        !           165: tread()
        !           166: {
        !           167:        register j, *ptr;
        !           168: 
        !           169:        if (read(fio,(char *)tapeb,BSIZE) != BSIZE) {
        !           170:                printf("Tape read error\n");
        !           171:                if ((flags & fli) == 0)         done();
        !           172:                ptr = (int *)tapeb;
        !           173:                j = BSIZE/sizeof(int);
        !           174:                while(j--) *ptr++ = 0;
        !           175:        }
        !           176:        rseeka++;
        !           177: }
        !           178: 
        !           179: twrite()
        !           180: {
        !           181:        if (write(fio, (char *)tapeb,BSIZE) != BSIZE) {
        !           182:                printf("Tape write error\n");
        !           183:                done();
        !           184:        }
        !           185:        ++wseeka;
        !           186: }
        !           187: 
        !           188: rseek(blk)
        !           189: {
        !           190:        rseeka = blk;
        !           191:        if (lseek(fio,(long)blk*BSIZE,0) < 0)   seekerr();
        !           192: }
        !           193: 
        !           194: wseek(blk)
        !           195: {
        !           196:        register amt, b;
        !           197: 
        !           198:        amt = b = blk;
        !           199:        if ((amt -= wseeka) < 0)        amt = -amt;
        !           200:        if (amt > 25 && b) {
        !           201:                lseek(fio, (long)(b-1)*BSIZE, 0);       /* seek previous block */
        !           202:                read(fio, (char *)&wseeka, 1);  /* read next block */
        !           203:        }
        !           204:        wseeka = b;
        !           205:        if (lseek(fio, (long)b*BSIZE, 0) < 0)   seekerr();
        !           206: }
        !           207: 
        !           208: seekerr()
        !           209: {
        !           210:        printf("Tape seek error\n");
        !           211:        done();
        !           212: }
        !           213: 
        !           214: verify(key)
        !           215: {
        !           216:        register c;
        !           217: 
        !           218:        if ((flags & (flw | flv)) == 0)
        !           219:                return(0);
        !           220: repeat:        printf("%c %s ", key, name);
        !           221:        if ((flags & flw) == 0) {
        !           222:                printf("\n");
        !           223:                return(0);
        !           224:        }
        !           225:        c = getchar();
        !           226:        if (c == 'n' && getchar() == '\n')
        !           227:                done();
        !           228:        if (c == '\n')
        !           229:                return(-1);
        !           230:        if (c == 'y' && getchar() == '\n')
        !           231:                return(0);
        !           232:        while (getchar() != '\n');
        !           233:        goto repeat;
        !           234: }
        !           235: 
        !           236: getfiles()
        !           237: {
        !           238: 
        !           239:        if ((narg -= 2) == 0) {
        !           240:                strcpy(name, ".");
        !           241:                callout();
        !           242:        } else while (--narg >= 0) {
        !           243:                strcpy(name, *parg++);
        !           244:                callout();
        !           245:        }
        !           246: }
        !           247: 
        !           248: 
        !           249: expand()
        !           250: {
        !           251:        register  char *p0, *save0;
        !           252:        int n, fid;
        !           253: 
        !           254:        if ((fid = open(name,0)) < 0)           fserr();
        !           255:        for (;;) {
        !           256:                if ((n = read(fid, (char *)&direct, sizeof(direct))) != sizeof(direct)) {
        !           257:                        if (n == 0) {
        !           258:                                close(fid);
        !           259:                                return;
        !           260:                        }
        !           261:                        fserr();
        !           262:                }
        !           263:                if (direct.d_ino == 0)  /* null entry */
        !           264:                        continue;
        !           265:                p0 = name;
        !           266:                if (direct.d_name[0] == '.')            /* don't save .xxxx */
        !           267:                        continue;
        !           268:                while (*p0++);
        !           269:                save0 = --p0;           /* save loc of \0 */
        !           270:                if (p0[-1] != '/')
        !           271:                        *p0++ = '/';
        !           272:                strcpy(p0, direct.d_name);
        !           273:                        callout();
        !           274:                *save0 = 0;             /* restore */
        !           275:        }
        !           276: }
        !           277: 
        !           278: fserr()
        !           279: {
        !           280:        printf("%s -- Cannot open file\n", name);
        !           281:        done();
        !           282: }
        !           283: 
        !           284: callout()
        !           285: {
        !           286:        register struct dent *d;
        !           287:        register char *ptr1, *ptr0;
        !           288:        struct dent *empty;
        !           289:        int mode;
        !           290: 
        !           291:        if (stat(name,&statb) < 0)      fserr();
        !           292:        mode = statb.st_mode;
        !           293:        if ((mode &= S_IFMT) != 0) {
        !           294:                if (mode == S_IFDIR)  /* directory */
        !           295:                        expand();
        !           296:                if(mode != S_IFREG) return;
        !           297:        }
        !           298:        /* when we reach here we have recursed until we found 
        !           299:         * an ordinary file.  Now we look for it in "dir".
        !           300:         */
        !           301:        empty = 0;
        !           302:        d = &dir[0];
        !           303:        do  {
        !           304:                if (d->d_namep == 0) {  /* empty directory slot */
        !           305:                        if (empty == 0) /* remember the first one */
        !           306:                                empty = d;
        !           307:                        continue;
        !           308:                }
        !           309:                decode(name1,d);
        !           310:                ptr0 = name;
        !           311:                ptr1 = name1;
        !           312:                do      if (*ptr0++ != *ptr1)   goto cont;
        !           313:                    while (*ptr1++);
        !           314:                /* veritably the same name */
        !           315:                if (flags & flu) {  /* check the times */
        !           316:                        if (d->d_time >= statb.st_mtime)
        !           317:                                return;
        !           318:                }
        !           319:                if (verify('r') < 0)    return;
        !           320:                goto copydir;
        !           321: cont:          continue;
        !           322:        }  while (++d <= lastd);
        !           323:        /* name not found in directory */
        !           324:        if ((d = empty) == 0) {
        !           325:                d = lastd +1;
        !           326:                if (d >= edir) {
        !           327:                        printf("Directory overflow\n");
        !           328:                        done();
        !           329:                }
        !           330:        }
        !           331:        if (verify('a') < 0)            return;
        !           332:        if (d > lastd)          lastd = d;
        !           333:        encode(name,d);
        !           334: copydir:
        !           335:        d->d_mode = statb.st_mode | OK;
        !           336:        d->d_uid = statb.st_uid;
        !           337:        d->d_gid = statb.st_gid;
        !           338:        d->d_size = statb.st_size;
        !           339:        d->d_time = statb.st_mtime;
        !           340: }
        !           341: 
        !           342: swabdir(tp)
        !           343: register struct tent *tp;
        !           344: {
        !           345:        swab((char *)tp, (char *)tp, sizeof(*tp));
        !           346:        swab(tp->pathnam, tp->pathnam, NAMELEN);
        !           347:        swab((char *)&tp->uid, (char *)&tp->uid, 4); /* uid,gid,spare,size0 */
        !           348: }

unix.superglobalmegacorp.com

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