mirror of
https://github.com/rkd77/elinks.git
synced 2024-10-02 03:46:21 -04:00
Bug 831: Make it possible to quote args given to -remote
This fixes the problem with URLs that contain commas and are passed to ELinks using: -remote openURL(URL). Fixes bug 831.
This commit is contained in:
parent
45d82029be
commit
685cb8d1a2
@ -218,8 +218,10 @@ remote_cmd(struct option *o, unsigned char ***argv, int *argc)
|
|||||||
{ "xfeDoCommand", REMOTE_METHOD_XFEDOCOMMAND },
|
{ "xfeDoCommand", REMOTE_METHOD_XFEDOCOMMAND },
|
||||||
{ NULL, REMOTE_METHOD_NOT_SUPPORTED },
|
{ NULL, REMOTE_METHOD_NOT_SUPPORTED },
|
||||||
};
|
};
|
||||||
unsigned char *command, *arg, *argend;
|
unsigned char *command, *arg, *argend, *argstring;
|
||||||
int method, len = 0;
|
int method, len = 0;
|
||||||
|
unsigned char *remote_argv[10];
|
||||||
|
int remote_argc;
|
||||||
|
|
||||||
if (*argc < 1) return gettext("Parameter expected");
|
if (*argc < 1) return gettext("Parameter expected");
|
||||||
|
|
||||||
@ -246,10 +248,69 @@ remote_cmd(struct option *o, unsigned char ***argv, int *argc)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Skip parenthesis and surrounding whitespace. */
|
|
||||||
arg++;
|
arg++;
|
||||||
skip_space(arg);
|
|
||||||
skipback_whitespace(arg, argend);
|
arg = argstring = memacpy(arg, argend - arg);
|
||||||
|
if (!argstring)
|
||||||
|
return gettext("Out of memory");
|
||||||
|
|
||||||
|
remote_argc = 0;
|
||||||
|
do {
|
||||||
|
unsigned char *start, *end;
|
||||||
|
|
||||||
|
if (remote_argc > sizeof_array(remote_argv)) {
|
||||||
|
mem_free(argstring);
|
||||||
|
return gettext("Too many arguments");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip parenthesis, comma, and surrounding whitespace. */
|
||||||
|
skip_space(arg);
|
||||||
|
start = arg;
|
||||||
|
|
||||||
|
if (*start == '"') {
|
||||||
|
end = ++start;
|
||||||
|
while ((end = strchr(end, '"'))) {
|
||||||
|
/* Treat "" inside quoted arg as ". */
|
||||||
|
if (end[1] != '"')
|
||||||
|
break;
|
||||||
|
|
||||||
|
end += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!end)
|
||||||
|
return gettext("Mismatched ending argument quoting");
|
||||||
|
|
||||||
|
arg = end + 1;
|
||||||
|
skip_space(arg);
|
||||||
|
if (*arg && *arg != ',')
|
||||||
|
return gettext("Garbage after quoted argument");
|
||||||
|
|
||||||
|
remote_argv[remote_argc++] = start;
|
||||||
|
*end = 0;
|
||||||
|
|
||||||
|
/* Unescape "" to ". */
|
||||||
|
for (end = start; *end; start++, end++) {
|
||||||
|
*start = *end;
|
||||||
|
if (*end == '"')
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
*start = 0;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
end = strchr(start, ',');
|
||||||
|
if (!end)
|
||||||
|
end = start + strlen(start);
|
||||||
|
arg = end;
|
||||||
|
skipback_whitespace(start, end);
|
||||||
|
|
||||||
|
if (start != end)
|
||||||
|
remote_argv[remote_argc++] = start;
|
||||||
|
*end = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*arg == ',')
|
||||||
|
arg++;
|
||||||
|
} while (*arg);
|
||||||
|
|
||||||
for (method = 0; remote_methods[method].name; method++) {
|
for (method = 0; remote_methods[method].name; method++) {
|
||||||
unsigned char *name = remote_methods[method].name;
|
unsigned char *name = remote_methods[method].name;
|
||||||
@ -260,15 +321,14 @@ remote_cmd(struct option *o, unsigned char ***argv, int *argc)
|
|||||||
|
|
||||||
switch (remote_methods[method].type) {
|
switch (remote_methods[method].type) {
|
||||||
case REMOTE_METHOD_OPENURL:
|
case REMOTE_METHOD_OPENURL:
|
||||||
if (arg == argend) {
|
if (remote_argc < 1) {
|
||||||
/* Prompt for a URL with a dialog box */
|
/* Prompt for a URL with a dialog box */
|
||||||
remote_session_flags |= SES_REMOTE_PROMPT_URL;
|
remote_session_flags |= SES_REMOTE_PROMPT_URL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = strcspn(arg, ",)");
|
if (remote_argc == 2) {
|
||||||
if (arg[len] == ',') {
|
unsigned char *where = remote_argv[1];
|
||||||
unsigned char *where = arg + len + 1;
|
|
||||||
|
|
||||||
if (strstr(where, "new-window")) {
|
if (strstr(where, "new-window")) {
|
||||||
remote_session_flags |= SES_REMOTE_NEW_WINDOW;
|
remote_session_flags |= SES_REMOTE_NEW_WINDOW;
|
||||||
@ -286,24 +346,14 @@ remote_cmd(struct option *o, unsigned char ***argv, int *argc)
|
|||||||
remote_session_flags |= SES_REMOTE_CURRENT_TAB;
|
remote_session_flags |= SES_REMOTE_CURRENT_TAB;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (len > 0 && isspace(arg[len - 1])) len--;
|
remote_url = stracpy(remote_argv[0]);
|
||||||
|
|
||||||
if (len > 1) {
|
|
||||||
/* Skip possible string delimiters. Atleast urlview
|
|
||||||
* seems to add them. */
|
|
||||||
if ((arg[0] == '\'' && arg[len - 1] == '\'')
|
|
||||||
|| (arg[0] == '"' && arg[len - 1] == '"'))
|
|
||||||
arg++, len -= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len) remote_url = memacpy(arg, len);
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REMOTE_METHOD_XFEDOCOMMAND:
|
case REMOTE_METHOD_XFEDOCOMMAND:
|
||||||
len = argend - arg;
|
if (remote_argc < 1)
|
||||||
|
break;
|
||||||
|
|
||||||
if (!strlcasecmp(arg, len, "openBrowser", 11)) {
|
if (!strcasecmp(remote_argv[0], "openBrowser")) {
|
||||||
remote_session_flags = SES_REMOTE_NEW_WINDOW;
|
remote_session_flags = SES_REMOTE_NEW_WINDOW;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -313,14 +363,16 @@ remote_cmd(struct option *o, unsigned char ***argv, int *argc)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case REMOTE_METHOD_ADDBOOKMARK:
|
case REMOTE_METHOD_ADDBOOKMARK:
|
||||||
if (arg == argend) break;
|
if (remote_argc < 1)
|
||||||
remote_url = memacpy(arg, argend - arg);
|
break;
|
||||||
|
remote_url = stracpy(remote_argv[0]);
|
||||||
remote_session_flags = SES_REMOTE_ADD_BOOKMARK;
|
remote_session_flags = SES_REMOTE_ADD_BOOKMARK;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REMOTE_METHOD_INFOBOX:
|
case REMOTE_METHOD_INFOBOX:
|
||||||
if (arg == argend) break;
|
if (remote_argc < 1)
|
||||||
remote_url = memacpy(arg, argend - arg);
|
break;
|
||||||
|
remote_url = stracpy(remote_argv[0]);
|
||||||
if (remote_url)
|
if (remote_url)
|
||||||
insert_in_string(&remote_url, 0, "about:", 6);
|
insert_in_string(&remote_url, 0, "about:", 6);
|
||||||
remote_session_flags = SES_REMOTE_INFO_BOX;
|
remote_session_flags = SES_REMOTE_INFO_BOX;
|
||||||
@ -330,6 +382,8 @@ remote_cmd(struct option *o, unsigned char ***argv, int *argc)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mem_free(argstring);
|
||||||
|
|
||||||
/* If no flags was applied it can only mean we are dealing with
|
/* If no flags was applied it can only mean we are dealing with
|
||||||
* unknown method. */
|
* unknown method. */
|
||||||
if (!remote_session_flags)
|
if (!remote_session_flags)
|
||||||
|
Loading…
Reference in New Issue
Block a user