[syslog-ng]BSDi strptime function ?

Balazs Scheidler bazsi@balabit.hu
Wed, 6 Dec 2000 12:46:45 +0100


> Wanted to know if anyone on this list had any success with a function to
> replace strptime() function for BSDi ? Any inputs (pros and cons) regarding
> working with syslog-ng on BSDi systems are most welcome.

attached you'll find a patch against syslog-ng 1.5.0 with a replacement
strptime function added. Please check out if it works. (you'll need autoconf
& automake to regenerate the makefiles, if you don't have them I may send
you a full tarball in private) 

It's not tested at all, but it does compile.

diff -urN syslog-ng-1.5.0/ChangeLog syslog-ng-1.5.1/ChangeLog
--- syslog-ng-1.5.0/ChangeLog	Wed Nov 29 12:54:33 2000
+++ syslog-ng-1.5.1/ChangeLog	Wed Dec  6 12:42:17 2000
@@ -1,3 +1,8 @@
+2000-12-06  Balazs Scheidler  <bazsi@balabit.hu>
+
+	* src/strptime.c: new file for systems lacking an strptime()
+	function
+
 2000-11-29  Balazs Scheidler  <bazsi@balabit.hu>
 
 	* src/center.c (do_distribute_log): evaluate DEFAULT filters in
diff -urN syslog-ng-1.5.0/configure.in syslog-ng-1.5.1/configure.in
--- syslog-ng-1.5.0/configure.in	Wed Nov 29 12:38:13 2000
+++ syslog-ng-1.5.1/configure.in	Wed Dec  6 12:42:24 2000
@@ -2,7 +2,7 @@
 dnl Process this file with autoconf to produce a configure script.
 AC_INIT(src/affile.c)
 
-AM_INIT_AUTOMAKE(syslog-ng, "1.5.0")
+AM_INIT_AUTOMAKE(syslog-ng, "1.5.1")
 LIBOL_REQ_MAJOR=0
 LIBOL_REQ_MINOR=2
 LIBOL_REQ_PATCH=20
@@ -99,6 +99,7 @@
 AC_CHECK_FUNCS(select snprintf vsnprintf strerror inet_aton strncpy getutent)
 AC_CHECK_FUNC(getopt_long,,[LIBOBJS="getopt.o getopt1.o $LIBOBJS"])
 AC_CHECK_FUNC(strcasecmp,,[LIBOBJS="strcasecmp.o $LIBOBJS"])
+AC_CHECK_FUNC(strptime,,[LIBOBJS="strptime.o $LIBOBJS"])
 
 if test "x$ac_cv_func_snprintf" = "xno" -o \
 	"x$ac_cv_func_vsnprintf" = "xno"; then
diff -urN syslog-ng-1.5.0/src/strptime.c syslog-ng-1.5.1/src/strptime.c
--- syslog-ng-1.5.0/src/strptime.c	Thu Jan  1 01:00:00 1970
+++ syslog-ng-1.5.1/src/strptime.c	Wed Dec  6 12:41:28 2000
@@ -0,0 +1,304 @@
+
+/***************************************************************
+ * STRPTIME.C -- strptime() for IRIX                           *
+ *            -- Michael Jennings                              *
+ *            -- 2 April 1997                                  *
+ ***************************************************************/
+/*
+ * This file is original work by Michael Jennings <mej@eterm.org>.
+ *
+ * Copyright (C) 1997, Michael Jennings
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * 
+ */
+
+static const char cvs_ident[] = "$Id: strptime.c,v 1.1.1.1.2.1 1999/08/18 23:54:23 mej Exp $";
+
+#include <config.h>
+
+#include "strptime.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#define sizeofone(s)      (sizeof(s) / sizeof((s)[0]))
+
+#define NUM_MONTHS     12
+#define NUM_DAYS        7
+
+typedef struct dtmap_struct {
+  char *Months[NUM_MONTHS];
+  char *MonthsAbbrev[NUM_MONTHS];
+  char *Days[NUM_DAYS];
+  char *DaysAbbrev[NUM_DAYS];
+  char *DateFormat;
+  char *TimeFormat;
+  char *DateTimeFormat;
+  char *LocaleDateFormat;
+  char *AM;
+  char *PM;
+} DTMap;
+
+static DTMap USMap = {
+  { "January", "February", "March", "April",
+    "May", "June", "July", "August",
+    "September", "October", "November", "December" },
+  { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" },
+  { "Sunday", "Monday", "Tuesday", "Wednesday",
+    "Thursday", "Friday", "Saturday" },
+  { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" },
+  "%m/%d/%y",
+  "%H:%M:%S",
+  "%a %b %e %T %Z %Y",
+  "%A, %B, %e, %Y",
+  "AM",
+  "PM"
+};
+
+char *
+strptime(const char *buf, const char *format, struct tm *tm)
+{
+
+  register char c;
+  register const char *tmp;
+  register int i, len;
+
+  for (tmp = format; *tmp;) {
+    if (!(*buf))
+      break;
+
+    if ((c = *tmp++) != '%') {
+      if (!isspace(*buf) && c != *buf++)
+	return ((char *) NULL);
+      for (; *buf != 0 && isspace(*buf); buf++);
+      continue;
+    }
+    switch ((c = *tmp++)) {
+      case 0:
+      case '%':
+	if (*buf++ != '%')
+	  return ((char *) NULL);
+	break;
+
+      case 'C':
+	buf = strptime(buf, USMap.LocaleDateFormat, tm);
+	if (!buf)
+	  return ((char *) NULL);
+	break;
+
+      case 'c':
+	buf = strptime(buf, "%x %X", tm);
+	if (!buf)
+	  return ((char *) NULL);
+	break;
+
+      case 'D':
+	buf = strptime(buf, "%m/%d/%y", tm);
+	if (!buf)
+	  return ((char *) NULL);
+	break;
+
+      case 'R':
+	buf = strptime(buf, "%H:%M", tm);
+	if (!buf)
+	  return ((char *) NULL);
+	break;
+
+      case 'r':
+	buf = strptime(buf, "%I:%M:%S %p", tm);
+	if (!buf)
+	  return ((char *) NULL);
+	break;
+
+      case 'T':
+	buf = strptime(buf, "%H:%M:%S", tm);
+	if (!buf)
+	  return ((char *) NULL);
+	break;
+
+      case 'X':
+	buf = strptime(buf, USMap.TimeFormat, tm);
+	if (!buf)
+	  return ((char *) NULL);
+	break;
+
+      case 'x':
+	buf = strptime(buf, USMap.DateFormat, tm);
+	if (!buf)
+	  return ((char *) NULL);
+	break;
+
+      case 'j':
+	if (!isdigit(*buf))
+	  return ((char *) NULL);
+	for (i = 0; *buf != 0 && isdigit(*buf); buf++) {
+	  i *= 10;
+	  i += *buf - '0';
+	}
+	if (i > 365)
+	  return ((char *) NULL);
+	tm->tm_yday = i;
+	break;
+
+      case 'M':
+      case 'S':
+	if (!(*buf) || isspace(*buf))
+	  break;
+	if (!isdigit(*buf))
+	  return ((char *) NULL);
+	for (i = 0; *buf != 0 && isdigit(*buf); buf++) {
+	  i *= 10;
+	  i += *buf - '0';
+	}
+	if (i > 59)
+	  return ((char *) NULL);
+	if (c == 'M')
+	  tm->tm_min = i;
+	else
+	  tm->tm_sec = i;
+
+	if (*buf && isspace(*buf))
+	  for (; *tmp && !isspace(*tmp); tmp++);
+	break;
+
+      case 'H':
+      case 'I':
+      case 'k':
+      case 'l':
+	if (!isdigit(*buf))
+	  return ((char *) NULL);
+	for (i = 0; *buf && isdigit(*buf); buf++) {
+	  i *= 10;
+	  i += *buf - '0';
+	}
+	if (c == 'H' || c == 'k') {
+	  if (i > 23)
+	    return ((char *) NULL);
+	} else if (i > 11)
+	  return ((char *) NULL);
+	tm->tm_hour = i;
+	if (*buf && isspace(*buf))
+	  for (; *tmp && !isspace(*tmp); tmp++);
+	break;
+
+      case 'p':
+	len = strlen(USMap.AM);
+	if (!strncasecmp(buf, USMap.AM, len)) {
+	  if (tm->tm_hour > 12)
+	    return ((char *) NULL);
+	  if (tm->tm_hour == 12)
+	    tm->tm_hour = 0;
+	  buf += len;
+	  break;
+	}
+	len = strlen(USMap.PM);
+	if (!strncasecmp(buf, USMap.PM, len)) {
+	  if (tm->tm_hour > 12)
+	    return ((char *) NULL);
+	  if (tm->tm_hour != 12)
+	    tm->tm_hour += 12;
+	  buf += len;
+	  break;
+	}
+	return ((char *) NULL);
+
+      case 'A':
+      case 'a':
+	for (i = 0; i < NUM_DAYS; i++) {
+	  len = strlen(USMap.Days[i]);
+	  if (!strncasecmp(buf, USMap.Days[i], len))
+	    break;
+	  len = strlen(USMap.DaysAbbrev[i]);
+	  if (!strncasecmp(buf, USMap.DaysAbbrev[i], len))
+	    break;
+	}
+	if (i == NUM_DAYS)
+	  return ((char *) NULL);
+	tm->tm_wday = i;
+	buf += len;
+	break;
+
+      case 'd':
+      case 'e':
+	if (!isdigit(*buf))
+	  return ((char *) NULL);
+	for (i = 0; *buf && isdigit(*buf); buf++) {
+	  i *= 10;
+	  i += *buf - '0';
+	}
+	if (i > 31)
+	  return ((char *) NULL);
+	tm->tm_mday = i;
+	if (*buf && isspace(*buf))
+	  for (; *tmp && !isspace(*tmp); tmp++);
+	break;
+
+      case 'B':
+      case 'b':
+      case 'h':
+	for (i = 0; i < NUM_MONTHS; i++) {
+	  len = strlen(USMap.Months[i]);
+	  if (!strncasecmp(buf, USMap.Months[i], len))
+	    break;
+	  len = strlen(USMap.MonthsAbbrev[i]);
+	  if (!strncasecmp(buf, USMap.MonthsAbbrev[i], len))
+	    break;
+	}
+	if (i == NUM_MONTHS)
+	  return ((char *) NULL);
+	tm->tm_mon = i;
+	buf += len;
+	break;
+
+      case 'm':
+	if (!isdigit(*buf))
+	  return ((char *) NULL);
+	for (i = 0; *buf && isdigit(*buf); buf++) {
+	  i *= 10;
+	  i += *buf - '0';
+	}
+	if (i < 1 || i > 12)
+	  return ((char *) NULL);
+	tm->tm_mon = i - 1;
+	if (*buf && isspace(*buf))
+	  for (; *tmp && !isspace(*tmp); tmp++);
+	break;
+
+      case 'Y':
+      case 'y':
+	if (!(*buf) || isspace(*buf))
+	  break;
+	if (!isdigit(*buf))
+	  return ((char *) NULL);
+	for (i = 0; *buf && isdigit(*buf); buf++) {
+	  i *= 10;
+	  i += *buf - '0';
+	}
+	if (c == 'Y')
+	  i -= 1900;
+	if (i < 0)
+	  return ((char *) NULL);
+	tm->tm_year = i;
+	if (*buf && isspace(*buf))
+	  for (; *tmp && !isspace(*tmp); tmp++);
+	break;
+    }
+  }
+  return (char *) (buf);
+}
+
diff -urN syslog-ng-1.5.0/syslog-ng.spec syslog-ng-1.5.1/syslog-ng.spec
--- syslog-ng-1.5.0/syslog-ng.spec	Wed Nov 29 12:49:40 2000
+++ syslog-ng-1.5.1/syslog-ng.spec	Wed Dec  6 12:42:30 2000
@@ -1,5 +1,5 @@
 %define name syslog-ng
-%define version 1.5.0
+%define version 1.5.1
 %define release 0
 %define prefix /usr
 


-- 
Bazsi
PGP info: KeyID 9AF8D0A9 Fingerprint CD27 CFB0 802C 0944 9CFD 804E C82C 8EB1
     url: http://www.balabit.hu/pgpkey.txt