|
|
1.1 root 1: /*
2: * $Header: /newbits/usr/lib/uucp/dcp/RCS/dcpxf2.c,v 1.4 91/08/15 13:24:56 bin Exp Locker: bin $
3: * $Log: dcpxf2.c,v $
4: * Revision 1.4 91/08/15 13:24:56 bin
5: * changes by epstein for 7bit sites
6: *
7: * Revision 1.6 90/03/29 10:54:13 wgl
8: * Add check of the -d option and fail to create directory if option absent.
9: *
10: * Revision 1.5 90/03/26 13:45:37 wgl
11: * Add routine 'rebuildfn' to rebuild file name as needed on receive.
12: *
13: * Revision 1.4 90/03/23 09:30:39 wgl
14: * Add routines for cheking read and write permissions.
15: *
16: * Revision 1.3 90/03/22 12:11:08 wgl
17: * Add 'canwrite'.
18: *
19: * Revision 1.2 90/03/22 08:59:23 wgl
20: * Fixed error in from/to file reporting in status mail message.
21: *
22: */
23:
24: #include "dcp.h"
25: #include <signal.h>
26: #include <ctype.h>
27: #include <sys/timeb.h>
28: #include <sys/stat.h>
29: #include <access.h>
30: #include <pwd.h>
31: #include "perm.h"
32:
33: static char uuxbuf [64];
34: static char allowed [80];
35: static char disallowed[80];
36: static char *successmsg [2] = {
37: "FAILED",
38: "Successfully"
39: };
40:
41: static char tmpfilename[BUFSIZ]; /* Holds the converted file name */
42: extern char reason[];
43: extern char *strtok();
44:
45: notifystatus(fromfilep, xtofile, sending, success, cdotctl)
46: char *fromfilep, *xtofile;
47: int success, cdotctl, sending;
48: {
49: if (cdotctl) {
50: if (index(optionp, 'm') != NULL)
51: l3statmail(fromfilep, xtofile, sending, success);
52: } else {
53: if (index(optionp, 'n') != NULL)
54: notify2mail(fromfilep, xtofile, success);
55: }
56: }
57:
58: l3statmail(from, to, sending, success)
59: char *from;
60: char *to;
61: int sending;
62: int success;
63: {
64: FILE *fmp;
65:
66: (void) signal(SIGPIPE, SIG_IGN);
67: sprintf(uuxbuf, "mail -auucp %s", usernamep);
68: plog(M_TRANSFER, "Posting local status mail to user \"%s\"", usernamep);
69: if ((fmp = popen(uuxbuf, "w")) == NULL)
70: plog(M_TRANSFER, "Cannot send status mail");
71: else {
72: static char *succp;
73: fprintf(fmp, "From: UUCP V%s\n", version);
74: fprintf(fmp, "Subject: UUCP file transfer status\n\n");
75: succp = successmsg [success];
76: if (sending) {
77: fprintf (fmp, "Sent file:\t%s\n", from);
78: fprintf (fmp, " to:\t%s!%s\n%s\n",
79: rmtname, to, succp);
80: } else {
81: fprintf (fmp,"Received file:\t%s\n", to);
82: fprintf (fmp, " from:\t%s!%s\n%s\n",
83: rmtname, from, succp);
84: }
85: if (!success)
86: fprintf(fmp, "Reason: %s\n", reason);
87: if (pclose(fmp) != 0)
88: plog(M_TRANSFER, "Status mail failed.");
89: }
90: }
91:
92: notify2mail(from, to, success)
93: char *from;
94: char *to;
95: int success;
96: {
97: FILE *fmp;
98: int status;
99:
100: (void) signal(SIGPIPE, SIG_IGN);
101: sprintf(uuxbuf, "mail -auucp %s", notifyp);
102: plog(M_TRANSFER, "Notifying user \"%s\".", notifyp);
103: if ((fmp = popen(uuxbuf, "w")) == NULL)
104: plog(M_TRANSFER, "Cannot send notify mail (popen)");
105: else {
106: fprintf(fmp, "From: UUCP V%s\n", version);
107: fprintf(fmp, "\nThe file:\t%s\nReceived from:\t%s!%s\n",
108: to, rmtname, from);
109: fprintf(fmp, "%s\n", successmsg [success]);
110: if (!success)
111: fprintf(fmp, "Reason: %s\n", reason);
112: if ((status = pclose(fmp)) != 0) {
113: plog(M_TRANSFER,
114: "Notify mail fails (pclose), code %d", status);
115: }
116: }
117: }
118:
119: getoct(s)
120: char *s;
121: {
122: char *cp;
123: char c;
124: int n;
125:
126: cp = s;
127: n = 0;
128: while ((c = *cp) != '\0') {
129: n = (n * 8) + *cp++ -'0';
130: }
131: return n;
132: }
133:
134: int
135: cantsend()
136: {
137: plog(M_TRANSFER, "Cannot send packet");
138: printmsg(M_TRANSFER, "Cannot send packet (cantsend)");
139: terminatelevel++;
140: return 'Y';
141: }
142:
143: int
144: cantread()
145: {
146: plog(M_TRANSFER, "Cannot read packet");
147: printmsg(M_TRANSFER, "Cannot read packet (cantread)");
148: terminatelevel++;
149: return 'Y';
150: }
151:
152: int
153: canwrite(fn)
154: char *fn;
155: {
156: static dirname [120];
157: struct stat statbuf;
158: char *cp;
159:
160: strcpy(dirname, fn);
161: if ((cp = rindex(dirname, '/')) != NULL) {
162: *cp = '\0';
163: if (index(optionp, 'd') != NULL) {
164: if (!ckdir(dirname)) {
165: plog(M_SPOOL, "unable to create directory %s",
166: dirname);
167: return 0;
168: }
169: }
170: }
171: if (stat(fn, &statbuf) == -1)
172: return 1;
173: if (access(fn, 0) == 0)
174: return 1;
175: return 0;
176: }
177:
178: perm_write(fn)
179: char *fn;
180: {
181: strcpy(allowed, perm_value(write_e));
182: strcpy(disallowed, perm_value(nowrite_e));
183: return allowed_or_not(fn);
184: }
185:
186: perm_read(fn)
187: char *fn;
188: {
189: strcpy(allowed, perm_value(read_e));
190: strcpy(disallowed, perm_value(noread_e));
191: return allowed_or_not(fn);
192: }
193:
194: static int
195: allowed_or_not(fn)
196: char *fn;
197: {
198: char *sp, *cp;
199:
200: strcat(allowed, ":/usr/spool/uucp");
201: sp = disallowed;
202: while ((cp = strtok(sp, ":")) != NULL) {
203: sp = NULL;
204: if (strncmp(fn, cp, strlen(cp)) == 0)
205: return 0;
206: }
207: sp = allowed;
208: while ((cp = strtok(sp, ":")) != NULL) {
209: sp = NULL;
210: if (strncmp(fn, cp, strlen(cp)) == 0)
211: return 1;
212: }
213: return 0;
214: }
215:
216: /*
217: * rebuildfn
218: * rebuild the destination file name for a transfer, handling
219: * directories and so on.
220: */
221: char *
222: rebuildfn(destfile)
223: char *destfile;
224: {
225: struct passwd *pwp;
226: struct stat statbuf;
227: char *cp;
228:
229: if (*destfile == '~') {
230: if (*(destfile + 1) == '/')
231: sprintf(tmpfilename, "%s/%s", PUBDIR, destfile + 2);
232: else {
233: static char user [20];
234: strcpy(tmpfilename, destfile + 1);
235: if ((cp = strtok(tmpfilename, "/\n")) == NULL)
236: cp = tmpfilename;
237: strcpy(user, tmpfilename);
238: if ((pwp = getpwnam(user)) == NULL)
239: return NULL;
240: if ((cp = index(destfile, "/")) == NULL)
241: cp = "";
242: sprintf(tmpfilename, "%s/%s", pwp->pw_dir, cp);
243: }
244: } else if (*destfile == '/')
245: sprintf(tmpfilename, "%s", destfile);
246: else
247: sprintf(tmpfilename, "%s/%s/%s", SPOOLDIR, rmtname, destfile);
248: if ((cp = index(tmpfilename, '\n')) != NULL)
249: *cp = '\0';
250: if (((stat(tmpfilename, &statbuf) != -1) &&
251: ((statbuf.st_mode & S_IFDIR) != 0)) ||
252: (tmpfilename[strlen(tmpfilename) - 1] == '/')) {
253: if ((cp = rindex(fromfilep, '/')) == NULL)
254: cp = fromfilep;
255: else
256: cp++;
257: if (tmpfilename[strlen(tmpfilename) - 1] != '/')
258: strcat(tmpfilename, "/");
259: strcat(tmpfilename, cp);
260: }
261: return tmpfilename;
262: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.