xref: /original-bsd/old/tp/tp1.c (revision f0fd5f8a)
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