platform/os2.c
changeset 416 eadb08626c80
parent 412 f743cf88c61f
child 420 8869f1432112
--- a/platform/os2.c	Sat Jul 27 22:41:19 2002 +0000
+++ b/platform/os2.c	Sat Jul 27 22:41:58 2002 +0000
@@ -233,7 +233,6 @@
     PHYSFS_sint32 len;
 
     assert(baseDir == NULL);
-
     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);
@@ -248,7 +247,7 @@
         } /* if */
     } /* for */
 
-    assert(len > 0);  /* should have been an "x:\\" on the front on string. */
+    assert(len > 0);  /* should have been a "x:\\" on the front on string. */
 
     baseDir = (char *) malloc(len + 1);
     BAIL_IF_MACRO(baseDir == NULL, ERR_OUT_OF_MEMORY, 0);
@@ -278,23 +277,31 @@
 } /* is_cdrom_inserted */
 
 
+/* looks like "CD01" in ASCII (littleendian)...used for an ioctl. */
+#define CD01 0x31304443
+
 static int is_cdrom_drive(ULONG drive)
 {
-    PHYSFS_uint16 cmd = (((drive & 0xFF) << 8) | 0);
-    BIOSPARAMETERBLOCK bpb;
+    PHYSFS_uint32 param, data;
     ULONG ul1, ul2;
     APIRET rc;
+    HFILE hfile = NULLHANDLE;
+    char drivename[3] = { 'A' + drive, ':', '\0' };
 
-    rc = DosDevIOCtl((HFILE) -1, IOCTL_DISK,
-                     DSK_GETDEVICEPARAMS,
-                     &cmd, sizeof (cmd), &ul1,
-                     &bpb, sizeof (bpb), &ul2);
+    rc = DosOpen(drivename, &hfile, &ul1, 0, 0,
+                 OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW,
+                 OPEN_FLAGS_DASD | OPEN_FLAGS_FAIL_ON_ERROR |
+                 OPEN_FLAGS_NOINHERIT | OPEN_SHARE_DENYNONE, NULL);
+    BAIL_IF_MACRO(rc != NO_ERROR, NULL, 0);
 
-    /*
-     * !!! 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) && ((bpb.fsDeviceAttr & 0x0001) == 0));
+    data = 0;
+    param = PHYSFS_swapULE32(CD01);
+    ul1 = ul2 = sizeof (PHYSFS_uint32);
+    rc = DosDevIOCtl(hfile, IOCTL_CDROMDISK, CDROMDISK_GETDRIVER,
+                     &param, sizeof (param), &ul1, &data, sizeof (data), &ul2);
+
+    DosClose(hfile);
+    return((rc == NO_ERROR) && (PHYSFS_swapULE32(data) == CD01));
 } /* is_cdrom_drive */
 
 
@@ -305,7 +312,7 @@
     ULONG i, bit;
     APIRET rc;
     char **retval;
-    PHYSFS_uint32 cd_count = 0;
+    PHYSFS_uint32 cd_count = 1;   /* we count the NULL entry. */
 
     retval = (char **) malloc(sizeof (char *));
     BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
@@ -340,6 +347,7 @@
         } /* if */
     } /* for */
 
+    retval[cd_count - 1] = NULL;
     return(retval);
 } /* __PHYSFS_platformDetectAvailableCDs */
 
@@ -441,15 +449,15 @@
                                                   int omitSymLinks)
 {
     char spec[CCHMAXPATH];
-    LinkedStringList *retval = NULL, *p = NULL;
+    LinkedStringList *ret = NULL, *p = NULL;
     FILEFINDBUF3 fb;
     HDIR hdir = HDIR_CREATE;
     ULONG count = 1;
     APIRET rc;
 
-    BAIL_IF_MACRO(strlen(dirname) > sizeof (spec) - 4, ERR_OS_ERROR, NULL);
+    BAIL_IF_MACRO(strlen(dirname) > sizeof (spec) - 5, ERR_OS_ERROR, NULL);
     strcpy(spec, dirname);
-    strcat(spec, "*.*");
+    strcat(spec, (spec[strlen(spec) - 1] != '\\') ? "\\*.*" : "*.*");
 
     rc = DosFindFirst(spec, &hdir,
                       FILE_DIRECTORY | FILE_ARCHIVED |
@@ -458,19 +466,14 @@
     BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, 0);
     while (count == 1)
     {
-        if (strcmp(fb.achName, ".") == 0)
-            continue;
-
-        if (strcmp(fb.achName, "..") == 0)
-            continue;
-
-        retval = __PHYSFS_addToLinkedStringList(retval, &p, fb.achName, -1);
+        if ((strcmp(fb.achName, ".") != 0) && (strcmp(fb.achName, "..") != 0))
+            ret = __PHYSFS_addToLinkedStringList(ret, &p, fb.achName, -1);
 
         DosFindNext(hdir, &fb, sizeof (fb), &count);
     } /* while */
 
     DosFindClose(hdir);
-    return(retval);
+    return(ret);
 } /* __PHYSFS_platformEnumerateFiles */