diff options
author | ache <ache@FreeBSD.org> | 1995-01-10 21:19:57 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1995-01-10 21:19:57 +0000 |
commit | 6cbf9ac3bb42c2ad20e4691fee6c0e761a87723d (patch) | |
tree | 4d1f24b0f9196b00d82cd33c7721e438a6f4d5cb /sbin/init/init.c | |
parent | ed41b47516bd7926123452af594db7b35688dc0f (diff) | |
download | FreeBSD-src-6cbf9ac3bb42c2ad20e4691fee6c0e761a87723d.zip FreeBSD-src-6cbf9ac3bb42c2ad20e4691fee6c0e761a87723d.tar.gz |
Add better argument handling
Submitted by: jmz
Diffstat (limited to 'sbin/init/init.c')
-rw-r--r-- | sbin/init/init.c | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/sbin/init/init.c b/sbin/init/init.c index 74d48f0..4ac9c97 100644 --- a/sbin/init/init.c +++ b/sbin/init/init.c @@ -865,14 +865,14 @@ char ** construct_argv(command) char *command; { + char *strk (char *); register int argc = 0; register char **argv = (char **) malloc(((strlen(command) + 1) / 2 + 1) * sizeof (char *)); - static const char separators[] = " \t"; - if ((argv[argc++] = strtok(command, separators)) == 0) + if ((argv[argc++] = strk(command)) == 0) return 0; - while (argv[argc++] = strtok((char *) 0, separators)) + while (argv[argc++] = strk((char *) 0)) continue; return argv; } @@ -1378,3 +1378,41 @@ death() return (state_func_t) single_user; } +char * +strk (char *p) +{ + static char *t; + char *q; + int c; + + if (p) + t = p; + if (!t) + return 0; + + c = *t; + while (c == ' ' || c == '\t' ) + c = *++t; + if (!c) { + t = 0; + return 0; + } + q = t; + if (c == '\'') { + c = *++t; + q = t; + while (c && c != '\'') + c = *++t; + if (!c) /* unterminated string */ + q = t = 0; + else + *t++ = 0; + } else { + while (c && c != ' ' && c != '\t' ) + c = *++t; + *t++ = 0; + if (!c) + t = 0; + } + return q; +} |