diff options
author | Anna (navi) Figueiredo Gomes <navi@vlhl.dev> | 2024-03-20 23:45:47 +0100 |
---|---|---|
committer | Anna (navi) Figueiredo Gomes <navi@vlhl.dev> | 2024-07-19 20:40:28 +0200 |
commit | c34fcd63f05044f9034b26c52f19c91e04668da7 (patch) | |
tree | 8ef449218cf736057197cd39fba1dac6117216c3 /src/openrc/rc.c | |
parent | 917a7031d946c0b608517936fab0f54689167265 (diff) | |
download | openrc-c34fcd63f05044f9034b26c52f19c91e04668da7.tar.xz |
openrc: dynamic paths for user services
add two api functions, `rc_service_dir` and `rc_sysconf_dir`, both are
generate paths (and sub-paths) for resources, and meant to replace the
hardcoded variables like `RC_SVCDIR`.
those functions differ by dynamically switching between the system path,
or the user path, set in their home folder or runtime directory.
this lays out the intial support for user services.
Signed-off-by: Anna (navi) Figueiredo Gomes <navi@vlhl.dev>
Diffstat (limited to 'src/openrc/rc.c')
-rw-r--r-- | src/openrc/rc.c | 83 |
1 files changed, 58 insertions, 25 deletions
diff --git a/src/openrc/rc.c b/src/openrc/rc.c index 15777c60..46e3022d 100644 --- a/src/openrc/rc.c +++ b/src/openrc/rc.c @@ -70,7 +70,7 @@ const char *usagestring = "" \ #define INITSH RC_LIBEXECDIR "/sh/init.sh" #define INITEARLYSH RC_LIBEXECDIR "/sh/init-early.sh" -#define INTERACTIVE RC_SVCDIR "/interactive" +#define INTERACTIVE_SUBDIR "/interactive" #define DEVBOOT "/dev/.rcboot" @@ -95,16 +95,18 @@ clean_failed(void) DIR *dp; struct dirent *d; char *path; + char *failed_dir; + xasprintf(&failed_dir, "%s/failed", rc_service_dir()); /* Clean the failed services state dir now */ - if ((dp = opendir(RC_SVCDIR "/failed"))) { + if ((dp = opendir(failed_dir))) { while ((d = readdir(dp))) { if (d->d_name[0] == '.' && (d->d_name[1] == '\0' || (d->d_name[1] == '.' && d->d_name[2] == '\0'))) continue; - xasprintf(&path, RC_SVCDIR "/failed/%s", d->d_name); + xasprintf(&path, "%s/%s", failed_dir, d->d_name); if (unlink(path)) eerror("%s: unlink `%s': %s", applet, path, strerror(errno)); @@ -112,16 +114,17 @@ clean_failed(void) } closedir(dp); } + free(failed_dir); } static void cleanup(void) { RC_PID *p, *tmp; + char *dir; - if (!rc_in_logger && !rc_in_plugin && - applet && (strcmp(applet, "rc") == 0 || strcmp(applet, "openrc") == 0)) - { + if (!rc_in_logger && !rc_in_plugin && applet && + (strcmp(applet, "rc") == 0 || strcmp(applet, "openrc") == 0)) { if (hook_out) rc_plugin_run(hook_out, runlevel); @@ -133,8 +136,14 @@ cleanup(void) } /* Clean runlevel start, stop markers */ - rmdir(RC_STARTING); - rmdir(RC_STOPPING); + xasprintf(&dir, "%s/%s", rc_service_dir(), RC_STARTING); + rmdir(dir); + free(dir); + + xasprintf(&dir, "%s/%s", rc_service_dir(), RC_STOPPING); + rmdir(dir); + free(dir); + clean_failed(); rc_logger_close(); } @@ -211,9 +220,14 @@ want_interactive(void) static void mark_interactive(void) { - FILE *fp = fopen(INTERACTIVE, "w"); + char *interactive_dir; + FILE *fp; + + xasprintf(&interactive_dir, "%s/%s", rc_service_dir(), INTERACTIVE_SUBDIR); + fp = fopen(interactive_dir, "w"); if (fp) fclose(fp); + free(interactive_dir); } static void @@ -649,9 +663,11 @@ do_start_services(const RC_STRINGLIST *start_services, bool parallel) bool interactive = false; RC_SERVICE state; bool crashed = false; + char *interactive_dir; + xasprintf(&interactive_dir, "%s/%s", rc_service_dir(), INTERACTIVE_SUBDIR); if (!rc_yesno(getenv("EINFO_QUIET"))) - interactive = exists(INTERACTIVE); + interactive = exists(interactive_dir); errno = 0; crashed = rc_conf_yesno("rc_crashed_start"); if (errno == ENOENT) @@ -710,10 +726,10 @@ do_start_services(const RC_STRINGLIST *start_services, bool parallel) strcmp(runlevel, getenv("RC_BOOTLEVEL")) == 0)) mark_interactive(); else { - if (exists(INTERACTIVE)) - unlink(INTERACTIVE); + if (exists(interactive_dir)) + unlink(interactive_dir); } - + free(interactive_dir); } #ifdef RC_DEBUG @@ -754,6 +770,9 @@ int main(int argc, char **argv) int depoptions = RC_DEP_STRICT | RC_DEP_TRACE; char *krunlevel = NULL; char *pidstr = NULL; + char *deptree_skewed; + char *stopping_dir; + char *starting_dir; int opt; bool parallel; int regen = 0; @@ -773,7 +792,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"); @@ -784,10 +802,6 @@ int main(int argc, char **argv) if (chdir("/") == -1) eerror("chdir: %s", strerror(errno)); - /* Ensure our environment is pure - * Also, add our configuration to it */ - env_filter(); - env_config(); /* complain about old configuration settings if they exist */ if (exists(RC_CONF_OLD)) { @@ -836,6 +850,14 @@ int main(int argc, char **argv) case_RC_COMMON_GETOPT } } + /* Register cleanup and set up env after flag parsing + * to assure user paths are still valid */ + atexit(cleanup); + + /* Ensure our environment is pure + * Also, add our configuration to it */ + env_filter(); + env_config(); newlevel = argv[optind++]; /* To make life easier, we only have the shutdown runlevel as @@ -952,17 +974,21 @@ int main(int argc, char **argv) /* Load our deptree */ if ((main_deptree = _rc_deptree_load(0, ®en)) == NULL) eerrorx("failed to load deptree"); - if (exists(RC_DEPTREE_SKEWED)) + + xasprintf(&deptree_skewed, "%s/%s", rc_service_dir(), RC_DEPTREE_SKEWED); + if (exists(deptree_skewed)) ewarn("WARNING: clock skew detected!"); + free(deptree_skewed); /* Clean the failed services state dir */ clean_failed(); - if (mkdir(RC_STOPPING, 0755) != 0) { + xasprintf(&stopping_dir, "%s/%s", rc_service_dir(), RC_STOPPING); + if (mkdir(stopping_dir, 0755) != 0) { if (errno == EACCES) eerrorx("%s: superuser access required", applet); eerrorx("%s: failed to create stopping dir `%s': %s", - applet, RC_STOPPING, strerror(errno)); + applet, stopping_dir, strerror(errno)); } /* Create a list of all services which we could stop (assuming @@ -1044,7 +1070,8 @@ int main(int argc, char **argv) going_down ? newlevel : runlevel); hook_out = 0; - rmdir(RC_STOPPING); + rmdir(stopping_dir); + free(stopping_dir); /* Store the new runlevel */ if (newlevel) { @@ -1061,7 +1088,9 @@ int main(int argc, char **argv) rc_logger_close(); #endif - mkdir(RC_STARTING, 0755); + xasprintf(&starting_dir, "%s/%s", rc_service_dir(), RC_STARTING); + mkdir(starting_dir, 0755); + free(starting_dir); rc_plugin_run(RC_HOOK_RUNLEVEL_START_IN, runlevel); hook_out = RC_HOOK_RUNLEVEL_START_OUT; @@ -1130,8 +1159,12 @@ int main(int argc, char **argv) * we need to delete them so that they are regenerated again in the * default runlevel as they may depend on things that are now * available */ - if (regen && strcmp(runlevel, bootlevel) == 0) - unlink(RC_DEPTREE_CACHE); + if (regen && strcmp(runlevel, bootlevel) == 0) { + char *deptree_cache; + xasprintf(&deptree_cache, "%s/%s", rc_service_dir(), RC_DEPTREE_CACHE); + unlink(deptree_cache); + free(deptree_cache); + } return EXIT_SUCCESS; } |