xref: /original-bsd/old/tp/tp1.c (revision e59fb703)
1 #ifndef lint
2 static char sccsid[] = "@(#)tp1.c	4.2 06/28/84";
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 	(*command)();
67 }
68 
69 optap()
70 {
71 	extern cmr();
72 
73 	if ((flags & flm) == 0) {	/*  DECTAPE */
74 		tapsiz = TCSIZ;
75 		ndirent = TCDIRS;
76 		fio =open(tc,2);
77 	} else {			/* MAGTAPE */
78 		tapsiz = MTSIZ;
79 		ndirent = MDIRENT;
80 		if(command == cmr) {
81 			fio = open(tname,1);
82 			if (fio < 0) fio = creat(tname,0666);
83 		} else
84 			fio = open(tname,0);
85 	}
86 	if (fio < 0)  {
87 		printf("Tape open error\n");
88 		done();
89 	}
90 	ndentb = ndirent/TPB;
91 	edir = &dir[ndirent];
92 }
93 
94 setcom(newcom)
95 int (*newcom)();
96 {
97 	extern cmr();
98 
99 	if (command != cmr)  	useerr();
100 	command = newcom;
101 }
102 
103 useerr()
104 {
105 	printf("Bad usage\n");
106 	done();
107 }
108 
109 /*/* COMMANDS */
110 
111 cmd()
112 {
113 	extern delete();
114 
115 	if (flags & (flm|flc))	useerr();
116 	if (narg <= 2)			useerr();
117 	rddir();
118 	gettape(delete);
119 	wrdir();
120 	check();
121 }
122 
123 cmr()
124 {
125 	if (flags & (flc|flm))		clrdir();
126 	else				rddir();
127 	getfiles();
128 	update();
129 	check();
130 }
131 
132 cmt()
133 {
134 	extern taboc();
135 
136 	if (flags & (flc|flw))	useerr();
137 	rddir();
138 	if (flags & flv)
139 		printf("   mode    uid gid tapa    size   date    time name\n");
140 	gettape(taboc);
141 	check();
142 }
143 
144 cmx()
145 {
146 	extern extract();
147 
148 	if (flags & (flc))		useerr();
149 	rddir();
150 	gettape(extract);
151 	done();
152 }
153 
154 check()
155 {
156 	usage();
157 	done();
158 }
159 
160 done()
161 {
162 	printf("End\n");
163 	exit(0);
164 }
165 
166 encode(pname,dptr)	/* pname points to the pathname
167 			 * dptr points to the dir entry		   */
168 char	*pname;
169 struct	dent *dptr;
170 {
171 	register  char *np;
172 	register n;
173 	extern char *malloc();
174 
175 	if((n=strlen(pname)) > NAMELEN) {
176 		printf("Pathname too long - %s\nFile ignored\n",pname);
177 		clrent(dptr);
178 	}
179 	else {
180 		dptr->d_namep = np = malloc(n + 1);
181 		if (np == 0) {
182 			printf("Out of core\n");
183 			done();
184 		}
185 		strcpy(np, pname);
186 	}
187 }
188 
189 decode(pname,dptr)	/* dptr points to the dir entry
190 			 * name is placed in pname[] */
191 char	*pname;
192 struct	dent *dptr;
193 {
194 
195 	strcpy(pname, dptr->d_namep);
196 }
197