Bunch of tedious corrections, optimizations, and cleanups.
This commit is contained in:
parent
b772eede1d
commit
1f5b571be7
|
@ -24,6 +24,10 @@ static PHYSFS_sint64 DIR_read(FileHandle *handle, void *buffer,
|
|||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static PHYSFS_sint64 DIR_write(FileHandle *handle, const void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static PHYSFS_sint64 DIR_dummyRead(FileHandle *handle, void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static PHYSFS_sint64 DIR_dummyWrite(FileHandle *handle, const void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static int DIR_eof(FileHandle *handle);
|
||||
static PHYSFS_sint64 DIR_tell(FileHandle *handle);
|
||||
static int DIR_seek(FileHandle *handle, PHYSFS_uint64 offset);
|
||||
|
@ -35,10 +39,10 @@ static LinkedStringList *DIR_enumerateFiles(DirHandle *h,
|
|||
const char *dname,
|
||||
int omitSymLinks);
|
||||
static int DIR_exists(DirHandle *h, const char *name);
|
||||
static int DIR_isDirectory(DirHandle *h, const char *name);
|
||||
static int DIR_isSymLink(DirHandle *h, const char *name);
|
||||
static FileHandle *DIR_openRead(DirHandle *h, const char *filename);
|
||||
static PHYSFS_sint64 DIR_getLastModTime(DirHandle *h, const char *name);
|
||||
static int DIR_isDirectory(DirHandle *h, const char *name, int *fileExists);
|
||||
static int DIR_isSymLink(DirHandle *h, const char *name, int *fileExists);
|
||||
static FileHandle *DIR_openRead(DirHandle *h, const char *fnm, int *exist);
|
||||
static PHYSFS_sint64 DIR_getLastModTime(DirHandle *h, const char *f, int *e);
|
||||
static FileHandle *DIR_openWrite(DirHandle *h, const char *filename);
|
||||
static FileHandle *DIR_openAppend(DirHandle *h, const char *filename);
|
||||
static int DIR_remove(DirHandle *h, const char *name);
|
||||
|
@ -58,7 +62,7 @@ const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_DIR =
|
|||
static const FileFunctions __PHYSFS_FileFunctions_DIR =
|
||||
{
|
||||
DIR_read, /* read() method */
|
||||
NULL, /* write() method */
|
||||
DIR_dummyWrite, /* write() method */
|
||||
DIR_eof, /* eof() method */
|
||||
DIR_tell, /* tell() method */
|
||||
DIR_seek, /* seek() method */
|
||||
|
@ -69,7 +73,7 @@ static const FileFunctions __PHYSFS_FileFunctions_DIR =
|
|||
|
||||
static const FileFunctions __PHYSFS_FileFunctions_DIRW =
|
||||
{
|
||||
NULL, /* read() method */
|
||||
DIR_dummyRead, /* read() method */
|
||||
DIR_write, /* write() method */
|
||||
DIR_eof, /* eof() method */
|
||||
DIR_tell, /* tell() method */
|
||||
|
@ -116,6 +120,20 @@ static PHYSFS_sint64 DIR_write(FileHandle *handle, const void *buffer,
|
|||
} /* DIR_write */
|
||||
|
||||
|
||||
static PHYSFS_sint64 DIR_dummyRead(FileHandle *handle, void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, -1);
|
||||
} /* DIR_dummyRead */
|
||||
|
||||
|
||||
static PHYSFS_sint64 DIR_dummyWrite(FileHandle *handle, const void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, -1);
|
||||
} /* DIR_dummyWrite */
|
||||
|
||||
|
||||
static int DIR_eof(FileHandle *handle)
|
||||
{
|
||||
return(__PHYSFS_platformEOF(handle->opaque));
|
||||
|
@ -217,37 +235,45 @@ static int DIR_exists(DirHandle *h, const char *name)
|
|||
} /* DIR_exists */
|
||||
|
||||
|
||||
static int DIR_isDirectory(DirHandle *h, const char *name)
|
||||
static int DIR_isDirectory(DirHandle *h, const char *name, int *fileExists)
|
||||
{
|
||||
char *d = __PHYSFS_platformCvtToDependent((char *)(h->opaque), name, NULL);
|
||||
int retval;
|
||||
int retval = 0;
|
||||
|
||||
BAIL_IF_MACRO(d == NULL, NULL, 0);
|
||||
retval = __PHYSFS_platformIsDirectory(d);
|
||||
*fileExists = __PHYSFS_platformExists(d);
|
||||
if (*fileExists)
|
||||
retval = __PHYSFS_platformIsDirectory(d);
|
||||
free(d);
|
||||
return(retval);
|
||||
} /* DIR_isDirectory */
|
||||
|
||||
|
||||
static int DIR_isSymLink(DirHandle *h, const char *name)
|
||||
static int DIR_isSymLink(DirHandle *h, const char *name, int *fileExists)
|
||||
{
|
||||
char *f = __PHYSFS_platformCvtToDependent((char *)(h->opaque), name, NULL);
|
||||
int retval;
|
||||
int retval = 0;
|
||||
|
||||
BAIL_IF_MACRO(f == NULL, NULL, 0);
|
||||
retval = __PHYSFS_platformIsSymLink(f);
|
||||
*fileExists = __PHYSFS_platformExists(f);
|
||||
if (*fileExists)
|
||||
retval = __PHYSFS_platformIsSymLink(f);
|
||||
free(f);
|
||||
return(retval);
|
||||
} /* DIR_isSymLink */
|
||||
|
||||
|
||||
static PHYSFS_sint64 DIR_getLastModTime(DirHandle *h, const char *name)
|
||||
static PHYSFS_sint64 DIR_getLastModTime(DirHandle *h,
|
||||
const char *name,
|
||||
int *fileExists)
|
||||
{
|
||||
char *d = __PHYSFS_platformCvtToDependent((char *)(h->opaque), name, NULL);
|
||||
PHYSFS_sint64 retval;
|
||||
PHYSFS_sint64 retval = -1;
|
||||
|
||||
BAIL_IF_MACRO(d == NULL, NULL, 0);
|
||||
retval = __PHYSFS_platformGetLastModTime(d);
|
||||
*fileExists = __PHYSFS_platformExists(d);
|
||||
if (*fileExists)
|
||||
retval = __PHYSFS_platformGetLastModTime(d);
|
||||
free(d);
|
||||
return(retval);
|
||||
} /* DIR_getLastModTime */
|
||||
|
@ -255,7 +281,7 @@ static PHYSFS_sint64 DIR_getLastModTime(DirHandle *h, const char *name)
|
|||
|
||||
static FileHandle *doOpen(DirHandle *h, const char *name,
|
||||
void *(*openFunc)(const char *filename),
|
||||
const FileFunctions *fileFuncs)
|
||||
int *fileExists, const FileFunctions *fileFuncs)
|
||||
{
|
||||
char *f = __PHYSFS_platformCvtToDependent((char *)(h->opaque), name, NULL);
|
||||
void *rc;
|
||||
|
@ -263,6 +289,16 @@ static FileHandle *doOpen(DirHandle *h, const char *name,
|
|||
|
||||
BAIL_IF_MACRO(f == NULL, NULL, NULL);
|
||||
|
||||
if (fileExists != NULL)
|
||||
{
|
||||
*fileExists = __PHYSFS_platformExists(f);
|
||||
if (!(*fileExists))
|
||||
{
|
||||
free(f);
|
||||
return(NULL);
|
||||
} /* if */
|
||||
} /* if */
|
||||
|
||||
retval = (FileHandle *) malloc(sizeof (FileHandle));
|
||||
if (!retval)
|
||||
{
|
||||
|
@ -287,23 +323,23 @@ static FileHandle *doOpen(DirHandle *h, const char *name,
|
|||
} /* doOpen */
|
||||
|
||||
|
||||
static FileHandle *DIR_openRead(DirHandle *h, const char *filename)
|
||||
static FileHandle *DIR_openRead(DirHandle *h, const char *fnm, int *exist)
|
||||
{
|
||||
return(doOpen(h, filename, __PHYSFS_platformOpenRead,
|
||||
return(doOpen(h, fnm, __PHYSFS_platformOpenRead, exist,
|
||||
&__PHYSFS_FileFunctions_DIR));
|
||||
} /* DIR_openRead */
|
||||
|
||||
|
||||
static FileHandle *DIR_openWrite(DirHandle *h, const char *filename)
|
||||
{
|
||||
return(doOpen(h, filename, __PHYSFS_platformOpenWrite,
|
||||
return(doOpen(h, filename, __PHYSFS_platformOpenWrite, NULL,
|
||||
&__PHYSFS_FileFunctions_DIRW));
|
||||
} /* DIR_openWrite */
|
||||
|
||||
|
||||
static FileHandle *DIR_openAppend(DirHandle *h, const char *filename)
|
||||
{
|
||||
return(doOpen(h, filename, __PHYSFS_platformOpenAppend,
|
||||
return(doOpen(h, filename, __PHYSFS_platformOpenAppend, NULL,
|
||||
&__PHYSFS_FileFunctions_DIRW));
|
||||
} /* DIR_openAppend */
|
||||
|
||||
|
|
|
@ -67,6 +67,8 @@ typedef struct
|
|||
static void GRP_dirClose(DirHandle *h);
|
||||
static PHYSFS_sint64 GRP_read(FileHandle *handle, void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static PHYSFS_sint64 GRP_write(FileHandle *handle, const void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static int GRP_eof(FileHandle *handle);
|
||||
static PHYSFS_sint64 GRP_tell(FileHandle *handle);
|
||||
static int GRP_seek(FileHandle *handle, PHYSFS_uint64 offset);
|
||||
|
@ -78,10 +80,14 @@ static LinkedStringList *GRP_enumerateFiles(DirHandle *h,
|
|||
const char *dirname,
|
||||
int omitSymLinks);
|
||||
static int GRP_exists(DirHandle *h, const char *name);
|
||||
static int GRP_isDirectory(DirHandle *h, const char *name);
|
||||
static int GRP_isSymLink(DirHandle *h, const char *name);
|
||||
static PHYSFS_sint64 GRP_getLastModTime(DirHandle *h, const char *name);
|
||||
static FileHandle *GRP_openRead(DirHandle *h, const char *name);
|
||||
static int GRP_isDirectory(DirHandle *h, const char *name, int *fileExists);
|
||||
static int GRP_isSymLink(DirHandle *h, const char *name, int *fileExists);
|
||||
static PHYSFS_sint64 GRP_getLastModTime(DirHandle *h, const char *n, int *e);
|
||||
static FileHandle *GRP_openRead(DirHandle *h, const char *name, int *exist);
|
||||
static FileHandle *GRP_openWrite(DirHandle *h, const char *name);
|
||||
static FileHandle *GRP_openAppend(DirHandle *h, const char *name);
|
||||
static int GRP_remove(DirHandle *h, const char *name);
|
||||
static int GRP_mkdir(DirHandle *h, const char *name);
|
||||
|
||||
const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_GRP =
|
||||
{
|
||||
|
@ -95,7 +101,7 @@ const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_GRP =
|
|||
static const FileFunctions __PHYSFS_FileFunctions_GRP =
|
||||
{
|
||||
GRP_read, /* read() method */
|
||||
NULL, /* write() method */
|
||||
GRP_write, /* write() method */
|
||||
GRP_eof, /* eof() method */
|
||||
GRP_tell, /* tell() method */
|
||||
GRP_seek, /* seek() method */
|
||||
|
@ -115,10 +121,10 @@ const DirFunctions __PHYSFS_DirFunctions_GRP =
|
|||
GRP_isSymLink, /* isSymLink() method */
|
||||
GRP_getLastModTime, /* getLastModTime() method */
|
||||
GRP_openRead, /* openRead() method */
|
||||
NULL, /* openWrite() method */
|
||||
NULL, /* openAppend() method */
|
||||
NULL, /* remove() method */
|
||||
NULL, /* mkdir() method */
|
||||
GRP_openWrite, /* openWrite() method */
|
||||
GRP_openAppend, /* openAppend() method */
|
||||
GRP_remove, /* remove() method */
|
||||
GRP_mkdir, /* mkdir() method */
|
||||
GRP_dirClose /* dirClose() method */
|
||||
};
|
||||
|
||||
|
@ -154,6 +160,13 @@ static PHYSFS_sint64 GRP_read(FileHandle *handle, void *buffer,
|
|||
} /* GRP_read */
|
||||
|
||||
|
||||
static PHYSFS_sint64 GRP_write(FileHandle *handle, const void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, -1);
|
||||
} /* GRP_write */
|
||||
|
||||
|
||||
static int GRP_eof(FileHandle *handle)
|
||||
{
|
||||
GRPfileinfo *finfo = (GRPfileinfo *) (handle->opaque);
|
||||
|
@ -427,37 +440,44 @@ static int GRP_exists(DirHandle *h, const char *name)
|
|||
} /* GRP_exists */
|
||||
|
||||
|
||||
static int GRP_isDirectory(DirHandle *h, const char *name)
|
||||
static int GRP_isDirectory(DirHandle *h, const char *name, int *fileExists)
|
||||
{
|
||||
*fileExists = GRP_exists(h, name);
|
||||
return(0); /* never directories in a groupfile. */
|
||||
} /* GRP_isDirectory */
|
||||
|
||||
|
||||
static int GRP_isSymLink(DirHandle *h, const char *name)
|
||||
static int GRP_isSymLink(DirHandle *h, const char *name, int *fileExists)
|
||||
{
|
||||
*fileExists = GRP_exists(h, name);
|
||||
return(0); /* never symlinks in a groupfile. */
|
||||
} /* GRP_isSymLink */
|
||||
|
||||
|
||||
static PHYSFS_sint64 GRP_getLastModTime(DirHandle *h, const char *name)
|
||||
static PHYSFS_sint64 GRP_getLastModTime(DirHandle *h,
|
||||
const char *name,
|
||||
int *fileExists)
|
||||
{
|
||||
GRPinfo *info = ((GRPinfo *) h->opaque);
|
||||
if (grp_find_entry(info, name) == NULL)
|
||||
return(-1); /* no such entry. */
|
||||
PHYSFS_sint64 retval = -1;
|
||||
|
||||
/* Just return the time of the GRP itself in the physical filesystem. */
|
||||
return(((GRPinfo *) h->opaque)->last_mod_time);
|
||||
*fileExists = (grp_find_entry(info, name) != NULL);
|
||||
if (*fileExists) /* use time of GRP itself in the physical filesystem. */
|
||||
retval = ((GRPinfo *) h->opaque)->last_mod_time;
|
||||
|
||||
return(retval);
|
||||
} /* GRP_getLastModTime */
|
||||
|
||||
|
||||
static FileHandle *GRP_openRead(DirHandle *h, const char *name)
|
||||
static FileHandle *GRP_openRead(DirHandle *h, const char *fnm, int *fileExists)
|
||||
{
|
||||
GRPinfo *info = ((GRPinfo *) h->opaque);
|
||||
FileHandle *retval;
|
||||
GRPfileinfo *finfo;
|
||||
GRPentry *entry;
|
||||
|
||||
entry = grp_find_entry(info, name);
|
||||
entry = grp_find_entry(info, fnm);
|
||||
*fileExists = (entry != NULL);
|
||||
BAIL_IF_MACRO(entry == NULL, NULL, NULL);
|
||||
|
||||
retval = (FileHandle *) malloc(sizeof (FileHandle));
|
||||
|
@ -486,6 +506,30 @@ static FileHandle *GRP_openRead(DirHandle *h, const char *name)
|
|||
return(retval);
|
||||
} /* GRP_openRead */
|
||||
|
||||
|
||||
static FileHandle *GRP_openWrite(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, NULL);
|
||||
} /* GRP_openWrite */
|
||||
|
||||
|
||||
static FileHandle *GRP_openAppend(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, NULL);
|
||||
} /* GRP_openAppend */
|
||||
|
||||
|
||||
static int GRP_remove(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, 0);
|
||||
} /* GRP_remove */
|
||||
|
||||
|
||||
static int GRP_mkdir(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, 0);
|
||||
} /* GRP_mkdir */
|
||||
|
||||
#endif /* defined PHYSFS_SUPPORTS_GRP */
|
||||
|
||||
/* end of grp.c ... */
|
||||
|
|
|
@ -73,19 +73,25 @@ static void QPAK_dirClose(DirHandle *h);
|
|||
static LinkedStringList *QPAK_enumerateFiles(DirHandle *h, const char *dirname,
|
||||
int omitSymLinks);
|
||||
static int QPAK_exists(DirHandle *h, const char *name);
|
||||
static int QPAK_isDirectory(DirHandle *h, const char *name);
|
||||
static int QPAK_isSymLink(DirHandle *h, const char *name);
|
||||
static PHYSFS_sint64 QPAK_getLastModTime(DirHandle *h, const char *name);
|
||||
static FileHandle *QPAK_openRead(DirHandle *h, const char *name);
|
||||
static int QPAK_isDirectory(DirHandle *h, const char *name, int *e);
|
||||
static int QPAK_isSymLink(DirHandle *h, const char *name, int *e);
|
||||
static PHYSFS_sint64 QPAK_getLastModTime(DirHandle *h, const char *n, int *e);
|
||||
static FileHandle *QPAK_openRead(DirHandle *h, const char *name, int *e);
|
||||
static FileHandle *QPAK_openWrite(DirHandle *h, const char *name);
|
||||
static FileHandle *QPAK_openAppend(DirHandle *h, const char *name);
|
||||
|
||||
|
||||
static PHYSFS_sint64 QPAK_read(FileHandle *handle, void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static PHYSFS_sint64 QPAK_write(FileHandle *handle, const void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static int QPAK_eof(FileHandle *handle);
|
||||
static PHYSFS_sint64 QPAK_tell(FileHandle *handle);
|
||||
static int QPAK_seek(FileHandle *handle, PHYSFS_uint64 offset);
|
||||
static PHYSFS_sint64 QPAK_fileLength(FileHandle *handle);
|
||||
static int QPAK_fileClose(FileHandle *handle);
|
||||
static int QPAK_remove(DirHandle *h, const char *name);
|
||||
static int QPAK_mkdir(DirHandle *h, const char *name);
|
||||
|
||||
|
||||
const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_QPAK =
|
||||
|
@ -99,7 +105,7 @@ const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_QPAK =
|
|||
static const FileFunctions __PHYSFS_FileFunctions_QPAK =
|
||||
{
|
||||
QPAK_read, /* read() method */
|
||||
NULL, /* write() method */
|
||||
QPAK_write, /* write() method */
|
||||
QPAK_eof, /* eof() method */
|
||||
QPAK_tell, /* tell() method */
|
||||
QPAK_seek, /* seek() method */
|
||||
|
@ -118,10 +124,10 @@ const DirFunctions __PHYSFS_DirFunctions_QPAK =
|
|||
QPAK_isSymLink, /* isSymLink() method */
|
||||
QPAK_getLastModTime, /* getLastModTime() method */
|
||||
QPAK_openRead, /* openRead() method */
|
||||
NULL, /* openWrite() method */
|
||||
NULL, /* openAppend() method */
|
||||
NULL, /* remove() method */
|
||||
NULL, /* mkdir() method */
|
||||
QPAK_openWrite, /* openWrite() method */
|
||||
QPAK_openAppend, /* openAppend() method */
|
||||
QPAK_remove, /* remove() method */
|
||||
QPAK_mkdir, /* mkdir() method */
|
||||
QPAK_dirClose /* dirClose() method */
|
||||
};
|
||||
|
||||
|
@ -308,7 +314,7 @@ static QPAKdirectory *qpak_findDirectory(QPAKdirectory *root, const char *name)
|
|||
} /* while */
|
||||
} /* else */
|
||||
|
||||
return(0);
|
||||
BAIL_MACRO(ERR_NO_SUCH_PATH, 0);
|
||||
} /* qpak_findDirectory */
|
||||
|
||||
|
||||
|
@ -390,7 +396,7 @@ static QPAKentry *qpak_findEntry(QPAKdirectory *root, const char *name)
|
|||
thisFile = thisFile->next;
|
||||
} /* while */
|
||||
|
||||
return(0);
|
||||
BAIL_MACRO(ERR_NO_SUCH_FILE, 0);
|
||||
} /* qpak_findEntry */
|
||||
|
||||
|
||||
|
@ -585,22 +591,45 @@ static int QPAK_exists(DirHandle *h, const char *name)
|
|||
} /* QPAK_exists */
|
||||
|
||||
|
||||
static int QPAK_isDirectory(DirHandle *h, const char *name)
|
||||
static int QPAK_isDirectory(DirHandle *h, const char *name, int *fileExists)
|
||||
{
|
||||
QPAKinfo *info = (QPAKinfo *) h->opaque;
|
||||
return(qpak_findDirectory(info->root, name) != 0);
|
||||
*fileExists = (qpak_findDirectory(info->root, name) != 0);
|
||||
return(*fileExists);
|
||||
} /* QPAK_isDirectory */
|
||||
|
||||
|
||||
static int QPAK_isSymLink(DirHandle *h, const char *name)
|
||||
static int QPAK_isSymLink(DirHandle *h, const char *name, int *fileExists)
|
||||
{
|
||||
*fileExists = QPAK_exists(h, name);
|
||||
return(0); /* we don't support symlinks for now */
|
||||
} /* QPAK_isSymlink */
|
||||
|
||||
|
||||
static PHYSFS_sint64 QPAK_getLastModTime(DirHandle *h, const char *name)
|
||||
static int QPAK_remove(DirHandle *h, const char *name)
|
||||
{
|
||||
return(__PHYSFS_platformGetLastModTime(((QPAKinfo *) h->opaque)->filename));
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, 0);
|
||||
} /* QPAK_remove */
|
||||
|
||||
|
||||
static int QPAK_mkdir(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, 0);
|
||||
} /* QPAK_mkdir */
|
||||
|
||||
|
||||
static PHYSFS_sint64 QPAK_getLastModTime(DirHandle *h,
|
||||
const char *name,
|
||||
int *fileExists)
|
||||
{
|
||||
QPAKinfo *info = (QPAKinfo *) h->opaque;
|
||||
PHYSFS_sint64 retval = -1;
|
||||
|
||||
*fileExists = QPAK_exists(h, name);
|
||||
if (*fileExists)
|
||||
retval = __PHYSFS_platformGetLastModTime(info->filename);
|
||||
|
||||
return(retval);
|
||||
} /* QPAK_getLastModTime */
|
||||
|
||||
|
||||
|
@ -620,13 +649,14 @@ static void *qpak_getFileHandle(const char *name, QPAKentry *entry)
|
|||
} /* qpak_getFileHandle */
|
||||
|
||||
|
||||
static FileHandle *QPAK_openRead(DirHandle *h, const char *name)
|
||||
static FileHandle *QPAK_openRead(DirHandle *h, const char *fnm, int *fileExists)
|
||||
{
|
||||
QPAKinfo *driver = (QPAKinfo *) h->opaque;
|
||||
QPAKentry *entry = qpak_findEntry(driver->root, name);
|
||||
QPAKentry *entry = qpak_findEntry(driver->root, fnm);
|
||||
QPAKfileinfo *fileDriver = 0;
|
||||
FileHandle *result = 0;
|
||||
|
||||
*fileExists = (entry != NULL);
|
||||
if (entry == NULL)
|
||||
return(NULL);
|
||||
|
||||
|
@ -658,6 +688,18 @@ static FileHandle *QPAK_openRead(DirHandle *h, const char *name)
|
|||
} /* QPAK_openRead */
|
||||
|
||||
|
||||
static FileHandle *QPAK_openWrite(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, NULL);
|
||||
} /* QPAK_openWrite */
|
||||
|
||||
|
||||
static FileHandle *QPAK_openAppend(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, NULL);
|
||||
} /* QPAK_openAppend */
|
||||
|
||||
|
||||
static PHYSFS_sint64 QPAK_read(FileHandle *handle, void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
|
||||
{
|
||||
|
@ -678,6 +720,13 @@ static PHYSFS_sint64 QPAK_read(FileHandle *handle, void *buffer,
|
|||
} /* QPAK_read */
|
||||
|
||||
|
||||
static PHYSFS_sint64 QPAK_write(FileHandle *handle, const void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, -1);
|
||||
} /* QPAK_write */
|
||||
|
||||
|
||||
static int QPAK_eof(FileHandle *handle)
|
||||
{
|
||||
QPAKfileinfo *finfo = (QPAKfileinfo *) (handle->opaque);
|
||||
|
|
|
@ -118,6 +118,8 @@ typedef struct
|
|||
|
||||
static PHYSFS_sint64 ZIP_read(FileHandle *handle, void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static PHYSFS_sint64 ZIP_write(FileHandle *handle, const void *buffer,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount);
|
||||
static int ZIP_eof(FileHandle *handle);
|
||||
static PHYSFS_sint64 ZIP_tell(FileHandle *handle);
|
||||
static int ZIP_seek(FileHandle *handle, PHYSFS_uint64 offset);
|
||||
|
@ -129,12 +131,16 @@ static LinkedStringList *ZIP_enumerateFiles(DirHandle *h,
|
|||
const char *dirname,
|
||||
int omitSymLinks);
|
||||
static int ZIP_exists(DirHandle *h, const char *name);
|
||||
static int ZIP_isDirectory(DirHandle *h, const char *name);
|
||||
static int ZIP_isSymLink(DirHandle *h, const char *name);
|
||||
static PHYSFS_sint64 ZIP_getLastModTime(DirHandle *h, const char *name);
|
||||
static FileHandle *ZIP_openRead(DirHandle *h, const char *filename);
|
||||
static int ZIP_isDirectory(DirHandle *h, const char *name, int *fileExists);
|
||||
static int ZIP_isSymLink(DirHandle *h, const char *name, int *fileExists);
|
||||
static PHYSFS_sint64 ZIP_getLastModTime(DirHandle *h, const char *n, int *e);
|
||||
static FileHandle *ZIP_openRead(DirHandle *h, const char *filename, int *e);
|
||||
static FileHandle *ZIP_openWrite(DirHandle *h, const char *filename);
|
||||
static FileHandle *ZIP_openAppend(DirHandle *h, const char *filename);
|
||||
static void ZIP_dirClose(DirHandle *h);
|
||||
static int zip_resolve(void *in, ZIPinfo *info, ZIPentry *entry);
|
||||
static int ZIP_remove(DirHandle *h, const char *name);
|
||||
static int ZIP_mkdir(DirHandle *h, const char *name);
|
||||
|
||||
|
||||
const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_ZIP =
|
||||
|
@ -148,7 +154,7 @@ const PHYSFS_ArchiveInfo __PHYSFS_ArchiveInfo_ZIP =
|
|||
static const FileFunctions __PHYSFS_FileFunctions_ZIP =
|
||||
{
|
||||
ZIP_read, /* read() method */
|
||||
NULL, /* write() method */
|
||||
ZIP_write, /* write() method */
|
||||
ZIP_eof, /* eof() method */
|
||||
ZIP_tell, /* tell() method */
|
||||
ZIP_seek, /* seek() method */
|
||||
|
@ -168,10 +174,10 @@ const DirFunctions __PHYSFS_DirFunctions_ZIP =
|
|||
ZIP_isSymLink, /* isSymLink() method */
|
||||
ZIP_getLastModTime, /* getLastModTime() method */
|
||||
ZIP_openRead, /* openRead() method */
|
||||
NULL, /* openWrite() method */
|
||||
NULL, /* openAppend() method */
|
||||
NULL, /* remove() method */
|
||||
NULL, /* mkdir() method */
|
||||
ZIP_openWrite, /* openWrite() method */
|
||||
ZIP_openAppend, /* openAppend() method */
|
||||
ZIP_remove, /* remove() method */
|
||||
ZIP_mkdir, /* mkdir() method */
|
||||
ZIP_dirClose /* dirClose() method */
|
||||
};
|
||||
|
||||
|
@ -305,6 +311,13 @@ static PHYSFS_sint64 ZIP_read(FileHandle *handle, void *buf,
|
|||
} /* ZIP_read */
|
||||
|
||||
|
||||
static PHYSFS_sint64 ZIP_write(FileHandle *handle, const void *buf,
|
||||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, -1);
|
||||
} /* ZIP_write */
|
||||
|
||||
|
||||
static int ZIP_eof(FileHandle *handle)
|
||||
{
|
||||
ZIPfileinfo *finfo = ((ZIPfileinfo *) (handle->opaque));
|
||||
|
@ -1233,15 +1246,18 @@ static int ZIP_exists(DirHandle *h, const char *name)
|
|||
} /* ZIP_exists */
|
||||
|
||||
|
||||
static PHYSFS_sint64 ZIP_getLastModTime(DirHandle *h, const char *name)
|
||||
static PHYSFS_sint64 ZIP_getLastModTime(DirHandle *h,
|
||||
const char *name,
|
||||
int *fileExists)
|
||||
{
|
||||
ZIPentry *entry = zip_find_entry((ZIPinfo *) h->opaque, name);
|
||||
*fileExists = (entry != NULL);
|
||||
BAIL_IF_MACRO(entry == NULL, NULL, -1);
|
||||
return(entry->last_mod_time);
|
||||
} /* ZIP_getLastModTime */
|
||||
|
||||
|
||||
static int ZIP_isDirectory(DirHandle *h, const char *name)
|
||||
static int ZIP_isDirectory(DirHandle *h, const char *name, int *fileExists)
|
||||
{
|
||||
ZIPinfo *info = (ZIPinfo *) h->opaque;
|
||||
PHYSFS_uint32 pos;
|
||||
|
@ -1249,10 +1265,14 @@ static int ZIP_isDirectory(DirHandle *h, const char *name)
|
|||
|
||||
pos = zip_find_start_of_dir(info, name, 1);
|
||||
if (pos >= 0)
|
||||
{
|
||||
*fileExists = 1;
|
||||
return(1); /* definitely a dir. */
|
||||
} /* if */
|
||||
|
||||
/* Follow symlinks. This means we might need to resolve entries. */
|
||||
entry = zip_find_entry(info, name);
|
||||
*fileExists = (entry != NULL);
|
||||
BAIL_IF_MACRO(entry == NULL, ERR_NO_SUCH_FILE, 0);
|
||||
|
||||
if (entry->resolved == ZIP_UNRESOLVED_SYMLINK) /* gotta resolve it. */
|
||||
|
@ -1273,9 +1293,10 @@ static int ZIP_isDirectory(DirHandle *h, const char *name)
|
|||
} /* ZIP_isDirectory */
|
||||
|
||||
|
||||
static int ZIP_isSymLink(DirHandle *h, const char *name)
|
||||
static int ZIP_isSymLink(DirHandle *h, const char *name, int *fileExists)
|
||||
{
|
||||
ZIPentry *entry = zip_find_entry((ZIPinfo *) h->opaque, name);
|
||||
*fileExists = (entry != NULL);
|
||||
BAIL_IF_MACRO(entry == NULL, NULL, 0);
|
||||
return(zip_entry_is_symlink(entry));
|
||||
} /* ZIP_isSymLink */
|
||||
|
@ -1305,14 +1326,15 @@ static void *zip_get_file_handle(const char *fn, ZIPinfo *inf, ZIPentry *entry)
|
|||
} /* zip_get_file_handle */
|
||||
|
||||
|
||||
static FileHandle *ZIP_openRead(DirHandle *h, const char *filename)
|
||||
static FileHandle *ZIP_openRead(DirHandle *h, const char *fnm, int *fileExists)
|
||||
{
|
||||
ZIPinfo *info = (ZIPinfo *) h->opaque;
|
||||
ZIPentry *entry = zip_find_entry(info, filename);
|
||||
ZIPentry *entry = zip_find_entry(info, fnm);
|
||||
FileHandle *retval = NULL;
|
||||
ZIPfileinfo *finfo = NULL;
|
||||
void *in;
|
||||
|
||||
*fileExists = (entry != NULL);
|
||||
BAIL_IF_MACRO(entry == NULL, NULL, NULL);
|
||||
|
||||
in = zip_get_file_handle(info->archiveName, info, entry);
|
||||
|
@ -1354,6 +1376,18 @@ static FileHandle *ZIP_openRead(DirHandle *h, const char *filename)
|
|||
} /* ZIP_openRead */
|
||||
|
||||
|
||||
static FileHandle *ZIP_openWrite(DirHandle *h, const char *filename)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, NULL);
|
||||
} /* ZIP_openWrite */
|
||||
|
||||
|
||||
static FileHandle *ZIP_openAppend(DirHandle *h, const char *filename)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, NULL);
|
||||
} /* ZIP_openAppend */
|
||||
|
||||
|
||||
static void ZIP_dirClose(DirHandle *h)
|
||||
{
|
||||
ZIPinfo *zi = (ZIPinfo *) (h->opaque);
|
||||
|
@ -1363,6 +1397,18 @@ static void ZIP_dirClose(DirHandle *h)
|
|||
free(h);
|
||||
} /* ZIP_dirClose */
|
||||
|
||||
|
||||
static int ZIP_remove(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, 0);
|
||||
} /* ZIP_remove */
|
||||
|
||||
|
||||
static int ZIP_mkdir(DirHandle *h, const char *name)
|
||||
{
|
||||
BAIL_MACRO(ERR_NOT_SUPPORTED, 0);
|
||||
} /* ZIP_mkdir */
|
||||
|
||||
#endif /* defined PHYSFS_SUPPORTS_ZIP */
|
||||
|
||||
/* end of zip.c ... */
|
||||
|
|
129
physfs.c
129
physfs.c
|
@ -22,7 +22,6 @@
|
|||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include "physfs.h"
|
||||
|
||||
#define __PHYSICSFS_INTERNAL__
|
||||
|
@ -70,7 +69,6 @@ extern const DirFunctions __PHYSFS_DirFunctions_QPAK;
|
|||
extern const DirFunctions __PHYSFS_DirFunctions_DIR;
|
||||
|
||||
|
||||
// !!! FIXME: This is stored with dirFunctions now, too.
|
||||
static const PHYSFS_ArchiveInfo *supported_types[] =
|
||||
{
|
||||
#if (defined PHYSFS_SUPPORTS_ZIP)
|
||||
|
@ -1198,10 +1196,12 @@ char * __PHYSFS_convertToDependent(const char *prepend,
|
|||
int __PHYSFS_verifySecurity(DirHandle *h, const char *fname)
|
||||
{
|
||||
int retval = 1;
|
||||
int fileExists;
|
||||
char *start;
|
||||
char *end;
|
||||
char *str;
|
||||
|
||||
/* !!! FIXME: Can we ditch this malloc()? */
|
||||
start = str = malloc(strlen(fname) + 1);
|
||||
BAIL_IF_MACRO(str == NULL, ERR_OUT_OF_MEMORY, 0);
|
||||
strcpy(str, fname);
|
||||
|
@ -1222,11 +1222,16 @@ int __PHYSFS_verifySecurity(DirHandle *h, const char *fname)
|
|||
break;
|
||||
} /* if */
|
||||
|
||||
if ((!allowSymLinks) && (h->funcs->isSymLink(h, str)))
|
||||
if (!allowSymLinks)
|
||||
{
|
||||
__PHYSFS_setError(ERR_SYMLINK_DISALLOWED);
|
||||
retval = 0;
|
||||
break;
|
||||
if (h->funcs->isSymLink(h, str, &fileExists))
|
||||
{
|
||||
__PHYSFS_setError(ERR_SYMLINK_DISALLOWED);
|
||||
retval = 0;
|
||||
break;
|
||||
} /* if */
|
||||
|
||||
/* !!! FIXME: Abort early here if !fileExists? */
|
||||
} /* if */
|
||||
|
||||
if (end == NULL)
|
||||
|
@ -1256,7 +1261,6 @@ int PHYSFS_mkdir(const char *dname)
|
|||
__PHYSFS_platformGrabMutex(stateLock);
|
||||
BAIL_IF_MACRO_MUTEX(writeDir == NULL, ERR_NO_WRITE_DIR, stateLock, 0);
|
||||
h = writeDir->dirHandle;
|
||||
BAIL_IF_MACRO_MUTEX(!h->funcs->mkdir, ERR_NOT_SUPPORTED, stateLock, 0);
|
||||
BAIL_IF_MACRO_MUTEX(!__PHYSFS_verifySecurity(h, dname), NULL, stateLock, 0);
|
||||
start = str = malloc(strlen(dname) + 1);
|
||||
BAIL_IF_MACRO_MUTEX(str == NULL, ERR_OUT_OF_MEMORY, stateLock, 0);
|
||||
|
@ -1299,7 +1303,6 @@ int PHYSFS_delete(const char *fname)
|
|||
|
||||
BAIL_IF_MACRO_MUTEX(writeDir == NULL, ERR_NO_WRITE_DIR, stateLock, 0);
|
||||
h = writeDir->dirHandle;
|
||||
BAIL_IF_MACRO_MUTEX(!h->funcs->remove, ERR_NOT_SUPPORTED, stateLock, 0);
|
||||
BAIL_IF_MACRO_MUTEX(!__PHYSFS_verifySecurity(h, fname), NULL, stateLock, 0);
|
||||
retval = h->funcs->remove(h, fname);
|
||||
|
||||
|
@ -1311,28 +1314,24 @@ int PHYSFS_delete(const char *fname)
|
|||
const char *PHYSFS_getRealDir(const char *filename)
|
||||
{
|
||||
PhysDirInfo *i;
|
||||
const char *retval = NULL;
|
||||
|
||||
while (*filename == '/')
|
||||
filename++;
|
||||
|
||||
__PHYSFS_platformGrabMutex(stateLock);
|
||||
for (i = searchPath; i != NULL; i = i->next)
|
||||
for (i = searchPath; ((i != NULL) && (retval == NULL)); i = i->next)
|
||||
{
|
||||
DirHandle *h = i->dirHandle;
|
||||
if (__PHYSFS_verifySecurity(h, filename))
|
||||
{
|
||||
if (!h->funcs->exists(h, filename))
|
||||
__PHYSFS_setError(ERR_NO_SUCH_FILE);
|
||||
else
|
||||
{
|
||||
__PHYSFS_platformReleaseMutex(stateLock);
|
||||
return(i->dirName);
|
||||
} /* else */
|
||||
if (h->funcs->exists(h, filename))
|
||||
retval = i->dirName;
|
||||
} /* if */
|
||||
} /* for */
|
||||
__PHYSFS_platformReleaseMutex(stateLock);
|
||||
|
||||
return(NULL);
|
||||
return(retval);
|
||||
} /* PHYSFS_getRealDir */
|
||||
|
||||
|
||||
|
@ -1467,6 +1466,8 @@ int PHYSFS_exists(const char *fname)
|
|||
PHYSFS_sint64 PHYSFS_getLastModTime(const char *fname)
|
||||
{
|
||||
PhysDirInfo *i;
|
||||
PHYSFS_sint64 retval = -1;
|
||||
int fileExists = 0;
|
||||
|
||||
BAIL_IF_MACRO(fname == NULL, ERR_INVALID_ARGUMENT, 0);
|
||||
while (*fname == '/')
|
||||
|
@ -1476,95 +1477,67 @@ PHYSFS_sint64 PHYSFS_getLastModTime(const char *fname)
|
|||
return(1);
|
||||
|
||||
__PHYSFS_platformGrabMutex(stateLock);
|
||||
for (i = searchPath; i != NULL; i = i->next)
|
||||
for (i = searchPath; ((i != NULL) && (!fileExists)); i = i->next)
|
||||
{
|
||||
DirHandle *h = i->dirHandle;
|
||||
if (__PHYSFS_verifySecurity(h, fname))
|
||||
{
|
||||
if (!h->funcs->exists(h, fname))
|
||||
__PHYSFS_setError(ERR_NO_SUCH_FILE);
|
||||
else
|
||||
{
|
||||
PHYSFS_sint64 retval = -1;
|
||||
if (h->funcs->getLastModTime == NULL)
|
||||
__PHYSFS_setError(ERR_NOT_SUPPORTED);
|
||||
else
|
||||
retval = h->funcs->getLastModTime(h, fname);
|
||||
|
||||
__PHYSFS_platformReleaseMutex(stateLock);
|
||||
return(retval);
|
||||
} /* else */
|
||||
} /* if */
|
||||
retval = h->funcs->getLastModTime(h, fname, &fileExists);
|
||||
} /* for */
|
||||
__PHYSFS_platformReleaseMutex(stateLock);
|
||||
|
||||
return(-1); /* error set in verifysecurity/exists */
|
||||
return(retval);
|
||||
} /* PHYSFS_getLastModTime */
|
||||
|
||||
|
||||
int PHYSFS_isDirectory(const char *fname)
|
||||
{
|
||||
PhysDirInfo *i;
|
||||
int retval = 0;
|
||||
int fileExists = 0;
|
||||
|
||||
BAIL_IF_MACRO(fname == NULL, ERR_INVALID_ARGUMENT, 0);
|
||||
while (*fname == '/')
|
||||
fname++;
|
||||
|
||||
if (*fname == '\0')
|
||||
return(1);
|
||||
BAIL_IF_MACRO(*fname == '\0', NULL, 1); /* Root is always a dir. :) */
|
||||
|
||||
__PHYSFS_platformGrabMutex(stateLock);
|
||||
for (i = searchPath; i != NULL; i = i->next)
|
||||
for (i = searchPath; ((i != NULL) && (!fileExists)); i = i->next)
|
||||
{
|
||||
DirHandle *h = i->dirHandle;
|
||||
if (__PHYSFS_verifySecurity(h, fname))
|
||||
{
|
||||
if (!h->funcs->exists(h, fname))
|
||||
__PHYSFS_setError(ERR_NO_SUCH_FILE);
|
||||
else
|
||||
{
|
||||
int retval = h->funcs->isDirectory(h, fname);
|
||||
__PHYSFS_platformReleaseMutex(stateLock);
|
||||
return(retval);
|
||||
} /* else */
|
||||
} /* if */
|
||||
retval = h->funcs->isDirectory(h, fname, &fileExists);
|
||||
} /* for */
|
||||
__PHYSFS_platformReleaseMutex(stateLock);
|
||||
|
||||
return(0);
|
||||
return(retval);
|
||||
} /* PHYSFS_isDirectory */
|
||||
|
||||
|
||||
int PHYSFS_isSymbolicLink(const char *fname)
|
||||
{
|
||||
PhysDirInfo *i;
|
||||
int retval = 0;
|
||||
int fileExists = 0;
|
||||
|
||||
if (!allowSymLinks)
|
||||
return(0);
|
||||
BAIL_IF_MACRO(!allowSymLinks, ERR_SYMLINK_DISALLOWED, 0);
|
||||
|
||||
BAIL_IF_MACRO(fname == NULL, ERR_INVALID_ARGUMENT, 0);
|
||||
while (*fname == '/')
|
||||
fname++;
|
||||
|
||||
BAIL_IF_MACRO(*fname == '\0', NULL, 0); /* Root is never a symlink */
|
||||
|
||||
__PHYSFS_platformGrabMutex(stateLock);
|
||||
for (i = searchPath; i != NULL; i = i->next)
|
||||
for (i = searchPath; ((i != NULL) && (!fileExists)); i = i->next)
|
||||
{
|
||||
DirHandle *h = i->dirHandle;
|
||||
if (__PHYSFS_verifySecurity(h, fname))
|
||||
{
|
||||
if (!h->funcs->exists(h, fname))
|
||||
__PHYSFS_setError(ERR_NO_SUCH_FILE);
|
||||
else
|
||||
{
|
||||
int retval = h->funcs->isSymLink(h, fname);
|
||||
__PHYSFS_platformReleaseMutex(stateLock);
|
||||
return(retval);
|
||||
} /* else */
|
||||
} /* if */
|
||||
retval = h->funcs->isSymLink(h, fname, &fileExists);
|
||||
} /* for */
|
||||
__PHYSFS_platformReleaseMutex(stateLock);
|
||||
|
||||
return(0);
|
||||
return(retval);
|
||||
} /* PHYSFS_isSymbolicLink */
|
||||
|
||||
|
||||
|
@ -1620,9 +1593,10 @@ PHYSFS_file *PHYSFS_openAppend(const char *filename)
|
|||
|
||||
PHYSFS_file *PHYSFS_openRead(const char *fname)
|
||||
{
|
||||
PHYSFS_file *retval;
|
||||
PHYSFS_file *retval = NULL;
|
||||
FileHandle *rc = NULL;
|
||||
FileHandleList *list;
|
||||
int fileExists = 0;
|
||||
PhysDirInfo *i;
|
||||
|
||||
BAIL_IF_MACRO(fname == NULL, ERR_INVALID_ARGUMENT, NULL);
|
||||
|
@ -1631,17 +1605,12 @@ PHYSFS_file *PHYSFS_openRead(const char *fname)
|
|||
|
||||
__PHYSFS_platformGrabMutex(stateLock);
|
||||
BAIL_IF_MACRO_MUTEX(!searchPath, ERR_NOT_IN_SEARCH_PATH, stateLock, NULL);
|
||||
for (i = searchPath; i != NULL; i = i->next)
|
||||
for (i = searchPath; ((i != NULL) && (!fileExists)); i = i->next)
|
||||
{
|
||||
DirHandle *h = i->dirHandle;
|
||||
if (__PHYSFS_verifySecurity(h, fname))
|
||||
{
|
||||
rc = h->funcs->openRead(h, fname);
|
||||
if (rc != NULL)
|
||||
break;
|
||||
} /* if */
|
||||
rc = h->funcs->openRead(h, fname, &fileExists);
|
||||
} /* for */
|
||||
|
||||
BAIL_IF_MACRO_MUTEX(rc == NULL, NULL, stateLock, NULL);
|
||||
|
||||
list = (FileHandleList *) malloc(sizeof (FileHandleList));
|
||||
|
@ -1711,9 +1680,6 @@ PHYSFS_sint64 PHYSFS_read(PHYSFS_file *handle, void *buffer,
|
|||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
|
||||
{
|
||||
FileHandle *h = (FileHandle *) handle->opaque;
|
||||
assert(h != NULL);
|
||||
assert(h->funcs != NULL);
|
||||
BAIL_IF_MACRO(h->funcs->read == NULL, ERR_NOT_SUPPORTED, -1);
|
||||
return(h->funcs->read(h, buffer, objSize, objCount));
|
||||
} /* PHYSFS_read */
|
||||
|
||||
|
@ -1722,9 +1688,6 @@ PHYSFS_sint64 PHYSFS_write(PHYSFS_file *handle, const void *buffer,
|
|||
PHYSFS_uint32 objSize, PHYSFS_uint32 objCount)
|
||||
{
|
||||
FileHandle *h = (FileHandle *) handle->opaque;
|
||||
assert(h != NULL);
|
||||
assert(h->funcs != NULL);
|
||||
BAIL_IF_MACRO(h->funcs->write == NULL, ERR_NOT_SUPPORTED, -1);
|
||||
return(h->funcs->write(h, buffer, objSize, objCount));
|
||||
} /* PHYSFS_write */
|
||||
|
||||
|
@ -1732,9 +1695,6 @@ PHYSFS_sint64 PHYSFS_write(PHYSFS_file *handle, const void *buffer,
|
|||
int PHYSFS_eof(PHYSFS_file *handle)
|
||||
{
|
||||
FileHandle *h = (FileHandle *) handle->opaque;
|
||||
assert(h != NULL);
|
||||
assert(h->funcs != NULL);
|
||||
BAIL_IF_MACRO(h->funcs->eof == NULL, ERR_NOT_SUPPORTED, -1);
|
||||
return(h->funcs->eof(h));
|
||||
} /* PHYSFS_eof */
|
||||
|
||||
|
@ -1742,9 +1702,6 @@ int PHYSFS_eof(PHYSFS_file *handle)
|
|||
PHYSFS_sint64 PHYSFS_tell(PHYSFS_file *handle)
|
||||
{
|
||||
FileHandle *h = (FileHandle *) handle->opaque;
|
||||
assert(h != NULL);
|
||||
assert(h->funcs != NULL);
|
||||
BAIL_IF_MACRO(h->funcs->tell == NULL, ERR_NOT_SUPPORTED, -1);
|
||||
return(h->funcs->tell(h));
|
||||
} /* PHYSFS_tell */
|
||||
|
||||
|
@ -1752,10 +1709,6 @@ PHYSFS_sint64 PHYSFS_tell(PHYSFS_file *handle)
|
|||
int PHYSFS_seek(PHYSFS_file *handle, PHYSFS_uint64 pos)
|
||||
{
|
||||
FileHandle *h = (FileHandle *) handle->opaque;
|
||||
assert(h != NULL);
|
||||
assert(h->funcs != NULL);
|
||||
BAIL_IF_MACRO(h->funcs->seek == NULL, ERR_NOT_SUPPORTED, 0);
|
||||
BAIL_IF_MACRO(pos < 0, ERR_INVALID_ARGUMENT, 0);
|
||||
return(h->funcs->seek(h, pos));
|
||||
} /* PHYSFS_seek */
|
||||
|
||||
|
@ -1763,10 +1716,6 @@ int PHYSFS_seek(PHYSFS_file *handle, PHYSFS_uint64 pos)
|
|||
PHYSFS_sint64 PHYSFS_fileLength(PHYSFS_file *handle)
|
||||
{
|
||||
FileHandle *h = (FileHandle *) handle->opaque;
|
||||
assert(h != NULL);
|
||||
assert(h->funcs != NULL);
|
||||
BAIL_IF_MACRO(h->funcs->fileLength == NULL, ERR_NOT_SUPPORTED, 0);
|
||||
|
||||
return(h->funcs->fileLength(h));
|
||||
} /* PHYSFS_filelength */
|
||||
|
||||
|
|
|
@ -842,6 +842,7 @@ typedef struct __PHYSFS_DIRFUNCTIONS__
|
|||
/*
|
||||
* Returns non-zero if filename can be opened for reading.
|
||||
* This filename is in platform-independent notation.
|
||||
* You should not follow symlinks.
|
||||
*/
|
||||
int (*exists)(DirHandle *r, const char *name);
|
||||
|
||||
|
@ -850,22 +851,34 @@ typedef struct __PHYSFS_DIRFUNCTIONS__
|
|||
* This filename is in platform-independent notation.
|
||||
* Symlinks should be followed; if what the symlink points
|
||||
* to is missing, or isn't a directory, then the retval is zero.
|
||||
*
|
||||
* Regardless of success or failure, please set *fileExists to
|
||||
* non-zero if the file existed (even if it's a broken symlink!),
|
||||
* zero if it did not.
|
||||
*/
|
||||
int (*isDirectory)(DirHandle *r, const char *name);
|
||||
int (*isDirectory)(DirHandle *r, const char *name, int *fileExists);
|
||||
|
||||
/*
|
||||
* Returns non-zero if filename is really a symlink.
|
||||
* This filename is in platform-independent notation.
|
||||
*
|
||||
* Regardless of success or failure, please set *fileExists to
|
||||
* non-zero if the file existed (even if it's a broken symlink!),
|
||||
* zero if it did not.
|
||||
*/
|
||||
int (*isSymLink)(DirHandle *r, const char *name);
|
||||
int (*isSymLink)(DirHandle *r, const char *name, int *fileExists);
|
||||
|
||||
/*
|
||||
* Retrieve the last modification time (mtime) of a file.
|
||||
* Returns -1 on failure, or the file's mtime in seconds since
|
||||
* the epoch (Jan 1, 1970) on success.
|
||||
* This filename is in platform-independent notation.
|
||||
*
|
||||
* Regardless of success or failure, please set *exists to
|
||||
* non-zero if the file existed (even if it's a broken symlink!),
|
||||
* zero if it did not.
|
||||
*/
|
||||
PHYSFS_sint64 (*getLastModTime)(DirHandle *r, const char *filename);
|
||||
PHYSFS_sint64 (*getLastModTime)(DirHandle *r, const char *fnm, int *exist);
|
||||
|
||||
/*
|
||||
* Open file for reading, and return a FileHandle.
|
||||
|
@ -874,8 +887,12 @@ typedef struct __PHYSFS_DIRFUNCTIONS__
|
|||
* you can opt to fail for the second call.
|
||||
* Fail if the file does not exist.
|
||||
* Returns NULL on failure, and calls __PHYSFS_setError().
|
||||
*
|
||||
* Regardless of success or failure, please set *fileExists to
|
||||
* non-zero if the file existed (even if it's a broken symlink!),
|
||||
* zero if it did not.
|
||||
*/
|
||||
FileHandle *(*openRead)(DirHandle *r, const char *filename);
|
||||
FileHandle *(*openRead)(DirHandle *r, const char *fname, int *fileExists);
|
||||
|
||||
/*
|
||||
* Open file for writing, and return a FileHandle.
|
||||
|
@ -1245,8 +1262,10 @@ int __PHYSFS_platformStricmp(const char *str1, const char *str2);
|
|||
|
||||
/*
|
||||
* Return non-zero if filename (in platform-dependent notation) exists.
|
||||
* Symlinks should be followed; if what the symlink points to is missing,
|
||||
* then the retval is false.
|
||||
* Symlinks should NOT be followed; at this stage, we do not care what the
|
||||
* symlink points to. Please call __PHYSFS_SetError() with the details of
|
||||
* why the file does not exist, if it doesn't; you are in a better position
|
||||
* to know (path not found, bogus filename, file itself is missing, etc).
|
||||
*/
|
||||
int __PHYSFS_platformExists(const char *fname);
|
||||
|
||||
|
@ -1258,7 +1277,6 @@ int __PHYSFS_platformExists(const char *fname);
|
|||
*/
|
||||
PHYSFS_sint64 __PHYSFS_platformGetLastModTime(const char *fname);
|
||||
|
||||
|
||||
/*
|
||||
* Return non-zero if filename (in platform-dependent notation) is a symlink.
|
||||
*/
|
||||
|
|
|
@ -144,10 +144,17 @@ int __PHYSFS_platformStricmp(const char *x, const char *y)
|
|||
} /* __PHYSFS_platformStricmp */
|
||||
|
||||
|
||||
#if (defined __PHYSFS_NO_SYMLINKS__)
|
||||
#define doStat stat
|
||||
#else
|
||||
#define doStat lstat
|
||||
#endif
|
||||
|
||||
int __PHYSFS_platformExists(const char *fname)
|
||||
{
|
||||
struct stat statbuf;
|
||||
return(stat(fname, &statbuf) == 0);
|
||||
BAIL_IF_MACRO(doStat(fname, &statbuf) == -1, strerror(errno), 0);
|
||||
return(1);
|
||||
} /* __PHYSFS_platformExists */
|
||||
|
||||
|
||||
|
@ -156,18 +163,9 @@ int __PHYSFS_platformIsSymLink(const char *fname)
|
|||
#if (defined __PHYSFS_NO_SYMLINKS__)
|
||||
return(0);
|
||||
#else
|
||||
|
||||
struct stat statbuf;
|
||||
int retval = 0;
|
||||
|
||||
if (lstat(fname, &statbuf) == 0)
|
||||
{
|
||||
if (S_ISLNK(statbuf.st_mode))
|
||||
retval = 1;
|
||||
} /* if */
|
||||
|
||||
return(retval);
|
||||
|
||||
BAIL_IF_MACRO(lstat(fname, &statbuf) == -1, strerror(errno), 0);
|
||||
return( (S_ISLNK(statbuf.st_mode)) ? 1 : 0 );
|
||||
#endif
|
||||
} /* __PHYSFS_platformIsSymlink */
|
||||
|
||||
|
@ -175,15 +173,8 @@ int __PHYSFS_platformIsSymLink(const char *fname)
|
|||
int __PHYSFS_platformIsDirectory(const char *fname)
|
||||
{
|
||||
struct stat statbuf;
|
||||
int retval = 0;
|
||||
|
||||
if (stat(fname, &statbuf) == 0)
|
||||
{
|
||||
if (S_ISDIR(statbuf.st_mode))
|
||||
retval = 1;
|
||||
} /* if */
|
||||
|
||||
return(retval);
|
||||
BAIL_IF_MACRO(stat(fname, &statbuf) == -1, strerror(errno), 0);
|
||||
return( (S_ISDIR(statbuf.st_mode)) ? 1 : 0 );
|
||||
} /* __PHYSFS_platformIsDirectory */
|
||||
|
||||
|
||||
|
|
|
@ -369,7 +369,9 @@ int __PHYSFS_platformStricmp(const char *x, const char *y)
|
|||
|
||||
int __PHYSFS_platformExists(const char *fname)
|
||||
{
|
||||
return(GetFileAttributes(fname) != INVALID_FILE_ATTRIBUTES);
|
||||
BAIL_IF_MACRO(GetFileAttributes(fname) == INVALID_FILE_ATTRIBUTES,
|
||||
win32strerror(), 0);
|
||||
return(1);
|
||||
} /* __PHYSFS_platformExists */
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue