summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Camera <skonfig@dtnr.ch>2022-08-21 01:37:36 +0200
committerDennis Camera <skonfig@dtnr.ch>2022-08-21 01:37:36 +0200
commit918927457b353cb717034a4d8497e75b11a82018 (patch)
tree2ecbbd211025265f61991d807650f41c5be768fc
parente2275c71243c924e521857c4d3ccde628dce7c76 (diff)
downloadskonfig-c-918927457b353cb717034a4d8497e75b11a82018.tar.gz
skonfig-c-918927457b353cb717034a4d8497e75b11a82018.zip
[src/run.c] Generate and store object marker
-rw-r--r--src/run.c52
1 files changed, 51 insertions, 1 deletions
diff --git a/src/run.c b/src/run.c
index 5fb9864..a0a58ea 100644
--- a/src/run.c
+++ b/src/run.c
@@ -24,7 +24,7 @@
#if HAVE_MKDTEMP && !HAVE_DECL_MKDTEMP
extern char *mkdtemp(char *);
#endif
-#if HAVE_MKTEMP && !HAVE_DECLMKTEMP
+#if HAVE_MKTEMP && !HAVE_DECL_MKTEMP
extern char *mktemp(char *);
#endif
#if HAVE_TEMPNAM && !HAVE_DECL_TEMPNAM
@@ -36,6 +36,10 @@ extern char *tempnam(const char *, const char *);
#define P_tmpdir "/tmp"
#endif
+/* as per mktemp(3p) the last 6 characters of object_marker_tmpl must be Xs */
+static char *object_marker_tmpl = ".skonfig-XXXXXX";
+
+
/**
* mktempdir:
* creates a temporary directory in a suitable location.
@@ -345,6 +349,35 @@ sk_run_error sk_run_install_type_cmds(const char *local_hostdir) {
return SK_RUN_OK;
}
+sk_run_error sk_run_setup_object_marker_file(
+ const char *restrict local_hostdir, const char *restrict object_marker) {
+ char file[PATH_MAX+1];
+ if (PATH_MAX < pathjoin_r(
+ file, PATH_MAX+1, local_hostdir, "object_marker")) {
+ sk_error("object_marker file name too long");
+ return SK_RUN_GENERIC_ERROR;
+ }
+
+ FILE *fh = fopen(file, "w");
+ if (NULL == fh) {
+ sk_error("could not open object_marker file: %s", strerror(errno));
+ return SK_RUN_GENERIC_ERROR;
+ }
+
+ size_t len = strlen(object_marker);
+ if (len > fwrite(object_marker, sizeof(char), len, fh)) {
+ sk_error("failed to store object marker: %s", strerror(errno));
+ return SK_RUN_GENERIC_ERROR;
+ }
+ (void)fputc('\n', fh);
+
+ (void)fclose(fh);
+
+ sk_trace("Object marker %s saved in %s", object_marker, file);
+
+ return SK_RUN_OK;
+}
+
sk_run_error sk_run_init_manifest(
const char *target_host, bool dry_run, struct sk_config *config) {
/* check if the initial manifest file exists */
@@ -380,6 +413,23 @@ sk_run_error sk_run_host(
/* link types for type runner */
rv = sk_run_install_type_cmds(local_hostdir);
if (SK_RUN_OK != rv) return rv;
+
+ /* generate and store object marker file */
+ char object_marker[strlen(object_marker_tmpl)+1];
+#if HAVE_MKTEMP
+ strcpy(object_marker, object_marker_tmpl);
+ mktemp(object_marker);
+ if (!*object_marker) {
+ sk_error("generating object marker failed: %s", strerror(errno));
+ return SK_RUN_GENERIC_ERROR;
+ }
+#else
+#error no available implementation to generate object marker
+#endif
+
+ rv = sk_run_setup_object_marker_file(local_hostdir, object_marker);
+ if (SK_RUN_OK != rv) return rv;
+
return SK_RUN_OK;
}