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