version 1.5, 2009/08/03 14:10:54 |
version 1.6, 2009/08/08 21:52:43 |
|
|
cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause) |
cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause) |
{ |
{ |
size_t p; |
size_t p; |
int ch, argc, rval, have_arg; |
int ch, i, argc, rval, have_arg; |
char **argv, *buf, *t, *u; |
char **argv, *buf, *t; |
|
const char *whitespace, *equals; |
size_t len; |
size_t len; |
|
|
if ((t = strchr(s, ' ')) == NULL && (t = strchr(s, '\t')) == NULL) |
|
t = strchr(s, '\0'); |
|
if ((u = strchr(s, '=')) != NULL && u < t) { |
|
if (putenv(xstrdup(s)) != 0) { |
|
xasprintf(cause, "assignment failed: %s", s); |
|
return (-1); |
|
} |
|
*cmdlist = NULL; |
|
return (0); |
|
} |
|
|
|
argv = NULL; |
argv = NULL; |
argc = 0; |
argc = 0; |
|
|
|
|
|
|
if (ch != EOF) |
if (ch != EOF) |
break; |
break; |
|
if (argc == 0) |
|
goto out; |
|
|
|
for (i = 0; i < argc; i++) { |
|
equals = strchr(argv[i], '='); |
|
whitespace = argv[i] + strcspn(argv[i], " \t"); |
|
if (equals == NULL || equals > whitespace) |
|
break; |
|
environ_put(&global_environ, argv[i]); |
|
memmove(&argv[i], &argv[i + 1], argc - i - 1); |
|
argc--; |
|
} |
if (argc == 0) |
if (argc == 0) |
goto out; |
goto out; |
|
|