gboolean
rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
- GError **err, const gchar *extraction_pattern, ...)
+ GError **err,
+ enum rspamd_lua_parse_arguments_flags how,
+ const gchar *extraction_pattern, ...)
{
const gchar *p, *key = NULL, *end, *cls;
va_list ap;
}
else if (t == LUA_TNIL || t == LUA_TNONE) {
failed = TRUE;
- *(va_arg (ap, const gchar **)) = NULL;
+
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, const gchar **)) = NULL;
+ }
}
else {
g_set_error (err,
}
else if (t == LUA_TNIL || t == LUA_TNONE) {
failed = TRUE;
- *(va_arg (ap, gint64 *)) = 0;
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, gint64 *)) = 0;
+ }
}
else {
g_set_error (err,
}
else if (t == LUA_TNIL || t == LUA_TNONE) {
failed = TRUE;
- *(va_arg (ap, gint *)) = -1;
+
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, gint *)) = -1;
+ }
+
if (is_table) {
lua_pop (L, 1);
}
}
else if (t == LUA_TNIL || t == LUA_TNONE) {
failed = TRUE;
- *(va_arg (ap, gboolean *)) = 0;
+
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, gboolean *)) = 0;
+ }
}
else {
g_set_error (err,
}
else if (t == LUA_TNIL || t == LUA_TNONE) {
failed = TRUE;
- *(va_arg (ap, gdouble *)) = 0;
+
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, gdouble *)) = 0;
+ }
}
else {
g_set_error (err,
}
else if (t == LUA_TNIL || t == LUA_TNONE) {
failed = TRUE;
- *(va_arg (ap, gdouble *)) = NAN;
+
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, gdouble *)) = NAN;
+ }
}
else {
g_set_error (err,
}
else if (t == LUA_TNIL || t == LUA_TNONE) {
failed = TRUE;
- *(va_arg (ap, const char **)) = NULL;
- *valuelen = 0;
+
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, const char **)) = NULL;
+ *valuelen = 0;
+ }
}
else {
g_set_error (err,
}
else {
failed = TRUE;
- *(va_arg (ap, ucl_object_t **)) = NULL;
+
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, ucl_object_t **)) = NULL;
+ }
}
if (is_table) {
case 'U':
if (t == LUA_TNIL || t == LUA_TNONE) {
failed = TRUE;
- *(va_arg (ap, void **)) = NULL;
+
+ if (how != RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING) {
+ *(va_arg (ap, void **)) = NULL;
+ }
}
else if (t != LUA_TUSERDATA) {
g_set_error (err,
struct ev_loop* lua_check_ev_base (lua_State * L, gint pos);
struct rspamd_dns_resolver * lua_check_dns_resolver (lua_State * L, gint pos);
+enum rspamd_lua_parse_arguments_flags {
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT = 0,
+ RSPAMD_LUA_PARSE_ARGUMENTS_IGNORE_MISSING,
+};
/**
* Extract an arguments from lua table according to format string. Supported arguments are:
* [*]key=S|I|N|B|V|U{a-z};[key=...]
* @param L lua state
* @param pos at which pos start extraction
* @param err error pointer
+ * @param how extraction type
* @param extraction_pattern static pattern
* @return TRUE if a table has been parsed
*/
gboolean rspamd_lua_parse_table_arguments (lua_State *L, gint pos,
- GError **err, const gchar *extraction_pattern, ...);
+ GError **err,
+ enum rspamd_lua_parse_arguments_flags how,
+ const gchar *extraction_pattern, ...);
gint rspamd_lua_traceback (lua_State *L);
if (cfg) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"name=S;weight=N;callback=F;flags=S;type=S;priority=I;parent=D;"
"score=D;description=S;group=S;one_shot=B;nshots=I;"
"allowed_ids=S;forbidden_ids=S",
if (lua_type (L, 2) == LUA_TTABLE) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"*name=S;score=N;description=S;"
"group=S;one_shot=B;one_param=B;priority=N;flags=S;"
"nshots=I",
if (lua_type (L, 2) == LUA_TTABLE) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"*action=S;score=N;"
"priority=N",
&name, &threshold,
*/
if (cfg != NULL) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"*re=U{regexp};*type=S;header=S;pcre_only=B",
&re, &type_str, &header_str, &pcre_only)) {
msg_err_config ("cannot get parameters list: %e", err);
if (cfg != NULL) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"*old_re=U{regexp};*new_re=U{regexp}",
&old_re, &new_re)) {
msg_err_config ("cannot get parameters list: %e", err);
if (cfg && option && doc_string) {
if (lua_type (L, 5) == LUA_TTABLE) {
if (!rspamd_lua_parse_table_arguments (L, 5, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"type=S;default=S;required=B",
&type_str, &default_value, &required)) {
msg_err_config ("cannot get parameters list: %e", err);
/* Check arguments */
if (!rspamd_lua_parse_table_arguments (L, 1, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"*name=S;task=U{task};*type=S;forced=B;session=U{session};config=U{config}",
&to_resolve,
&task,
/* Check arguments */
if (!rspamd_lua_parse_table_arguments (L, first, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"session=U{session};mempool=U{mempool};*name=S;*callback=F;"
"option=S;task=U{task};forced=B",
&session, &pool, &to_resolve, &cbref, &user_str, &task, &forced)) {
if (cfg) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"*url=O;description=S;callback=F;type=S",
&map_obj, &description, &cbidx, &type)) {
ret = luaL_error (L, "invalid table arguments: %s", err->message);
if (task) {
if (lua_istable (L, 2)) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"filename=S;tmpmask=S;mode=I;force_new=B;keep=B",
&fname, &tmpmask, &mode, &force_new, &keep)) {
msg_err_task ("cannot get parameters list: %e", err);
*/
if (task != NULL) {
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
- "*re=U{regexp};*type=S;header=V;strong=B",
- &re, &type_str, &header_len, &header_str,
- &strong)) {
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
+ "*re=U{regexp};*type=S;header=V;strong=B",
+ &re, &type_str, &header_len, &header_str,
+ &strong)) {
msg_err_task ("cannot get parameters list: %e", err);
if (err) {
struct ev_loop *ev_base = NULL;
int arguments_validated = rspamd_lua_parse_table_arguments (L, 1, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"task=U{task};session=U{session};resolver=U{resolver};ev_base=U{ev_base};"
"*host=S;*port=I;timeout=D;config=U{config}",
&task, &session, &resolver, &ev_base,
gint func_cbref, cb_cbref;
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"func=F;exec=S;stdin=V;*on_complete=F", &func_cbref,
&cmdline, &inputlen, &input, &cb_cbref)) {
msg_err ("cannot get parameters list: %e", err);
* - key
*/
if (!rspamd_lua_parse_table_arguments (L, 2, &err,
+ RSPAMD_LUA_PARSE_ARGUMENTS_DEFAULT,
"key=V;rawkey=V;*domain=S;*selector=S;no_cache=B;headers=S;"
"sign_type=S;arc_idx=I;arc_cv=S;expire=I;pubkey=S;"
"strict_pubkey_check=B",