aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tool_cfgable.c19
-rw-r--r--src/tool_cfgable.h7
-rw-r--r--src/tool_getparam.c30
-rw-r--r--src/tool_main.c2
4 files changed, 51 insertions, 7 deletions
diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c
index 6bcf421b3..aed96a48b 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -153,6 +153,21 @@ static void free_config_fields(struct Configurable *config)
void config_free(struct Configurable *config)
{
- free_config_fields(config);
- free(config);
+ struct Configurable *last = config;
+
+ /* Find the last config structure */
+ while(last->next)
+ last = last->next;
+
+ /* Free each of the structures in reverse order */
+ do {
+ struct Configurable *prev = last->prev;
+ if(prev)
+ last->easy = NULL;
+
+ free_config_fields(last);
+ free(last);
+
+ last = prev;
+ } while(last);
}
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index 7ac4df7ea..6696dfb90 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -213,8 +213,11 @@ struct Configurable {
#ifdef CURLDEBUG
bool test_event_based;
#endif
- char *xoauth2_bearer; /* XOAUTH2 bearer token */
-}; /* struct Configurable */
+ char *xoauth2_bearer; /* XOAUTH2 bearer token */
+
+ struct Configurable* prev;
+ struct Configurable* next; /* Always last in the struct */
+};
void config_init(struct Configurable* config);
void config_free(struct Configurable* config);
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index 2938f88b2..e9ae7923a 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -1859,7 +1859,29 @@ ParameterError parse_args(struct Configurable *config, int argc,
for(i = 1, stillflags = TRUE; i < argc && !result; i++) {
orig_opt = argv[i];
- if(stillflags && ('-' == argv[i][0])) {
+ if(curlx_strequal(":", argv[i]) &&
+ ((config->url_list && config->url_list->url) || config->list_engines)) {
+
+ /* Allocate the next config */
+ config->next = malloc(sizeof(struct Configurable));
+ if(config->next) {
+ /* Initialise the newly created config */
+ config_init(config->next);
+
+ /* Copy the easy handle */
+ config->next->easy = config->easy;
+
+ /* Move onto the new config */
+ config->next->prev = config;
+ config = config->next;
+
+ /* Reset the flag indicator */
+ stillflags = TRUE;
+ }
+ else
+ result = PARAM_NO_MEM;
+ }
+ else if(stillflags && ('-' == argv[i][0])) {
char *nextarg;
bool passarg;
char *flag = argv[i];
@@ -1886,7 +1908,11 @@ ParameterError parse_args(struct Configurable *config, int argc,
if(result && result != PARAM_HELP_REQUESTED) {
const char *reason = param2text(result);
- helpf(config->errors, "option %s: %s\n", orig_opt, reason);
+
+ if(!curlx_strequal(":", orig_opt))
+ helpf(config->errors, "option %s: %s\n", orig_opt, reason);
+ else
+ helpf(config->errors, "%s\n", reason);
}
return result;
diff --git a/src/tool_main.c b/src/tool_main.c
index 9fde71807..ecf9f9f38 100644
--- a/src/tool_main.c
+++ b/src/tool_main.c
@@ -196,7 +196,7 @@ int main(int argc, char *argv[])
tool_pressanykey();
#endif
- /* Free the config structure */
+ /* Free the config structures */
config_free(config);
config = NULL;
}