summaryrefslogtreecommitdiffstats
path: root/sbin/init
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1995-01-10 21:19:57 +0000
committerache <ache@FreeBSD.org>1995-01-10 21:19:57 +0000
commit6cbf9ac3bb42c2ad20e4691fee6c0e761a87723d (patch)
tree4d1f24b0f9196b00d82cd33c7721e438a6f4d5cb /sbin/init
parented41b47516bd7926123452af594db7b35688dc0f (diff)
downloadFreeBSD-src-6cbf9ac3bb42c2ad20e4691fee6c0e761a87723d.zip
FreeBSD-src-6cbf9ac3bb42c2ad20e4691fee6c0e761a87723d.tar.gz
Add better argument handling
Submitted by: jmz
Diffstat (limited to 'sbin/init')
-rw-r--r--sbin/init/init.c44
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;
+}
OpenPOWER on IntegriCloud