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