1*9830Ssam #ifndef lint 2*9830Ssam static char sccsid[] = "@(#)tp1.c 4.1 12/18/82"; 3*9830Ssam #endif 4*9830Ssam 5*9830Ssam #include "tp.h" 6*9830Ssam 7*9830Ssam main(argc,argv) 8*9830Ssam char **argv; 9*9830Ssam { 10*9830Ssam register char c,*ptr; 11*9830Ssam extern cmd(), cmr(),cmx(), cmt(); 12*9830Ssam 13*9830Ssam tname = tc; 14*9830Ssam command = cmr; 15*9830Ssam if ((narg = rnarg = argc) < 2) narg = 2; 16*9830Ssam else { 17*9830Ssam ptr = argv[1]; /* get first argument */ 18*9830Ssam parg = &argv[2]; /* pointer to second argument */ 19*9830Ssam while (c = *ptr++) switch(c) { 20*9830Ssam case '0': 21*9830Ssam case '1': 22*9830Ssam case '2': 23*9830Ssam case '3': 24*9830Ssam case '4': 25*9830Ssam case '5': 26*9830Ssam case '6': 27*9830Ssam case '7': 28*9830Ssam tc[8] = c; 29*9830Ssam mt[8] = c; 30*9830Ssam continue; 31*9830Ssam 32*9830Ssam case 'f': 33*9830Ssam tname = *parg++; 34*9830Ssam flags |= flm; 35*9830Ssam narg--; rnarg--; 36*9830Ssam continue; 37*9830Ssam case 'c': 38*9830Ssam flags |= flc; continue; 39*9830Ssam case 'd': 40*9830Ssam setcom(cmd); continue; 41*9830Ssam case 'i': 42*9830Ssam flags |= fli; continue; 43*9830Ssam case 'm': 44*9830Ssam tname = mt; 45*9830Ssam flags |= flm; 46*9830Ssam continue; 47*9830Ssam case 'r': 48*9830Ssam flags &= ~flu; setcom(cmr); continue; 49*9830Ssam case 's': 50*9830Ssam flags |= fls; continue; 51*9830Ssam case 't': 52*9830Ssam setcom(cmt); continue; 53*9830Ssam case 'u': 54*9830Ssam flags |= flu; setcom(cmr); continue; 55*9830Ssam case 'v': 56*9830Ssam flags |= flv; continue; 57*9830Ssam case 'w': 58*9830Ssam flags |= flw; continue; 59*9830Ssam case 'x': 60*9830Ssam setcom(cmx); continue; 61*9830Ssam default: 62*9830Ssam useerr(); 63*9830Ssam } 64*9830Ssam } 65*9830Ssam optap(); 66*9830Ssam nptr = nameblk = malloc(1000); 67*9830Ssam top = nptr + 1000; 68*9830Ssam (*command)(); 69*9830Ssam } 70*9830Ssam 71*9830Ssam optap() 72*9830Ssam { 73*9830Ssam extern cmr(); 74*9830Ssam 75*9830Ssam if ((flags & flm) == 0) { /* DECTAPE */ 76*9830Ssam tapsiz = TCSIZ; 77*9830Ssam ndirent = TCDIRS; 78*9830Ssam fio =open(tc,2); 79*9830Ssam } else { /* MAGTAPE */ 80*9830Ssam tapsiz = MTSIZ; 81*9830Ssam ndirent = MDIRENT; 82*9830Ssam if(command == cmr) { 83*9830Ssam fio = open(tname,1); 84*9830Ssam if (fio < 0) fio = creat(tname,0666); 85*9830Ssam } else 86*9830Ssam fio = open(tname,0); 87*9830Ssam } 88*9830Ssam if (fio < 0) { 89*9830Ssam printf("Tape open error\n"); 90*9830Ssam done(); 91*9830Ssam } 92*9830Ssam ndentb = ndirent/TPB; 93*9830Ssam edir = &dir[ndirent]; 94*9830Ssam } 95*9830Ssam 96*9830Ssam setcom(newcom) 97*9830Ssam int (*newcom)(); 98*9830Ssam { 99*9830Ssam extern cmr(); 100*9830Ssam 101*9830Ssam if (command != cmr) useerr(); 102*9830Ssam command = newcom; 103*9830Ssam } 104*9830Ssam 105*9830Ssam useerr() 106*9830Ssam { 107*9830Ssam printf("Bad usage\n"); 108*9830Ssam done(); 109*9830Ssam } 110*9830Ssam 111*9830Ssam /*/* COMMANDS */ 112*9830Ssam 113*9830Ssam cmd() 114*9830Ssam { 115*9830Ssam extern delete(); 116*9830Ssam 117*9830Ssam if (flags & (flm|flc)) useerr(); 118*9830Ssam if (narg <= 2) useerr(); 119*9830Ssam rddir(); 120*9830Ssam gettape(delete); 121*9830Ssam wrdir(); 122*9830Ssam check(); 123*9830Ssam } 124*9830Ssam 125*9830Ssam cmr() 126*9830Ssam { 127*9830Ssam if (flags & (flc|flm)) clrdir(); 128*9830Ssam else rddir(); 129*9830Ssam getfiles(); 130*9830Ssam update(); 131*9830Ssam check(); 132*9830Ssam } 133*9830Ssam 134*9830Ssam cmt() 135*9830Ssam { 136*9830Ssam extern taboc(); 137*9830Ssam 138*9830Ssam if (flags & (flc|flw)) useerr(); 139*9830Ssam rddir(); 140*9830Ssam if (flags & flv) 141*9830Ssam printf(" mode uid gid tapa size date time name\n"); 142*9830Ssam gettape(taboc); 143*9830Ssam check(); 144*9830Ssam } 145*9830Ssam 146*9830Ssam cmx() 147*9830Ssam { 148*9830Ssam extern extract(); 149*9830Ssam 150*9830Ssam if (flags & (flc)) useerr(); 151*9830Ssam rddir(); 152*9830Ssam gettape(extract); 153*9830Ssam done(); 154*9830Ssam } 155*9830Ssam 156*9830Ssam check() 157*9830Ssam { 158*9830Ssam usage(); 159*9830Ssam done(); 160*9830Ssam } 161*9830Ssam 162*9830Ssam done() 163*9830Ssam { 164*9830Ssam printf("End\n"); 165*9830Ssam exit(0); 166*9830Ssam } 167*9830Ssam 168*9830Ssam encode(pname,dptr) /* pname points to the pathname 169*9830Ssam * nptr points to next location in nameblk 170*9830Ssam * dptr points to the dir entry */ 171*9830Ssam char *pname; 172*9830Ssam struct dent *dptr; 173*9830Ssam { 174*9830Ssam register char *np; 175*9830Ssam register n; 176*9830Ssam 177*9830Ssam dptr->d_namep = np = nptr; 178*9830Ssam if (np > top - NAMELEN) { 179*9830Ssam int size = top - nptr; 180*9830Ssam if (nptr = realloc(nptr, 2 * size) == 0) { 181*9830Ssam printf("Out of core\n"); 182*9830Ssam done(); 183*9830Ssam } 184*9830Ssam top = nptr + 2 * size; 185*9830Ssam } 186*9830Ssam if((n=strlen(pname)) > NAMELEN) { 187*9830Ssam printf("Pathname too long - %s\nFile ignored\n",pname); 188*9830Ssam clrent(dptr); 189*9830Ssam } 190*9830Ssam else { 191*9830Ssam nptr += n+1; 192*9830Ssam strcpy(np, pname); 193*9830Ssam } 194*9830Ssam } 195*9830Ssam 196*9830Ssam decode(pname,dptr) /* dptr points to the dir entry 197*9830Ssam * name is placed in pname[] */ 198*9830Ssam char *pname; 199*9830Ssam struct dent *dptr; 200*9830Ssam { 201*9830Ssam 202*9830Ssam strcpy(pname, dptr->d_namep); 203*9830Ssam } 204