chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
f60f22d
)
service: allow configuration of more than one Exec command in one line
author
Lennart Poettering
<lennart@poettering.net>
Wed, 7 Jul 2010 18:59:20 +0000
(20:59 +0200)
committer
Lennart Poettering
<lennart@poettering.net>
Wed, 7 Jul 2010 18:59:20 +0000
(20:59 +0200)
src/load-fragment.c
patch
|
blob
|
history
diff --git
a/src/load-fragment.c
b/src/load-fragment.c
index 43b8093fa02e782dad11d983a7c9115440585ab5..c3909e9563432830e284c81acc33ccc13307f6db 100644
(file)
--- a/
src/load-fragment.c
+++ b/
src/load-fragment.c
@@
-364,73
+364,94
@@
static int config_parse_exec(
void *data,
void *userdata) {
void *data,
void *userdata) {
- ExecCommand **e = data, *nce = NULL;
- char **n;
- char *w;
+ ExecCommand **e = data, *nce;
+ char *path, **n;
unsigned k;
unsigned k;
- size_t l;
- char *state, *path = NULL;
- bool honour_argv0, write_to_path;
assert(filename);
assert(lvalue);
assert(rvalue);
assert(filename);
assert(lvalue);
assert(rvalue);
- assert(
data
);
+ assert(
e
);
/* We accept an absolute path as first argument, or
* alternatively an absolute prefixed with @ to allow
* overriding of argv[0]. */
/* We accept an absolute path as first argument, or
* alternatively an absolute prefixed with @ to allow
* overriding of argv[0]. */
- honour_argv0 = rvalue[0] == '@';
+ for (;;) {
+ char *w;
+ size_t l;
+ char *state;
+ bool honour_argv0, write_to_path;
- if (rvalue[honour_argv0 ? 1 : 0] != '/') {
- log_error("[%s:%u] Invalid executable path in command line: %s", filename, line, rvalue);
- return -EINVAL;
- }
+ path = NULL;
+ nce = NULL;
+ n = NULL;
- k = 0;
- FOREACH_WORD_QUOTED(w, l, rvalue, state)
- k++;
+ rvalue += strspn(rvalue, WHITESPACE);
-
if (!(n = new(char*, k + (honour_argv0 ? 0 : 1)))
)
-
return -ENOMEM
;
+
if (rvalue[0] == 0
)
+
break
;
- k = 0;
- write_to_path = honour_argv0;
- FOREACH_WORD_QUOTED(w, l, rvalue, state) {
- if (write_to_path) {
- if (!(path = strndup(w+1, l-1)))
- goto fail;
- write_to_path = false;
- } else {
- if (!(n[k++] = strndup(w, l)))
- goto fail;
+ honour_argv0 = rvalue[0] == '@';
+
+ if (rvalue[honour_argv0 ? 1 : 0] != '/') {
+ log_error("[%s:%u] Invalid executable path in command line: %s", filename, line, rvalue);
+ return -EINVAL;
}
}
- }
- n[k] = NULL;
+ k = 0;
+ FOREACH_WORD_QUOTED(w, l, rvalue, state) {
+ if (strncmp(w, ";", l) == 0)
+ break;
- if (!n[0]) {
- log_error("[%s:%u] Invalid command line: %s", filename, line, rvalue);
- strv_free(n);
- return -EINVAL;
- }
+ k++;
+ }
- if (!path)
- if (!(path = strdup(n[0])))
- goto fail;
+ if (!(n = new(char*, k + (honour_argv0 ? 0 : 1))))
+ return -ENOMEM;
+
+ k = 0;
+ write_to_path = honour_argv0;
+ FOREACH_WORD_QUOTED(w, l, rvalue, state) {
+ if (strncmp(w, ";", l) == 0)
+ break;
+
+ if (write_to_path) {
+ if (!(path = cunescape_length(w+1, l-1)))
+ goto fail;
+ write_to_path = false;
+ } else {
+ if (!(n[k++] = cunescape_length(w, l)))
+ goto fail;
+ }
+ }
-
assert(path_is_absolute(path))
;
+
n[k] = NULL
;
- if (!(nce = new0(ExecCommand, 1)))
- goto fail;
+ if (!n[0]) {
+ log_error("[%s:%u] Invalid command line: %s", filename, line, rvalue);
+ strv_free(n);
+ return -EINVAL;
+ }
- nce->argv = n;
- nce->path = path;
+ if (!path)
+ if (!(path = strdup(n[0])))
+ goto fail;
- path_kill_slashes(nce->path);
+ assert(path_is_absolute(path));
+
+ if (!(nce = new0(ExecCommand, 1)))
+ goto fail;
- exec_command_append_list(e, nce);
+ nce->argv = n;
+ nce->path = path;
+
+ path_kill_slashes(nce->path);
+
+ exec_command_append_list(e, nce);
+
+ rvalue = state;
+ }
return 0;
return 0;