home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / sendmail / sendmail-5.65c+IDA-1.4.4.1 / src / RCS / arpadate.c,v < prev    next >
Encoding:
Text File  |  1991-06-27  |  13.9 KB  |  763 lines

  1. head    5.11;
  2. branch    5.11.0;
  3. access;
  4. symbols
  5.     RELEASE:5.11.0.9
  6.     BETA:5.11.0.7
  7.     UICSO:5.11.0
  8.     VANILLA:5.11;
  9. locks; strict;
  10. comment    @ * @;
  11.  
  12.  
  13. 5.11
  14. date    90.06.20.08.35.19;    author paul;    state Exp;
  15. branches
  16.     5.11.0.1;
  17. next    ;
  18.  
  19. 5.11.0.1
  20. date    91.03.29.23.26.44;    author paul;    state Exp;
  21. branches;
  22. next    5.11.0.2;
  23.  
  24. 5.11.0.2
  25. date    91.04.05.14.55.15;    author paul;    state Exp;
  26. branches;
  27. next    5.11.0.3;
  28.  
  29. 5.11.0.3
  30. date    91.05.18.03.42.00;    author paul;    state Exp;
  31. branches;
  32. next    5.11.0.4;
  33.  
  34. 5.11.0.4
  35. date    91.05.23.21.17.00;    author paul;    state Exp;
  36. branches;
  37. next    5.11.0.5;
  38.  
  39. 5.11.0.5
  40. date    91.05.29.19.33.41;    author paul;    state Exp;
  41. branches;
  42. next    5.11.0.6;
  43.  
  44. 5.11.0.6
  45. date    91.06.02.01.54.40;    author paul;    state Exp;
  46. branches;
  47. next    5.11.0.7;
  48.  
  49. 5.11.0.7
  50. date    91.06.02.17.58.30;    author paul;    state Exp;
  51. branches;
  52. next    5.11.0.8;
  53.  
  54. 5.11.0.8
  55. date    91.06.21.12.35.39;    author paul;    state Exp;
  56. branches;
  57. next    5.11.0.9;
  58.  
  59. 5.11.0.9
  60. date    91.06.27.04.42.05;    author paul;    state Exp;
  61. branches;
  62. next    5.11.0.10;
  63.  
  64. 5.11.0.10
  65. date    91.06.28.05.52.38;    author paul;    state Exp;
  66. branches;
  67. next    ;
  68.  
  69.  
  70. desc
  71. @@
  72.  
  73.  
  74. 5.11
  75. log
  76. @5.64 Berkeley release
  77. @
  78. text
  79. @/*
  80.  * Copyright (c) 1983 Eric P. Allman
  81.  * Copyright (c) 1988 Regents of the University of California.
  82.  * All rights reserved.
  83.  *
  84.  * Redistribution and use in source and binary forms are permitted provided
  85.  * that: (1) source distributions retain this entire copyright notice and
  86.  * comment, and (2) distributions including binaries display the following
  87.  * acknowledgement:  ``This product includes software developed by the
  88.  * University of California, Berkeley and its contributors'' in the
  89.  * documentation or other materials provided with the distribution and in
  90.  * all advertising materials mentioning features or use of this software.
  91.  * Neither the name of the University nor the names of its contributors may
  92.  * be used to endorse or promote products derived from this software without
  93.  * specific prior written permission.
  94.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  95.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  96.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  97.  */
  98.  
  99. #ifndef lint
  100. static char sccsid[] = "@@(#)arpadate.c    5.11 (Berkeley) 6/1/90";
  101. #endif /* not lint */
  102.  
  103. # include "conf.h"
  104. # include <time.h>
  105. # include <sys/types.h>
  106. # include "useful.h"
  107.  
  108. /*
  109. **  ARPADATE -- Create date in ARPANET format
  110. **
  111. **    Parameters:
  112. **        ud -- unix style date string.  if NULL, one is created.
  113. **
  114. **    Returns:
  115. **        pointer to an ARPANET date field
  116. **
  117. **    Side Effects:
  118. **        none
  119. **
  120. **    WARNING:
  121. **        date is stored in a local buffer -- subsequent
  122. **        calls will overwrite.
  123. **
  124. **    Bugs:
  125. **        Timezone is computed from local time, rather than
  126. **        from whereever (and whenever) the message was sent.
  127. **        To do better is very hard.
  128. **
  129. **        Some sites are now inserting the timezone into the
  130. **        local date.  This routine should figure out what
  131. **        the format is and work appropriately.
  132. */
  133.  
  134. char *
  135. arpadate(ud)
  136.     register char *ud;
  137. {
  138.     register char *p;
  139.     register char *q;
  140.     register int off;
  141.     register int i;
  142.     register struct tm *lt;
  143.     time_t t;
  144.     struct tm gmt;
  145.     static char b[40];
  146.     extern struct tm *localtime(), *gmtime();
  147.     extern char *ctime();
  148.     extern time_t time();
  149.  
  150.     /*
  151.     **  Get current time.
  152.     **    This will be used if a null argument is passed and
  153.     **    to resolve the timezone.
  154.     */
  155.  
  156.     (void) time(&t);
  157.     if (ud == NULL)
  158.         ud = ctime(&t);
  159.  
  160.     /*
  161.     **  Crack the UNIX date line in a singularly unoriginal way.
  162.     */
  163.  
  164.     q = b;
  165.  
  166.     p = &ud[0];        /* Mon */
  167.     *q++ = *p++;
  168.     *q++ = *p++;
  169.     *q++ = *p++;
  170.     *q++ = ',';
  171.     *q++ = ' ';
  172.  
  173.     p = &ud[8];        /* 16 */
  174.     if (*p == ' ')
  175.         p++;
  176.     else
  177.         *q++ = *p++;
  178.     *q++ = *p++;
  179.     *q++ = ' ';
  180.  
  181.     p = &ud[4];        /* Sep */
  182.     *q++ = *p++;
  183.     *q++ = *p++;
  184.     *q++ = *p++;
  185.     *q++ = ' ';
  186.  
  187.     p = &ud[22];        /* 79 */
  188.     *q++ = *p++;
  189.     *q++ = *p++;
  190.     *q++ = ' ';
  191.  
  192.     p = &ud[11];        /* 01:03:52 */
  193.     for (i = 8; i > 0; i--)
  194.         *q++ = *p++;
  195.  
  196.     /*
  197.      * should really get the timezone from the time in "ud" (which
  198.      * is only different if a non-null arg was passed which is different
  199.      * from the current time), but for all practical purposes, returning
  200.      * the current local zone will do (its all that is ever needed).
  201.      */
  202.     gmt = *gmtime(&t);
  203.     lt = localtime(&t);
  204.  
  205.     off = (lt->tm_hour - gmt.tm_hour) * 60 + lt->tm_min - gmt.tm_min;
  206.  
  207.     /* assume that offset isn't more than a day ... */
  208.     if (lt->tm_year < gmt.tm_year)
  209.         off -= 24 * 60;
  210.     else if (lt->tm_year > gmt.tm_year)
  211.         off += 24 * 60;
  212.     else if (lt->tm_yday < gmt.tm_yday)
  213.         off -= 24 * 60;
  214.     else if (lt->tm_yday > gmt.tm_yday)
  215.         off += 24 * 60;
  216.  
  217.     *q++ = ' ';
  218.     if (off == 0) {
  219.         *q++ = 'G';
  220.         *q++ = 'M';
  221.         *q++ = 'T';
  222.     } else {
  223.         if (off < 0) {
  224.             off = -off;
  225.             *q++ = '-';
  226.         } else
  227.             *q++ = '+';
  228.  
  229.         if (off >= 24*60)        /* should be impossible */
  230.             off = 23*60+59;        /* if not, insert silly value */
  231.  
  232.         *q++ = (off / 600) + '0';
  233.         *q++ = (off / 60) % 10 + '0';
  234.         off %= 60;
  235.         *q++ = (off / 10) + '0';
  236.         *q++ = (off % 10) + '0';
  237.     }
  238.     *q = '\0';
  239.  
  240.     return (b);
  241. }
  242. @
  243.  
  244.  
  245. 5.11.0.1
  246. log
  247. @ANSIfied.
  248. @
  249. text
  250. @d68 3
  251. @
  252.  
  253.  
  254. 5.11.0.2
  255. log
  256. @Added RCS ID string
  257. @
  258. text
  259. @a22 1
  260. static char rcsid[] = "@@(#)$Id$";
  261. @
  262.  
  263.  
  264. 5.11.0.3
  265. log
  266. @*** empty log message ***
  267. @
  268. text
  269. @d22 2
  270. a23 2
  271. static char sccsid[] = "@@(#)arpadate.c    5.11 (Berkeley) 6/1/90    %I% local";
  272. static char rcsid[] = "@@(#)$Id: arpadate.c,v 5.11.0.2 1991/04/05 14:55:15 paul Exp paul $";
  273. d26 4
  274. a29 2
  275. #include <time.h>
  276. #include "sendmail.h"
  277. d66 1
  278. a66 1
  279.     TIME_TYPE t;
  280. d138 1
  281. a138 2
  282.     if (off == 0)
  283.     {
  284. d142 2
  285. a143 5
  286.     }
  287.     else
  288.     {
  289.         if (off < 0)
  290.         {
  291. d146 1
  292. a146 2
  293.         }
  294.         else
  295. @
  296.  
  297.  
  298. 5.11.0.4
  299. log
  300. @time.h now included in sendmail.h
  301. @
  302. text
  303. @d23 1
  304. a23 1
  305. static char rcsid[] = "@@(#)$Id: arpadate.c,v 5.11.0.3 1991/05/18 03:42:00 paul Exp paul $";
  306. d26 1
  307. @
  308.  
  309.  
  310. 5.11.0.5
  311. log
  312. @Bruce Lilly contributed arpatounix() that converts RFC-822/1123 date-time
  313. fields to UNIX ctime format.  Also changes to use 4 digit years.
  314. @
  315. text
  316. @d23 1
  317. a23 1
  318. static char rcsid[] = "@@(#)$Id: arpadate.c,v 5.11.0.4 1991/05/23 21:17:00 paul Exp paul $";
  319. d65 1
  320. a65 1
  321.     static char b[42];
  322. d104 1
  323. a104 1
  324.     p = &ud[20];        /* 1979 */
  325. a106 2
  326.     *q++ = *p++;
  327.     *q++ = *p++;
  328. d162 1
  329. a162 317
  330.     return(b);
  331. }
  332. /*
  333. **  NEXTATOM -- Return pointer to next atom in header
  334. **        (skip whitespace and comments)
  335. **
  336. **    Parameters:
  337. **        s -- pointer to header string
  338. **
  339. **    Returns:
  340. **        pointer advanced to next non-comment header atom
  341. **
  342. **    Side Effects:
  343. **        none
  344. */
  345.  
  346. static char *
  347. nextatom(s)
  348.     char *s;
  349. {
  350.     char *p;
  351.  
  352.     for (p = s; *p && (*p == ' ' || *p == '\t' || *p == '('); p++)
  353.     {
  354.         if (*p == '(')
  355.         {
  356.             /* ignore comments */
  357.             p++;
  358.             for (; *p; p++)
  359.             {
  360.                 int nested = 0;
  361.  
  362.                 if (*p == '(')
  363.                     nested++;
  364.                 else if (*p == ')')
  365.                     if (!nested)
  366.                         break;
  367.                     else
  368.                         nested--;
  369.             }
  370.         }
  371.     }
  372.     return (p);
  373. }
  374.  
  375. /*
  376. **  ARPATOUNIX -- Convert RFC-822/1123 date-time specification to
  377. **        UNIX(R) ctime format.
  378. **
  379. **    Parameters:
  380. **        s -- pointer to date string
  381. **        e -- pointer to envelope associated with date
  382. **
  383. **    Returns:
  384. **        pointer to a string in ctime format
  385. **
  386. **    Side Effects:
  387. **        Calls asctime() which modifies its static area.
  388. */
  389.  
  390. /*
  391. ** date-time field specification from RFC822 as amended by RFC 1123:
  392. **
  393. **
  394. ** [ day "," ] 1*2DIGIT month 2*4DIGIT 2DIGIT ":" 2DIGIT [ ":" 2DIGIT  ] zone
  395. **         date        year    hours      minutes      seconds
  396. **
  397. ** day can be "Mon" "Tue" "Wed" "Thu" "Fri" "Sat" "Sun" (case-insensitive)
  398. **
  399. ** month can be "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct"
  400. ** "Nov" "Dec" (also case-insensitive)
  401. **
  402. ** zone can be "UT" "GMT" "EST" "EDT" "CST" "CDT" "MST" "MDT" "PST" "PDT"
  403. ** or "+"4*DIGIT or "-"4*DIGIT (case-insensitive; military zones not useful
  404. ** per RFC1123)
  405. **
  406. ** Additional whitespace or comments may occur.
  407. */
  408.  
  409. static char MonthDays[] = {
  410.     31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
  411. };
  412.  
  413. char *
  414. arpatounix(s, e)
  415.     char    *s;
  416.     ENVELOPE *e;
  417. {
  418.     struct tm tm;
  419.     char    *p;
  420.     int    h_offset = 0;        /* hours */
  421.     int    m_offset = 0;        /* minutes */
  422.     extern char *DowList[];        /* defined in collect.c */
  423.     extern char *MonthList[];    /* defined in collect.c */
  424.  
  425.     tm.tm_wday = -1;    /* impossible value */
  426.     p = nextatom (s);
  427.  
  428.     /* next atom must be a day or a date */
  429.     if (isalpha((int) *p))
  430.     {
  431.         /* day */
  432.         for (tm.tm_wday = 0; DowList[tm.tm_wday]; tm.tm_wday++)
  433.             if (strncasecmp (p, DowList[tm.tm_wday], 3))
  434.                 continue;
  435.             else
  436.             {
  437.                 p += 3;
  438.                 break;
  439.             }
  440.         p = nextatom(p);        /* ',' */
  441.         if (*p == ',')
  442.             p = nextatom(++p);
  443.     }
  444.  
  445.     /* now must have date */
  446.     tm.tm_mday = atoi(p);
  447.     while (isdigit((int) *p))        /* skip over date */
  448.         p++;
  449.     p = nextatom(p);            /* point to month name */
  450.     for (tm.tm_mon = 0; MonthList[tm.tm_mon]; tm.tm_mon++)
  451.         if (strncasecmp(p, MonthList[tm.tm_mon], 3))
  452.             continue;
  453.         else {
  454.             p += 3;
  455.             break;
  456.         }
  457.     p = nextatom(p);            /* year */
  458.     tm.tm_year = atoi(p);
  459.  
  460.     /* if this was 4 digits, subtract 1900 */
  461.     if (tm.tm_year > 999)
  462.         tm.tm_year -= 1900;
  463.     else
  464.     {
  465.         /* if 2 or 3 digits, guess which century and convert */
  466.         TIME_TYPE now;
  467.         struct tm *gmt;
  468.  
  469.         (void) time(&now);
  470.         gmt = gmtime(&now);
  471.  
  472.         /* more likely +1 day than -100(0) years */
  473.         if (gmt->tm_mon == 11 && gmt->tm_mday == 31 &&
  474.             tm.tm_mon == 0 && tm.tm_mday == 1)
  475.             gmt->tm_year++;
  476.         if (tm.tm_year > 99)
  477.         {
  478.             /* 3 digits */
  479.             tm.tm_year += ((gmt->tm_year + 900 - tm.tm_year) / 1000) * 1000;
  480.         }
  481.         else
  482.         {
  483.             /* 2 digits */
  484.             tm.tm_year += ((gmt->tm_year - tm.tm_year) / 100) * 100;
  485.         }
  486.     }
  487.     while (isdigit((int) *p))    /* skip over year */
  488.         p++;
  489.     p = nextatom(p);        /* hours */
  490.     tm.tm_hour = atoi(p);
  491.     while (isdigit((int) *p))    /* skip over hours */
  492.         p++;
  493.     p = nextatom(p);        /* colon */
  494.     if (*p == ':')
  495.         p = nextatom(++p);
  496.     p = nextatom(p);        /* minutes */
  497.     tm.tm_min = atoi(p);
  498.     while (isdigit((int) *p))    /* skip over minutes */
  499.         p++;
  500.     p = nextatom(p);        /* colon or zone */
  501.     if (*p == ':')            /* have seconds field */
  502.     {
  503.         p = nextatom(++p);
  504.         tm.tm_sec = atoi(p);
  505.         while (isdigit((int) *p))    /* skip over seconds */
  506.             p++;
  507.     }
  508.     p = nextatom(p);        /* zone */
  509.     if (!strncasecmp(p, "UT", 2) || !strncasecmp(p, "GMT", 3))
  510.         ;
  511.     else if (!strncasecmp(p, "EDT", 3))
  512.         h_offset = -4;
  513.     else if (!strncasecmp(p, "EST", 3))
  514.     {
  515.         h_offset = -5;
  516.         tm.tm_isdst = 1;
  517.     }
  518.     else if (!strncasecmp(p, "CDT", 3))
  519.         h_offset = -5;
  520.     else if (!strncasecmp(p, "CST", 3))
  521.     {
  522.         h_offset = -6;
  523.         tm.tm_isdst = 1;
  524.     }
  525.     else if (!strncasecmp(p, "MDT", 3))
  526.         h_offset = -6;
  527.     else if (!strncasecmp(p, "MST", 3))
  528.     {
  529.         h_offset = -7;
  530.         tm.tm_isdst = 1;
  531.     }
  532.     else if (!strncasecmp(p, "PDT", 3))
  533.         h_offset = -7;
  534.     else if (!strncasecmp(p, "PST", 3))
  535.     {
  536.         h_offset = -8;
  537.         tm.tm_isdst = 1;
  538.     }
  539.     else if (*p == '+')
  540.     {
  541.         int off;
  542.  
  543.         off = atoi(++p);
  544.         h_offset = off / 100;
  545.         m_offset = off % 100;
  546.     }
  547.     else if (*p == '-')
  548.     {
  549.         int off;
  550.  
  551.         off = atoi(++p);
  552.         h_offset = off / -100;
  553.         m_offset = -1 * (off % 100);
  554.     }
  555.     else
  556.     {
  557. #ifdef LOG
  558.         syslog(LOG_NOTICE, "%s: arpatounix: unparseable date: %s\n",
  559.             e->e_id, s);
  560.         return(NULL);
  561. #endif /* LOG */
  562.     }
  563.  
  564.     /* is the year a leap year? */
  565.     if ((tm.tm_year % 4 == 0) &&
  566.         ((tm.tm_year % 100 != 0) || (tm.tm_year % 400 == 0)))
  567.         MonthDays[2] = 29;
  568.     else
  569.         MonthDays[2] = 28;
  570.  
  571.     /* apply offset */
  572.     if (h_offset || m_offset)
  573.     {
  574.         tm.tm_min += m_offset;
  575.         tm.tm_hour += h_offset;
  576.  
  577.         /* normalize */
  578.         if (tm.tm_min < 0)
  579.         {
  580.             tm.tm_hour--;
  581.             tm.tm_min += 60;
  582.         }
  583.         else if (tm.tm_min > 59)
  584.         {
  585.             tm.tm_hour++;
  586.             tm.tm_min -= 60;
  587.         }
  588.         if (tm.tm_hour < 0)
  589.         {
  590.             tm.tm_mday--;
  591.             tm.tm_wday--;
  592.             tm.tm_hour += 24;
  593.         }
  594.         else if (tm.tm_hour > 23)
  595.         {
  596.             tm.tm_mday++;
  597.             tm.tm_wday++;
  598.             tm.tm_hour -= 24;
  599.         }
  600.         if (tm.tm_mday < 1)
  601.         {
  602.             if (--tm.tm_mon == -1)
  603.             {
  604.                 tm.tm_mon = 11;
  605.                 tm.tm_year--;
  606.  
  607.                 /* is the year a leap year? */
  608.                 if ((tm.tm_year % 4 == 0) &&
  609.                     ((tm.tm_year % 100 != 0) || (tm.tm_year % 400 == 0)))
  610.                     MonthDays[2] = 29;
  611.                 else
  612.                     MonthDays[2] = 28;
  613.             }
  614.             tm.tm_mday += MonthDays[tm.tm_mon];
  615.         }
  616.         else if (tm.tm_mday > MonthDays[tm.tm_mon])
  617.         {
  618.             tm.tm_mday -= MonthDays[tm.tm_mon++];
  619.             if (tm.tm_mon > 11)
  620.             {
  621.                 tm.tm_mon = 0;
  622.                 tm.tm_year++;
  623.  
  624.                 /*
  625.                 * Don't have to worry about leap years in
  626.                 * January.
  627.                 */
  628.             }
  629.         }
  630.     }
  631.  
  632.     /* determine day of week if not set from RFC822/1123 line */
  633.     if (tm.tm_wday < 0)
  634.     {
  635.         int i;
  636.  
  637.         for (i = 0; i < tm.tm_mon; i++)
  638.             tm.tm_yday += MonthDays[i];
  639.         tm.tm_yday += tm.tm_mday;
  640.  
  641.         /* I wouldn't change these constants if I were you... */
  642.         tm.tm_wday = (int) (((((tm.tm_year + 699L) * 146097L) / 400L) + tm.tm_yday) % 7);
  643.     }
  644.  
  645.     /* now get UT */
  646.     return(asctime(&tm));
  647. @
  648.  
  649.  
  650. 5.11.0.6
  651. log
  652. @Moved declaration of nested above loop that uses it.
  653. @
  654. text
  655. @d23 1
  656. a23 1
  657. static char rcsid[] = "@@(#)$Id: arpadate.c,v 5.11.0.5 1991/05/29 19:33:41 paul Exp paul $";
  658. a189 2
  659.             int nested = 0;
  660.  
  661. d194 2
  662. @
  663.  
  664.  
  665. 5.11.0.7
  666. log
  667. @Added checks.
  668. @
  669. text
  670. @d23 1
  671. a23 1
  672. static char rcsid[] = "@@(#)$Id: arpadate.c,v 5.11.0.6 1991/06/02 01:54:40 paul Exp paul $";
  673. d186 1
  674. a186 3
  675.     for (p = s;
  676.          *p && (*p == ' ' || *p == '\t' || *p == '\n' || *p == '(');
  677.          p++)
  678. d392 1
  679. a392 1
  680.         syslog(LOG_NOTICE, "%s: arpatounix: unparseable date: %s",
  681. d394 1
  682. a395 1
  683.         return(NULL);
  684. d480 1
  685. a480 9
  686.     if ((p = asctime(&tm)) == NULL || *p == '\0')
  687.     {
  688. #ifdef LOG
  689.         syslog(LOG_NOTICE, "%s: arpatounix: asctime failed: %s",
  690.             e->e_id, s);
  691. #endif /* LOG */
  692.         return(NULL);
  693.     }
  694.     return(p);
  695. @
  696.  
  697.  
  698. 5.11.0.8
  699. log
  700. @Handle more date formats.
  701. @
  702. text
  703. @d22 2
  704. a23 2
  705. static char sccsid[] = "@@(#)arpadate.c    5.11 (Berkeley) 6/1/90";
  706. static char rcsid[] = "@@(#)$Id: arpadate.c,v 5.11.0.7 1991/06/02 17:58:30 paul Exp paul $";
  707. d61 1
  708. d104 1
  709. a104 3
  710.     p = &ud[20];        /* 1979  or _1979 */
  711.     if (*p == ' ')
  712.         p++;
  713. d111 2
  714. a112 10
  715.     p = &ud[11];        /* 01:03:52 or 01:03 EST */
  716.     *q++ = *p++;
  717.     *q++ = *p++;
  718.     *q++ = *p++;
  719.     *q++ = *p++;
  720.     *q++ = *p++;
  721.     if (*p == ':')
  722.     {
  723.         *q++ = *p++;
  724.         *q++ = *p++;
  725. a113 1
  726.     }
  727. @
  728.  
  729.  
  730. 5.11.0.9
  731. log
  732. @more bullet-proofing.
  733. @
  734. text
  735. @d23 1
  736. a23 1
  737. static char rcsid[] = "@@(#)$Id: arpadate.c,v 5.11.0.12 1991/06/27 04:17:00 paul Exp paul $";
  738. a270 1
  739.     bzero((char *) &tm, sizeof tm);
  740. a302 5
  741.  
  742.     /* skip over months that are spelled out, e.g., June */
  743.     while (*p && isalpha(*p))
  744.         p++;
  745.  
  746. d492 1
  747. a492 1
  748.     if ((p = asctime(&tm)) == NULL || *p == '\0' || strlen(p) < 25)
  749. @
  750.  
  751.  
  752. 5.11.0.10
  753. log
  754. @Though Shalt Not try to fix strange times not blessed by RFC 1123.
  755. (Thanks, Bruce, I needed that).
  756. @
  757. text
  758. @d23 1
  759. a23 1
  760. static char rcsid[] = "@@(#)$Id: arpadate.c,v 5.11.0.9 1991/06/27 04:42:05 paul Exp paul $";
  761. d304 4
  762. @
  763.