Research V7 development
[unix-history] / usr / src / cmd / tp / tp1.c
CommitLineData
88f62f26
KT
1#include "tp.h"
2
3main(argc,argv)
4char **argv;
5{
6 register char c,*ptr;
7 extern cmd(), cmr(),cmx(), cmt();
8
9 tname = tc;
10 command = cmr;
11 if ((narg = rnarg = argc) < 2) narg = 2;
12 else {
13 ptr = argv[1]; /* get first argument */
14 parg = &argv[2]; /* pointer to second argument */
15 while (c = *ptr++) switch(c) {
16 case '0':
17 case '1':
18 case '2':
19 case '3':
20 case '4':
21 case '5':
22 case '6':
23 case '7':
24 tc[8] = c;
25 mt[7] = c;
26 continue;
27
28 case 'f':
29 tname = *parg++;
30 narg--; rnarg--;
31 continue;
32 case 'c':
33 flags |= flc; continue;
34 case 'd':
35 setcom(cmd); continue;
36 case 'i':
37 flags |= fli; continue;
38 case 'm':
39 tname = mt;
40 flags |= flm;
41 continue;
42 case 'r':
43 flags &= ~flu; setcom(cmr); continue;
44 case 's':
45 flags |= fls; continue;
46 case 't':
47 setcom(cmt); continue;
48 case 'u':
49 flags |= flu; setcom(cmr); continue;
50 case 'v':
51 flags |= flv; continue;
52 case 'w':
53 flags |= flw; continue;
54 case 'x':
55 setcom(cmx); continue;
56 default:
57 useerr();
58 }
59 }
60 optap();
61 top = nptr = nameblk = sbrk(0);
62 (*command)();
63}
64
65optap()
66{
67 extern cmr();
68
69 if ((flags & flm) == 0) { /* DECTAPE */
70 tapsiz = TCSIZ;
71 ndirent = TCDIRS;
72 fio =open(tc,2);
73 } else { /* MAGTAPE */
74 tapsiz = MTSIZ;
75 ndirent = MDIRENT;
76 if(command == cmr)
77 fio = open(tname,1);
78 else
79 fio = open(tname,0);
80 }
81 if (fio < 0) {
82 printf("Tape open error\n");
83 done();
84 }
85 ndentb = ndirent/TPB;
86 edir = &dir[ndirent];
87}
88
89setcom(newcom)
90int (*newcom)();
91{
92 extern cmr();
93
94 if (command != cmr) useerr();
95 command = newcom;
96}
97
98useerr()
99{
100 printf("Bad usage\n");
101 done();
102}
103
104/*\f/* COMMANDS */
105
106cmd()
107{
108 extern delete();
109
110 if (flags & (flm|flc)) useerr();
111 if (narg <= 2) useerr();
112 rddir();
113 gettape(delete);
114 wrdir();
115 check();
116}
117
118cmr()
119{
120 if (flags & (flc|flm)) clrdir();
121 else rddir();
122 getfiles();
123 update();
124 check();
125}
126
127cmt()
128{
129 extern taboc();
130
131 if (flags & (flc|flw)) useerr();
132 rddir();
133 if (flags & flv)
134 printf(" mode uid gid tapa size date time name\n");
135 gettape(taboc);
136 check();
137}
138
139cmx()
140{
141 extern extract();
142
143 if (flags & (flc)) useerr();
144 rddir();
145 gettape(extract);
146 done();
147}
148
149check()
150{
151 usage();
152 done();
153}
154
155done()
156{
157 printf("End\n");
158 exit(0);
159}
160
161encode(pname,dptr) /* pname points to the pathname
162 * nptr points to next location in nameblk
163 * dptr points to the dir entry */
164char *pname;
165struct dent *dptr;
166{
167 register char *np;
168 register n;
169
170 dptr->d_namep = np = nptr;
171 if (np > top - NAMELEN) {
172 if(sbrk(BRKINCR) == (char *)-1) {
173 printf("Out of core\n");
174 done();
175 } else
176 top += BRKINCR;
177 }
178 if((n=strlen(pname)) > NAMELEN) {
179 printf("Pathname too long - %s\nFile ignored\n",pname);
180 clrent(dptr);
181 }
182 else {
183 nptr += n+1;
184 strcpy(np, pname);
185 }
186}
187
188decode(pname,dptr) /* dptr points to the dir entry
189 * name is placed in pname[] */
190char *pname;
191struct dent *dptr;
192{
193
194 strcpy(pname, dptr->d_namep);
195}