19830Ssam #ifndef lint
2*16648Sralph static char sccsid[] = "@(#)tp1.c 4.2 06/28/84";
39830Ssam #endif
49830Ssam
59830Ssam #include "tp.h"
69830Ssam
main(argc,argv)79830Ssam main(argc,argv)
89830Ssam char **argv;
99830Ssam {
109830Ssam register char c,*ptr;
119830Ssam extern cmd(), cmr(),cmx(), cmt();
129830Ssam
139830Ssam tname = tc;
149830Ssam command = cmr;
159830Ssam if ((narg = rnarg = argc) < 2) narg = 2;
169830Ssam else {
179830Ssam ptr = argv[1]; /* get first argument */
189830Ssam parg = &argv[2]; /* pointer to second argument */
199830Ssam while (c = *ptr++) switch(c) {
209830Ssam case '0':
219830Ssam case '1':
229830Ssam case '2':
239830Ssam case '3':
249830Ssam case '4':
259830Ssam case '5':
269830Ssam case '6':
279830Ssam case '7':
289830Ssam tc[8] = c;
299830Ssam mt[8] = c;
309830Ssam continue;
319830Ssam
329830Ssam case 'f':
339830Ssam tname = *parg++;
349830Ssam flags |= flm;
359830Ssam narg--; rnarg--;
369830Ssam continue;
379830Ssam case 'c':
389830Ssam flags |= flc; continue;
399830Ssam case 'd':
409830Ssam setcom(cmd); continue;
419830Ssam case 'i':
429830Ssam flags |= fli; continue;
439830Ssam case 'm':
449830Ssam tname = mt;
459830Ssam flags |= flm;
469830Ssam continue;
479830Ssam case 'r':
489830Ssam flags &= ~flu; setcom(cmr); continue;
499830Ssam case 's':
509830Ssam flags |= fls; continue;
519830Ssam case 't':
529830Ssam setcom(cmt); continue;
539830Ssam case 'u':
549830Ssam flags |= flu; setcom(cmr); continue;
559830Ssam case 'v':
569830Ssam flags |= flv; continue;
579830Ssam case 'w':
589830Ssam flags |= flw; continue;
599830Ssam case 'x':
609830Ssam setcom(cmx); continue;
619830Ssam default:
629830Ssam useerr();
639830Ssam }
649830Ssam }
659830Ssam optap();
669830Ssam (*command)();
679830Ssam }
689830Ssam
optap()699830Ssam optap()
709830Ssam {
719830Ssam extern cmr();
729830Ssam
739830Ssam if ((flags & flm) == 0) { /* DECTAPE */
749830Ssam tapsiz = TCSIZ;
759830Ssam ndirent = TCDIRS;
769830Ssam fio =open(tc,2);
779830Ssam } else { /* MAGTAPE */
789830Ssam tapsiz = MTSIZ;
799830Ssam ndirent = MDIRENT;
809830Ssam if(command == cmr) {
819830Ssam fio = open(tname,1);
829830Ssam if (fio < 0) fio = creat(tname,0666);
839830Ssam } else
849830Ssam fio = open(tname,0);
859830Ssam }
869830Ssam if (fio < 0) {
879830Ssam printf("Tape open error\n");
889830Ssam done();
899830Ssam }
909830Ssam ndentb = ndirent/TPB;
919830Ssam edir = &dir[ndirent];
929830Ssam }
939830Ssam
949830Ssam setcom(newcom)
959830Ssam int (*newcom)();
969830Ssam {
979830Ssam extern cmr();
989830Ssam
999830Ssam if (command != cmr) useerr();
1009830Ssam command = newcom;
1019830Ssam }
1029830Ssam
useerr()1039830Ssam useerr()
1049830Ssam {
1059830Ssam printf("Bad usage\n");
1069830Ssam done();
1079830Ssam }
1089830Ssam
1099830Ssam /*/* COMMANDS */
1109830Ssam
cmd()1119830Ssam cmd()
1129830Ssam {
1139830Ssam extern delete();
1149830Ssam
1159830Ssam if (flags & (flm|flc)) useerr();
1169830Ssam if (narg <= 2) useerr();
1179830Ssam rddir();
1189830Ssam gettape(delete);
1199830Ssam wrdir();
1209830Ssam check();
1219830Ssam }
1229830Ssam
cmr()1239830Ssam cmr()
1249830Ssam {
1259830Ssam if (flags & (flc|flm)) clrdir();
1269830Ssam else rddir();
1279830Ssam getfiles();
1289830Ssam update();
1299830Ssam check();
1309830Ssam }
1319830Ssam
cmt()1329830Ssam cmt()
1339830Ssam {
1349830Ssam extern taboc();
1359830Ssam
1369830Ssam if (flags & (flc|flw)) useerr();
1379830Ssam rddir();
1389830Ssam if (flags & flv)
1399830Ssam printf(" mode uid gid tapa size date time name\n");
1409830Ssam gettape(taboc);
1419830Ssam check();
1429830Ssam }
1439830Ssam
cmx()1449830Ssam cmx()
1459830Ssam {
1469830Ssam extern extract();
1479830Ssam
1489830Ssam if (flags & (flc)) useerr();
1499830Ssam rddir();
1509830Ssam gettape(extract);
1519830Ssam done();
1529830Ssam }
1539830Ssam
check()1549830Ssam check()
1559830Ssam {
1569830Ssam usage();
1579830Ssam done();
1589830Ssam }
1599830Ssam
done()1609830Ssam done()
1619830Ssam {
1629830Ssam printf("End\n");
1639830Ssam exit(0);
1649830Ssam }
1659830Ssam
encode(pname,dptr)1669830Ssam encode(pname,dptr) /* pname points to the pathname
1679830Ssam * dptr points to the dir entry */
1689830Ssam char *pname;
1699830Ssam struct dent *dptr;
1709830Ssam {
1719830Ssam register char *np;
1729830Ssam register n;
173*16648Sralph extern char *malloc();
1749830Ssam
1759830Ssam if((n=strlen(pname)) > NAMELEN) {
1769830Ssam printf("Pathname too long - %s\nFile ignored\n",pname);
1779830Ssam clrent(dptr);
1789830Ssam }
1799830Ssam else {
180*16648Sralph dptr->d_namep = np = malloc(n + 1);
181*16648Sralph if (np == 0) {
182*16648Sralph printf("Out of core\n");
183*16648Sralph done();
184*16648Sralph }
1859830Ssam strcpy(np, pname);
1869830Ssam }
1879830Ssam }
1889830Ssam
decode(pname,dptr)1899830Ssam decode(pname,dptr) /* dptr points to the dir entry
1909830Ssam * name is placed in pname[] */
1919830Ssam char *pname;
1929830Ssam struct dent *dptr;
1939830Ssam {
1949830Ssam
1959830Ssam strcpy(pname, dptr->d_namep);
1969830Ssam }
197