Fix EET_FILE_MODE_READ_WRITE when file doesn't exist.
authorcedric <cedric>
Fri, 16 May 2008 10:00:54 +0000 (10:00 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 16 May 2008 10:00:54 +0000 (10:00 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/e17/libs/eet@34588 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/eet_lib.c

index 2699836..9d4c8ee 100644 (file)
@@ -1163,18 +1163,23 @@ eet_open(const char *file, Eet_File_Mode mode)
    if ((mode == EET_FILE_MODE_READ) || (mode == EET_FILE_MODE_READ_WRITE))
      {
        fp = fopen(file, "rb");
-       if (!fp) return NULL;
+       if (!fp) goto on_error;
        if (fstat(fileno(fp), &file_stat))
          {
             fclose(fp);
-            return NULL;
+            fp = NULL;
+            goto on_error;
          }
        if ((mode == EET_FILE_MODE_READ) &&
            (file_stat.st_size < (sizeof(int) * 3)))
          {
             fclose(fp);
-            return NULL;
+            fp = NULL;
+            goto on_error;
          }
+
+     on_error:
+       if (fp == NULL && mode == EET_FILE_MODE_READ) return NULL;
      }
    else
      {
@@ -1197,7 +1202,7 @@ eet_open(const char *file, Eet_File_Mode mode)
    if (ef)
      {
        /* reference it up and return it */
-        fclose(fp);
+       if (fp != NULL) fclose(fp);
        ef->references++;
        return ef;
      }
@@ -1221,8 +1226,11 @@ eet_open(const char *file, Eet_File_Mode mode)
    ef->data = NULL;
    ef->data_size = 0;
 
-   /* FIXME: Add new ed on EET_FILE_MODE_WRITE */
-   ef->ed = mode == EET_FILE_MODE_WRITE ? eet_dictionary_add() : NULL;
+   ef->ed = (mode == EET_FILE_MODE_WRITE)
+     || (ef->fp == NULL && mode == EET_FILE_MODE_READ_WRITE) ?
+     eet_dictionary_add() : NULL;
+
+   if (ef->fp == NULL && mode == EET_FILE_MODE_READ_WRITE) goto empty_file;
 
    /* if we can't open - bail out */
    if (eet_test_close(!ef->fp, ef))
@@ -1241,12 +1249,14 @@ eet_open(const char *file, Eet_File_Mode mode)
          return NULL;
      }
 
+ empty_file:
    /* we need to delete the original file in read-write mode and re-open for writing */
    if (ef->mode == EET_FILE_MODE_READ_WRITE)
      {
        ef->readfp = ef->fp;
        unlink(ef->path);
        ef->fp = fopen(ef->path, "wb");
+       fcntl(fileno(ef->fp), F_SETFD, FD_CLOEXEC);
      }
 
    /* add to cache */