Annotation of coherent/d/bin/mail/smail/misc.c, revision 1.1

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:        FILE *fd;
        !            75:        char *logtime, tbuf[50];
        !            76:        char buff[2*MAXCLEN];
        !            77:        int cmask;
        !            78: 
        !            79: /*     logtime = strcpy(tbuf, nows); */
        !            80:        strcpy(tbuf, nows);
        !            81:        logtime = tbuf;
        !            82:        logtime[16] = '\0';
        !            83:        logtime += 4;
        !            84: 
        !            85:        cmask = umask(0);
        !            86:        fd = fopen(LOG, "a"); /* Open for writing.  */
        !            87: /*     lseek(fd, 0L, 2); Seek to the end of file.  */
        !            88:        (void) umask(cmask);
        !            89: 
        !            90:        if (fd != -1) {
        !            91:                (void) fprintf(fd, "%s\tpid:%d\t%s\n",
        !            92:                        tbuf, getpid(), message);
        !            93:                fflush(fd);     
        !            94: /*             (void) write(fd, buff, strlen(buff)); */
        !            95:                (void) fclose(fd);
        !            96:        }
        !            97: }
        !            98: # endif
        !            99: 
        !           100: # ifdef RECORD
        !           101: FILE *
        !           102: record(command, from, size)
        !           103: char *command, *from;
        !           104: long size;
        !           105: {
        !           106:        FILE *fd;
        !           107:        char *logtime, buf[SMLBUF];
        !           108:        int cmask;
        !           109: 
        !           110:        logtime = strcpy(buf, nows);
        !           111:        logtime[16] = 0;
        !           112:        logtime += 4;
        !           113: 
        !           114:        cmask = umask(0);
        !           115:        fd = fopen(RECORD, "a");
        !           116:        (void) umask(cmask);
        !           117: 
        !           118:        if (fd != NULL) {
        !           119:                (void) fprintf(fd, "%s: %s, from %s, %ld bytes\n", 
        !           120:                        logtime, command, from, size);
        !           121:        }
        !           122:        while(fgets(buf, sizeof(buf), spoolfp) != NULL) {
        !           123:                (void) fputs(buf, fd);
        !           124:        }
        !           125:        (void) fclose(fd);
        !           126: }
        !           127: # endif
        !           128: 
        !           129: 
        !           130: setdates()
        !           131: {
        !           132:        time_t time();
        !           133:        struct tm *gmtime();
        !           134:        char *ctime(), *arpadate();
        !           135: 
        !           136:        (void) time(&now);
        !           137:        (void) strcpy(nows, ctime(&now));
        !           138:        gmt = gmtime(&now);
        !           139:        loc = localtime(&now);
        !           140: /*     (void) strcpy(arpanows, nows); */
        !           141:        (void) strcpy(arpanows, arpadate(nows)); 
        !           142: }
        !           143: 
        !           144: /*
        !           145: **  Note: This routine was taken from sendmail
        !           146: **
        !           147: **  ARPADATE -- Create date in ARPANET format
        !           148: **
        !           149: **     Parameters:
        !           150: **             ud -- unix style date string.  if NULL, one is created.
        !           151: **
        !           152: **     Returns:
        !           153: **             pointer to an ARPANET date field
        !           154: **
        !           155: **     Side Effects:
        !           156: **             none
        !           157: **
        !           158: **     WARNING:
        !           159: **             date is stored in a local buffer -- subsequent
        !           160: **             calls will overwrite.
        !           161: **
        !           162: **     Bugs:
        !           163: **             Timezone is computed from local time, rather than
        !           164: **             from whereever (and whenever) the message was sent.
        !           165: **             To do better is very hard.
        !           166: **
        !           167: **             Some sites are now inserting the timezone into the
        !           168: **             local date.  This routine should figure out what
        !           169: **             the format is and work appropriately.
        !           170: */
        !           171: 
        !           172: char *
        !           173: arpadate(ud)
        !           174:        register char *ud;
        !           175: {
        !           176:        char errmsg[70];
        !           177:        register char *p;
        !           178:        register char *q;
        !           179:        static char b[40];
        !           180:        extern char *ctime();
        !           181:        register int i;
        !           182: #ifndef BSD
        !           183:        extern char *tzname[];
        !           184:        time_t t, time();
        !           185: #else
        !           186:        /* V7 and 4BSD */
        !           187:        struct timeb t;
        !           188:        extern struct timeb *ftime();
        !           189:        extern char *timezone();
        !           190: #endif
        !           191: 
        !           192:        /*
        !           193:        **  Get current time.
        !           194:        **      This will be used if a null argument is passed and
        !           195:        **      to resolve the timezone.
        !           196:        */
        !           197: 
        !           198: #ifndef BSD
        !           199:        (void) time(&t);
        !           200:        if (ud == NULL)
        !           201:                ud = ctime(&t);
        !           202: #else
        !           203:        /* V7 or 4BSD */
        !           204:        ftime(&t);
        !           205:        if (ud == NULL)
        !           206:                ud = ctime(&t.time);
        !           207: #endif
        !           208: 
        !           209:        /*
        !           210:        **  Crack the UNIX date line in a singularly unoriginal way.
        !           211:        */
        !           212: 
        !           213:        q = b;
        !           214: 
        !           215:        p = &ud[8];             /* 16 */
        !           216:        if (*p == ' ')
        !           217:                p++;
        !           218:        else
        !           219:                *q++ = *p++;
        !           220:        *q++ = *p++;
        !           221:        *q++ = ' ';
        !           222: 
        !           223:        p = &ud[4];             /* Sep */
        !           224:        *q++ = *p++;
        !           225:        *q++ = *p++;
        !           226:        *q++ = *p++;
        !           227:        *q++ = ' ';
        !           228: 
        !           229:        p = &ud[22];            /* 1979 */
        !           230:        *q++ = *p++;
        !           231:        *q++ = *p++;
        !           232:        *q++ = ' ';
        !           233: 
        !           234:        p = &ud[11];            /* 01:03:52 */
        !           235:        for (i = 8; i > 0; i--)
        !           236:                *q++ = *p++;
        !           237: 
        !           238:                                /* -PST or -PDT */
        !           239: #ifndef BSD
        !           240:        p = tzname[localtime(&t)->tm_isdst]; 
        !           241: #else
        !           242:        p = timezone(t.timezone, localtime(&t.time)->tm_isdst);
        !           243: #endif
        !           244:        if (p[3] != '\0')
        !           245:        {
        !           246:                /* hours from GMT */
        !           247: /*
        !           248:  *             p += 3;
        !           249:  *             *q++ = *p++;
        !           250:  *             if (p[1] == ':')
        !           251:  *                     *q++ = '0';
        !           252:  *             else
        !           253:  *                     *q++ = *p++;
        !           254:  *             *q++ = *p++;
        !           255:  *             p++;             skip ``:'' 
        !           256:  *             *q++ = *p++;
        !           257:  *             *q++ = *p++;
        !           258:  */
        !           259: 
        !           260:        /* this short section of code replaces the above commented code. The
        !           261:         * reason for this is because the above code wasn't correctly parsing
        !           262:         * out the hours from GMT returned by the p=tzname... code above. The
        !           263:         * old code skipped the first 3 characters (example +0800), leaving
        !           264:         * only the last 2 characters to be added to the string we are building.
        !           265:         *
        !           266:         * The real question at this point should be 'is this the right format?'
        !           267:         * Sorry, no docs available at this time.
        !           268:         *
        !           269:         * bob h: 05/11/93.
        !           270:         */
        !           271:                *q++ = ' ';
        !           272:                do{
        !           273:                        *q++ = *p;
        !           274:                }
        !           275:                while(*p++!= '\0');
        !           276: 
        !           277:        }
        !           278:        else
        !           279:        {
        !           280:                *q++ = ' ';
        !           281:                *q++ = *p++;
        !           282:                *q++ = *p++;
        !           283:                *q++ = *p++;
        !           284:        }
        !           285: 
        !           286:        p = &ud[0];             /* Mon */
        !           287:        *q++ = ' ';
        !           288:        *q++ = '(';
        !           289:        *q++ = *p++;
        !           290:        *q++ = *p++;
        !           291:        *q++ = *p++;
        !           292:        *q++ = ')';
        !           293: 
        !           294:        *q = '\0';
        !           295:        return (b);
        !           296: }
        !           297: 
        !           298: /*
        !           299:  *     The user name "postmaster" must be accepted regardless of what
        !           300:  *     combination of upper and lower case is used.  This function is
        !           301:  *     used to convert all case variants of "postmaster" to all lower
        !           302:  *     case.  If the user name passed in is not "postmaster", it is
        !           303:  *     returned unchanged.
        !           304:  */
        !           305: char *
        !           306: postmaster(user)
        !           307: char *user;
        !           308: {
        !           309:        static char *pm = "postmaster";
        !           310: 
        !           311:        if(strcmpic(user, pm) == 0) {
        !           312:                return(pm);
        !           313:        } else {
        !           314:                return(user);
        !           315:        }
        !           316: }
        !           317: 
        !           318: /*
        !           319:  * Return 1 iff the string is "UUCP" (ignore case).
        !           320:  */
        !           321: isuucp(str)
        !           322: char *str;
        !           323: {
        !           324:        if(strcmpic(str, "UUCP") == 0) {
        !           325:                return(1);
        !           326:        } else {
        !           327:                return(0);
        !           328:        }
        !           329: }
        !           330: 
        !           331: /*
        !           332: ** sform(form) returns a pointer to a string that tells what 'form' means
        !           333: */
        !           334: 
        !           335: char *
        !           336: sform(form)
        !           337: enum eform form;
        !           338: {
        !           339:        if(form == ERROR)  return("ERROR");
        !           340:        if(form == LOCAL)  return("LOCAL");
        !           341:        if(form == DOMAIN) return("DOMAIN");
        !           342:        if(form == UUCP)   return("UUCP");
        !           343:        if(form == ROUTE)  return("ROUTE");
        !           344:        return("UNKNOWN");
        !           345: }
        !           346: 
        !           347: /*
        !           348: **
        !           349: **  getmynames(): what is my host name and host domain?
        !           350: **
        !           351: **  Hostname set by -h, failing that by #define HOSTNAME, failing
        !           352: **  that by gethostname() or uname().
        !           353: **  
        !           354: **  Hostdomain set by -h, failing that by #define HOSTDOMAIN,
        !           355: **  failing that as hostname.MYDOM, or as just hostname.
        !           356: **
        !           357: **  See defs.h for the inside story.
        !           358: **
        !           359: */
        !           360: 
        !           361: getmynames()
        !           362: {
        !           363: #ifdef HOSTNAME
        !           364:        if (!*hostname)
        !           365:                (void) strcpy(hostname, HOSTNAME);
        !           366: #endif
        !           367: #ifdef GETHOSTNAME
        !           368:        if (!*hostname)
        !           369:                gethostname(hostname, SMLBUF - 1);
        !           370: #endif
        !           371: #ifdef UNAME
        !           372:        if (!*hostname) {
        !           373:                struct utsname site;
        !           374: 
        !           375:                if (uname(&site) < 0)
        !           376:                        error(EX_SOFTWARE, "uname() call failed", 0);
        !           377:                (void) strcpy(hostname, site.nodename);
        !           378:        }
        !           379: #endif
        !           380:        if (!*hostname)
        !           381:                error(EX_SOFTWARE, "can't determine hostname.\n", 0);
        !           382: #ifdef HOSTDOMAIN
        !           383:        if (!*hostdomain)
        !           384:                (void) strcpy(hostdomain, HOSTDOMAIN);
        !           385: #endif
        !           386: #ifdef MYDOM
        !           387:        if (!*hostdomain)
        !           388:                (void) strcat(strcpy(hostdomain, hostname), MYDOM);
        !           389: #endif
        !           390: #ifdef GETDOMAIN
        !           391:        if (!*hostdomain){
        !           392:                unsigned char temp[SMLBUF];
        !           393: 
        !           394:                getdomain(temp, SMLBUF - 1);
        !           395:                (void) strcat(strcpy(hostdomain, hostname), ".");
        !           396:                (void) strcat(hostdomain, temp);
        !           397:        }
        !           398: #endif
        !           399:        if (!*hostdomain)
        !           400:                (void) strcpy(hostdomain, hostname);
        !           401: 
        !           402:        (void) strcat(strcpy(hostuucp, hostname), ".UUCP");
        !           403: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.