Create new cache in a tmp file
authorenglebass <englebass@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 1 Mar 2010 19:05:49 +0000 (19:05 +0000)
committerenglebass <englebass@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 1 Mar 2010 19:05:49 +0000 (19:05 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/efreet@46730 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/bin/efreet_desktop_cache_create.c

index 3a9b056..ceb55bd 100644 (file)
@@ -146,14 +146,13 @@ main(int argc, char **argv)
     /* TODO:
      * - Add file monitor on files, so that we catch changes on files
      *   during whilst this program runs.
-     * - When creating new cache, do it on a tmp file, then rename tmp file
-     *   to cache file.
      */
     char file[PATH_MAX];
+    char util_file[PATH_MAX];
     Eina_List *dirs;
     int priority = 0;
     char *dir = NULL;
-    int fd = 0;
+    int fd = 0, tmpfd;
 
     /* init external subsystems */
     if (!eet_init()) goto eet_error;
@@ -201,9 +200,18 @@ main(int argc, char **argv)
     if (!edd) goto edd_error;
 
     /* create cache */
-    ef = eet_open(efreet_desktop_cache_file(), EET_FILE_MODE_WRITE);
+    snprintf(file, sizeof(file), "%s.XXXXXX", efreet_desktop_cache_file());
+    tmpfd = mkstemp(file);
+    if (tmpfd < 0) goto error;
+    close(tmpfd);
+    ef = eet_open(file, EET_FILE_MODE_WRITE);
     if (!ef) goto error;
-    util_ef = eet_open(efreet_util_cache_file(), EET_FILE_MODE_WRITE);
+
+    snprintf(util_file, sizeof(util_file), "%s.XXXXXX", efreet_util_cache_file());
+    tmpfd = mkstemp(util_file);
+    if (tmpfd < 0) goto error;
+    close(tmpfd);
+    util_ef = eet_open(util_file, EET_FILE_MODE_WRITE);
     if (!util_ef) goto error;
 
     file_ids = eina_hash_string_superfast_new(NULL);
@@ -232,6 +240,10 @@ main(int argc, char **argv)
     eet_close(util_ef);
     eet_close(ef);
 
+    /* rename tmp files to real files */
+    if (rename(file, efreet_desktop_cache_file()) < 0) goto error;
+    if (rename(util_file, efreet_util_cache_file()) < 0) goto error;
+
     efreet_desktop_edd_shutdown(edd);
     efreet_shutdown();
     eet_shutdown();
@@ -239,20 +251,15 @@ main(int argc, char **argv)
     close(fd);
     return 0;
 error:
-    printf("error\n");
     IF_FREE(dir);
     efreet_desktop_edd_shutdown(edd);
 edd_error:
-    printf("error\n");
     efreet_shutdown();
 efreet_error:
-    printf("error\n");
     eina_shutdown();
 eina_error:
-    printf("error\n");
     eet_shutdown();
 eet_error:
-    printf("error\n");
     if (fd > 0) close(fd);
     return 1;
 }