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