raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=5028a8807780892c361ae976b567cd924fa529b1
commit 5028a8807780892c361ae976b567cd924fa529b1 Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Fri Apr 8 12:12:21 2016 +0900 efreet: fix tmp file/dir/log handling to not leave a mess and work so efreets tmp file/cache/log file handling was broken, using filenames in tmp and renaming them to a caceh dir that can be on different filesystems. also log file should have been in a tmp dir ... and subsidrs cache didnt get renamed properly at all and thus not updated. @fix --- src/bin/efreet/efreetd.c | 41 +++++++++++++++++++++++++++-------------- src/bin/efreet/efreetd_cache.c | 19 +++++++++++++------ 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/bin/efreet/efreetd.c b/src/bin/efreet/efreetd.c index 870dea7..81d97aa 100644 --- a/src/bin/efreet/efreetd.c +++ b/src/bin/efreet/efreetd.c @@ -3,6 +3,8 @@ #endif #include <stdlib.h> +#include <netdb.h> +#include <unistd.h> #ifdef HAVE_SYS_RESOURCE_H #include <sys/time.h> #include <sys/resource.h> @@ -26,9 +28,12 @@ quit(void) int main(int argc, char *argv[]) { - char path[PATH_MAX]; + char path[PATH_MAX], buf[PATH_MAX]; FILE *log; int fd; + const char *s; + const char *log_file_dir = NULL; + const char *hostname_str = NULL; #ifdef HAVE_SYS_RESOURCE_H setpriority(PRIO_PROCESS, 0, 19); @@ -38,31 +43,37 @@ main(int argc, char *argv[]) if (!eina_init()) return 1; - snprintf(path, sizeof(path), "efreetd_XXXXXX.cache"); + if (!ecore_init()) goto ecore_error; + ecore_app_args_set(argc, (const char **)argv); + if (!ecore_file_init()) goto ecore_file_error; + if (!ipc_init()) goto ipc_error; + if (!cache_init()) goto cache_error; + + s = getenv("XDG_RUNTIME_DIR"); + if (s) log_file_dir = s; + else log_file_dir = "/tmp"; + if (gethostname(buf, sizeof(buf)) < 0) + hostname_str = ""; + else + hostname_str = buf; + snprintf(path, sizeof(path), "%s/efreetd_%s_XXXXXX.log", + log_file_dir, hostname_str); fd = eina_file_mkstemp(path, NULL); if (fd < 0) { - perror("mkstemp"); - goto ecore_error; + ERR("Can't create log file '%s'\b", path);; + goto tmp_error; } log = fdopen(fd, "wb"); - if (!log) - goto ecore_error; - + if (!log) goto tmp_error; eina_log_print_cb_set(eina_log_print_cb_file, log); efreetd_log_dom = eina_log_domain_register("efreetd", EFREETD_DEFAULT_LOG_COLOR); if (efreetd_log_dom < 0) { EINA_LOG_ERR("Efreet: Could not create a log domain for efreetd."); - goto ecore_error; + goto tmp_error; } - if (!ecore_init()) goto ecore_error; - ecore_app_args_set(argc, (const char **)argv); - if (!ecore_file_init()) goto ecore_file_error; - if (!ipc_init()) goto ipc_error; - if (!cache_init()) goto cache_error; - ecore_main_loop_begin(); cache_shutdown(); @@ -74,6 +85,8 @@ main(int argc, char *argv[]) eina_shutdown(); return 0; +tmp_error: + cache_shutdown(); cache_error: ipc_shutdown(); ipc_error: diff --git a/src/bin/efreet/efreetd_cache.c b/src/bin/efreet/efreetd_cache.c index 55e8130..fefc852 100644 --- a/src/bin/efreet/efreetd_cache.c +++ b/src/bin/efreet/efreetd_cache.c @@ -122,7 +122,8 @@ subdir_cache_init(void) EET_DATA_DESCRIPTOR_ADD_HASH(subdir_edd, Subdir_Cache, "dirs", dirs, subdir_dir_edd); // load subdirs from the cache file - snprintf(buf, sizeof(buf), "%s/efreet/subdirs_%s.eet", efreet_cache_home_get(), efreet_hostname_get()); + snprintf(buf, sizeof(buf), "%s/efreet/subdirs_%s.eet", + efreet_cache_home_get(), efreet_hostname_get()); ef = eet_open(buf, EET_FILE_MODE_READ); if (ef) { @@ -172,15 +173,15 @@ subdir_cache_save(void) if (!subdir_cache->dirs) return; // save to tmp file first - snprintf(buf2, sizeof(buf2), "%s/efreet/subdirs_%s.eet.XXXXXX.cache", efreet_cache_home_get(), efreet_hostname_get()); + snprintf(buf2, sizeof(buf2), "%s/efreet/subdirs_%s.eet.XXXXXX.cache", + efreet_cache_home_get(), efreet_hostname_get()); tmpfd = eina_file_mkstemp(buf2, &tmpstr); if (tmpfd < 0) return; // write out eet file to tmp file - ef = eet_open(buf2, EET_FILE_MODE_WRITE); + ef = eet_open(tmpstr, EET_FILE_MODE_WRITE); eet_data_write(ef, subdir_edd, "subdirs", subdir_cache, EET_COMPRESSION_SUPERFAST); eet_close(ef); - eina_tmpstr_del(tmpstr); /* * On Windows, buf2 has one remaining ref, hence it can not be renamed below. @@ -192,10 +193,16 @@ subdir_cache_save(void) #endif // atomically rename subdirs file on top from tmp file - snprintf(buf, sizeof(buf), "%s/efreet/subdirs_%s.eet", efreet_cache_home_get(), efreet_hostname_get()); - if (rename(buf2, buf) < 0) ERR("Can't save subdir cache %s", buf); + snprintf(buf, sizeof(buf), "%s/efreet/subdirs_%s.eet", + efreet_cache_home_get(), efreet_hostname_get()); + if (rename(tmpstr, buf) < 0) + { + unlink(tmpstr); + ERR("Can't save subdir cache %s", buf); + } // we dont need saving anymore - we just did subdir_need_save = EINA_FALSE; + eina_tmpstr_del(tmpstr); } static const Subdir_Cache_Dir * --