From bed3b484d4d560c2586d7e517a1336da53e73ac9 Mon Sep 17 00:00:00 2001 From: "Anna (navi) Figueiredo Gomes" Date: Sat, 21 Sep 2024 11:18:43 +0200 Subject: [PATCH] user services flag --- src/mark_service/mark_service.c | 3 +++ src/openrc-run/openrc-run.c | 7 +++++-- src/openrc/rc.c | 6 ++++-- src/service/service.c | 3 +++ src/shared/_usage.h | 9 +++++++-- src/value/value.c | 3 +++ 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/mark_service/mark_service.c b/src/mark_service/mark_service.c index 7d4d9d976..49e41f57c 100644 --- a/src/mark_service/mark_service.c +++ b/src/mark_service/mark_service.c @@ -45,6 +45,9 @@ int main(int argc, char **argv) if (service == NULL || *service == '\0') eerrorx("%s: no service specified", applet); + if (rc_yesno(getenv("RC_USER_SERVICES"))) + rc_set_user(); + if (!strncmp(applet, "mark_", 5) && (bit = lookup_service_state(applet + 5))) ok = rc_service_mark(service, bit); diff --git a/src/openrc-run/openrc-run.c b/src/openrc-run/openrc-run.c index e7eda8d18..7806cc8c0 100644 --- a/src/openrc-run/openrc-run.c +++ b/src/openrc-run/openrc-run.c @@ -1165,6 +1165,9 @@ int main(int argc, char **argv) exit(EXIT_FAILURE); } + if (rc_yesno(getenv("RC_USER_SERVICES"))) + rc_set_user(); + /* We need to work out the real full path to our service. * multiplexed services must point to a target in a init dir. */ if (!realpath(argv[1], service_path)) { @@ -1182,8 +1185,6 @@ int main(int argc, char **argv) service = normalize_path(argv[1]); applet = basename_c(service); - atexit(cleanup); - if (argc < 3) usage(EXIT_FAILURE); @@ -1277,6 +1278,8 @@ int main(int argc, char **argv) case_RC_COMMON_GETOPT } + atexit(cleanup); + if (rc_yesno(getenv("RC_NODEPS"))) deps = false; diff --git a/src/openrc/rc.c b/src/openrc/rc.c index 3d9201c6c..c609e9693 100644 --- a/src/openrc/rc.c +++ b/src/openrc/rc.c @@ -772,7 +772,7 @@ int main(int argc, char **argv) RC_STRING *service; bool going_down = false; int depoptions = RC_DEP_STRICT | RC_DEP_TRACE; - const char *svcdir = rc_svcdir(); + const char *svcdir; char *rc_starting, *rc_stopping; char *deptree_skewed; char *krunlevel = NULL; @@ -796,7 +796,6 @@ int main(int argc, char **argv) applet = basename_c(argv[0]); LIST_INIT(&service_pids); LIST_INIT(&free_these_pids); - atexit(cleanup); if (!applet) eerrorx("arguments required"); @@ -859,6 +858,7 @@ int main(int argc, char **argv) } } + svcdir = rc_svcdir(); newlevel = argv[optind++]; /* To make life easier, we only have the shutdown runlevel as * nothing really needs to know that we're rebooting. @@ -870,6 +870,8 @@ int main(int argc, char **argv) } } + atexit(cleanup); + /* Enable logging */ setenv("EINFO_LOG", "openrc", 1); diff --git a/src/service/service.c b/src/service/service.c index 2545a0229..6444d6802 100644 --- a/src/service/service.c +++ b/src/service/service.c @@ -40,6 +40,9 @@ int main(int argc, char **argv) if (service == NULL || *service == '\0') eerrorx("%s: no service specified", applet); + if (rc_yesno(getenv("RC_USER_SERVICES"))) + rc_set_user(); + state = rc_service_state(service); bit = lookup_service_state(applet); if (bit) { diff --git a/src/shared/_usage.h b/src/shared/_usage.h index 91b956e06..c165011a0 100644 --- a/src/shared/_usage.h +++ b/src/shared/_usage.h @@ -12,8 +12,9 @@ #include #include +#include "librc.h" -#define getoptstring_COMMON "ChqVv" +#define getoptstring_COMMON "ChqVvU" #define longopts_COMMON \ { "help", 0, NULL, 'h'}, \ @@ -21,6 +22,7 @@ { "version", 0, NULL, 'V'}, \ { "verbose", 0, NULL, 'v'}, \ { "quiet", 0, NULL, 'q'}, \ + { "user", 0, NULL, 'U'}, \ { NULL, 0, NULL, 0 } #define longopts_help_COMMON \ @@ -28,13 +30,15 @@ "Disable color output", \ "Display software version", \ "Run verbosely", \ - "Run quietly (repeat to suppress errors)" + "Run quietly (repeat to suppress errors)" \ + "Run in user mode" #define case_RC_COMMON_getopt_case_C setenv ("EINFO_COLOR", "NO", 1); #define case_RC_COMMON_getopt_case_h usage (EXIT_SUCCESS); #define case_RC_COMMON_getopt_case_V if (argc == 2) show_version(); #define case_RC_COMMON_getopt_case_v setenv ("EINFO_VERBOSE", "YES", 1); #define case_RC_COMMON_getopt_case_q set_quiet_options(); +#define case_RC_COMMON_getopt_case_U rc_set_user(); #define case_RC_COMMON_getopt_default usage (EXIT_FAILURE); #define case_RC_COMMON_GETOPT \ @@ -43,6 +47,7 @@ case 'V': case_RC_COMMON_getopt_case_V; break; \ case 'v': case_RC_COMMON_getopt_case_v; break; \ case 'q': case_RC_COMMON_getopt_case_q; break; \ + case 'U': case_RC_COMMON_getopt_case_U; break; \ default: case_RC_COMMON_getopt_default; break; extern const char *applet; diff --git a/src/value/value.c b/src/value/value.c index e5190379d..c9620cf0c 100644 --- a/src/value/value.c +++ b/src/value/value.c @@ -33,6 +33,9 @@ int main(int argc, char **argv) if (service == NULL) eerrorx("%s: no service specified", applet); + if (rc_yesno(getenv("RC_USER_SERVICES"))) + rc_set_user(); + if (argc < 2 || !argv[1] || *argv[1] == '\0') eerrorx("%s: no option specified", applet);