From: Lennart Poettering Date: Thu, 1 Dec 2016 22:19:31 +0000 (+0100) Subject: util-lib: add easy helpers for temporary directories that rmdir()ed via _cleanup_ X-Git-Tag: v233.3~138 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=c1748bb202ab6f6aa4e5c17409ef83cf3ffdaa37;hp=4d207ba52cb963c2ebec17bfc4300d570aa43846 util-lib: add easy helpers for temporary directories that rmdir()ed via _cleanup_ This adds mkdtemp_malloc() that is a combination of mkdtemp() plus strdup(). It initializes its return paremeter only if the temporary directory could be created successfully, so that the parameter is exactly non-NULL when the directory exists. rmdir_and_free() and rmdir_and_freep() are also added, and the latter may be used inside of _cleanup_ for such a directory string variable, to automatically rmdir() the directory if it is non-NULL when the scope exits. rmdir_and_free() is similar to the existing rm_rf_and_free() however, is only removes a single directory and does not operate recursively. --- diff --git a/src/basic/fileio.c b/src/basic/fileio.c index f4915b28a..8241e656a 100644 --- a/src/basic/fileio.c +++ b/src/basic/fileio.c @@ -1414,3 +1414,22 @@ int read_nul_string(FILE *f, char **ret) { return 0; } + +int mkdtemp_malloc(const char *template, char **ret) { + char *p; + + assert(template); + assert(ret); + + p = strdup(template); + if (!p) + return -ENOMEM; + + if (!mkdtemp(p)) { + free(p); + return -errno; + } + + *ret = p; + return 0; +} diff --git a/src/basic/fileio.h b/src/basic/fileio.h index 6a628086b..062aeed2e 100644 --- a/src/basic/fileio.h +++ b/src/basic/fileio.h @@ -49,8 +49,6 @@ int parse_env_file(const char *fname, const char *separator, ...) _sentinel_; int load_env_file(FILE *f, const char *fname, const char *separator, char ***l); int load_env_file_pairs(FILE *f, const char *fname, const char *separator, char ***l); -int merge_env_file(char ***env, FILE *f, const char *fname); - int write_env_file(const char *fname, char **l); int executable_is_script(const char *path, char **interpreter); @@ -96,3 +94,5 @@ int link_tmpfile(int fd, const char *path, const char *target); #endif // 0 int read_nul_string(FILE *f, char **ret); + +int mkdtemp_malloc(const char *template, char **ret); diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index d925cc2d0..3f47537de 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -97,3 +97,10 @@ enum { }; int chase_symlinks(const char *path_with_prefix, const char *root, unsigned flags, char **ret); + +/* Useful for usage with _cleanup_(), removes a directory and frees the pointer */ +static inline void rmdir_and_free(char *p) { + (void) rmdir(p); + free(p); +} +DEFINE_TRIVIAL_CLEANUP_FUNC(char*, rmdir_and_free);