1: /*
   2:  * Copyright (c) 1983 Eric P. Allman
   3:  * Copyright (c) 1988, 1993
   4:  *	The Regents of the University of California.  All rights reserved.
   5:  *
   6:  * Redistribution and use in source and binary forms, with or without
   7:  * modification, are permitted provided that the following conditions
   8:  * are met:
   9:  * 1. Redistributions of source code must retain the above copyright
  10:  *    notice, this list of conditions and the following disclaimer.
  11:  * 2. Redistributions in binary form must reproduce the above copyright
  12:  *    notice, this list of conditions and the following disclaimer in the
  13:  *    documentation and/or other materials provided with the distribution.
  14:  * 3. All advertising materials mentioning features or use of this software
  15:  *    must display the following acknowledgement:
  16:  *	This product includes software developed by the University of
  17:  *	California, Berkeley and its contributors.
  18:  * 4. Neither the name of the University nor the names of its contributors
  19:  *    may be used to endorse or promote products derived from this software
  20:  *    without specific prior written permission.
  21:  *
  22:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32:  * SUCH DAMAGE.
  33:  */
  34: 
  35: #if !defined(lint) && !defined(NOSCCS)
  36: static char sccsid[] = "@(#)arpadate.c	8.1.2 (2.11BSD GTE) 1997/10/3";
  37: #endif
  38: 
  39: #include "sendmail.h"
  40: 
  41: /*
  42: **  ARPADATE -- Create date in ARPANET format
  43: **
  44: **	Parameters:
  45: **		ud -- unix style date string.  if NULL, one is created.
  46: **
  47: **	Returns:
  48: **		pointer to an ARPANET date field
  49: **
  50: **	Side Effects:
  51: **		none
  52: **
  53: **	WARNING:
  54: **		date is stored in a local buffer -- subsequent
  55: **		calls will overwrite.
  56: **
  57: **	Bugs:
  58: **		Timezone is computed from local time, rather than
  59: **		from whereever (and whenever) the message was sent.
  60: **		To do better is very hard.
  61: **
  62: **		Some sites are now inserting the timezone into the
  63: **		local date.  This routine should figure out what
  64: **		the format is and work appropriately.
  65: */
  66: 
  67: char *
  68: arpadate(ud)
  69:     char *ud;
  70: {
  71:     register char *p;
  72:     register char *q;
  73:     int off;
  74:     int i;
  75:     register struct tm *lt;
  76:     time_t t;
  77:     struct tm gmt;
  78:     static char b[40];
  79: 
  80:     /*
  81: 	**  Get current time.
  82: 	**	This will be used if a null argument is passed and
  83: 	**	to resolve the timezone.
  84: 	*/
  85: 
  86:     (void) time(&t);
  87:     if (ud == NULL)
  88:         ud = ctime(&t);
  89: 
  90:     /*
  91: 	**  Crack the UNIX date line in a singularly unoriginal way.
  92: 	*/
  93: 
  94:     q = b;
  95: 
  96:     p = &ud[0];     /* Mon */
  97:     *q++ = *p++;
  98:     *q++ = *p++;
  99:     *q++ = *p++;
 100:     *q++ = ',';
 101:     *q++ = ' ';
 102: 
 103:     p = &ud[8];     /* 16 */
 104:     if (*p == ' ')
 105:         p++;
 106:     else
 107:         *q++ = *p++;
 108:     *q++ = *p++;
 109:     *q++ = ' ';
 110: 
 111:     p = &ud[4];     /* Sep */
 112:     *q++ = *p++;
 113:     *q++ = *p++;
 114:     *q++ = *p++;
 115:     *q++ = ' ';
 116: 
 117:     p = &ud[20];        /* 1979 */
 118:     *q++ = *p++;
 119:     *q++ = *p++;
 120:     *q++ = *p++;
 121:     *q++ = *p++;
 122:     *q++ = ' ';
 123: 
 124:     p = &ud[11];        /* 01:03:52 */
 125:     for (i = 8; i > 0; i--)
 126:         *q++ = *p++;
 127: 
 128:     /*
 129: 	 * should really get the timezone from the time in "ud" (which
 130: 	 * is only different if a non-null arg was passed which is different
 131: 	 * from the current time), but for all practical purposes, returning
 132: 	 * the current local zone will do (its all that is ever needed).
 133: 	 */
 134:     gmt = *gmtime(&t);
 135:     lt = localtime(&t);
 136: 
 137:     off = (lt->tm_hour - gmt.tm_hour) * 60 + lt->tm_min - gmt.tm_min;
 138: 
 139:     /* assume that offset isn't more than a day ... */
 140:     if (lt->tm_year < gmt.tm_year)
 141:         off -= 24 * 60;
 142:     else if (lt->tm_year > gmt.tm_year)
 143:         off += 24 * 60;
 144:     else if (lt->tm_yday < gmt.tm_yday)
 145:         off -= 24 * 60;
 146:     else if (lt->tm_yday > gmt.tm_yday)
 147:         off += 24 * 60;
 148: 
 149:     *q++ = ' ';
 150:     if (off == 0) {
 151:         *q++ = 'G';
 152:         *q++ = 'M';
 153:         *q++ = 'T';
 154:     } else {
 155:         if (off < 0) {
 156:             off = -off;
 157:             *q++ = '-';
 158:         } else
 159:             *q++ = '+';
 160: 
 161:         if (off >= 24*60)       /* should be impossible */
 162:             off = 23*60+59;     /* if not, insert silly value */
 163: 
 164:         *q++ = (off / 600) + '0';
 165:         *q++ = (off / 60) % 10 + '0';
 166:         off %= 60;
 167:         *q++ = (off / 10) + '0';
 168:         *q++ = (off % 10) + '0';
 169:     }
 170:     *q = '\0';
 171: 
 172:     return (b);
 173: }
Last modified: 1997-10-03
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2519
Valid CSS Valid XHTML 1.0 Strict