114 lines
1.4 KiB
C
114 lines
1.4 KiB
C
/*
|
|
** Copyright 1998 - 1999 Double Precision, Inc.
|
|
** See COPYING for distribution information.
|
|
*/
|
|
|
|
/*
|
|
** $Id$
|
|
*/
|
|
|
|
#include "rfc822.h"
|
|
|
|
#include <sys/types.h>
|
|
#include <time.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#if HAVE_UNISTD_H
|
|
#include <unistd.h>
|
|
#endif
|
|
|
|
static const char * const months[]={
|
|
"Jan",
|
|
"Feb",
|
|
"Mar",
|
|
"Apr",
|
|
"May",
|
|
"Jun",
|
|
"Jul",
|
|
"Aug",
|
|
"Sep",
|
|
"Oct",
|
|
"Nov",
|
|
"Dec"};
|
|
|
|
static const char * const wdays[]={
|
|
"Sun",
|
|
"Mon",
|
|
"Tue",
|
|
"Wed",
|
|
"Thu",
|
|
"Fri",
|
|
"Sat"};
|
|
|
|
void rfc822_mkdate_buf(time_t t, char *buf)
|
|
{
|
|
struct tm *p;
|
|
int offset;
|
|
|
|
#if USE_TIME_ALTZONE
|
|
|
|
p=localtime(&t);
|
|
offset= -timezone;
|
|
|
|
if (p->tm_isdst > 0)
|
|
offset= -altzone;
|
|
|
|
if (offset % 60)
|
|
{
|
|
offset=0;
|
|
p=gmtime(&t);
|
|
}
|
|
offset /= 60;
|
|
#else
|
|
#if USE_TIME_DAYLIGHT
|
|
|
|
p=localtime(&t);
|
|
offset= -timezone;
|
|
|
|
if (p->tm_isdst > 0)
|
|
offset += 60*60;
|
|
if (offset % 60)
|
|
{
|
|
offset=0;
|
|
p=gmtime(&t);
|
|
}
|
|
offset /= 60;
|
|
#else
|
|
#if USE_TIME_GMTOFF
|
|
p=localtime(&t);
|
|
offset= p->tm_gmtoff;
|
|
|
|
if (offset % 60)
|
|
{
|
|
offset=0;
|
|
p=gmtime(&t);
|
|
}
|
|
offset /= 60;
|
|
#else
|
|
p=gmtime(&t);
|
|
offset=0;
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
offset = (offset % 60) + offset / 60 * 100;
|
|
|
|
sprintf(buf, "%s, %02d %s %04d %02d:%02d:%02d %+05d",
|
|
wdays[p->tm_wday],
|
|
p->tm_mday,
|
|
months[p->tm_mon],
|
|
p->tm_year+1900,
|
|
p->tm_hour,
|
|
p->tm_min,
|
|
p->tm_sec,
|
|
offset);
|
|
}
|
|
|
|
const char *rfc822_mkdate(time_t t)
|
|
{
|
|
static char buf[50];
|
|
|
|
rfc822_mkdate_buf(t, buf);
|
|
return (buf);
|
|
}
|