1
0
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:
Jonas Fonseca 2006-12-04 21:54:39 +01:00
parent 45d82029be
commit 685cb8d1a2

View File

@ -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)