cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=0cd59bb199d8704bba9707721fbe41bf5c7c0b03
commit 0cd59bb199d8704bba9707721fbe41bf5c7c0b03 Author: Cedric BAIL <ced...@osg.samsung.com> Date: Fri Oct 23 12:34:53 2015 -0700 efreet: make sure that we use the right directory and ef for the cache. --- src/bin/efreet/efreet_desktop_cache_create.c | 122 +++++++++++++++++---------- 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/src/bin/efreet/efreet_desktop_cache_create.c b/src/bin/efreet/efreet_desktop_cache_create.c index 4ab9fc6..db14d46 100644 --- a/src/bin/efreet/efreet_desktop_cache_create.c +++ b/src/bin/efreet/efreet_desktop_cache_create.c @@ -23,8 +23,6 @@ static int _efreet_desktop_cache_log_dom = -1; #include "efreet_cache_private.h" static Eet_Data_Descriptor *edd = NULL; -static Eet_File *ef = NULL; -static Eet_File *util_ef = NULL; static Eina_Hash *desktops = NULL; @@ -43,7 +41,7 @@ static Eina_Hash *environments = NULL; static Eina_Hash *keywords = NULL; static int -cache_add(const char *path, const char *file_id, int priority EINA_UNUSED, int *changed) +cache_add(Eet_File *ef, const char *path, const char *file_id, int priority EINA_UNUSED, int *changed) { Efreet_Desktop *desk; char *ext; @@ -145,7 +143,8 @@ stat_cmp(const void *a, const void *b) } static int -cache_scan(Eina_Inarray *stack, const char *path, const char *base_id, +cache_scan(Eet_File *ef, + Eina_Inarray *stack, const char *path, const char *base_id, int priority, int recurse, int *changed) { char *file_id = NULL; @@ -184,13 +183,13 @@ cache_scan(Eina_Inarray *stack, const char *path, const char *base_id, { if (recurse) { - ret = cache_scan(stack, info->path, file_id, priority, recurse, changed); + ret = cache_scan(ef, stack, info->path, file_id, priority, recurse, changed); if (!ret) break; } } else { - ret = cache_add(info->path, file_id, priority, changed); + ret = cache_add(ef, info->path, file_id, priority, changed); if (!ret) break; } } @@ -257,6 +256,47 @@ changed: return 1; } +static Eet_File * +_open_temp_eet(Eina_Tmpstr **path, const char *rel) +{ + Eet_File *ef; + int tmpfd; + char buffer[PATH_MAX]; + + { + char *tmp; + + tmp = strdup(rel); + snprintf(buffer, sizeof(buffer), "%s.XXXXXX.cache", basename(tmp)); + free(tmp); + } + + tmpfd = eina_file_mkstemp(buffer, path); + if (tmpfd < 0) return NULL; + close(tmpfd); + + ef = eet_open(*path, EET_FILE_MODE_READ_WRITE); + if (!ef) goto on_error; + + return ef; + + on_error: + eina_tmpstr_del(*path); + *path = NULL; + + return NULL; +} + +static Eina_Bool +_file_move(const char *src, const char *dst) +{ + if (rename(src, dst) == 0) return EINA_TRUE; + + return eina_file_copy(src, dst, + EINA_FILE_COPY_DATA | EINA_FILE_COPY_PERMISSION, + NULL, NULL); +} + int main(int argc, char **argv) { @@ -272,15 +312,17 @@ main(int argc, char **argv) Eina_List *extra_dirs = NULL; Eina_List *l = NULL; Eina_Inarray *stack = NULL; + Eet_File *ef = NULL; + Eet_File *util_ef = NULL; int priority = 0; char *dir = NULL; char *path; - int lockfd = -1, tmpfd; + int lockfd = -1; int changed = 0; int i; - char file[PATH_MAX] = { '\0' }; - char util_file[PATH_MAX] = { '\0' }; - Eina_Tmpstr *tmpstr = NULL; + char buffer[PATH_MAX]; + Eina_Tmpstr *tmpc = NULL; + Eina_Tmpstr *tmpuc = NULL; if (!eina_init()) goto eina_error; _efreet_desktop_cache_log_dom = @@ -328,11 +370,11 @@ main(int argc, char **argv) if (!efreet_init()) goto efreet_error; /* create homedir */ - snprintf(file, sizeof(file), "%s/efreet", efreet_cache_home_get()); - if (!ecore_file_exists(file)) + snprintf(buffer, sizeof(buffer), "%s/efreet", efreet_cache_home_get()); + if (!ecore_file_exists(buffer)) { - if (!ecore_file_mkpath(file)) goto efreet_error; - efreet_setowner(file); + if (!ecore_file_mkpath(buffer)) goto efreet_error; + efreet_setowner(buffer); } /* lock process, so that we only run one copy of this program */ @@ -351,22 +393,10 @@ main(int argc, char **argv) } /* create cache */ - snprintf(file, sizeof(file), "%s.XXXXXX.cache", efreet_desktop_cache_file()); - tmpfd = eina_file_mkstemp(file, &tmpstr); - if (tmpfd < 0) goto error; - close(tmpfd); - ef = eet_open(tmpstr, EET_FILE_MODE_READ_WRITE); - eina_tmpstr_del(tmpstr); - tmpstr = NULL; + ef = _open_temp_eet(&tmpc, efreet_desktop_cache_file()); if (!ef) goto error; - snprintf(util_file, sizeof(util_file), "%s.XXXXXX.cache", efreet_desktop_util_cache_file()); - tmpfd = eina_file_mkstemp(util_file, &tmpstr); - if (tmpfd < 0) goto error; - close(tmpfd); - util_ef = eet_open(util_file, EET_FILE_MODE_READ_WRITE); - eina_tmpstr_del(tmpstr); - tmpstr = NULL; + util_ef = _open_temp_eet(&tmpuc, efreet_desktop_util_cache_file()); if (!util_ef) goto error; /* write cache version */ @@ -395,6 +425,7 @@ main(int argc, char **argv) dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(), "applications"); if (!dirs) goto error; + stack = eina_inarray_new(sizeof(struct stat), 16); if (!stack) goto error; @@ -403,7 +434,7 @@ main(int argc, char **argv) char file_id[PATH_MAX] = { '\0' }; eina_inarray_flush(stack); - if (!cache_scan(stack, path, file_id, priority++, 1, &changed)) + if (!cache_scan(ef, stack, path, file_id, priority++, 1, &changed)) goto error; systemdirs = eina_list_append(systemdirs, path); } @@ -411,7 +442,7 @@ main(int argc, char **argv) EINA_LIST_FOREACH(extra_dirs, l, path) { eina_inarray_flush(stack); - if (!cache_scan(stack, path, NULL, priority, 0, &changed)) goto error; + if (!cache_scan(ef, stack, path, NULL, priority, 0, &changed)) goto error; } /* store util */ @@ -490,18 +521,18 @@ main(int argc, char **argv) /* unlink old cache files */ if (changed) - { - /* rename tmp files to real files */ - if (rename(util_file, efreet_desktop_util_cache_file()) < 0) goto error; - efreet_setowner(efreet_desktop_util_cache_file()); - if (rename(file, efreet_desktop_cache_file()) < 0) goto error; - efreet_setowner(efreet_desktop_cache_file()); - } + { + /* rename tmp files to real files */ + if (!_file_move(tmpuc, efreet_desktop_util_cache_file())) goto error; + efreet_setowner(efreet_desktop_util_cache_file()); + if (!_file_move(tmpc, efreet_desktop_cache_file())) goto error; + efreet_setowner(efreet_desktop_cache_file()); + } else - { - unlink(util_file); - unlink(file); - } + { + unlink(tmpuc); + unlink(tmpc); + } { char c = 'n'; @@ -510,8 +541,10 @@ main(int argc, char **argv) printf("%c\n", c); } + eina_tmpstr_del(tmpuc); + eina_tmpstr_del(tmpc); EINA_LIST_FREE(systemdirs, dir) - eina_stringshare_del(dir); + eina_stringshare_del(dir); eina_list_free(extra_dirs); eina_inarray_free(stack); efreet_shutdown(); @@ -521,8 +554,11 @@ main(int argc, char **argv) eina_shutdown(); close(lockfd); return 0; + error: - eina_tmpstr_del(tmpstr); + eina_tmpstr_del(tmpuc); + eina_tmpstr_del(tmpc); + if (stack) eina_inarray_free(stack); IF_FREE(dir); edd_error: --