|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ T m ┃
Length: 7381 (0x1cd5) Types: TextFile Names: »misc.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─ ⟦this⟧ »EUUGD11/euug-87hel/sec8/smail/src/misc.c«
/* ** Miscellaneous support functions for smail/rmail */ #ifndef lint static char *sccsid="@(#)misc.c 2.3 (smail) 1/26/87"; #endif # include <stdio.h> # include <sys/types.h> # include <ctype.h> # include "defs.h" #ifdef BSD # include <sys/time.h> # include <sys/timeb.h> # include <strings.h> #else # include <time.h> # include <sys/utsname.h> # include <string.h> #endif extern int exitstat; /* set if a forked mailer fails */ extern enum edebug debug; /* how verbose we are */ extern enum ehandle handle; /* what we handle */ extern char *uuxargs; /* arguments given to uux */ extern int queuecost; /* threshold for queueing mail */ extern int maxnoqueue; /* max number of uucico's */ extern enum erouting routing; /* when to route addresses */ extern char hostdomain[]; /* */ extern char hostname[]; /* */ extern char *pathfile; /* location of path database */ extern char *spoolfile; /* file name of spooled message */ extern FILE *spoolfp; /* file ptr to spooled message */ extern int spoolmaster; /* set if creator of spoolfile */ struct tm *gmt, *loc; /* GMT and local time structure */ time_t now; /* current system time */ char nows[50]; /* time in ctime format */ char arpanows[50]; /* time in arpa format */ # ifdef LOG void log(command, from, size) char *command, *from; long size; { FILE *fd; char *logtime, tbuf[50]; int cmask; logtime = strcpy(tbuf, nows); logtime[16] = '\0'; logtime += 4; cmask = umask(0); fd = fopen(LOG, "a"); (void) umask(cmask); if (fd != NULL) { (void) fprintf(fd, "%s\t%ld\t%s\t%s\n", logtime, size, from, command); (void) fclose(fd); } } # endif # ifdef RECORD FILE * record(command, from, size) char *command, *from; long size; { FILE *fd; char *logtime, buf[SMLBUF]; int cmask; logtime = strcpy(buf, nows); logtime[16] = 0; logtime += 4; cmask = umask(0); fd = fopen(RECORD, "a"); (void) umask(cmask); if (fd != NULL) { (void) fprintf(fd, "%s: %s, from %s, %ld bytes\n", logtime, command, from, size); } while(fgets(buf, sizeof(buf), spoolfp) != NULL) { (void) fputs(buf, fd); } (void) fclose(fd); } # endif setdates() { time_t time(); struct tm *gmtime(); char *ctime(), *arpadate(); (void) time(&now); (void) strcpy(nows, ctime(&now)); gmt = gmtime(&now); loc = localtime(&now); (void) strcpy(arpanows, arpadate(nows)); } /* ** Note: This routine was taken from sendmail ** ** ARPADATE -- Create date in ARPANET format ** ** Parameters: ** ud -- unix style date string. if NULL, one is created. ** ** Returns: ** pointer to an ARPANET date field ** ** Side Effects: ** none ** ** WARNING: ** date is stored in a local buffer -- subsequent ** calls will overwrite. ** ** Bugs: ** Timezone is computed from local time, rather than ** from whereever (and whenever) the message was sent. ** To do better is very hard. ** ** Some sites are now inserting the timezone into the ** local date. This routine should figure out what ** the format is and work appropriately. */ char * arpadate(ud) register char *ud; { register char *p; register char *q; static char b[40]; extern char *ctime(); register int i; extern struct tm *localtime(); #ifndef BSD extern char *tzname[]; time_t t, time(); #else /* V7 and 4BSD */ struct timeb t; extern struct timeb *ftime(); extern char *timezone(); #endif /* ** Get current time. ** This will be used if a null argument is passed and ** to resolve the timezone. */ #ifndef BSD (void) time(&t); if (ud == NULL) ud = ctime(&t); #else /* V7 or 4BSD */ ftime(&t); if (ud == NULL) ud = ctime(&t.time); #endif /* ** Crack the UNIX date line in a singularly unoriginal way. */ q = b; p = &ud[8]; /* 16 */ if (*p == ' ') p++; else *q++ = *p++; *q++ = *p++; *q++ = ' '; p = &ud[4]; /* Sep */ *q++ = *p++; *q++ = *p++; *q++ = *p++; *q++ = ' '; p = &ud[22]; /* 1979 */ *q++ = *p++; *q++ = *p++; *q++ = ' '; p = &ud[11]; /* 01:03:52 */ for (i = 8; i > 0; i--) *q++ = *p++; /* -PST or -PDT */ #ifndef BSD p = tzname[localtime(&t)->tm_isdst]; #else p = timezone(t.timezone, localtime(&t.time)->tm_isdst); #endif if (p[3] != '\0') { /* hours from GMT */ p += 3; *q++ = *p++; if (p[1] == ':') *q++ = '0'; else *q++ = *p++; *q++ = *p++; p++; /* skip ``:'' */ *q++ = *p++; *q++ = *p++; } else { *q++ = ' '; *q++ = *p++; *q++ = *p++; *q++ = *p++; } p = &ud[0]; /* Mon */ *q++ = ' '; *q++ = '('; *q++ = *p++; *q++ = *p++; *q++ = *p++; *q++ = ')'; *q = '\0'; return (b); } /* * The user name "postmaster" must be accepted regardless of what * combination of upper and lower case is used. This function is * used to convert all case variants of "postmaster" to all lower * case. If the user name passed in is not "postmaster", it is * returned unchanged. */ char * postmaster(user) char *user; { static char *pm = "postmaster"; if(strcmpic(user, pm) == 0) { return(pm); } else { return(user); } } /* ** strncmpic: string compare, ignore case, stop after 'n' chars */ strncmpic(s1, s2, n) char *s1, *s2; int n; { register char *u = s1; register char *p = s2; while((n > 0) && (*p != '\0')) { /* chars match or only case different */ if(lower(*u) == lower(*p)) { p++; /* examine next char */ u++; } else { break; /* no match - stop comparison */ } n--; } if(n > 0) { return(lower(*u) - lower(*p)); /* return "difference" */ } else { return(0); } } /* ** strcmpic: string compare, ignore case */ strcmpic(s1, s2) char *s1, *s2; { register char *u = s1; register char *p = s2; while(*p != '\0') { /* chars match or only case different */ if(lower(*u) == lower(*p)) { p++; /* examine next char */ u++; } else { break; /* no match - stop comparison */ } } return(lower(*u) - lower(*p)); /* return "difference" */ } /* * Return 1 iff the string is "UUCP" (ignore case). */ isuucp(str) char *str; { if(strcmpic(str, "UUCP") == 0) { return(1); } else { return(0); } } /* ** sform(form) returns a pointer to a string that tells what 'form' means */ char * sform(form) enum eform form; { if(form == ERROR) return("ERROR"); if(form == LOCAL) return("LOCAL"); if(form == DOMAIN) return("DOMAIN"); if(form == UUCP) return("UUCP"); if(form == ROUTE) return("ROUTE"); return("UNKNOWN"); } /* ** ** getmynames(): what is my host name and host domain? ** ** Hostname set by -h, failing that by #define HOSTNAME, failing ** that by gethostname() or uname(). ** ** Hostdomain set by -h, failing that by #define HOSTDOMAIN, ** failing that as hostname.MYDOM, or as just hostname. ** ** See defs.h for the inside story. ** */ getmynames() { #ifdef HOSTNAME if (!*hostname) (void) strcpy(hostname, HOSTNAME); #endif #ifdef GETHOSTNAME if (!*hostname) gethostname(hostname, SMLBUF - 1); #endif #ifdef UNAME if (!*hostname) { struct utsname site; if (uname(&site) < 0) error(EX_SOFTWARE, "uname() call failed", 0); (void) strcpy(hostname, site.nodename); } #endif if (!*hostname) error(EX_SOFTWARE, "can't determine hostname.\n", 0); #ifdef HOSTDOMAIN if (!*hostdomain) (void) strcpy(hostdomain, HOSTDOMAIN); #endif #ifdef MYDOM if (!*hostdomain) (void) strcat(strcpy(hostdomain, hostname), MYDOM); #endif if (!*hostdomain) (void) strcpy(hostdomain, hostname); }