From: Mike Yuan Date: Sat, 12 Aug 2023 17:15:20 +0000 (+0800) Subject: generators: use generator_open_unit_file where appropriate X-Git-Tag: v255-rc1~686 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=121ce4a6879b0222cb7a9c27730a27e4fbfe5fb2;p=thirdparty%2Fsystemd.git generators: use generator_open_unit_file where appropriate --- diff --git a/src/gpt-auto-generator/gpt-auto-generator.c b/src/gpt-auto-generator/gpt-auto-generator.c index ec047a14b52..2bcb887a82e 100644 --- a/src/gpt-auto-generator/gpt-auto-generator.c +++ b/src/gpt-auto-generator/gpt-auto-generator.c @@ -79,7 +79,7 @@ static int add_cryptsetup( if (r < 0) return log_error_errno(r, "Failed to generate unit name: %m"); - r = generator_open_unit_file(arg_dest, NULL, n, &f); + r = generator_open_unit_file(arg_dest, /* source = */ NULL, n, &f); if (r < 0) return r; @@ -175,7 +175,7 @@ static int add_mount( const char *description, const char *post) { - _cleanup_free_ char *unit = NULL, *crypto_what = NULL, *p = NULL; + _cleanup_free_ char *unit = NULL, *crypto_what = NULL; _cleanup_fclose_ FILE *f = NULL; int r; @@ -212,16 +212,11 @@ static int add_mount( if (r < 0) return log_error_errno(r, "Failed to generate unit name: %m"); - p = path_join(empty_to_root(arg_dest), unit); - if (!p) - return log_oom(); - - f = fopen(p, "wxe"); - if (!f) - return log_error_errno(errno, "Failed to create unit file %s: %m", unit); + r = generator_open_unit_file(arg_dest, /* source = */ NULL, unit, &f); + if (r < 0) + return r; fprintf(f, - "# Automatically generated by systemd-gpt-auto-generator\n\n" "[Unit]\n" "Description=%s\n" "Documentation=man:systemd-gpt-auto-generator(8)\n", @@ -253,7 +248,7 @@ static int add_mount( r = fflush_and_check(f); if (r < 0) - return log_error_errno(r, "Failed to write unit file %s: %m", p); + return log_error_errno(r, "Failed to write unit %s: %m", unit); if (growfs) { r = generator_hook_up_growfs(arg_dest, where, post); @@ -348,7 +343,7 @@ static int add_partition_mount( static int add_partition_swap(DissectedPartition *p) { const char *what; - _cleanup_free_ char *name = NULL, *unit = NULL, *crypto_what = NULL; + _cleanup_free_ char *name = NULL, *crypto_what = NULL; _cleanup_fclose_ FILE *f = NULL; int r; @@ -381,16 +376,11 @@ static int add_partition_swap(DissectedPartition *p) { if (r < 0) return log_error_errno(r, "Failed to generate unit name: %m"); - unit = path_join(empty_to_root(arg_dest), name); - if (!unit) - return log_oom(); - - f = fopen(unit, "wxe"); - if (!f) - return log_error_errno(errno, "Failed to create unit file %s: %m", unit); + r = generator_open_unit_file(arg_dest, /* source = */ NULL, name, &f); + if (r < 0) + return r; fprintf(f, - "# Automatically generated by systemd-gpt-auto-generator\n\n" "[Unit]\n" "Description=Swap Partition\n" "Documentation=man:systemd-gpt-auto-generator(8)\n"); @@ -407,7 +397,7 @@ static int add_partition_swap(DissectedPartition *p) { r = fflush_and_check(f); if (r < 0) - return log_error_errno(r, "Failed to write unit file %s: %m", unit); + return log_error_errno(r, "Failed to write unit %s: %m", name); return generator_add_symlink(arg_dest, SPECIAL_SWAP_TARGET, "wants", name); } @@ -423,7 +413,7 @@ static int add_automount( const char *description, usec_t timeout) { - _cleanup_free_ char *unit = NULL, *p = NULL; + _cleanup_free_ char *unit = NULL; _cleanup_fclose_ FILE *f = NULL; int r; @@ -448,16 +438,11 @@ static int add_automount( if (r < 0) return log_error_errno(r, "Failed to generate unit name: %m"); - p = path_join(arg_dest, unit); - if (!p) - return log_oom(); - - f = fopen(p, "wxe"); - if (!f) - return log_error_errno(errno, "Failed to create unit file %s: %m", unit); + r = generator_open_unit_file(arg_dest, /* source = */ NULL, unit, &f); + if (r < 0) + return r; fprintf(f, - "# Automatically generated by systemd-gpt-auto-generator\n\n" "[Unit]\n" "Description=%s\n" "Documentation=man:systemd-gpt-auto-generator(8)\n" @@ -470,7 +455,7 @@ static int add_automount( r = fflush_and_check(f); if (r < 0) - return log_error_errno(r, "Failed to write unit file %s: %m", p); + return log_error_errno(r, "Failed to write unit %s: %m", unit); return generator_add_symlink(arg_dest, SPECIAL_LOCAL_FS_TARGET, "wants", unit); } diff --git a/src/run-generator/run-generator.c b/src/run-generator/run-generator.c index dda7c36159e..5692b7a58ef 100644 --- a/src/run-generator/run-generator.c +++ b/src/run-generator/run-generator.c @@ -63,13 +63,11 @@ static int generate(void) { if (strv_isempty(arg_commands) && !arg_success_action) return 0; - p = strjoina(arg_dest, "/kernel-command-line.service"); - f = fopen(p, "wxe"); - if (!f) - return log_error_errno(errno, "Failed to create unit file %s: %m", p); + r = generator_open_unit_file(arg_dest, /* source = */ NULL, "kernel-command-line.service", &f); + if (r < 0) + return r; - fputs("# Automatically generated by systemd-run-generator\n\n" - "[Unit]\n" + fputs("[Unit]\n" "Description=Command from Kernel Command Line\n" "Documentation=man:systemd-run-generator(8)\n" "SourcePath=/proc/cmdline\n", f); @@ -99,7 +97,7 @@ static int generate(void) { r = fflush_and_check(f); if (r < 0) - return log_error_errno(r, "Failed to write unit file %s: %m", p); + return log_error_errno(r, "Failed to write unit kernel-command-line.service: %m"); /* Let's create a target we can link "default.target" to */ p = strjoina(arg_dest, "/kernel-command-line.target"); diff --git a/src/shared/generator.c b/src/shared/generator.c index 274b799b634..aced4949a9a 100644 --- a/src/shared/generator.c +++ b/src/shared/generator.c @@ -192,9 +192,12 @@ static int write_fsck_sysroot_service( _cleanup_free_ char *device = NULL, *escaped = NULL, *escaped2 = NULL; _cleanup_fclose_ FILE *f = NULL; - const char *fn; int r; + assert(unit); + assert(dir); + assert(what); + /* Writes out special versions of systemd-fsck-root.service and systemd-fsck-usr.service for use in * the initrd. The regular statically shipped versions of these unit files use / and /usr for as * paths, which doesn't match what we need for the initrd (where the dirs are /sysroot + @@ -208,35 +211,30 @@ static int write_fsck_sysroot_service( if (!escaped2) return log_oom(); - fn = strjoina(dir, "/", unit); - log_debug("Creating %s", fn); - r = unit_name_from_path(what, ".device", &device); if (r < 0) return log_error_errno(r, "Failed to convert device \"%s\" to unit name: %m", what); - f = fopen(fn, "wxe"); - if (!f) - return log_error_errno(errno, "Failed to create unit file %s: %m", fn); + r = generator_open_unit_file(dir, /* source = */ NULL, unit, &f); + if (r < 0) + return r; fprintf(f, - "# Automatically generated by %1$s\n\n" "[Unit]\n" - "Description=File System Check on %2$s\n" - "Documentation=man:%3$s(8)\n" + "Description=File System Check on %1$s\n" + "Documentation=man:%2$s(8)\n" "\n" "DefaultDependencies=no\n" - "BindsTo=%4$s\n" + "BindsTo=%3$s\n" "Conflicts=shutdown.target\n" - "After=%5$s%6$slocal-fs-pre.target %4$s\n" + "After=%4$s%5$slocal-fs-pre.target %3$s\n" "Before=shutdown.target\n" "\n" "[Service]\n" "Type=oneshot\n" "RemainAfterExit=yes\n" - "ExecStart=" SYSTEMD_FSCK_PATH " %7$s\n" + "ExecStart=" SYSTEMD_FSCK_PATH " %6$s\n" "TimeoutSec=infinity\n", - program_invocation_short_name, escaped, unit, device, @@ -246,7 +244,7 @@ static int write_fsck_sysroot_service( r = fflush_and_check(f); if (r < 0) - return log_error_errno(r, "Failed to write unit file %s: %m", fn); + return log_error_errno(r, "Failed to write unit %s: %m", unit); return 0; } @@ -474,10 +472,12 @@ int generator_hook_up_mkswap( const char *what) { _cleanup_free_ char *node = NULL, *unit = NULL, *escaped = NULL, *where_unit = NULL; - _cleanup_free_ char *unit_file = NULL; _cleanup_fclose_ FILE *f = NULL; int r; + assert(dir); + assert(what); + node = fstab_node_to_udev_node(what); if (!node) return log_oom(); @@ -493,12 +493,6 @@ int generator_hook_up_mkswap( return log_error_errno(r, "Failed to make unit instance name from path \"%s\": %m", node); - unit_file = path_join(dir, unit); - if (!unit_file) - return log_oom(); - - log_debug("Creating %s", unit_file); - escaped = cescape(node); if (!escaped) return log_oom(); @@ -508,13 +502,11 @@ int generator_hook_up_mkswap( return log_error_errno(r, "Failed to make unit name from path \"%s\": %m", what); - f = fopen(unit_file, "wxe"); - if (!f) - return log_error_errno(errno, "Failed to create unit file %s: %m", - unit_file); + r = generator_open_unit_file(dir, /* source = */ NULL, unit, &f); + if (r < 0) + return r; fprintf(f, - "# Automatically generated by %s\n\n" "[Unit]\n" "Description=Make Swap on %%f\n" "Documentation=man:systemd-mkswap@.service(8)\n" @@ -531,13 +523,12 @@ int generator_hook_up_mkswap( "RemainAfterExit=yes\n" "ExecStart="SYSTEMD_MAKEFS_PATH " swap %s\n" "TimeoutSec=infinity\n", - program_invocation_short_name, where_unit, escaped); r = fflush_and_check(f); if (r < 0) - return log_error_errno(r, "Failed to write unit file %s: %m", unit_file); + return log_error_errno(r, "Failed to write unit %s: %m", unit); return generator_add_symlink(dir, where_unit, "requires", unit); } @@ -548,10 +539,15 @@ int generator_hook_up_mkfs( const char *where, const char *type) { - _cleanup_free_ char *node = NULL, *unit = NULL, *unit_file = NULL, *escaped = NULL, *where_unit = NULL; + _cleanup_free_ char *node = NULL, *unit = NULL, *escaped = NULL, *where_unit = NULL; _cleanup_fclose_ FILE *f = NULL; + const char *fsck_unit; int r; + assert(dir); + assert(what); + assert(where); + node = fstab_node_to_udev_node(what); if (!node) return log_oom(); @@ -572,13 +568,6 @@ int generator_hook_up_mkfs( return log_error_errno(r, "Failed to make unit instance name from path \"%s\": %m", node); - unit_file = path_join(dir, unit); - if (!unit_file) - return log_oom(); - - log_debug("Creating %s", unit_file); - - const char *fsck_unit; if (in_initrd() && path_equal(where, "/sysroot")) fsck_unit = SPECIAL_FSCK_ROOT_SERVICE; else if (in_initrd() && path_equal(where, "/sysusr/usr")) @@ -595,13 +584,11 @@ int generator_hook_up_mkfs( return log_error_errno(r, "Failed to make unit name from path \"%s\": %m", where); - f = fopen(unit_file, "wxe"); - if (!f) - return log_error_errno(errno, "Failed to create unit file %s: %m", - unit_file); + r = generator_open_unit_file(dir, /* source = */ NULL, unit, &f); + if (r < 0) + return r; fprintf(f, - "# Automatically generated by %s\n\n" "[Unit]\n" "Description=Make File System on %%f\n" "Documentation=man:systemd-makefs@.service(8)\n" @@ -620,7 +607,6 @@ int generator_hook_up_mkfs( "RemainAfterExit=yes\n" "ExecStart="SYSTEMD_MAKEFS_PATH " %s %s\n" "TimeoutSec=infinity\n", - program_invocation_short_name, fsck_unit, where_unit, type, @@ -629,7 +615,7 @@ int generator_hook_up_mkfs( r = fflush_and_check(f); if (r < 0) - return log_error_errno(r, "Failed to write unit file %s: %m", unit_file); + return log_error_errno(r, "Failed to write unit %s: %m", unit); return generator_add_symlink(dir, where_unit, "requires", unit); } diff --git a/src/xdg-autostart-generator/xdg-autostart-service.c b/src/xdg-autostart-generator/xdg-autostart-service.c index 1861f86cf7c..90321b892fa 100644 --- a/src/xdg-autostart-generator/xdg-autostart-service.c +++ b/src/xdg-autostart-generator/xdg-autostart-service.c @@ -9,6 +9,7 @@ #include "conf-parser.h" #include "escape.h" #include "fd-util.h" +#include "fileio.h" #include "generator.h" #include "log.h" #include "nulstr-util.h" @@ -516,7 +517,7 @@ int xdg_autostart_service_generate_unit( const XdgAutostartService *service, const char *dest) { - _cleanup_free_ char *path_escaped = NULL, *exec_start = NULL, *unit = NULL; + _cleanup_free_ char *path_escaped = NULL, *exec_start = NULL; _cleanup_fclose_ FILE *f = NULL; _cleanup_strv_free_ char **only_show_in = NULL, **not_show_in = NULL; int r; @@ -603,16 +604,11 @@ int xdg_autostart_service_generate_unit( if (!path_escaped) return log_oom(); - unit = path_join(dest, service->name); - if (!unit) - return log_oom(); - - f = fopen(unit, "wxe"); - if (!f) - return log_error_errno(errno, "%s: failed to create unit file %s: %m", service->path, unit); + r = generator_open_unit_file(dest, /* source = */ NULL, service->name, &f); + if (r < 0) + return r; fprintf(f, - "# Automatically generated by systemd-xdg-autostart-generator\n\n" "[Unit]\n" "Documentation=man:systemd-xdg-autostart-generator(8)\n" "SourcePath=%s\n" @@ -686,6 +682,10 @@ int xdg_autostart_service_generate_unit( if (r < 0) return r; + r = fflush_and_check(f); + if (r < 0) + return log_error_errno(r, "Failed to write unit %s: %m", service->name); + log_debug("%s: symlinking %s in xdg-desktop-autostart.target/.wants%s", service->path, service->name, special_glyph(SPECIAL_GLYPH_ELLIPSIS)); return generator_add_symlink(dest, "xdg-desktop-autostart.target", "wants", service->name);