Enlightenment CVS committal

Author  : cedric
Project : e17
Module  : libs/eet

Dir     : e17/libs/eet/src/lib


Modified Files:
        eet_lib.c 


Log Message:
Fix EET_FILE_MODE_READ_WRITE when file doesn't exist.


===================================================================
RCS file: /cvs/e/e17/libs/eet/src/lib/eet_lib.c,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -3 -r1.102 -r1.103
--- eet_lib.c   10 Apr 2008 09:12:43 -0000      1.102
+++ eet_lib.c   16 May 2008 10:00:54 -0000      1.103
@@ -1163,18 +1163,23 @@
    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 @@
    if (ef)
      {
        /* reference it up and return it */
-        fclose(fp);
+       if (fp != NULL) fclose(fp);
        ef->references++;
        return ef;
      }
@@ -1221,8 +1226,11 @@
    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 @@
          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 */



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft 
Defy all challenges. Microsoft(R) Visual Studio 2008. 
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to