From c3a00ee94b0e9f1cf20a2ca2ef2bd38b57f1eaae Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Fri, 14 Sep 2001 22:59:53 +0000 Subject: [PATCH] Patches from David Hedbor to handle missing current working directories. "The attached patch makes PhysFS handle the case when the current directory (as returned by getcwd()) has been deleted. Fix 1, platform/unix.c: Only retry getcwd if the error is ERANGE. Before it retried till the malloc failed in the case of the directory not existing. Fix 2: physfs.c: If __PHYSFS_platformCurrentDir() return's NULL, use the root as the base dir. Bad solution but the best I can think of (alternative : use /tmp or Windows TEMP dir?)." --- physfs.c | 14 +++++++++++++- platform/unix.c | 13 ++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/physfs.c b/physfs.c index a0bb6f23..fa3d4ce7 100644 --- a/physfs.c +++ b/physfs.c @@ -340,7 +340,19 @@ static char *calculateBaseDir(const char *argv0) /* * Last ditch effort: it's the current working directory. (*shrug*) */ - return(__PHYSFS_platformCurrentDir()); + retval = __PHYSFS_platformCurrentDir(); + if(retval != NULL) { + return(retval); + } + + /* + * Ok, current directory doesn't exist, use the root directory. + * Not a good alternative, but it only happens if the current + * directory was deleted from under the program. + */ + retval = (char *) malloc(strlen(dirsep) + 1); + strcpy(retval, dirsep); + return(retval); } /* calculateBaseDir */ diff --git a/platform/unix.c b/platform/unix.c index 3d345330..1f07f931 100644 --- a/platform/unix.c +++ b/platform/unix.c @@ -436,11 +436,18 @@ char *__PHYSFS_platformCurrentDir(void) free(retval); BAIL_IF_MACRO(1, ERR_OUT_OF_MEMORY, NULL); } /* if */ - + retval = ptr; ptr = getcwd(retval, allocSize); - } while (ptr == NULL); - + } while (ptr == NULL && errno == ERANGE); + if(ptr == NULL && errno) { + /* getcwd() failed for some reason, for example current + * directory not existing. + */ + if (retval != NULL) + free(retval); + BAIL_IF_MACRO(1, ERR_NO_SUCH_FILE, NULL); + } return(retval); } /* __PHYSFS_platformCurrentDir */