From 1ac9ef013b0e9c737d6909ab41a38b45a3d36e43 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 1 Jun 2016 17:08:49 +0000 Subject: fix #4545: create directory for log file if it does not exist --- src/util/common_logging.c | 10 ++++++++++ src/util/disk.c | 13 ++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/util/common_logging.c b/src/util/common_logging.c index 0cefa194d..4d78f4898 100644 --- a/src/util/common_logging.c +++ b/src/util/common_logging.c @@ -25,6 +25,7 @@ */ #include "platform.h" #include "gnunet_crypto_lib.h" +#include "gnunet_disk_lib.h" #include "gnunet_strings_lib.h" #include @@ -357,6 +358,15 @@ setup_log_file (const struct tm *tm) return GNUNET_OK; /* no change */ log_rotate (last_fn); strcpy (last_fn, fn); + if (GNUNET_SYSERR == + GNUNET_DISK_directory_create_for_file (fn)) + { + fprintf (stderr, + "Failed to create directory for `%s': %s\n", + fn, + STRERROR (errno)); + return GNUNET_SYSERR; + } #if WINDOWS altlog_fd = OPEN (fn, O_APPEND | O_BINARY | diff --git a/src/util/disk.c b/src/util/disk.c index 91ce02b05..4624df7c1 100644 --- a/src/util/disk.c +++ b/src/util/disk.c @@ -814,23 +814,30 @@ GNUNET_DISK_directory_create_for_file (const char *filename) char *rdir; size_t len; int ret; + int eno; rdir = GNUNET_STRINGS_filename_expand (filename); - if (rdir == NULL) + if (NULL == rdir) + { + errno = EINVAL; return GNUNET_SYSERR; + } len = strlen (rdir); while ((len > 0) && (rdir[len] != DIR_SEPARATOR)) len--; rdir[len] = '\0'; /* The empty path is invalid and in this case refers to / */ - if (0 == len) { + if (0 == len) + { GNUNET_free (rdir); rdir = GNUNET_strdup ("/"); } ret = GNUNET_DISK_directory_create (rdir); - if ((ret == GNUNET_OK) && (0 != ACCESS (rdir, W_OK))) + if ((GNUNET_OK == ret) && (0 != ACCESS (rdir, W_OK))) ret = GNUNET_NO; + eno = errno; GNUNET_free (rdir); + errno = eno; return ret; } -- cgit v1.2.3