date and time created 82/12/18 15:14:15 by sam
[unix-history] / usr / src / old / tp / tp1.c
CommitLineData
53f9bd51
SL
1#ifndef lint
2static char sccsid[] = "@(#)tp1.c 4.1 %G%";
3#endif
4
5#include "tp.h"
6
7main(argc,argv)
8char **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
71optap()
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
96setcom(newcom)
97int (*newcom)();
98{
99 extern cmr();
100
101 if (command != cmr) useerr();
102 command = newcom;
103}
104
105useerr()
106{
107 printf("Bad usage\n");
108 done();
109}
110
111/*\f/* COMMANDS */
112
113cmd()
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
125cmr()
126{
127 if (flags & (flc|flm)) clrdir();
128 else rddir();
129 getfiles();
130 update();
131 check();
132}
133
134cmt()
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
146cmx()
147{
148 extern extract();
149
150 if (flags & (flc)) useerr();
151 rddir();
152 gettape(extract);
153 done();
154}
155
156check()
157{
158 usage();
159 done();
160}
161
162done()
163{
164 printf("End\n");
165 exit(0);
166}
167
168encode(pname,dptr) /* pname points to the pathname
169 * nptr points to next location in nameblk
170 * dptr points to the dir entry */
171char *pname;
172struct 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
196decode(pname,dptr) /* dptr points to the dir entry
197 * name is placed in pname[] */
198char *pname;
199struct dent *dptr;
200{
201
202 strcpy(pname, dptr->d_namep);
203}