瀏覽代碼

Add integer converting function.

tags/0.6.0
Vsevolod Stakhov 10 年之前
父節點
當前提交
7ade35b5e8
共有 2 個文件被更改,包括 67 次插入0 次删除
  1. 53
    0
      src/cfg_rcl.c
  2. 14
    0
      src/cfg_rcl.h

+ 53
- 0
src/cfg_rcl.c 查看文件

@@ -289,3 +289,56 @@ rspamd_rcl_parse_struct_string (struct config_file *cfg, rspamd_cl_object_t *obj

return TRUE;
}

gboolean
rspamd_rcl_parse_struct_integer (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 *ip;
gint32 *i32p;
gint16 *i16p;
gint64 *i64p;
} target;
gint64 val;

if (pd->size == sizeof (gint)) {
target.ip = (gint *)(((gchar *)pd->user_struct) + pd->offset);
if (!rspamd_cl_obj_toint_safe (obj, &val)) {
g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot convert param to integer");
return FALSE;
}
*target.ip = val;
}
else if (pd->size == sizeof (gint32)) {
target.i32p = (gint32 *)(((gchar *)pd->user_struct) + pd->offset);
if (!rspamd_cl_obj_toint_safe (obj, &val)) {
g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot convert param to integer");
return FALSE;
}
*target.i32p = val;
}
else if (pd->size == sizeof (gint16)) {
target.i16p = (gint16 *)(((gchar *)pd->user_struct) + pd->offset);
if (!rspamd_cl_obj_toint_safe (obj, &val)) {
g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot convert param to integer");
return FALSE;
}
*target.i16p = val;
}
else if (pd->size == sizeof (gint64)) {
target.i64p = (gint64 *)(((gchar *)pd->user_struct) + pd->offset);
if (!rspamd_cl_obj_toint_safe (obj, &val)) {
g_set_error (err, CFG_RCL_ERROR, EINVAL, "cannot convert param to integer");
return FALSE;
}
*target.i64p = val;
}
else {
g_set_error (err, CFG_RCL_ERROR, E2BIG, "unknown integer size");
return FALSE;
}

return TRUE;
}

+ 14
- 0
src/cfg_rcl.h 查看文件

@@ -91,6 +91,7 @@ gboolean rspamd_read_rcl_config (struct rspamd_rcl_section *top,
struct rspamd_rcl_struct_parser {
gpointer user_struct;
goffset offset;
gsize size;
};

/**
@@ -105,4 +106,17 @@ struct rspamd_rcl_struct_parser {
gboolean rspamd_rcl_parse_struct_string (struct config_file *cfg, rspamd_cl_object_t *obj,
gpointer ud, struct rspamd_rcl_section *section, GError **err);

/**
* Parse an integer field of a structure
* @param cfg config pointer
* @param obj object to parse
* @param ud struct_parser structure
* @param section the current section
* @param err error pointer
* @return TRUE if a value has been successfully parsed
*/
gboolean rspamd_rcl_parse_struct_integer (struct config_file *cfg, rspamd_cl_object_t *obj,
gpointer ud, struct rspamd_rcl_section *section, GError **err);


#endif /* CFG_RCL_H_ */

Loading…
取消
儲存