xref: /csrg-svn/old/tp/tp1.c (revision 16648)
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