Research V7 development
[unix-history] / usr / src / cmd / uucp / uucp.c
CommitLineData
128be09c
N
1#include "uucp.h"
2#include "uucpdefs.h"
3#include <sys/types.h>
4#include <sys/stat.h>
5
6/*
7 * uucp
8 */
9
10int Uid;
11int Startjob = 1;
12char Path[100], Optns[10];
13char Grade = 'n';
14int Copy = 1;
15
16main(argc, argv)
17char *argv[];
18{
19 int ret;
20 char *sysfile1, *sysfile2, *cp;
21 char file1[MAXFULLNAME], file2[MAXFULLNAME];
22 extern char *index();
23
24 Optns[0] = '-';
25 Optns[1] = '\0';
26 while(argc>1 && argv[1][0] == '-'){
27 switch(argv[1][1]){
28 case 'c':
29 Copy = 0;
30 break;
31 case 'd':
32 strcat(Optns, "d");
33 break;
34 case 'e':
35 fprintf(stderr, "-e option removed\n");
36 break;
37 case 'g':
38 Grade = argv[1][2]; break;
39 case 'm':
40 strcat(Optns, "m");
41 break;
42 case 'r':
43 Startjob = 0;
44 break;
45 case 's':
46 Spool = &argv[1][2]; break;
47 case 'x':
48 Debug = atoi(&argv[1][2]);
49 if (Debug <= 0)
50 Debug = 1;
51 break;
52 default:
53 printf("unknown flag %s\n", argv[1]); break;
54 }
55 --argc; argv++;
56 }
57 DEBUG(4, "\n\n** %s **\n", "START");
58 ret = gwd(Wrkdir);
59 ASSERT(ret == 0, "GWD FAILED %d", ret);
60 chdir(Spool);
61
62 Uid = getuid();
63 ret = guinfo(Uid, User, Path);
64 ASSERT(ret == 0, "CAN NOT FIND UID %d\n", Uid);
65 DEBUG(4, "UID %d, ", Uid);
66 DEBUG(4, "User %s,", User);
67 DEBUG(4, "PATH %s\n", Path);
68 if (argc < 3) {
69 fprintf(stderr, "usage uucp from ... to\n");
70 cleanup(0);
71 }
72
73
74 /* set up "to" system and file names */
75 if ((cp = index(argv[argc - 1], '!')) != NULL) {
76 sysfile2 = argv[argc - 1];
77 *cp = '\0';
78 if (*sysfile2 == '\0')
79 sysfile2 = Myname;
80 else
81 sprintf(Rmtname, "%.7s", sysfile2);
82 if (versys(sysfile2) != 0) {
83 fprintf(stderr, "bad system name: %s\n", sysfile2);
84 cleanup(0);
85 }
86 strcpy(file2, cp + 1);
87 }
88 else {
89 sysfile2 = Myname;
90 strcpy(file2, argv[argc - 1]);
91 }
92
93
94 /* do each from argument */
95 while (argc > 2) {
96 if ((cp = index(argv[1], '!')) != NULL) {
97 sysfile1 = argv[1];
98 *cp = '\0';
99 if (*sysfile1 == '\0')
100 sysfile1 = Myname;
101 else
102 sprintf(Rmtname, "%.7s", sysfile1);
103 if (versys(sysfile1) != 0) {
104 fprintf(stderr, "bad system name: %s\n", sysfile1);
105 cleanup(0);
106 }
107 strcpy(file1, cp + 1);
108 }
109 else {
110 sysfile1 = Myname;
111 strcpy(file1, argv[1]);
112 }
113 DEBUG(4, "file1 - %s\n", file1);
114 copy(sysfile1, file1, sysfile2, file2);
115 --argc;
116 argv++;
117 }
118
119 if (Startjob)
120 xuucico("");
121 cleanup(0);
122}
123
124cleanup(code)
125int code;
126{
127 logcls();
128 rmlock(NULL);
129 exit(code);
130}
131
132
133/***
134 * copy(s1, f1, s2, f2) generate copy files
135 * char *s1, *f1, *s2, *f2;
136 *
137 * return codes 0 | FAIL
138 */
139
140copy(s1, f1, s2, f2)
141char *s1, *f1, *s2, *f2;
142{
143 int ret, type;
144 struct stat stbuf;
145 char cfile[NAMESIZE], dfile[NAMESIZE];
146 char file1[MAXFULLNAME], file2[MAXFULLNAME];
147 FILE *cfp;
148 extern char *index();
149
150 type = 0;
151 strcpy(file1, f1);
152 strcpy(file2, f2);
153 if (strcmp(s1, Myname) != SAME)
154 type = 1;
155 if (strcmp(s2, Myname) != SAME)
156 type += 2;
157 if (type & 01)
158 if ((index(file1, '*') != NULL
159 || index(file1, '?') != NULL
160 || index(file1, '[') != NULL))
161 type = 4;
162 switch (type) {
163 case 0:
164 /* all work here */
165 DEBUG(4, "all work here %d\n", type);
166 expfile(file1);
167 expfile(file2);
168 if (chkpth(User, "", file1) != 0
169 || chkpth(User, "", file2) != 0) {
170 fprintf(stderr, "permission denied\n");
171 cleanup(1);
172 }
173 xcp(file1, file2);
174 logent("WORK HERE", "DONE");
175 return(0);
176 case 1:
177 /* receive file */
178 DEBUG(4, "receive file - %d\n", type);
179 if (file1[0] != '~')
180 expfile(file1);
181 expfile(file2);
182 if (chkpth(User, "", file2) != 0) {
183 fprintf(stderr, "permission denied\n");
184 return(FAIL);
185 }
186 gename(CMDPRE, s1, Grade, cfile);
187 strcpy(dfile, cfile);
188 dfile[0] = DATAPRE;
189 cfp = fopen(cfile, "w");
190 ASSERT(cfp != NULL, "CAN NOT OPEN %s", cfile);
191 fprintf(cfp, "R %s %s %s %s\n", file1, file2, User, Optns);
192 fclose(cfp);
193 break;
194 case 2:
195 /* send file */
196 expfile(file1);
197 if (file2[0] != '~')
198 expfile(file2);
199 DEBUG(4, "send file - %d\n", type);
200
201 gename(CMDPRE, s2, Grade, cfile);
202 strcpy(dfile, cfile);
203 dfile[0] = DATAPRE;
204 if (chkpth(User, "", file1) != 0) {
205 fprintf(stderr, "permission denied %s\n", file1);
206 return(FAIL);
207 }
208 ret = stat(file1, &stbuf);
209 if ((stbuf.st_mode & S_IFMT) == S_IFDIR) {
210 fprintf(stderr, "directory name illegal - %s\n",
211 file1);
212 return(FAIL);
213 }
214 if (Copy) {
215 if (xcp(file1, dfile) != 0) {
216 fprintf(stderr, "can't copy %s\n", file1);
217 return(FAIL);
218 }
219 chmod(dfile, 0666);
220 }
221 else {
222 if ((stbuf.st_mode & 04) == 0) {
223 fprintf(stderr, "uucico can't access %s (-c specified)\n", file1);
224 return(FAIL);
225 }
226 }
227 cfp = fopen(cfile, "w");
228 ASSERT(cfp != NULL, "CAN NOT OPEN %s", cfile);
229 chmod(cfile, 0200);
230 fprintf(cfp, "S %s %s %s %s %s %o\n", file1, file2,
231 User, Optns, dfile, stbuf.st_mode & 0777);
232 fclose(cfp);
233 chmod(cfile, 0666);
234 break;
235 case 3:
236 case 4:
237 /* send uucp command for execution on s2 */
238 DEBUG(4, "send uucp command - %d\n", type);
239 if (strcmp(s2, Myname) == SAME) {
240 expfile(file2);
241 if (chkpth(User, "", file2) != 0) {
242 fprintf(stderr, "permission denied\n");
243 return(FAIL);
244 }
245 }
246 gename(CMDPRE, s1, Grade, cfile);
247 cfp = fopen(cfile, "w");
248 ASSERT(cfp != NULL, "CAN NOT OPEN %s", cfile);
249 fprintf(cfp, "X %s %s!%s\n", file1, s2, file2);
250 fclose(cfp);
251 break;
252 }
253 logent(cfile, "QUEUED");
254 return(0);
255}