]> source.dussan.org Git - rspamd.git/commitdiff
Add time fields parser.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 29 Aug 2013 15:06:40 +0000 (16:06 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 29 Aug 2013 15:06:40 +0000 (16:06 +0100)
src/cfg_rcl.c
src/cfg_rcl.h

index 942c944a6e55ac3a4a732830009e8651a75a8baa..f2f48f912e355eb8935011513ed36a5e2708bd35 100644 (file)
@@ -354,6 +354,51 @@ rspamd_rcl_parse_struct_double (struct config_file *cfg, rspamd_cl_object_t *obj
 
        if (!rspamd_cl_obj_todouble_safe (obj, target)) {
                g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot convert param to double");
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+gboolean
+rspamd_rcl_parse_struct_time (struct config_file *cfg, rspamd_cl_object_t *obj,
+               gpointer ud, struct rspamd_rcl_section *section, GError **err)
+{
+       struct rspamd_rcl_struct_parser *pd = ud;
+       union {
+               gint *psec;
+               gdouble *pdv;
+               struct timeval *ptv;
+               struct timespec *pts;
+       } target;
+       gdouble val;
+
+       if (!rspamd_cl_obj_todouble_safe (obj, &val)) {
+               g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot convert param to double");
+               return FALSE;
+       }
+
+       if (pd->flags == RSPAMD_CL_FLAG_TIME_TIMEVAL) {
+               target.ptv = (struct timeval *)(((gchar *)pd->user_struct) + pd->offset);
+               target.ptv->tv_sec = (glong)val;
+               target.ptv->tv_usec = (val - (glong)val) * 1000000;
+       }
+       else if (pd->flags == RSPAMD_CL_FLAG_TIME_TIMESPEC) {
+               target.pts = (struct timespec *)(((gchar *)pd->user_struct) + pd->offset);
+               target.pts->tv_sec = (glong)val;
+               target.pts->tv_nsec = (val - (glong)val) * 1000000000000LL;
+       }
+       else if (pd->flags == RSPAMD_CL_FLAG_TIME_FLOAT) {
+               target.pdv = (double *)(((gchar *)pd->user_struct) + pd->offset);
+               *target.pdv = val;
+       }
+       else if (pd->flags == RSPAMD_CL_FLAG_TIME_INTEGER) {
+               target.psec = (gint *)(((gchar *)pd->user_struct) + pd->offset);
+               *target.psec = val;
+       }
+       else {
+               g_set_error (err, CFG_RCL_ERROR, EINVAL, "invalid flags to parse time value");
+               return FALSE;
        }
 
        return TRUE;
index 93b9bba7d54aafd9ebbfcae9575a003f9eeec61c..8c77009a29c6041280b7593e5cb161ab50729ac1 100644 (file)
@@ -92,11 +92,12 @@ struct rspamd_rcl_struct_parser {
        gpointer user_struct;
        goffset offset;
        gsize size;
-#define RSPAMD_CL_FLAG_TIME_FLOAT 0x1 << 0
-#define RSPAMD_CL_FLAG_TIME_TIMEVAL 0x1 << 1
-#define RSPAMD_CL_FLAG_TIME_TIMESPEC 0x1 << 2
-#define RSPAMD_CL_FLAG_TIME_INTEGER 0x1 << 3
-       gint flags;
+       enum {
+               RSPAMD_CL_FLAG_TIME_FLOAT = 0x1 << 0,
+               RSPAMD_CL_FLAG_TIME_TIMEVAL = 0x1 << 1,
+               RSPAMD_CL_FLAG_TIME_TIMESPEC = 0x1 << 2,
+               RSPAMD_CL_FLAG_TIME_INTEGER = 0x1 << 3
+       } flags;
 };
 
 /**
@@ -136,4 +137,16 @@ gboolean rspamd_rcl_parse_struct_integer (struct config_file *cfg, rspamd_cl_obj
 gboolean rspamd_rcl_parse_struct_double (struct config_file *cfg, rspamd_cl_object_t *obj,
                gpointer ud, struct rspamd_rcl_section *section, GError **err);
 
+/**
+ * Parse a time field of a structure
+ * @param cfg config pointer
+ * @param obj object to parse
+ * @param ud struct_parser structure (flags mean the exact structure used)
+ * @param section the current section
+ * @param err error pointer
+ * @return TRUE if a value has been successfully parsed
+ */
+gboolean rspamd_rcl_parse_struct_time (struct config_file *cfg, rspamd_cl_object_t *obj,
+               gpointer ud, struct rspamd_rcl_section *section, GError **err);
+
 #endif /* CFG_RCL_H_ */