From 1b259f1ae798099de280dd0ee10018d1fd54be04 Mon Sep 17 00:00:00 2001 From: Eric Engestrom Date: Mon, 3 Jun 2019 17:51:37 +0100 Subject: [PATCH] util: add os_file_create_unique() MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Eric Engestrom Reviewed-by: Kristian H. Kristensen Reviewed-by: Marek Olšák --- src/util/os_file.c | 23 +++++++++++++++++++++++ src/util/os_file.h | 11 +++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/util/os_file.c b/src/util/os_file.c index 756164c..ae41506 100644 --- a/src/util/os_file.c +++ b/src/util/os_file.c @@ -6,7 +6,30 @@ #include "os_file.h" #include +#include #include +#include + + +#if defined(WIN32) +#include +#define open _open +#define fdopen _fdopen +#define O_CREAT _O_CREAT +#define O_EXCL _O_EXCL +#define O_WRONLY _O_WRONLY +#endif + + +FILE * +os_file_create_unique(const char *filename, int filemode) +{ + int fd = open(filename, O_CREAT | O_EXCL | O_WRONLY, filemode); + if (fd == -1) + return NULL; + return fdopen(fd, "w"); +} + #if defined(__linux__) diff --git a/src/util/os_file.h b/src/util/os_file.h index 2f97c19..d691302 100644 --- a/src/util/os_file.h +++ b/src/util/os_file.h @@ -8,11 +8,22 @@ #ifndef _OS_FILE_H_ #define _OS_FILE_H_ +#include + #ifdef __cplusplus extern "C" { #endif /* + * Create a new file and opens it for writing-only. + * If the given filename already exists, nothing is done and NULL is returned. + * `errno` gets set to the failure reason; if that is not EEXIST, the caller + * might want to do something other than trying again. + */ +FILE * +os_file_create_unique(const char *filename, int filemode); + +/* * Read a file. * Returns a char* that the caller must free(), or NULL and sets errno. */ -- 2.7.4