generator: add generator_open_unit_file_full to allow creating temporary units

This function is like `generator_open_unit_file`, but if `ret_temp_path` is
passed, a temporary unit is created instead.
This commit is contained in:
Antonio Alvarez Feijoo
2023-04-10 15:18:33 +02:00
parent 737a9edc88
commit 8a84e0d796
2 changed files with 36 additions and 20 deletions
+31 -15
View File
@@ -21,41 +21,57 @@
#include "specifier.h"
#include "string-util.h"
#include "time-util.h"
#include "tmpfile-util.h"
#include "unit-name.h"
int generator_open_unit_file(
int generator_open_unit_file_full(
const char *dir,
const char *source,
const char *fn,
FILE **ret) {
FILE **ret_file,
char **ret_temp_path) {
_cleanup_free_ char *p = NULL;
FILE *f;
int r;
assert(dir);
assert(fn);
assert(ret);
assert(ret_file);
p = path_join(dir, fn);
if (!p)
return log_oom();
/* If <ret_temp_path> is specified, it creates a temporary unit file and also returns its
* temporary path. */
r = fopen_unlocked(p, "wxe", &f);
if (r < 0) {
if (source && r == -EEXIST)
return log_error_errno(r,
"Failed to create unit file '%s', as it already exists. Duplicate entry in '%s'?",
p, source);
if (ret_temp_path) {
r = fopen_temporary(dir, &f, &p);
if (r < 0)
return log_error_errno(r, "Failed to create temporary unit file in '%s': %m", dir);
return log_error_errno(r, "Failed to create unit file '%s': %m", p);
(void) fchmod(fileno(f), 0644);
*ret_temp_path = TAKE_PTR(p);
} else {
assert(fn);
p = path_join(dir, fn);
if (!p)
return log_oom();
r = fopen_unlocked(p, "wxe", &f);
if (r < 0) {
if (source && r == -EEXIST)
return log_error_errno(r,
"Failed to create unit file '%s', as it already exists. Duplicate entry in '%s'?",
p, source);
return log_error_errno(r, "Failed to create unit file '%s': %m", p);
}
}
fprintf(f,
"# Automatically generated by %s\n\n",
program_invocation_short_name);
*ret = f;
*ret_file = f;
return 0;
}
+5 -5
View File
@@ -6,11 +6,11 @@
#include "macro.h"
#include "main-func.h"
int generator_open_unit_file(
const char *dest,
const char *source,
const char *name,
FILE **file);
int generator_open_unit_file_full(const char *dest, const char *source, const char *name, FILE **ret_file, char **ret_temp_path);
static inline int generator_open_unit_file(const char *dest, const char *source, const char *name, FILE **ret_file) {
return generator_open_unit_file_full(dest, source, name, ret_file, NULL);
}
int generator_add_symlink_full(const char *dir, const char *dst, const char *dep_type, const char *src, const char *instance);