Blob Blame History Raw
#include "config.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define HTTPDATE_FMT "%3s, %02d %s %4d %02d:%02d:%02d GMT"

static char * wdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
static char * months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
			  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

void
httpdate_init (void)
{
  tzset();
}

int
httpdate_snprint (char * buf, int n, time_t mtime)
{
  struct tm * g;

  g = gmtime (&mtime);

  return snprintf (buf, n, HTTPDATE_FMT,
		   wdays[g->tm_wday], g->tm_mday, months[g->tm_mon],
		   g->tm_year + 1900, g->tm_hour, g->tm_min, g->tm_sec);
}

time_t
httpdate_parse (char * s, int n)
{
  struct tm d;
  char wday[3], month[3];
  int i;

  if (n < 30) return (time_t)(-1);

  memset (&d, 0, sizeof(struct tm));

  sscanf (s, HTTPDATE_FMT,
	  wday, &d.tm_mday, month, &d.tm_year,
          &d.tm_hour, &d.tm_min, &d.tm_sec);

  for (i = 0; i < 7; i++) {
    if (!strncmp (wday, wdays[i], 3)) {
      d.tm_wday = i;
      break;
    }
  }

  for (i = 0; i < 12; i++) {
    if (!strncmp (month, months[i], 3)) {
      d.tm_mon = i;
      break;
    }
  }

  d.tm_year -= 1900;

  d.tm_sec -= timezone;

  return mktime (&d);
}