[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