1 #ifndef lint
2 static char sccsid[] = "@(#)tp1.c 4.2 06/28/84";
3 #endif
4
5 #include "tp.h"
6
main(argc,argv)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
optap()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
useerr()103 useerr()
104 {
105 printf("Bad usage\n");
106 done();
107 }
108
109 /*/* COMMANDS */
110
cmd()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
cmr()123 cmr()
124 {
125 if (flags & (flc|flm)) clrdir();
126 else rddir();
127 getfiles();
128 update();
129 check();
130 }
131
cmt()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
cmx()144 cmx()
145 {
146 extern extract();
147
148 if (flags & (flc)) useerr();
149 rddir();
150 gettape(extract);
151 done();
152 }
153
check()154 check()
155 {
156 usage();
157 done();
158 }
159
done()160 done()
161 {
162 printf("End\n");
163 exit(0);
164 }
165
encode(pname,dptr)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
decode(pname,dptr)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