diff options
| author | Dennis Camera <skonfig@dtnr.ch> | 2022-08-21 01:37:36 +0200 |
|---|---|---|
| committer | Dennis Camera <skonfig@dtnr.ch> | 2022-08-21 01:37:36 +0200 |
| commit | 918927457b353cb717034a4d8497e75b11a82018 (patch) | |
| tree | 2ecbbd211025265f61991d807650f41c5be768fc | |
| parent | e2275c71243c924e521857c4d3ccde628dce7c76 (diff) | |
| download | skonfig-c-918927457b353cb717034a4d8497e75b11a82018.tar.gz skonfig-c-918927457b353cb717034a4d8497e75b11a82018.zip | |
[src/run.c] Generate and store object marker
| -rw-r--r-- | src/run.c | 52 |
1 files changed, 51 insertions, 1 deletions
@@ -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; } |
