|
|
@@ -17,13 +17,23 @@
|
|
|
#define INCL_DOSFILEMGR
|
|
|
#define INCL_DOSMODULEMGR
|
|
|
#define INCL_DOSERRORS
|
|
|
+#define INCL_DOSPROCESS
|
|
|
#define INCL_DOSDEVICES
|
|
|
+#define INCL_DOSDEVIOCTL
|
|
|
+#define INCL_DOSMISC
|
|
|
#include <os2.h>
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
#include <errno.h>
|
|
|
#include <string.h>
|
|
|
#include <assert.h>
|
|
|
+#include <time.h>
|
|
|
+#include <ctype.h>
|
|
|
+
|
|
|
+#define __PHYSICSFS_INTERNAL__
|
|
|
+#include "physfs_internal.h"
|
|
|
+
|
|
|
+const char *__PHYSFS_platformDirSeparator = "\\";
|
|
|
|
|
|
|
|
|
static APIRET os2err(APIRET retval)
|
|
|
@@ -62,10 +72,6 @@ static APIRET os2err(APIRET retval)
|
|
|
err = "Not a DOS disk";
|
|
|
break;
|
|
|
|
|
|
- case ERROR_DRIVE_LOCKED:
|
|
|
- err = "Drive is locked";
|
|
|
- break;
|
|
|
-
|
|
|
case ERROR_SHARING_VIOLATION:
|
|
|
err = "Sharing violation";
|
|
|
break;
|
|
|
@@ -78,10 +84,6 @@ static APIRET os2err(APIRET retval)
|
|
|
err = "Device already in use";
|
|
|
break;
|
|
|
|
|
|
- case ERROR_DRIVE_LOCKED:
|
|
|
- err = "Drive is locked";
|
|
|
- break;
|
|
|
-
|
|
|
case ERROR_OPEN_FAILED:
|
|
|
err = "Open failed";
|
|
|
break;
|
|
|
@@ -90,7 +92,7 @@ static APIRET os2err(APIRET retval)
|
|
|
err = "Disk is full";
|
|
|
break;
|
|
|
|
|
|
- case ERROR_DISK_FULL:
|
|
|
+ case ERROR_PIPE_BUSY:
|
|
|
err = "Pipe busy";
|
|
|
break;
|
|
|
|
|
|
@@ -104,7 +106,7 @@ static APIRET os2err(APIRET retval)
|
|
|
break;
|
|
|
|
|
|
case ERROR_TOO_MANY_HANDLES:
|
|
|
- case ERROR_TOO_OPEN_FILES:
|
|
|
+ case ERROR_TOO_MANY_OPEN_FILES:
|
|
|
case ERROR_NO_MORE_SEARCH_HANDLES:
|
|
|
err = "Too many open handles";
|
|
|
break;
|
|
|
@@ -192,10 +194,6 @@ static APIRET os2err(APIRET retval)
|
|
|
err = "OS/2 reported an inconsistent Extended Attribute list";
|
|
|
break;
|
|
|
|
|
|
- case ERROR_EA_VALUE_UNSUPPORTABLE:
|
|
|
- err = "OS/2 reported an unsupportable Extended Attribute value";
|
|
|
- break;
|
|
|
-
|
|
|
case ERROR_SEM_OWNER_DIED:
|
|
|
err = "OS/2 reported that semaphore owner died";
|
|
|
break;
|
|
|
@@ -230,18 +228,18 @@ int __PHYSFS_platformInit(void)
|
|
|
{
|
|
|
char buf[CCHMAXPATH];
|
|
|
APIRET rc;
|
|
|
- TIB tib;
|
|
|
- PIB pib;
|
|
|
+ PTIB ptib;
|
|
|
+ PPIB ppib;
|
|
|
|
|
|
assert(baseDir == NULL);
|
|
|
|
|
|
- BAIL_IF_MACRO(os2err(DosGetInfoBlocks(&tib, &pib)) != NO_ERROR, NULL, 0);
|
|
|
- rc = DosQueryModuleName(pib.pib_hmte, sizeof (buf), (PCHAR) buf);
|
|
|
+ BAIL_IF_MACRO(os2err(DosGetInfoBlocks(&ptib, &ppib)) != NO_ERROR, NULL, 0);
|
|
|
+ rc = DosQueryModuleName(ppib->pib_hmte, sizeof (buf), (PCHAR) buf);
|
|
|
BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, 0);
|
|
|
|
|
|
baseDir = (char *) malloc(strlen(buf) + 1);
|
|
|
BAIL_IF_MACRO(baseDir == NULL, ERR_OUT_OF_MEMORY, 0);
|
|
|
- strcpy(baseDir);
|
|
|
+ strcpy(baseDir, buf);
|
|
|
|
|
|
return(1); /* success. */
|
|
|
} /* __PHYSFS_platformInit */
|
|
|
@@ -277,13 +275,13 @@ static int is_cdrom_drive(ULONG drive)
|
|
|
rc = DosDevIOCtl((HFILE) -1, IOCTL_DISK,
|
|
|
DSK_GETDEVICEPARAMS,
|
|
|
&cmd, sizeof (cmd), &ul1,
|
|
|
- &bpb, sizeof (bpb), &u2);
|
|
|
+ &bpb, sizeof (bpb), &ul2);
|
|
|
|
|
|
/*
|
|
|
* !!! FIXME: Note that this tells us that the media is REMOVABLE...
|
|
|
* !!! FIXME: but it might not be a CD-ROM...check driver name?
|
|
|
*/
|
|
|
- return((rc == NO_ERROR) && ((DiskData.fsDeviceAttr & 0x0001) == 0));
|
|
|
+ return((rc == NO_ERROR) && ((bpb.fsDeviceAttr & 0x0001) == 0));
|
|
|
} /* is_cdrom_drive */
|
|
|
|
|
|
|
|
|
@@ -304,7 +302,7 @@ char **__PHYSFS_platformDetectAvailableCDs(void)
|
|
|
BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, retval);
|
|
|
|
|
|
/* !!! FIXME: the a, b, and c drives are almost certainly NOT cdroms... */
|
|
|
- for (i = 0, bit = 1; i < 26; i++, bit << 1)
|
|
|
+ for (i = 0, bit = 1; i < 26; i++, bit <<= 1)
|
|
|
{
|
|
|
if (drivemap & bit) /* this logical drive exists. */
|
|
|
{
|
|
|
@@ -431,19 +429,19 @@ LinkedStringList *__PHYSFS_platformEnumerateFiles(const char *dirname,
|
|
|
{
|
|
|
char spec[CCHMAXPATH];
|
|
|
LinkedStringList *retval = NULL, *p = NULL;
|
|
|
- FINDFILEBUF3 fb;
|
|
|
+ FILEFINDBUF3 fb;
|
|
|
HDIR hdir = HDIR_CREATE;
|
|
|
ULONG count = 1;
|
|
|
APIRET rc;
|
|
|
|
|
|
BAIL_IF_MACRO(strlen(dirname) > sizeof (spec) - 4, ERR_OS_ERROR, NULL);
|
|
|
- strcpy(spec, dname)
|
|
|
+ strcpy(spec, dirname);
|
|
|
strcat(spec, "*.*");
|
|
|
|
|
|
rc = DosFindFirst(spec, &hdir,
|
|
|
FILE_DIRECTORY | FILE_ARCHIVED |
|
|
|
FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM,
|
|
|
- &fb, sizeof (fb), &count, FIL_STANDARD)
|
|
|
+ &fb, sizeof (fb), &count, FIL_STANDARD);
|
|
|
BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, 0);
|
|
|
while (count == 1)
|
|
|
{
|
|
|
@@ -500,7 +498,7 @@ char *__PHYSFS_platformRealPath(const char *path)
|
|
|
{
|
|
|
char buf[CCHMAXPATH];
|
|
|
char *retval;
|
|
|
- APIRET rc = DosQueryPathInfo(fname, FIL_QUERYFULLNAME, buf, sizeof (buf));
|
|
|
+ APIRET rc = DosQueryPathInfo(path, FIL_QUERYFULLNAME, buf, sizeof (buf));
|
|
|
BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, NULL);
|
|
|
retval = (char *) malloc(strlen(buf) + 1);
|
|
|
BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
|
|
|
@@ -527,7 +525,7 @@ void *__PHYSFS_platformOpenRead(const char *filename)
|
|
|
os2err(DosOpen(filename, &hfile, &actionTaken, 0, FILE_NORMAL,
|
|
|
OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW,
|
|
|
OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_LOCALITY |
|
|
|
- OPEN_FLAGS_NO_INHERIT | OPEN_SHARE_DENYWRITE |
|
|
|
+ OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYWRITE |
|
|
|
OPEN_ACCESS_READONLY, NULL));
|
|
|
|
|
|
return((void *) hfile);
|
|
|
@@ -546,7 +544,7 @@ void *__PHYSFS_platformOpenWrite(const char *filename)
|
|
|
os2err(DosOpen(filename, &hfile, &actionTaken, 0, FILE_NORMAL,
|
|
|
OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW,
|
|
|
OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_LOCALITY |
|
|
|
- OPEN_FLAGS_NO_INHERIT | OPEN_SHARE_DENYWRITE |
|
|
|
+ OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYWRITE |
|
|
|
OPEN_ACCESS_READWRITE, NULL));
|
|
|
|
|
|
return((void *) hfile);
|
|
|
@@ -557,6 +555,7 @@ void *__PHYSFS_platformOpenAppend(const char *filename)
|
|
|
{
|
|
|
ULONG dummy = 0;
|
|
|
HFILE hfile = NULLHANDLE;
|
|
|
+ APIRET rc;
|
|
|
|
|
|
/*
|
|
|
* File must be opened SHARE_DENYWRITE and ACCESS_READWRITE, otherwise
|
|
|
@@ -565,7 +564,7 @@ void *__PHYSFS_platformOpenAppend(const char *filename)
|
|
|
rc = os2err(DosOpen(filename, &hfile, &dummy, 0, FILE_NORMAL,
|
|
|
OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW,
|
|
|
OPEN_FLAGS_FAIL_ON_ERROR | OPEN_FLAGS_NO_LOCALITY |
|
|
|
- OPEN_FLAGS_NO_INHERIT | OPEN_SHARE_DENYWRITE |
|
|
|
+ OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYWRITE |
|
|
|
OPEN_ACCESS_READWRITE, NULL));
|
|
|
|
|
|
if (rc == NO_ERROR)
|
|
|
@@ -590,14 +589,14 @@ PHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buffer,
|
|
|
|
|
|
for (retval = 0; retval < count; retval++)
|
|
|
{
|
|
|
- APIRET rc = os2err(DosRead(hfile, buffer, size, &br));
|
|
|
+ os2err(DosRead(hfile, buffer, size, &br));
|
|
|
if (br < size)
|
|
|
{
|
|
|
- DosSetFilePtr(hfile, -bw, FILE_CURRENT, &br); /* try to cleanup. */
|
|
|
+ DosSetFilePtr(hfile, -br, FILE_CURRENT, &br); /* try to cleanup. */
|
|
|
return(retval);
|
|
|
} /* if */
|
|
|
|
|
|
- buffer = (void *) ( ((char *) buffer) + size) );
|
|
|
+ buffer = (void *) ( ((char *) buffer) + size );
|
|
|
} /* for */
|
|
|
|
|
|
return(retval);
|
|
|
@@ -613,14 +612,14 @@ PHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,
|
|
|
|
|
|
for (retval = 0; retval < count; retval++)
|
|
|
{
|
|
|
- APIRET rc = os2err(DosWrite(hfile, buffer, size, &bw));
|
|
|
+ os2err(DosWrite(hfile, buffer, size, &bw));
|
|
|
if (bw < size)
|
|
|
{
|
|
|
DosSetFilePtr(hfile, -bw, FILE_CURRENT, &bw); /* try to cleanup. */
|
|
|
return(retval);
|
|
|
} /* if */
|
|
|
|
|
|
- buffer = (void *) ( ((char *) buffer) + size) );
|
|
|
+ buffer = (void *) ( ((char *) buffer) + size );
|
|
|
} /* for */
|
|
|
|
|
|
return(retval);
|
|
|
@@ -675,7 +674,7 @@ int __PHYSFS_platformEOF(void *opaque)
|
|
|
|
|
|
int __PHYSFS_platformFlush(void *opaque)
|
|
|
{
|
|
|
- return(os2err(DosResetBuffers((HFILE) opaque) == NO_ERROR));
|
|
|
+ return(os2err(DosResetBuffer((HFILE) opaque) == NO_ERROR));
|
|
|
} /* __PHYSFS_platformFlush */
|
|
|
|
|
|
|
|
|
@@ -696,6 +695,7 @@ int __PHYSFS_platformDelete(const char *path)
|
|
|
|
|
|
PHYSFS_sint64 __PHYSFS_platformGetLastModTime(const char *fname)
|
|
|
{
|
|
|
+ PHYSFS_sint64 retval;
|
|
|
struct tm tm;
|
|
|
FILESTATUS3 fs;
|
|
|
APIRET rc = DosQueryPathInfo(fname, FIL_STANDARD, &fs, sizeof (fs));
|
|
|
@@ -728,15 +728,15 @@ void __PHYSFS_platformTimeslice(void)
|
|
|
|
|
|
PHYSFS_uint64 __PHYSFS_platformGetThreadID(void)
|
|
|
{
|
|
|
- TIB tib;
|
|
|
- PIB pib;
|
|
|
+ PTIB ptib;
|
|
|
+ PPIB ppib;
|
|
|
|
|
|
/*
|
|
|
* Allegedly, this API never fails, but we'll punt and return a
|
|
|
* default value (zero might as well do) if it does.
|
|
|
*/
|
|
|
- BAIL_IF_MACRO(os2err(DosGetInfoBlocks(&tib, &pib)) != NO_ERROR, 0, 0);
|
|
|
- return((PHYSFS_uint64) tib.tib_ordinal);
|
|
|
+ BAIL_IF_MACRO(os2err(DosGetInfoBlocks(&ptib, &ppib)) != NO_ERROR, 0, 0);
|
|
|
+ return((PHYSFS_uint64) ptib->tib_ordinal);
|
|
|
} /* __PHYSFS_platformGetThreadID */
|
|
|
|
|
|
|