Re: [PATCH] start-stop-daemon: add chdir option
Applied, thank you. On Wed, Oct 25, 2023 at 4:44 PM Esa Jääskelä wrote: > > Add option to change the running directory before starting the process. > This can be done using -d or --chdir options. Add also test cases to > start-stop-daemon to test out the directory change option. > > Signed-off-by: ejaaskel > --- > TODO | 2 -- > debianutils/start_stop_daemon.c | 21 ++--- > testsuite/start-stop-daemon.tests | 20 > 3 files changed, 34 insertions(+), 9 deletions(-) > > diff --git a/TODO b/TODO > index 72ae0f88d..6c7415a81 100644 > --- a/TODO > +++ b/TODO > @@ -222,8 +222,6 @@ Minor stuff: > --- >unify progress_meter. wget, flash_eraseall, pipe_progress, fbsplash, > setfiles. > --- > - support start-stop-daemon -d > > > (TODO list after discussion 11.05.2009) > > diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c > index 3e5dd9faa..88c2be11c 100644 > --- a/debianutils/start_stop_daemon.c > +++ b/debianutils/start_stop_daemon.c > @@ -105,6 +105,7 @@ Misc options: > //usage: "\n -N NChange nice level" > //usage: ) > //usage: "\n -c USER[:[GRP]] Change user/group" > +//usage: "\n -d PATH Change path" > //usage: "\n -m Write PID to pidfile specified by -p" > //usage: "\n-K only:" > //usage: "\n -s SIG Signal to send" > @@ -138,11 +139,12 @@ enum { > OPT_s = (1 << 8), // -s > OPT_u = (1 << 9), // -u > OPT_c = (1 << 10), // -c > - OPT_x = (1 << 11), // -x > - OPT_p = (1 << 12), // -p > - OPT_OKNODO = (1 << 13) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, > // -o > - OPT_VERBOSE= (1 << 14) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, > // -v > - OPT_NICELEVEL = (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, > // -N > + OPT_d = (1 << 11), // -d > + OPT_x = (1 << 12), // -x > + OPT_p = (1 << 13), // -p > + OPT_OKNODO = (1 << 14) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, > // -o > + OPT_VERBOSE= (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, > // -v > + OPT_NICELEVEL = (1 << 16) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, > // -N > }; > #define QUIET (option_mask32 & OPT_QUIET) > #define TEST (option_mask32 & OPT_TEST) > @@ -391,6 +393,7 @@ static const char start_stop_daemon_longopts[] ALIGN1 = > "signal\0" Required_argument "s" > "user\0" Required_argument "u" > "chuid\0"Required_argument "c" > + "chdir\0"Required_argument "d" > "exec\0" Required_argument "x" > "pidfile\0" Required_argument "p" > # if ENABLE_FEATURE_START_STOP_DAEMON_FANCY > @@ -411,6 +414,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char > **argv) > char *signame; > char *startas = NULL; > char *chuid; > + char *chdir; > #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY > // char *retry_arg = NULL; > // int retries = -1; > @@ -420,7 +424,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char > **argv) > INIT_G(); > > opt = GETOPT32(argv, "^" > - "KSbqtma:n:s:u:c:x:p:" > + "KSbqtma:n:s:u:c:d:x:p:" > IF_FEATURE_START_STOP_DAEMON_FANCY("ovN:R:") > /* -K or -S is required; they are mutually exclusive > */ > /* -p is required if -m is given */ > @@ -432,7 +436,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char > **argv) > "K:S:K--S:S--K:m?p:K?xpun" > IF_FEATURE_START_STOP_DAEMON_FANCY("q-v"), > LONGOPTS > - , , , , , , > > + , , , , , , > , > IF_FEATURE_START_STOP_DAEMON_FANCY(,_N) > /* We accept and ignore -R / --retry */ > IF_FEATURE_START_STOP_DAEMON_FANCY(,NULL) > @@ -560,6 +564,9 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char > **argv) > setgroups(1, ); > } > } > + if (opt & OPT_d) { > + xchdir(chdir); > + } > /* Try: > * strace -oLOG start-stop-daemon -S -x /bin/usleep -a qwerty 50 > * should exec "/bin/usleep", but argv[0] should be "qwerty": > diff --git a/testsuite/start-stop-daemon.tests > b/testsuite/start-stop-daemon.tests > index 0757b1288..e1e49ab5f 100755 > --- a/testsuite/start-stop-daemon.tests > +++ b/testsuite/start-stop-daemon.tests > @@ -11,6 +11,21 @@ testing "start-stop-daemon -x without -a" \ > "0\n" \ > "" "" > > +testing "start-stop-daemon -x with -d on existing directory" \ > + 'start-stop-daemon -S -d /tmp -x true 2>&1; echo $?' \ > + "0\n" \ > + "" "" > + > +testing
[PATCH] start-stop-daemon: add chdir option
Add option to change the running directory before starting the process. This can be done using -d or --chdir options. Add also test cases to start-stop-daemon to test out the directory change option. Signed-off-by: ejaaskel --- TODO | 2 -- debianutils/start_stop_daemon.c | 21 ++--- testsuite/start-stop-daemon.tests | 20 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/TODO b/TODO index 72ae0f88d..6c7415a81 100644 --- a/TODO +++ b/TODO @@ -222,8 +222,6 @@ Minor stuff: --- unify progress_meter. wget, flash_eraseall, pipe_progress, fbsplash, setfiles. --- - support start-stop-daemon -d (TODO list after discussion 11.05.2009) diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c index 3e5dd9faa..88c2be11c 100644 --- a/debianutils/start_stop_daemon.c +++ b/debianutils/start_stop_daemon.c @@ -105,6 +105,7 @@ Misc options: //usage: "\n -N NChange nice level" //usage: ) //usage: "\n -c USER[:[GRP]] Change user/group" +//usage: "\n -d PATH Change path" //usage: "\n -m Write PID to pidfile specified by -p" //usage: "\n-K only:" //usage: "\n -s SIG Signal to send" @@ -138,11 +139,12 @@ enum { OPT_s = (1 << 8), // -s OPT_u = (1 << 9), // -u OPT_c = (1 << 10), // -c - OPT_x = (1 << 11), // -x - OPT_p = (1 << 12), // -p - OPT_OKNODO = (1 << 13) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -o - OPT_VERBOSE= (1 << 14) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -v - OPT_NICELEVEL = (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -N + OPT_d = (1 << 11), // -d + OPT_x = (1 << 12), // -x + OPT_p = (1 << 13), // -p + OPT_OKNODO = (1 << 14) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -o + OPT_VERBOSE= (1 << 15) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -v + OPT_NICELEVEL = (1 << 16) * ENABLE_FEATURE_START_STOP_DAEMON_FANCY, // -N }; #define QUIET (option_mask32 & OPT_QUIET) #define TEST (option_mask32 & OPT_TEST) @@ -391,6 +393,7 @@ static const char start_stop_daemon_longopts[] ALIGN1 = "signal\0" Required_argument "s" "user\0" Required_argument "u" "chuid\0"Required_argument "c" + "chdir\0"Required_argument "d" "exec\0" Required_argument "x" "pidfile\0" Required_argument "p" # if ENABLE_FEATURE_START_STOP_DAEMON_FANCY @@ -411,6 +414,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) char *signame; char *startas = NULL; char *chuid; + char *chdir; #if ENABLE_FEATURE_START_STOP_DAEMON_FANCY // char *retry_arg = NULL; // int retries = -1; @@ -420,7 +424,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) INIT_G(); opt = GETOPT32(argv, "^" - "KSbqtma:n:s:u:c:x:p:" + "KSbqtma:n:s:u:c:d:x:p:" IF_FEATURE_START_STOP_DAEMON_FANCY("ovN:R:") /* -K or -S is required; they are mutually exclusive */ /* -p is required if -m is given */ @@ -432,7 +436,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) "K:S:K--S:S--K:m?p:K?xpun" IF_FEATURE_START_STOP_DAEMON_FANCY("q-v"), LONGOPTS - , , , , , , + , , , , , , , IF_FEATURE_START_STOP_DAEMON_FANCY(,_N) /* We accept and ignore -R / --retry */ IF_FEATURE_START_STOP_DAEMON_FANCY(,NULL) @@ -560,6 +564,9 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) setgroups(1, ); } } + if (opt & OPT_d) { + xchdir(chdir); + } /* Try: * strace -oLOG start-stop-daemon -S -x /bin/usleep -a qwerty 50 * should exec "/bin/usleep", but argv[0] should be "qwerty": diff --git a/testsuite/start-stop-daemon.tests b/testsuite/start-stop-daemon.tests index 0757b1288..e1e49ab5f 100755 --- a/testsuite/start-stop-daemon.tests +++ b/testsuite/start-stop-daemon.tests @@ -11,6 +11,21 @@ testing "start-stop-daemon -x without -a" \ "0\n" \ "" "" +testing "start-stop-daemon -x with -d on existing directory" \ + 'start-stop-daemon -S -d /tmp -x true 2>&1; echo $?' \ + "0\n" \ + "" "" + +testing "start-stop-daemon -x with -d on existing and check dir" \ + 'output=$(start-stop-daemon -S -d /tmp -x pwd); echo $output' \ + "/tmp\n" \ + "" "" + +testing "start-stop-daemon -x with --chdir on existing and check dir" \ + 'output=$(start-stop-daemon -S --chdir /tmp -x pwd); echo $output' \ +