%PDF- %PDF-
Direktori : /backups/router/usr/local/include/syslog-ng/timeutils/ |
Current File : //backups/router/usr/local/include/syslog-ng/timeutils/wallclocktime.h |
/* * Copyright (c) 2002-2018 Balabit * Copyright (c) 1998-2018 Balázs Scheidler * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * As an additional exemption you are allowed to compile & link against the * OpenSSL libraries as published by the OpenSSL project. See the file * COPYING for details. * */ #ifndef WALLCLOCKTIME_H_INCLUDED #define WALLCLOCKTIME_H_INCLUDED #include "syslog-ng.h" /* * This is a simple wrapper over "struct tm" with fields that are not * portable across all platforms or are not present at all, but which we * would use. * * For instance, wct_gmtoff is not present on a number of platforms but would * be very useful internally, so we _always_ have the capability to * represent a broken-down time with all the properties needed for proper * timezone reference. * * Another example is wct_usec, which represents the number of microseconds * so we can carry fractions of a second information. * * The design of the class is so that we don't need to copy the contents of * "struct tm" around for conversions, rather we contain one instance and * provide wrapper macros so that fields that are present in struct tm are * used from there, those that aren't will be part of the wrapper structure. * * NOTE on thread safety: the wct_zone field is a pointer to a dynamically * allocated string, that is managed in a thread-specific location (in * cache.c), the pointer could become stale across a syslog-ng reload. In * general it is not a good idea to pass WallClockTime instances between * threads, if the wct_zone field was initialized by cached_localtime() and * friends, unless you ensure this field does not become stale. */ typedef struct _WallClockTime WallClockTime; struct _WallClockTime { #define wct_year tm.tm_year #define wct_mon tm.tm_mon #define wct_mday tm.tm_mday #define wct_wday tm.tm_wday #define wct_yday tm.tm_yday #define wct_hour tm.tm_hour #define wct_min tm.tm_min #define wct_sec tm.tm_sec #define wct_isdst tm.tm_isdst struct tm tm; /* We might need to separate tm_zone to a different conditional/autoconf * check. At least on Linux/FreeBSD they were introduced the same time. * Some platforms may lack tm_zone, even though they have tm_gmtoff */ #ifndef SYSLOG_NG_HAVE_STRUCT_TM_TM_GMTOFF long wct_gmtoff; const char *wct_zone; #else #define wct_gmtoff tm.tm_gmtoff #define wct_zone tm.tm_zone #endif int wct_usec; }; #ifdef SYSLOG_NG_HAVE_STRUCT_TM_TM_GMTOFF #define WALL_CLOCK_TIME_INIT \ { \ .tm = \ { \ .tm_year = -1, \ .tm_mon = -1, \ .tm_mday = -1, \ .tm_wday = -1, \ .tm_yday = -1, \ .tm_hour = -1, \ .tm_min = -1, \ .tm_sec = -1, \ .tm_isdst = -1, \ .tm_gmtoff = -1, \ .tm_zone = NULL, \ }, \ .wct_usec = 0, \ } #else #define WALL_CLOCK_TIME_INIT \ { \ .tm = \ { \ .tm_year = -1, \ .tm_mon = -1, \ .tm_mday = -1, \ .tm_wday = -1, \ .tm_yday = -1, \ .tm_hour = -1, \ .tm_min = -1, \ .tm_sec = -1, \ .tm_isdst = -1, \ }, \ .wct_gmtoff = -1, \ .wct_zone = NULL, \ .wct_usec = 0, \ } #endif guint32 wall_clock_time_iso_week_number(WallClockTime *wct); static inline gboolean wall_clock_time_is_set(WallClockTime *wct) { return wct->wct_hour != -1; } void wall_clock_time_unset(WallClockTime *wct); gchar *wall_clock_time_strptime(WallClockTime *wct, const gchar *format, const gchar *input); void wall_clock_time_guess_missing_year(WallClockTime *self); void wall_clock_time_guess_missing_fields(WallClockTime *self); #endif