diff --git a/src/config/conf.c b/src/config/conf.c
index 4f0bfb27..0a19dca4 100644
--- a/src/config/conf.c
+++ b/src/config/conf.c
@@ -30,6 +30,7 @@
#include "terminal/terminal.h"
#include "util/error.h"
#include "util/memory.h"
+#include "util/qs_parse/qs_parse.h"
#include "util/secsave.h"
#include "util/string.h"
@@ -671,7 +672,6 @@ parse_config_command(struct option *options, struct conf_parsing_state *state,
return show_parse_error(state, ERROR_COMMAND);
}
-#ifdef CONFIG_EXMODE
enum parse_error
parse_config_exmode_command(char *cmd)
{
@@ -684,7 +684,6 @@ parse_config_exmode_command(char *cmd)
return parse_config_command(config_options, &state, NULL, 0);
}
-#endif /* CONFIG_EXMODE */
void
parse_config_file(struct option *options, char *name,
@@ -1003,6 +1002,7 @@ smart_config_output_fn_html(struct string *string, struct option *option,
int action, int i18n)
{
static unsigned int counter;
+ int is_str = 0;
if (option->type == OPT_ALIAS) {
return;
@@ -1032,7 +1032,7 @@ smart_config_output_fn_html(struct string *string, struct option *option,
add_to_string(string, option->name);
add_to_string(string, "
");
- add_format_to_string(string, " | \n");
+ add_to_string(string, "\"/>");
+
+ if (is_str) {
+ add_to_string(string, "");
+ }
+ add_to_string(string, "\n");
break;
}
}
@@ -1281,7 +1286,9 @@ write_config_file(char *prefix, char *name,
}
}
- write_config_dialog(term, config_file, secsave_errno, ret);
+ if (term) {
+ write_config_dialog(term, config_file, secsave_errno, ret);
+ }
mem_free(config_file);
free_cfg_str:
@@ -1293,14 +1300,64 @@ free_cfg_str:
int
write_config(struct terminal *term)
{
- assert(term);
-
if (!elinks_home) {
- write_config_dialog(term, get_cmd_opt_str("config-file"),
+ if (term) {
+ write_config_dialog(term, get_cmd_opt_str("config-file"),
SS_ERR_DISABLED, 0);
+ }
return -1;
}
return write_config_file(elinks_home, get_cmd_opt_str("config-file"),
term);
}
+
+void
+set_option_or_save(const char *str)
+{
+#define NUMKVPAIRS 16
+#define VALSIZE 4096
+ int i;
+ char * kvpairs[NUMKVPAIRS];
+ char value[VALSIZE];
+ char *option_name;
+ char *option_value;
+ char *value_ptr;
+
+ struct string tmp;
+
+ init_string(&tmp);
+ add_to_string(&tmp, str);
+ i = qs_parse(tmp.source, kvpairs, 16);
+
+ option_name = qs_k2v("option", kvpairs, i);
+ option_value = qs_k2v("val", kvpairs, i);
+
+ if (qs_k2v("set", kvpairs, i)) {
+ struct string cmd;
+
+ char *is_str = qs_k2v("str", kvpairs, i);
+
+ init_string(&cmd);
+ add_to_string(&cmd, "set ");
+ add_to_string(&cmd, option_name);
+ add_to_string(&cmd, " = ");
+ if (is_str) {
+ add_char_to_string(&cmd, '"');
+ }
+ add_to_string(&cmd, option_value);
+ if (is_str) {
+ add_char_to_string(&cmd, '"');
+ }
+
+ parse_config_exmode_command(cmd.source);
+ done_string(&cmd);
+
+ //set_option(option_name, option_value);
+ } else if (qs_k2v("save", kvpairs, i)) {
+ write_config(NULL);
+ }
+ done_string(&tmp);
+#undef NUMKVPAIRS
+#undef VALSIZE
+}
diff --git a/src/config/conf.h b/src/config/conf.h
index b2a09381..7cb1d946 100644
--- a/src/config/conf.h
+++ b/src/config/conf.h
@@ -29,6 +29,7 @@ int write_config(struct terminal *);
char *create_config_string(char *prefix, char *name);
char *create_about_config_string(void);
+void set_option_or_save(const char *str);
struct string *wrap_option_desc(struct string *out, const char *src,
const struct string *indent, int maxwidth);
diff --git a/src/protocol/about.c b/src/protocol/about.c
index ea8c55cb..37b4cf61 100644
--- a/src/protocol/about.c
+++ b/src/protocol/about.c
@@ -97,14 +97,18 @@ about_protocol_handler(struct connection *conn)
if (cached && !cached->content_type) {
#ifndef CONFIG_SMALL
{
- if (!strcmp(conn->uri->data, "config")) {
- char *str = create_about_config_string();
+ if (!strncmp(conn->uri->data, "config", 6)) {
+ char *str;
+
+ set_option_or_save(conn->uri->data);
+ str = create_about_config_string();
if (str) {
int len = strlen(str);
add_fragment(cached, 0, str, len);
conn->from = len;
+ mem_free(str);
}
} else {
const struct about_page *page = about_pages;