arpadate.c
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:4k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
  3.  * All rights reserved.
  4.  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
  5.  * Copyright (c) 1988, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * By using this file, you agree to the terms and conditions set
  9.  * forth in the LICENSE file which can be found at the top level of
  10.  * the sendmail distribution.
  11.  *
  12.  */
  13. #ifndef lint
  14. static char id[] = "@(#)$Id: arpadate.c,v 8.23 1999/09/23 19:59:18 ca Exp $";
  15. #endif /* ! lint */
  16. #include <sendmail.h>
  17. /*
  18. **  ARPADATE -- Create date in ARPANET format
  19. **
  20. ** Parameters:
  21. ** ud -- unix style date string.  if NULL, one is created.
  22. **
  23. ** Returns:
  24. ** pointer to an ARPANET date field
  25. **
  26. ** Side Effects:
  27. ** none
  28. **
  29. ** WARNING:
  30. ** date is stored in a local buffer -- subsequent
  31. ** calls will overwrite.
  32. **
  33. ** Bugs:
  34. ** Timezone is computed from local time, rather than
  35. ** from wherever (and whenever) the message was sent.
  36. ** To do better is very hard.
  37. **
  38. ** Some sites are now inserting the timezone into the
  39. ** local date.  This routine should figure out what
  40. ** the format is and work appropriately.
  41. */
  42. #ifndef TZNAME_MAX
  43. # define TZNAME_MAX 50 /* max size of timezone */
  44. #endif /* ! TZNAME_MAX */
  45. /* values for TZ_TYPE */
  46. #define TZ_NONE 0 /* no character timezone support */
  47. #define TZ_TM_NAME 1 /* use tm->tm_name */
  48. #define TZ_TM_ZONE 2 /* use tm->tm_zone */
  49. #define TZ_TZNAME 3 /* use tzname[] */
  50. #define TZ_TIMEZONE 4 /* use timezone() */
  51. char *
  52. arpadate(ud)
  53. register char *ud;
  54. {
  55. register char *p;
  56. register char *q;
  57. register int off;
  58. register int i;
  59. register struct tm *lt;
  60. time_t t;
  61. struct tm gmt;
  62. char *tz;
  63. static char b[43 + TZNAME_MAX];
  64. /*
  65. **  Get current time.
  66. ** This will be used if a null argument is passed and
  67. ** to resolve the timezone.
  68. */
  69. t = curtime();
  70. if (ud == NULL)
  71. ud = ctime(&t);
  72. /*
  73. **  Crack the UNIX date line in a singularly unoriginal way.
  74. */
  75. q = b;
  76. p = &ud[0]; /* Mon */
  77. *q++ = *p++;
  78. *q++ = *p++;
  79. *q++ = *p++;
  80. *q++ = ',';
  81. *q++ = ' ';
  82. p = &ud[8]; /* 16 */
  83. if (*p == ' ')
  84. p++;
  85. else
  86. *q++ = *p++;
  87. *q++ = *p++;
  88. *q++ = ' ';
  89. p = &ud[4]; /* Sep */
  90. *q++ = *p++;
  91. *q++ = *p++;
  92. *q++ = *p++;
  93. *q++ = ' ';
  94. p = &ud[20]; /* 1979 */
  95. *q++ = *p++;
  96. *q++ = *p++;
  97. *q++ = *p++;
  98. *q++ = *p++;
  99. *q++ = ' ';
  100. p = &ud[11]; /* 01:03:52 */
  101. for (i = 8; i > 0; i--)
  102. *q++ = *p++;
  103. /*
  104.  * should really get the timezone from the time in "ud" (which
  105.  * is only different if a non-null arg was passed which is different
  106.  * from the current time), but for all practical purposes, returning
  107.  * the current local zone will do (its all that is ever needed).
  108.  */
  109. gmt = *gmtime(&t);
  110. lt = localtime(&t);
  111. off = (lt->tm_hour - gmt.tm_hour) * 60 + lt->tm_min - gmt.tm_min;
  112. /* assume that offset isn't more than a day ... */
  113. if (lt->tm_year < gmt.tm_year)
  114. off -= 24 * 60;
  115. else if (lt->tm_year > gmt.tm_year)
  116. off += 24 * 60;
  117. else if (lt->tm_yday < gmt.tm_yday)
  118. off -= 24 * 60;
  119. else if (lt->tm_yday > gmt.tm_yday)
  120. off += 24 * 60;
  121. *q++ = ' ';
  122. if (off == 0)
  123. {
  124. *q++ = 'G';
  125. *q++ = 'M';
  126. *q++ = 'T';
  127. }
  128. else
  129. {
  130. tz = NULL;
  131. #if TZ_TYPE == TZ_TM_NAME
  132. tz = lt->tm_name;
  133. #endif /* TZ_TYPE == TZ_TM_NAME */
  134. #if TZ_TYPE == TZ_TM_ZONE
  135. tz = lt->tm_zone;
  136. #endif /* TZ_TYPE == TZ_TM_ZONE */
  137. #if TZ_TYPE == TZ_TZNAME
  138. {
  139. extern char *tzname[];
  140. if (lt->tm_isdst > 0)
  141. tz = tzname[1];
  142. else if (lt->tm_isdst == 0)
  143. tz = tzname[0];
  144. else
  145. tz = NULL;
  146. }
  147. #endif /* TZ_TYPE == TZ_TZNAME */
  148. #if TZ_TYPE == TZ_TIMEZONE
  149. {
  150. extern char *timezone();
  151. tz = timezone(off, lt->tm_isdst);
  152. }
  153. #endif /* TZ_TYPE == TZ_TIMEZONE */
  154. if (off < 0)
  155. {
  156. off = -off;
  157. *q++ = '-';
  158. }
  159. else
  160. *q++ = '+';
  161. if (off >= 24*60) /* should be impossible */
  162. off = 23*60+59; /* if not, insert silly value */
  163. *q++ = (off / 600) + '0';
  164. *q++ = (off / 60) % 10 + '0';
  165. off %= 60;
  166. *q++ = (off / 10) + '0';
  167. *q++ = (off % 10) + '0';
  168. if (tz != NULL && *tz != '')
  169. {
  170. *q++ = ' ';
  171. *q++ = '(';
  172. while (*tz != '' && q < &b[sizeof b - 3])
  173. *q++ = *tz++;
  174. *q++ = ')';
  175. }
  176. }
  177. *q = '';
  178. return b;
  179. }