|
|
|
@ -134,6 +134,7 @@ gboolean plugin_register(server *srv, const gchar *name, PluginInit init) {
|
|
|
|
|
so->p = p; |
|
|
|
|
so->default_value = po->default_value; |
|
|
|
|
g_hash_table_insert(srv->options, (gchar*) po->name, so); |
|
|
|
|
plugin_load_default_option(srv, so); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -326,38 +327,67 @@ void plugins_handle_close(connection *con) {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
gboolean plugins_load_default_options(server *srv) { |
|
|
|
|
GHashTableIter iter; |
|
|
|
|
gpointer k, v; |
|
|
|
|
gboolean plugin_set_default_option(server *srv, const gchar* name, value *val) { |
|
|
|
|
server_option *sopt; |
|
|
|
|
option_set setting; |
|
|
|
|
|
|
|
|
|
g_hash_table_iter_init(&iter, srv->options); |
|
|
|
|
while (g_hash_table_iter_next(&iter, &k, &v)) { |
|
|
|
|
server_option *sopt = v; |
|
|
|
|
option_value oval = { 0 }; |
|
|
|
|
|
|
|
|
|
if (!sopt->parse_option) { |
|
|
|
|
switch (sopt->type) { |
|
|
|
|
case VALUE_NONE: |
|
|
|
|
break; |
|
|
|
|
case VALUE_BOOLEAN: |
|
|
|
|
oval.boolean = GPOINTER_TO_INT(sopt->default_value); |
|
|
|
|
case VALUE_NUMBER: |
|
|
|
|
oval.number = GPOINTER_TO_INT(sopt->default_value); |
|
|
|
|
break; |
|
|
|
|
case VALUE_STRING: |
|
|
|
|
oval.string = g_string_new((const char*) sopt->default_value); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
oval.ptr = NULL; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (!sopt->parse_option(srv, sopt->p, sopt->module_index, NULL, &oval)) { |
|
|
|
|
/* errors should be logged by parse function */ |
|
|
|
|
return FALSE; |
|
|
|
|
} |
|
|
|
|
sopt = find_option(srv, name); |
|
|
|
|
|
|
|
|
|
if (!sopt) { |
|
|
|
|
ERROR(srv, "unknown option \"%s\"", name); |
|
|
|
|
return FALSE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* free old value */ |
|
|
|
|
setting.sopt = sopt; |
|
|
|
|
setting.ndx = sopt->index; |
|
|
|
|
setting.value = g_array_index(srv->option_def_values, option_value, sopt->index); |
|
|
|
|
|
|
|
|
|
release_option(srv, &setting); |
|
|
|
|
|
|
|
|
|
/* assign new value */ |
|
|
|
|
if (!parse_option(srv, name, val, &setting)) { |
|
|
|
|
return FALSE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
g_array_index(srv->option_def_values, option_value, sopt->index) = setting.value; |
|
|
|
|
|
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
gboolean plugin_load_default_option(server *srv, server_option *sopt) { |
|
|
|
|
option_value oval = {0}; |
|
|
|
|
|
|
|
|
|
if (!sopt) |
|
|
|
|
return FALSE; |
|
|
|
|
|
|
|
|
|
if (!sopt->parse_option) { |
|
|
|
|
switch (sopt->type) { |
|
|
|
|
case VALUE_NONE: |
|
|
|
|
break; |
|
|
|
|
case VALUE_BOOLEAN: |
|
|
|
|
oval.boolean = GPOINTER_TO_INT(sopt->default_value); |
|
|
|
|
case VALUE_NUMBER: |
|
|
|
|
oval.number = GPOINTER_TO_INT(sopt->default_value); |
|
|
|
|
break; |
|
|
|
|
case VALUE_STRING: |
|
|
|
|
oval.string = g_string_new((const char*) sopt->default_value); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
oval.ptr = NULL; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (!sopt->parse_option(srv, sopt->p, sopt->module_index, NULL, &oval)) { |
|
|
|
|
/* errors should be logged by parse function */ |
|
|
|
|
return FALSE; |
|
|
|
|
} |
|
|
|
|
srv->option_def_values[sopt->index] = oval; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (srv->option_def_values->len <= sopt->index) |
|
|
|
|
g_array_set_size(srv->option_def_values, sopt->index + 1); |
|
|
|
|
|
|
|
|
|
g_array_index(srv->option_def_values, option_value, sopt->index) = oval; |
|
|
|
|
|
|
|
|
|
return TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -372,9 +402,10 @@ void plugins_free_default_options(server *srv) {
|
|
|
|
|
option_set mark; |
|
|
|
|
mark.sopt = sopt; |
|
|
|
|
mark.ndx = sopt->index; |
|
|
|
|
mark.value = srv->option_def_values[sopt->index]; |
|
|
|
|
|
|
|
|
|
mark.value = g_array_index(srv->option_def_values, option_value, sopt->index); |
|
|
|
|
|
|
|
|
|
release_option(srv, &mark); |
|
|
|
|
srv->option_def_values[sopt->index] = oempty; |
|
|
|
|
g_array_index(srv->option_def_values, option_value, sopt->index) = oempty; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|