|
|
1.1 root 1:
2: /*
3: ** Miscellaneous support functions for smail/rmail
4: */
5:
6: #ifndef lint
7: static char *sccsid="@(#)misc.c 2.5 (smail) 9/15/87";
8: #endif
9:
10: # include <stdio.h>
11: # include <sys/types.h>
12: # include <ctype.h>
13: # include "defs.h"
14: #ifdef BSD
15: # include <sys/time.h>
16: # include <sys/timeb.h>
17: #else
18: # include <time.h>
19: # include <sys/utsname.h>
20: #endif
21:
22: extern int exitstat; /* set if a forked mailer fails */
23: extern enum edebug debug; /* how verbose we are */
24: extern enum ehandle handle; /* what we handle */
25: extern char *uuxargs; /* arguments given to uux */
26: extern int queuecost; /* threshold for queueing mail */
27: extern int maxnoqueue; /* max number of uucico's */
28: extern enum erouting routing; /* when to route addresses */
29: extern char hostdomain[]; /* */
30: extern char hostname[]; /* */
31: extern char hostuucp[]; /* */
32: extern char *pathfile; /* location of path database */
33: extern char *spoolfile; /* file name of spooled message */
34: extern FILE *spoolfp; /* file ptr to spooled message */
35: extern int spoolmaster; /* set if creator of spoolfile */
36:
37: extern struct tm *localtime();
38:
39: struct tm *gmt, *loc; /* GMT and local time structure */
40: time_t now; /* current system time */
41: char nows[50]; /* time in ctime format */
42: char arpanows[50]; /* time in arpa format */
43:
44: # ifdef LOG
45: void
46: log(command, from, size)
47: char *command, *from;
48: long size;
49: {
50: FILE *fd;
51: char *logtime, tbuf[50];
52: int cmask;
53:
54: logtime = strcpy(tbuf, nows);
55: logtime[16] = '\0';
56: logtime += 4;
57:
58: cmask = umask(0);
59: fd = fopen(LOG, "a");
60: (void) umask(cmask);
61:
62: if (fd != NULL) {
63: (void) fprintf(fd, "%s\t%ld\t%s\t%s\n",
64: logtime, size, from, command);
65: (void) fclose(fd);
66: }
67: }
68: # endif
69: # ifdef LOG
70: void
71: error_log(message)
72: char *message;
73: {
74: int fd;
75: char *logtime, tbuf[50];
76: char buff[2*MAXCLEN];
77: int cmask;
78:
79: logtime = strcpy(tbuf, nows);
80: logtime[16] = '\0';
81: logtime += 4;
82:
83: cmask = umask(0);
84: fd = open(LOG, 1); /* Open for writing. */
85: lseek(fd, 0L, 2); /* Seek to the end of file. */
86: (void) umask(cmask);
87:
88: if (fd != -1) {
89: (void) sprintf(buff, "%s\tpid:%d\t%s\n",
90: logtime, getpid(), message);
91: (void) write(fd, buff, strlen(buff));
92: (void) close(fd);
93: }
94: }
95: # endif
96:
97: # ifdef RECORD
98: FILE *
99: record(command, from, size)
100: char *command, *from;
101: long size;
102: {
103: FILE *fd;
104: char *logtime, buf[SMLBUF];
105: int cmask;
106:
107: logtime = strcpy(buf, nows);
108: logtime[16] = 0;
109: logtime += 4;
110:
111: cmask = umask(0);
112: fd = fopen(RECORD, "a");
113: (void) umask(cmask);
114:
115: if (fd != NULL) {
116: (void) fprintf(fd, "%s: %s, from %s, %ld bytes\n",
117: logtime, command, from, size);
118: }
119: while(fgets(buf, sizeof(buf), spoolfp) != NULL) {
120: (void) fputs(buf, fd);
121: }
122: (void) fclose(fd);
123: }
124: # endif
125:
126:
127: setdates()
128: {
129: time_t time();
130: struct tm *gmtime();
131: char *ctime(), *arpadate();
132:
133: (void) time(&now);
134: (void) strcpy(nows, ctime(&now));
135: gmt = gmtime(&now);
136: loc = localtime(&now);
137: (void) strcpy(arpanows, arpadate(nows));
138: }
139:
140: /*
141: ** Note: This routine was taken from sendmail
142: **
143: ** ARPADATE -- Create date in ARPANET format
144: **
145: ** Parameters:
146: ** ud -- unix style date string. if NULL, one is created.
147: **
148: ** Returns:
149: ** pointer to an ARPANET date field
150: **
151: ** Side Effects:
152: ** none
153: **
154: ** WARNING:
155: ** date is stored in a local buffer -- subsequent
156: ** calls will overwrite.
157: **
158: ** Bugs:
159: ** Timezone is computed from local time, rather than
160: ** from whereever (and whenever) the message was sent.
161: ** To do better is very hard.
162: **
163: ** Some sites are now inserting the timezone into the
164: ** local date. This routine should figure out what
165: ** the format is and work appropriately.
166: */
167:
168: char *
169: arpadate(ud)
170: register char *ud;
171: {
172: register char *p;
173: register char *q;
174: static char b[40];
175: extern char *ctime();
176: register int i;
177: #ifndef BSD
178: extern char *tzname[];
179: time_t t, time();
180: #else
181: /* V7 and 4BSD */
182: struct timeb t;
183: extern struct timeb *ftime();
184: extern char *timezone();
185: #endif
186:
187: /*
188: ** Get current time.
189: ** This will be used if a null argument is passed and
190: ** to resolve the timezone.
191: */
192:
193: #ifndef BSD
194: (void) time(&t);
195: if (ud == NULL)
196: ud = ctime(&t);
197: #else
198: /* V7 or 4BSD */
199: ftime(&t);
200: if (ud == NULL)
201: ud = ctime(&t.time);
202: #endif
203:
204: /*
205: ** Crack the UNIX date line in a singularly unoriginal way.
206: */
207:
208: q = b;
209:
210: p = &ud[8]; /* 16 */
211: if (*p == ' ')
212: p++;
213: else
214: *q++ = *p++;
215: *q++ = *p++;
216: *q++ = ' ';
217:
218: p = &ud[4]; /* Sep */
219: *q++ = *p++;
220: *q++ = *p++;
221: *q++ = *p++;
222: *q++ = ' ';
223:
224: p = &ud[22]; /* 1979 */
225: *q++ = *p++;
226: *q++ = *p++;
227: *q++ = ' ';
228:
229: p = &ud[11]; /* 01:03:52 */
230: for (i = 8; i > 0; i--)
231: *q++ = *p++;
232:
233: /* -PST or -PDT */
234: #ifndef BSD
235: p = tzname[localtime(&t)->tm_isdst];
236: #else
237: p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
238: #endif
239: if (p[3] != '\0')
240: {
241: /* hours from GMT */
242: p += 3;
243: *q++ = *p++;
244: if (p[1] == ':')
245: *q++ = '0';
246: else
247: *q++ = *p++;
248: *q++ = *p++;
249: p++; /* skip ``:'' */
250: *q++ = *p++;
251: *q++ = *p++;
252: }
253: else
254: {
255: *q++ = ' ';
256: *q++ = *p++;
257: *q++ = *p++;
258: *q++ = *p++;
259: }
260:
261: p = &ud[0]; /* Mon */
262: *q++ = ' ';
263: *q++ = '(';
264: *q++ = *p++;
265: *q++ = *p++;
266: *q++ = *p++;
267: *q++ = ')';
268:
269: *q = '\0';
270: return (b);
271: }
272:
273: /*
274: * The user name "postmaster" must be accepted regardless of what
275: * combination of upper and lower case is used. This function is
276: * used to convert all case variants of "postmaster" to all lower
277: * case. If the user name passed in is not "postmaster", it is
278: * returned unchanged.
279: */
280: char *
281: postmaster(user)
282: char *user;
283: {
284: static char *pm = "postmaster";
285:
286: if(strcmpic(user, pm) == 0) {
287: return(pm);
288: } else {
289: return(user);
290: }
291: }
292:
293: /*
294: * Return 1 iff the string is "UUCP" (ignore case).
295: */
296: isuucp(str)
297: char *str;
298: {
299: if(strcmpic(str, "UUCP") == 0) {
300: return(1);
301: } else {
302: return(0);
303: }
304: }
305:
306: /*
307: ** sform(form) returns a pointer to a string that tells what 'form' means
308: */
309:
310: char *
311: sform(form)
312: enum eform form;
313: {
314: if(form == ERROR) return("ERROR");
315: if(form == LOCAL) return("LOCAL");
316: if(form == DOMAIN) return("DOMAIN");
317: if(form == UUCP) return("UUCP");
318: if(form == ROUTE) return("ROUTE");
319: return("UNKNOWN");
320: }
321:
322: /*
323: **
324: ** getmynames(): what is my host name and host domain?
325: **
326: ** Hostname set by -h, failing that by #define HOSTNAME, failing
327: ** that by gethostname() or uname().
328: **
329: ** Hostdomain set by -h, failing that by #define HOSTDOMAIN,
330: ** failing that as hostname.MYDOM, or as just hostname.
331: **
332: ** See defs.h for the inside story.
333: **
334: */
335:
336: getmynames()
337: {
338: #ifdef HOSTNAME
339: if (!*hostname)
340: (void) strcpy(hostname, HOSTNAME);
341: #endif
342: #ifdef GETHOSTNAME
343: if (!*hostname)
344: gethostname(hostname, SMLBUF - 1);
345: #endif
346: #ifdef UNAME
347: if (!*hostname) {
348: struct utsname site;
349:
350: if (uname(&site) < 0)
351: error(EX_SOFTWARE, "uname() call failed", 0);
352: (void) strcpy(hostname, site.nodename);
353: }
354: #endif
355: if (!*hostname)
356: error(EX_SOFTWARE, "can't determine hostname.\n", 0);
357: #ifdef HOSTDOMAIN
358: if (!*hostdomain)
359: (void) strcpy(hostdomain, HOSTDOMAIN);
360: #endif
361: #ifdef MYDOM
362: if (!*hostdomain)
363: (void) strcat(strcpy(hostdomain, hostname), MYDOM);
364: #endif
365: #ifdef GETDOMAIN
366: if (!*hostdomain){
367: unsigned char temp[SMLBUF];
368:
369: getdomain(temp, SMLBUF - 1);
370: (void) strcat(strcpy(hostdomain, hostname), ".");
371: (void) strcat(hostdomain, temp);
372: }
373: #endif
374: if (!*hostdomain)
375: (void) strcpy(hostdomain, hostname);
376:
377: (void) strcat(strcpy(hostuucp, hostname), ".UUCP");
378: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.