paragui-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paragui-cvs] CVS: paragui/src/physfs/platform os2.c,NONE,1.1.2.1 Makefi


From: Alexander Pipelka <address@hidden>
Subject: [paragui-cvs] CVS: paragui/src/physfs/platform os2.c,NONE,1.1.2.1 Makefile.am,1.1.1.1.6.6,1.1.1.1.6.7 beos.cpp,1.1.2.5,1.1.2.6 macclassic.c,1.1.2.5,1.1.2.6 posix.c,1.1.2.4,1.1.2.5 unix.c,1.1.1.1.6.6,1.1.1.1.6.7 win32.c,1.1.1.1.6.13,1.1.1.1.6.14
Date: Tue, 30 Jul 2002 16:50:29 -0400

Update of /cvsroot/paragui/paragui/src/physfs/platform
In directory subversions:/tmp/cvs-serv15063/src/physfs/platform

Modified Files:
      Tag: devel-1-0
        Makefile.am beos.cpp macclassic.c posix.c unix.c win32.c 
Added Files:
      Tag: devel-1-0
        os2.c 
Log Message:
physfs sync
memleaks fixed
fixed callbacks within modal loops



--- NEW FILE ---
/*
 * OS/2 support routines for PhysicsFS.
 *
 * Please see the file LICENSE in the source's root directory.
 *
 *  This file written by Ryan C. Gordon.
 */

#if HAVE_CONFIG_H
#  include <config.h>
#endif

#if (defined OS2)

#define INCL_DOSSEMAPHORES
#define INCL_DOSDATETIME
#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 const char *get_os2_error_string(APIRET rc)
{
    switch (rc)
    {
        case NO_ERROR: return(NULL);  /* not an error. */
        case ERROR_INTERRUPT: return(NULL);  /* not an error. */
        case ERROR_TIMEOUT: return(NULL);  /* not an error. */
        case ERROR_NOT_ENOUGH_MEMORY: return(ERR_OUT_OF_MEMORY);
        case ERROR_FILE_NOT_FOUND: return(ERR_NO_SUCH_FILE);
        case ERROR_PATH_NOT_FOUND: return(ERR_NO_SUCH_PATH);
        case ERROR_ACCESS_DENIED: return(ERR_ACCESS_DENIED);
        case ERROR_NOT_DOS_DISK: return(ERR_NOT_A_DOS_DISK);
        case ERROR_SHARING_VIOLATION: return(ERR_SHARING_VIOLATION);
        case ERROR_CANNOT_MAKE: return(ERR_CANNOT_MAKE);
        case ERROR_DEVICE_IN_USE: return(ERR_DEV_IN_USE);
        case ERROR_OPEN_FAILED: return(ERR_OPEN_FAILED);
        case ERROR_DISK_FULL: return(ERR_DISK_FULL);
        case ERROR_PIPE_BUSY: return(ERR_PIPE_BUSY);
        case ERROR_SHARING_BUFFER_EXCEEDED: return(ERR_SHARING_BUF_EXCEEDED);
        case ERROR_FILENAME_EXCED_RANGE: return(ERR_BAD_FILENAME);
        case ERROR_META_EXPANSION_TOO_LONG: return(ERR_BAD_FILENAME);
        case ERROR_TOO_MANY_HANDLES: return(ERR_TOO_MANY_HANDLES);
        case ERROR_TOO_MANY_OPEN_FILES: return(ERR_TOO_MANY_HANDLES);
        case ERROR_NO_MORE_SEARCH_HANDLES: return(ERR_TOO_MANY_HANDLES);
        case ERROR_SEEK_ON_DEVICE: return(ERR_SEEK_ERROR);
        case ERROR_NEGATIVE_SEEK: return(ERR_SEEK_OUT_OF_RANGE);
        case ERROR_DEL_CURRENT_DIRECTORY: return(ERR_DEL_CWD);
        case ERROR_WRITE_PROTECT: return(ERR_WRITE_PROTECT_ERROR);
        case ERROR_WRITE_FAULT: return(ERR_WRITE_FAULT);
        case ERROR_LOCK_VIOLATION: return(ERR_LOCK_VIOLATION);
        case ERROR_GEN_FAILURE: return(ERR_GENERAL_FAILURE);
        case ERROR_UNCERTAIN_MEDIA: return(ERR_UNCERTAIN_MEDIA);
        case ERROR_PROTECTION_VIOLATION: return(ERR_PROT_VIOLATION);
        case ERROR_BROKEN_PIPE: return(ERR_BROKEN_PIPE);

        case ERROR_INVALID_PARAMETER:
        case ERROR_INVALID_NAME:
        case ERROR_INVALID_DRIVE:
        case ERROR_INVALID_HANDLE:
        case ERROR_INVALID_FUNCTION:
        case ERROR_INVALID_LEVEL:
        case ERROR_INVALID_CATEGORY:
        case ERROR_DUPLICATE_NAME:
        case ERROR_BUFFER_OVERFLOW:
        case ERROR_BAD_LENGTH:
        case ERROR_BAD_DRIVER_LEVEL:
        case ERROR_DIRECT_ACCESS_HANDLE:
        case ERROR_NOT_OWNER:
            return(ERR_PHYSFS_BAD_OS_CALL);

        default: return(ERR_OS2_GENERIC);
    } /* switch */

    return(NULL);
} /* get_os2_error_string */


static APIRET os2err(APIRET retval)
{
    char buf[128];
    const char *err = get_os2_error_string(retval);
    if (err == ERR_OS2_GENERIC)
    {
        snprintf(buf, ERR_OS2_GENERIC, (int) retval);
        err = buf;
    } /* if */

    if (err != NULL)
        __PHYSFS_setError(err);

    return(err);
} /* os2err */


/* (be gentle, this function isn't very robust.) */
static void cvt_path_to_correct_case(char *buf)
{
    char *fname = buf + 3;            /* point to first element. */
    char *ptr = strchr(fname, '\\');  /* find end of first element. */

    buf[0] = toupper(buf[0]);  /* capitalize drive letter. */

    /*
     * Go through each path element, and enumerate its parent dir until
     *  a case-insensitive match is found. If one is (and it SHOULD be)
     *  then overwrite the original element with the correct case.
     * If there's an error, or the path has vanished for some reason, it
     *  won't hurt to have the original case, so we just keep going.
     */
    while (fname != NULL)
    {
        char spec[CCHMAXPATH];
        FILEFINDBUF3 fb;
        HDIR hdir = HDIR_CREATE;
        ULONG count = 1;
        APIRET rc;

        *(fname - 1) = '\0';  /* isolate parent dir string. */

        strcpy(spec, buf);      /* copy isolated parent dir... */
        strcat(spec, "\\*.*");  /*  ...and add wildcard search spec. */

        if (ptr != NULL)  /* isolate element to find (fname is the start). */
            *ptr = '\0';

        rc = DosFindFirst(spec, &hdir, FILE_DIRECTORY,
                          &fb, sizeof (fb), &count, FIL_STANDARD);
        if (rc == NO_ERROR)
        {
            while (count == 1)  /* while still entries to enumerate... */
            {
                if (__PHYSFS_platformStricmp(fb.achName, fname) == 0)
                {
                    strcpy(fname, fb.achName);
                    break;  /* there it is. Overwrite and stop searching. */
                } /* if */

                DosFindNext(hdir, &fb, sizeof (fb), &count);
            } /* while */
            DosFindClose(hdir);
        } /* if */

        *(fname - 1) = '\\';   /* unisolate parent dir. */
        fname = ptr;           /* point to next element. */
        if (ptr != NULL)
        {
            *ptr = '\\';       /* unisolate element. */
            ptr = strchr(++fname, '\\');  /* find next element. */
        } /* if */
    } /* while */
} /* cvt_file_to_correct_case */


static char *baseDir = NULL;

int __PHYSFS_platformInit(void)
{
    char buf[CCHMAXPATH];
    APIRET rc;
    PTIB ptib;
    PPIB ppib;
    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);

    /* chop off filename, leave path. */
    for (len = strlen(buf) - 1; len >= 0; len--)
    {
        if (buf[len] == '\\')
        {
            buf[len] = '\0';
            break;
        } /* if */
    } /* for */

    assert(len > 0);  /* should have been a "x:\\" on the front on string. */

    /* The string is capitalized! Figure out the REAL case... */
    cvt_path_to_correct_case(buf);

    baseDir = (char *) malloc(len + 1);
    BAIL_IF_MACRO(baseDir == NULL, ERR_OUT_OF_MEMORY, 0);
    strcpy(baseDir, buf);
    return(1);  /* success. */
} /* __PHYSFS_platformInit */


int __PHYSFS_platformDeinit(void)
{
    assert(baseDir != NULL);
    free(baseDir);
    baseDir = NULL;
    return(1);  /* success. */
} /* __PHYSFS_platformDeinit */


static int disc_is_inserted(ULONG drive)
{
    int rc;
    char buf[20];
    DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION);
    rc = DosQueryFSInfo(drive + 1, FSIL_VOLSER, buf, sizeof (buf));
    DosError(FERR_ENABLEHARDERR | FERR_ENABLEEXCEPTION);
    return(rc == NO_ERROR);
} /* is_cdrom_inserted */


/* looks like "CD01" in ASCII (littleendian)...used for an ioctl. */
#define CD01 0x31304443

static int is_cdrom_drive(ULONG drive)
{
    PHYSFS_uint32 param, data;
    ULONG ul1, ul2;
    APIRET rc;
    HFILE hfile = NULLHANDLE;
    char drivename[3] = { 'A' + drive, ':', '\0' };

    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);

    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 */


char **__PHYSFS_platformDetectAvailableCDs(void)
{
    ULONG dummy;
    ULONG drivemap;
    ULONG i, bit;
    APIRET rc;
    char **retval;
    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);
    *retval = NULL;

    rc = DosQueryCurrentDisk(&dummy, &drivemap);
    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)
    {
        if (drivemap & bit)  /* this logical drive exists. */
        {
            if ((is_cdrom_drive(i)) && (disc_is_inserted(i)))
            {
                char **tmp = realloc(retval, sizeof (char *) * (cd_count + 1));
                if (tmp)
                {
                    char *str = (char *) malloc(4);
                    retval = tmp;
                    retval[cd_count - 1] = str;
                    if (str)
                    {
                        str[0] = ('A' + i);
                        str[1] = ':';
                        str[2] = '\\';
                        str[3] = '\0';
                        cd_count++;
                    } /* if */
                } /* if */
            } /* if */
        } /* if */
    } /* for */

    retval[cd_count - 1] = NULL;
    return(retval);
} /* __PHYSFS_platformDetectAvailableCDs */


char *__PHYSFS_platformCalcBaseDir(const char *argv0)
{
    char *retval = (char *) malloc(strlen(baseDir) + 1);
    BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);
    strcpy(retval, baseDir); /* calculated at init time. */
    return(retval);
} /* __PHYSFS_platformCalcBaseDir */


char *__PHYSFS_platformGetUserName(void)
{
    return(NULL);  /* (*shrug*) */
} /* __PHYSFS_platformGetUserName */


char *__PHYSFS_platformGetUserDir(void)
{
    return(__PHYSFS_platformCalcBaseDir(NULL));
} /* __PHYSFS_platformGetUserDir */


int __PHYSFS_platformStricmp(const char *x, const char *y)
{
    int ux, uy;

    do
    {
        ux = toupper((int) *x);
        uy = toupper((int) *y);
        if (ux > uy)
            return(1);
        else if (ux < uy)
            return(-1);
        x++;
        y++;
    } while ((ux) && (uy));

    return(0);
} /* __PHYSFS_platformStricmp */


int __PHYSFS_platformExists(const char *fname)
{
    FILESTATUS3 fs;
    APIRET rc = DosQueryPathInfo(fname, FIL_STANDARD, &fs, sizeof (fs));
    return(os2err(rc) == NO_ERROR);
} /* __PHYSFS_platformExists */


int __PHYSFS_platformIsSymLink(const char *fname)
{
    return(0);  /* no symlinks in OS/2. */
} /* __PHYSFS_platformIsSymlink */


int __PHYSFS_platformIsDirectory(const char *fname)
{
    FILESTATUS3 fs;
    APIRET rc = DosQueryPathInfo(fname, FIL_STANDARD, &fs, sizeof (fs));
    BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, 0)
    return((fs.attrFile & FILE_DIRECTORY) != 0);
} /* __PHYSFS_platformIsDirectory */


char *__PHYSFS_platformCvtToDependent(const char *prepend,
                                      const char *dirName,
                                      const char *append)
{
    int len = ((prepend) ? strlen(prepend) : 0) +
              ((append) ? strlen(append) : 0) +
              strlen(dirName) + 1;
    char *retval = malloc(len);
    char *p;

    BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);

    if (prepend)
        strcpy(retval, prepend);
    else
        retval[0] = '\0';

    strcat(retval, dirName);

    if (append)
        strcat(retval, append);

    for (p = strchr(retval, '/'); p != NULL; p = strchr(p + 1, '/'))
        *p = '\\';

    return(retval);
} /* __PHYSFS_platformCvtToDependent */


LinkedStringList *__PHYSFS_platformEnumerateFiles(const char *dirname,
                                                  int omitSymLinks)
{
    char spec[CCHMAXPATH];
    LinkedStringList *ret = NULL, *p = NULL;
    FILEFINDBUF3 fb;
    HDIR hdir = HDIR_CREATE;
    ULONG count = 1;
    APIRET rc;

    BAIL_IF_MACRO(strlen(dirname) > sizeof (spec) - 5, ERR_BAD_FILENAME, NULL);
    strcpy(spec, dirname);
    strcat(spec, (spec[strlen(spec) - 1] != '\\') ? "\\*.*" : "*.*");

    rc = DosFindFirst(spec, &hdir,
                      FILE_DIRECTORY | FILE_ARCHIVED |
                      FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM,
                      &fb, sizeof (fb), &count, FIL_STANDARD);
    BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, 0);
    while (count == 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(ret);
} /* __PHYSFS_platformEnumerateFiles */


char *__PHYSFS_platformCurrentDir(void)
{
    char *retval;
    ULONG currentDisk;
    ULONG dummy;
    ULONG pathSize = 0;
    APIRET rc;
    BYTE byte;

    rc = DosQueryCurrentDisk(&currentDisk, &dummy);
    BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, NULL);

    /* The first call just tells us how much space we need for the string. */
    rc = DosQueryCurrentDir(currentDisk, &byte, &pathSize);
    pathSize++; /* Add space for null terminator. */
    retval = (char *) malloc(pathSize + 3);  /* plus "x:\\" */
    BAIL_IF_MACRO(retval == NULL, ERR_OUT_OF_MEMORY, NULL);

    /* Actually get the string this time. */
    rc = DosQueryCurrentDir(currentDisk, (PBYTE) (retval + 3), &pathSize);
    if (os2err(rc) != NO_ERROR)
    {
        free(retval);
        return(NULL);
    } /* if */

    retval[0] = ('A' + (currentDisk - 1));
    retval[1] = ':';
    retval[2] = '\\';
    return(retval);
} /* __PHYSFS_platformCurrentDir */


char *__PHYSFS_platformRealPath(const char *path)
{
    char buf[CCHMAXPATH];
    char *retval;
    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);
    strcpy(retval, buf);
    return(retval);
} /* __PHYSFS_platformRealPath */


int __PHYSFS_platformMkDir(const char *path)
{
    return(os2err(DosCreateDir(path, NULL)) == NO_ERROR);
} /* __PHYSFS_platformMkDir */


void *__PHYSFS_platformOpenRead(const char *filename)
{
    ULONG actionTaken = 0;
    HFILE hfile = NULLHANDLE;

    /*
     * File must be opened SHARE_DENYWRITE and ACCESS_READONLY, otherwise
     *  DosQueryFileInfo() will fail if we try to get a file length, etc.
     */
    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_NOINHERIT | OPEN_SHARE_DENYWRITE |
                   OPEN_ACCESS_READONLY, NULL));

    return((void *) hfile);
} /* __PHYSFS_platformOpenRead */


void *__PHYSFS_platformOpenWrite(const char *filename)
{
    ULONG actionTaken = 0;
    HFILE hfile = NULLHANDLE;

    /*
     * File must be opened SHARE_DENYWRITE and ACCESS_READWRITE, otherwise
     *  DosQueryFileInfo() will fail if we try to get a file length, etc.
     */
    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_NOINHERIT | OPEN_SHARE_DENYWRITE |
                   OPEN_ACCESS_READWRITE, NULL));

    return((void *) hfile);
} /* __PHYSFS_platformOpenWrite */


void *__PHYSFS_platformOpenAppend(const char *filename)
{
    ULONG dummy = 0;
    HFILE hfile = NULLHANDLE;
    APIRET rc;

    /*
     * File must be opened SHARE_DENYWRITE and ACCESS_READWRITE, otherwise
     *  DosQueryFileInfo() will fail if we try to get a file length, etc.
     */
    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_NOINHERIT | OPEN_SHARE_DENYWRITE |
                   OPEN_ACCESS_READWRITE, NULL));

    if (rc == NO_ERROR)
    {
        if (os2err(DosSetFilePtr(hfile, 0, FILE_END, &dummy)) != NO_ERROR)
        {
            DosClose(hfile);
            hfile = NULLHANDLE;
        } /* if */
    } /* if */

    return((void *) hfile);
} /* __PHYSFS_platformOpenAppend */


PHYSFS_sint64 __PHYSFS_platformRead(void *opaque, void *buffer,
                                    PHYSFS_uint32 size, PHYSFS_uint32 count)
{
    HFILE hfile = (HFILE) opaque;
    PHYSFS_sint64 retval;
    ULONG br;

    for (retval = 0; retval < count; retval++)
    {
        os2err(DosRead(hfile, buffer, size, &br));
        if (br < size)
        {
            DosSetFilePtr(hfile, -br, FILE_CURRENT, &br); /* try to cleanup. */
            return(retval);
        } /* if */

        buffer = (void *) ( ((char *) buffer) + size );
    } /* for */

    return(retval);
} /* __PHYSFS_platformRead */


PHYSFS_sint64 __PHYSFS_platformWrite(void *opaque, const void *buffer,
                                     PHYSFS_uint32 size, PHYSFS_uint32 count)
{
    HFILE hfile = (HFILE) opaque;
    PHYSFS_sint64 retval;
    ULONG bw;

    for (retval = 0; retval < count; retval++)
    {
        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 );
    } /* for */

    return(retval);
} /* __PHYSFS_platformWrite */


int __PHYSFS_platformSeek(void *opaque, PHYSFS_uint64 pos)
{
    ULONG dummy;
    HFILE hfile = (HFILE) opaque;
    LONG dist = (LONG) pos;

    /* hooray for 32-bit filesystem limits!  :) */
    BAIL_IF_MACRO((PHYSFS_uint64) dist != pos, ERR_SEEK_OUT_OF_RANGE, 0);

    return(os2err(DosSetFilePtr(hfile, dist, FILE_BEGIN, &dummy)) == NO_ERROR);
} /* __PHYSFS_platformSeek */


PHYSFS_sint64 __PHYSFS_platformTell(void *opaque)
{
    ULONG pos;
    HFILE hfile = (HFILE) opaque;
    APIRET rc = os2err(DosSetFilePtr(hfile, 0, FILE_CURRENT, &pos));
    BAIL_IF_MACRO(rc != NO_ERROR, NULL, -1);
    return((PHYSFS_sint64) pos);
} /* __PHYSFS_platformTell */


PHYSFS_sint64 __PHYSFS_platformFileLength(void *opaque)
{
    FILESTATUS3 fs;
    HFILE hfile = (HFILE) opaque;
    APIRET rc = DosQueryFileInfo(hfile, FIL_STANDARD, &fs, sizeof (fs));
    BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, -1);
    return((PHYSFS_sint64) fs.cbFile);
} /* __PHYSFS_platformFileLength */


int __PHYSFS_platformEOF(void *opaque)
{
    PHYSFS_sint64 len, pos;

    len = __PHYSFS_platformFileLength(opaque);
    BAIL_IF_MACRO(len == -1, NULL, 1);  /* (*shrug*) */
    pos = __PHYSFS_platformTell(opaque);
    BAIL_IF_MACRO(pos == -1, NULL, 1);  /* (*shrug*) */

    return(pos >= len);
} /* __PHYSFS_platformEOF */


int __PHYSFS_platformFlush(void *opaque)
{
    return(os2err(DosResetBuffer((HFILE) opaque) == NO_ERROR));
} /* __PHYSFS_platformFlush */


int __PHYSFS_platformClose(void *opaque)
{
    return(os2err(DosClose((HFILE) opaque) == NO_ERROR));
} /* __PHYSFS_platformClose */


int __PHYSFS_platformDelete(const char *path)
{
    if (__PHYSFS_platformIsDirectory(path))
        return(os2err(DosDeleteDir(path)) == NO_ERROR);

    return(os2err(DosDelete(path) == NO_ERROR));
} /* __PHYSFS_platformDelete */


PHYSFS_sint64 __PHYSFS_platformGetLastModTime(const char *fname)
{
    PHYSFS_sint64 retval;
    struct tm tm;
    FILESTATUS3 fs;
    APIRET rc = DosQueryPathInfo(fname, FIL_STANDARD, &fs, sizeof (fs));
    BAIL_IF_MACRO(os2err(rc) != NO_ERROR, NULL, -1);

    /* Convert to a format that mktime() can grok... */
    tm.tm_sec = ((PHYSFS_uint32) fs.ftimeLastWrite.twosecs) * 2;
    tm.tm_min = fs.ftimeLastWrite.minutes;
    tm.tm_hour = fs.ftimeLastWrite.hours;
    tm.tm_mday = fs.fdateLastWrite.day;
    tm.tm_mon = fs.fdateLastWrite.month;
    tm.tm_year = ((PHYSFS_uint32) fs.fdateLastWrite.year) + 80;
    tm.tm_wday = -1 /*st_localtz.wDayOfWeek*/;
    tm.tm_yday = -1;
    tm.tm_isdst = -1;

    /* Convert to a format PhysicsFS can grok... */
    retval = (PHYSFS_sint64) mktime(&tm);
    BAIL_IF_MACRO(retval == -1, strerror(errno), -1);
    return(retval);
} /* __PHYSFS_platformGetLastModTime */


/* Much like my college days, try to sleep for 10 milliseconds at a time... */
void __PHYSFS_platformTimeslice(void)
{
    DosSleep(10);
} /* __PHYSFS_platformTimeslice(void) */


PHYSFS_uint64 __PHYSFS_platformGetThreadID(void)
{
    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(&ptib, &ppib)) != NO_ERROR, 0, 0);
    return((PHYSFS_uint64) ptib->tib_ordinal);
} /* __PHYSFS_platformGetThreadID */


void *__PHYSFS_platformCreateMutex(void)
{
    HMTX hmtx = NULLHANDLE;
    os2err(DosCreateMutexSem(NULL, &hmtx, 0, 0));
    return((void *) hmtx);
} /* __PHYSFS_platformCreateMutex */


void __PHYSFS_platformDestroyMutex(void *mutex)
{
    DosCloseMutexSem((HMTX) mutex);
} /* __PHYSFS_platformDestroyMutex */


int __PHYSFS_platformGrabMutex(void *mutex)
{
    /* Do _NOT_ call os2err() (which sets the physfs error msg) in here! */
    return(DosRequestMutexSem((HMTX) mutex, SEM_INDEFINITE_WAIT) == NO_ERROR);
} /* __PHYSFS_platformGrabMutex */


void __PHYSFS_platformReleaseMutex(void *mutex)
{
    DosReleaseMutexSem((HMTX) mutex);
} /* __PHYSFS_platformReleaseMutex */

#endif  /* defined OS2 */

/* end of os2.c ... */


Index: Makefile.am
===================================================================
RCS file: /cvsroot/paragui/paragui/src/physfs/platform/Makefile.am,v
retrieving revision 1.1.1.1.6.6
retrieving revision 1.1.1.1.6.7
diff -C2 -r1.1.1.1.6.6 -r1.1.1.1.6.7
*** Makefile.am 11 Jul 2002 08:59:29 -0000      1.1.1.1.6.6
--- Makefile.am 30 Jul 2002 20:50:27 -0000      1.1.1.1.6.7
***************
*** 11,15 ****
        unix.c                  \
        win32.c                 \
!       posix.c
  endif
  
--- 11,16 ----
        unix.c                  \
        win32.c                 \
!       posix.c                 \
!       os2.c
  endif
  
***************
*** 20,23 ****
--- 21,25 ----
        win32.c       \
        unix.c        \
+       os2.c         \
      beos.cpp
  

Index: beos.cpp
===================================================================
RCS file: /cvsroot/paragui/paragui/src/physfs/platform/beos.cpp,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -C2 -r1.1.2.5 -r1.1.2.6
*** beos.cpp    25 Jul 2002 07:27:38 -0000      1.1.2.5
--- beos.cpp    30 Jul 2002 20:50:27 -0000      1.1.2.6
***************
*** 36,41 ****
  const char *__PHYSFS_platformDirSeparator = "/";
  
- #define get_error_str(x) strerror(x)
- 
  
  int __PHYSFS_platformInit(void)
--- 36,39 ----
***************
*** 83,91 ****
              status_t rc;
              rc = vol.GetRootDirectory(&directory);
!             BAIL_IF_MACRO(rc < B_OK, get_error_str(rc), NULL);
              rc = directory.GetEntry(&entry);
!             BAIL_IF_MACRO(rc < B_OK, get_error_str(rc), NULL);
              rc = entry.GetPath(&path);
!             BAIL_IF_MACRO(rc < B_OK, get_error_str(rc), NULL);
              const char *str = path.Path();
              BAIL_IF_MACRO(str == NULL, ERR_OS_ERROR, NULL);  /* ?! */
--- 81,89 ----
              status_t rc;
              rc = vol.GetRootDirectory(&directory);
!             BAIL_IF_MACRO(rc < B_OK, strerror(rc), NULL);
              rc = directory.GetEntry(&entry);
!             BAIL_IF_MACRO(rc < B_OK, strerror(rc), NULL);
              rc = entry.GetPath(&path);
!             BAIL_IF_MACRO(rc < B_OK, strerror(rc), NULL);
              const char *str = path.Path();
              BAIL_IF_MACRO(str == NULL, ERR_OS_ERROR, NULL);  /* ?! */
***************
*** 189,193 ****
      app_info info;
      status_t rc = roster.GetRunningAppInfo(getTeamID(), &info);
!     BAIL_IF_MACRO(rc < B_OK, get_error_str(rc), NULL);
      BEntry entry(&(info.ref), true);
      BPath path;
--- 187,191 ----
      app_info info;
      status_t rc = roster.GetRunningAppInfo(getTeamID(), &info);
!     BAIL_IF_MACRO(rc < B_OK, strerror(rc), NULL);
      BEntry entry(&(info.ref), true);
      BPath path;
***************
*** 247,251 ****
      {
          free(retval);
!         BAIL_MACRO(get_error_str(rc), NULL);
      } // if
  
--- 245,249 ----
      {
          free(retval);
!         BAIL_MACRO(strerror(rc), NULL);
      } // if
  
***************
*** 265,269 ****
  {
      status_t rc = acquire_sem(*((sem_id *) mutex));
!     BAIL_IF_MACRO(rc < B_OK, get_error_str(rc), 0);
      return(1);
  } /* __PHYSFS_platformGrabMutex */
--- 263,267 ----
  {
      status_t rc = acquire_sem(*((sem_id *) mutex));
!     BAIL_IF_MACRO(rc < B_OK, strerror(rc), 0);
      return(1);
  } /* __PHYSFS_platformGrabMutex */

Index: macclassic.c
===================================================================
RCS file: /cvsroot/paragui/paragui/src/physfs/platform/macclassic.c,v
retrieving revision 1.1.2.5
retrieving revision 1.1.2.6
diff -C2 -r1.1.2.5 -r1.1.2.6
*** macclassic.c        25 Jul 2002 07:27:38 -0000      1.1.2.5
--- macclassic.c        30 Jul 2002 20:50:27 -0000      1.1.2.6
***************
*** 61,64 ****
--- 61,151 ----
  const char *__PHYSFS_platformDirSeparator = ":";
  
+ 
+ static const char *get_macos_error_string(OSErr err)
+ {
+     if (err == noErr)
+         return(NULL);
+ 
+     switch (err)
+     {
+         case fnfErr: return(ERR_NO_SUCH_FILE);
+         case notOpenErr: return(ERR_NO_SUCH_VOLUME);
+         case dirFulErr: return(ERR_DIRECTORY_FULL);
+         case dskFulErr: return(ERR_DISK_FULL);
+         case nsvErr: return(ERR_NO_SUCH_VOLUME);
+         case ioErr: return(ERR_IO_ERROR);
+         case bdNamErr: return(ERR_BAD_FILENAME);
+         case fnOpnErr: return(ERR_NOT_A_HANDLE);
+         case eofErr: return(ERR_PAST_EOF);
+         case posErr: return(ERR_SEEK_OUT_OF_RANGE);
+         case tmfoErr: return(ERR_TOO_MANY_HANDLES);
+         case wPrErr: return(ERR_VOL_LOCKED_HW);
+         case fLckdErr: return(ERR_FILE_LOCKED);
+         case vLckdErr: return(ERR_VOL_LOCKED_SW);
+         case fBsyErr: return(ERR_FILE_OR_DIR_BUSY);
+         case dupFNErr: return(ERR_FILE_ALREADY_EXISTS);
+         case opWrErr: return(ERR_FILE_ALREADY_OPEN_W);
+         case rfNumErr: return(ERR_INVALID_REFNUM);
+         case gfpErr: return(ERR_GETTING_FILE_POS);
+         case volOffLinErr: return(ERR_VOLUME_OFFLINE);
+         case permErr: return(ERR_PERMISSION_DENIED);
+         case volOnLinErr: return(ERR_VOL_ALREADY_ONLINE);
+         case nsDrvErr: return(ERR_NO_SUCH_DRIVE);
+         case noMacDskErr: return(ERR_NOT_MAC_DISK);
+         case extFSErr: return(ERR_VOL_EXTERNAL_FS);
+         case fsRnErr: return(ERR_PROBLEM_RENAME);
+         case badMDBErr: return(ERR_BAD_MASTER_BLOCK);
+         case wrPermErr: return(ERR_PERMISSION_DENIED);
+         case memFullErr: return(ERR_OUT_OF_MEMORY);
+         case dirNFErr: return(ERR_NO_SUCH_PATH);
+         case tmwdoErr: return(ERR_TOO_MANY_HANDLES);
+         case badMovErr: return(ERR_CANT_MOVE_FORBIDDEN);
+         case wrgVolTypErr: return(ERR_WRONG_VOL_TYPE);
+         case volGoneErr: return(ERR_SERVER_VOL_LOST);
+         case errFSNameTooLong: return(ERR_BAD_FILENAME);
+         case errFSNotAFolder: return(ERR_NOT_A_DIR);
+         case errFSNotAFile: return(ERR_NOT_A_FILE);
+         case fidNotFound: return(ERR_FILE_ID_NOT_FOUND);
+         case fidExists: return(ERR_FILE_ID_EXISTS);
+         case afpAccessDenied: return(ERR_ACCESS_DENIED);
+         case afpNoServer: return(ERR_SERVER_NO_RESPOND);
+         case afpUserNotAuth: return(ERR_USER_AUTH_FAILED);
+         case afpPwdExpiredErr: return(ERR_PWORD_EXPIRED);
+ 
+         case paramErr:
+         case errFSBadFSRef:
+         case errFSBadBuffer:
+         case errFSMissingName:
+         case errFSBadPosMode:
+         case errFSBadAllocFlags:
+         case errFSBadItemCount
+         case errFSBadSearchParams
+         case afpDenyConflict
+             return(ERR_PHYSFS_BAD_OS_CALL);
+ 
+         default: return(ERR_MACOS_GENERIC);
+     } /* switch */
+ 
+     return(NULL);
+ } /* get_macos_error_string */
+ 
+ 
+ static OSErr oserr(OSErr retval)
+ {
+     char buf[128];
+     const char *errstr = get_macos_error_string(retval);
+     if (errstr == ERR_MACOS_GENERIC)
+     {
+         snprintf(buf, ERR_MACOS_GENERIC, (int) retval);
+         errstr = buf;
+     } /* if */
+ 
+     if (errstr != NULL)
+         __PHYSFS_setError(errstr);
+ 
+     return(retval);
+ } /* oserr */
+ 
+ 
  static struct ProcessInfoRec procInfo;
  static FSSpec procfsspec;
***************
*** 68,72 ****
      OSErr err;
      ProcessSerialNumber psn;
!     BAIL_IF_MACRO(GetCurrentProcess(&psn) != noErr, ERR_OS_ERROR, 0);
      memset(&procInfo, '\0', sizeof (ProcessInfoRec));
      memset(&procfsspec, '\0', sizeof (FSSpec));
--- 155,159 ----
      OSErr err;
      ProcessSerialNumber psn;
!     BAIL_IF_MACRO(oserr(GetCurrentProcess(&psn)) != noErr, NULL, 0);
      memset(&procInfo, '\0', sizeof (ProcessInfoRec));
      memset(&procfsspec, '\0', sizeof (FSSpec));
***************
*** 74,78 ****
      procInfo.processAppSpec = &procfsspec;
      err = GetProcessInformation(&psn, &procInfo);
!     BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, 0);
      return(1);  /* we're golden. */
  } /* __PHYSFS_platformInit */
--- 161,165 ----
      procInfo.processAppSpec = &procfsspec;
      err = GetProcessInformation(&psn, &procInfo);
!     BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
      return(1);  /* we're golden. */
  } /* __PHYSFS_platformInit */
***************
*** 166,174 ****
          /* check parent dir of what we last looked at... */
          infoPB.dirInfo.ioDrDirID = infoPB.dirInfo.ioDrParID;
!         if (PBGetCatInfoSync(&infoPB) != noErr)
          {
              if (retval != NULL)
                  free(retval);
!             BAIL_MACRO(ERR_OS_ERROR, NULL);
          } /* if */
  
--- 253,261 ----
          /* check parent dir of what we last looked at... */
          infoPB.dirInfo.ioDrDirID = infoPB.dirInfo.ioDrParID;
!         if (oserr(PBGetCatInfoSync(&infoPB)) != noErr)
          {
              if (retval != NULL)
                  free(retval);
!             return(NULL);
          } /* if */
  
***************
*** 220,226 ****
      UseResFile(0);
      /* apparently, -16096 specifies the username. */
!     strHandle = GetString(-16096);
      UseResFile(origResourceFile);
!     BAIL_IF_MACRO(strHandle == NULL, ERR_OS_ERROR, NULL);
  
      HLock((Handle) strHandle);
--- 307,313 ----
      UseResFile(0);
      /* apparently, -16096 specifies the username. */
!     strHandle = oserr(GetString(-16096));
      UseResFile(origResourceFile);
!     BAIL_IF_MACRO(strHandle == NULL, NULL, NULL);
  
      HLock((Handle) strHandle);
***************
*** 281,285 ****
          str255[len] = ':';
  
!     err = FSMakeFSSpec(0, 0, str255, spec);
      return(err);
  } /* fnameToFSSpecNoAlias */
--- 368,372 ----
          str255[len] = ':';
  
!     err = oserr(FSMakeFSSpec(0, 0, str255, spec));
      return(err);
  } /* fnameToFSSpecNoAlias */
***************
*** 309,313 ****
          *ptr = '\0';
          err = fnameToFSSpecNoAlias(path, spec); /* get first dir. */
!         BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, err);
          start = ptr;
          ptr = strchr(start + 1, ':');
--- 396,400 ----
          *ptr = '\0';
          err = fnameToFSSpecNoAlias(path, spec); /* get first dir. */
!         BAIL_IF_MACRO(oserr(err) != noErr, NULL, err);
          start = ptr;
          ptr = strchr(start + 1, ':');
***************
*** 350,356 ****
      else /* there's something there; make sure final file is not an alias. */
      {
!         BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, err);
          err = ResolveAliasFileWithMountFlags(spec, 1, &folder, &alias, 0);
!         BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, err);
      } /* else */
  
--- 437,443 ----
      else /* there's something there; make sure final file is not an alias. */
      {
!         BAIL_IF_MACRO(oserr(err) != noErr, NULL, err);
          err = ResolveAliasFileWithMountFlags(spec, 1, &folder, &alias, 0);
!         BAIL_IF_MACRO(oserr(err) != noErr, NULL, err);
      } /* else */
  
***************
*** 383,387 ****
      /* resolve aliases up to the actual file... */
      *ptr = '\0';
!     BAIL_IF_MACRO(fnameToFSSpec(dir, &spec) != noErr, ERR_OS_ERROR, 0);
  
      *ptr = strlen(ptr + 1);  /* ptr is now a pascal string. Yikes! */
--- 470,474 ----
      /* resolve aliases up to the actual file... */
      *ptr = '\0';
!     BAIL_IF_MACRO(fnameToFSSpec(dir, &spec) != noErr, NULL, 0);
  
      *ptr = strlen(ptr + 1);  /* ptr is now a pascal string. Yikes! */
***************
*** 391,400 ****
      infoPB.dirInfo.ioDrDirID = spec.parID;
      infoPB.dirInfo.ioFDirIndex = 0;
!     BAIL_IF_MACRO(PBGetCatInfoSync(&infoPB) != noErr, ERR_OS_ERROR, 0);
  
      err = FSMakeFSSpec(spec.vRefNum, infoPB.dirInfo.ioDrDirID,
                         (const unsigned char *) ptr, &spec);
!     BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, 0);
!     BAIL_IF_MACRO(IsAliasFile(&spec, &a, &f) != noErr, ERR_OS_ERROR, 0);
      return(a);
  } /* __PHYSFS_platformIsSymlink */
--- 478,487 ----
      infoPB.dirInfo.ioDrDirID = spec.parID;
      infoPB.dirInfo.ioFDirIndex = 0;
!     BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, 0);
  
      err = FSMakeFSSpec(spec.vRefNum, infoPB.dirInfo.ioDrDirID,
                         (const unsigned char *) ptr, &spec);
!     BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
!     BAIL_IF_MACRO(oserr(IsAliasFile(&spec, &a, &f)) != noErr, NULL, 0);
      return(a);
  } /* __PHYSFS_platformIsSymlink */
***************
*** 407,411 ****
      OSErr err;
  
!     BAIL_IF_MACRO(fnameToFSSpec(fname, &spec) != noErr, ERR_OS_ERROR, 0);
      memset(&infoPB, '\0', sizeof (CInfoPBRec));
      infoPB.dirInfo.ioNamePtr = spec.name;     /* put name in here.       */
--- 494,498 ----
      OSErr err;
  
!     BAIL_IF_MACRO(fnameToFSSpec(fname, &spec) != noErr, NULL, 0);
      memset(&infoPB, '\0', sizeof (CInfoPBRec));
      infoPB.dirInfo.ioNamePtr = spec.name;     /* put name in here.       */
***************
*** 414,418 ****
      infoPB.dirInfo.ioFDirIndex = 0;           /* file (not parent) info. */
      err = PBGetCatInfoSync(&infoPB);
!     BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, 0);
      return((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0);
  } /* __PHYSFS_platformIsDirectory */
--- 501,505 ----
      infoPB.dirInfo.ioFDirIndex = 0;           /* file (not parent) info. */
      err = PBGetCatInfoSync(&infoPB);
!     BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
      return((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0);
  } /* __PHYSFS_platformIsDirectory */
***************
*** 467,471 ****
      long dirID;
  
!     BAIL_IF_MACRO(fnameToFSSpec(dirname, &spec) != noErr, ERR_OS_ERROR, 0);
  
      /* get the dir ID of what we want to enumerate... */
--- 554,558 ----
      long dirID;
  
!     BAIL_IF_MACRO(fnameToFSSpec(dirname, &spec) != noErr, NULL, 0);
  
      /* get the dir ID of what we want to enumerate... */
***************
*** 475,479 ****
      infoPB.dirInfo.ioDrDirID = spec.parID;    /* ID of dir.              */
      infoPB.dirInfo.ioFDirIndex = 0;           /* file (not parent) info. */
!     BAIL_IF_MACRO(PBGetCatInfoSync(&infoPB) != noErr, ERR_OS_ERROR, NULL);
  
      if ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) == 0)
--- 562,566 ----
      infoPB.dirInfo.ioDrDirID = spec.parID;    /* ID of dir.              */
      infoPB.dirInfo.ioFDirIndex = 0;           /* file (not parent) info. */
!     BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, NULL);
  
      if ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) == 0)
***************
*** 537,541 ****
  
      FSSpec spec;
!     BAIL_IF_MACRO(fnameToFSSpec(path, &spec) != noErr, ERR_OS_ERROR, NULL);
      return(convFSSpecToPath(&spec, 1));
  } /* __PHYSFS_platformRealPath */
--- 624,628 ----
  
      FSSpec spec;
!     BAIL_IF_MACRO(fnameToFSSpec(path, &spec) != noErr, NULL, NULL);
      return(convFSSpecToPath(&spec, 1));
  } /* __PHYSFS_platformRealPath */
***************
*** 549,556 ****
  
      BAIL_IF_MACRO(err == noErr, ERR_FILE_EXISTS, 0);
!     BAIL_IF_MACRO(err != fnfErr, ERR_OS_ERROR, 0);
  
      err = DirCreate(spec.vRefNum, spec.parID, spec.name, &val);
!     BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, 0);
      return(1);
  } /* __PHYSFS_platformMkDir */
--- 636,643 ----
  
      BAIL_IF_MACRO(err == noErr, ERR_FILE_EXISTS, 0);
!     BAIL_IF_MACRO(err != fnfErr, NULL, 0);
  
      err = DirCreate(spec.vRefNum, spec.parID, spec.name, &val);
!     BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
      return(1);
  } /* __PHYSFS_platformMkDir */
***************
*** 563,567 ****
      FSSpec spec;
      OSErr err = fnameToFSSpec(fname, &spec);
!     BAIL_IF_MACRO((err != noErr) && (err != fnfErr), ERR_OS_ERROR, NULL);
      if (err == fnfErr)
      {
--- 650,654 ----
      FSSpec spec;
      OSErr err = fnameToFSSpec(fname, &spec);
!     BAIL_IF_MACRO((err != noErr) && (err != fnfErr), NULL, NULL);
      if (err == fnfErr)
      {
***************
*** 569,573 ****
          err = HCreate(spec.vRefNum, spec.parID, spec.name,
                        procInfo.processSignature, 'BINA');
!         BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, NULL);
          created = 1;
      } /* if */
--- 656,660 ----
          err = HCreate(spec.vRefNum, spec.parID, spec.name,
                        procInfo.processSignature, 'BINA');
!         BAIL_IF_MACRO(oserr(err) != noErr, NULL, NULL);
          created = 1;
      } /* if */
***************
*** 581,590 ****
      } /* if */
  
!     if (HOpenDF(spec.vRefNum, spec.parID, spec.name, perm, retval) != noErr)
      {
          free(retval);
          if (created)
              HDelete(spec.vRefNum, spec.parID, spec.name);
!         BAIL_MACRO(ERR_OS_ERROR, NULL);
      } /* if */
  
--- 668,678 ----
      } /* if */
  
!     err = HOpenDF(spec.vRefNum, spec.parID, spec.name, perm, retval)
!     if (oserr(err) != noErr)
      {
          free(retval);
          if (created)
              HDelete(spec.vRefNum, spec.parID, spec.name);
!         return(NULL);
      } /* if */
  
***************
*** 598,605 ****
      if (retval != NULL)   /* got a file; seek to start. */
      {
!         if (SetFPos(*retval, fsFromStart, 0) != noErr)
          {
              FSClose(*retval);
!             BAIL_MACRO(ERR_OS_ERROR, NULL);
          } /* if */
      } /* if */
--- 686,693 ----
      if (retval != NULL)   /* got a file; seek to start. */
      {
!         if (oserr(SetFPos(*retval, fsFromStart, 0)) != noErr)
          {
              FSClose(*retval);
!             return(NULL);
          } /* if */
      } /* if */
***************
*** 614,622 ****
      if (retval != NULL)   /* got a file; truncate it. */
      {
!         if ((SetEOF(*retval, 0) != noErr) ||
!             (SetFPos(*retval, fsFromStart, 0) != noErr))
          {
              FSClose(*retval);
!             BAIL_MACRO(ERR_OS_ERROR, NULL);
          } /* if */
      } /* if */
--- 702,710 ----
      if (retval != NULL)   /* got a file; truncate it. */
      {
!         if ((oserr(SetEOF(*retval, 0)) != noErr) ||
!             (oserr(SetFPos(*retval, fsFromStart, 0)) != noErr))
          {
              FSClose(*retval);
!             return(NULL);
          } /* if */
      } /* if */
***************
*** 631,638 ****
      if (retval != NULL)   /* got a file; seek to end. */
      {
!         if (SetFPos(*retval, fsFromLEOF, 0) != noErr)
          {
              FSClose(*retval);
!             BAIL_MACRO(ERR_OS_ERROR, NULL);
          } /* if */
      } /* if */
--- 719,726 ----
      if (retval != NULL)   /* got a file; seek to end. */
      {
!         if (oserr(SetFPos(*retval, fsFromLEOF, 0)) != noErr)
          {
              FSClose(*retval);
!             return(NULL);
          } /* if */
      } /* if */
***************
*** 652,657 ****
      {
          br = size;
!         BAIL_IF_MACRO(FSRead(ref, &br, buffer) != noErr, ERR_OS_ERROR, i);
!         BAIL_IF_MACRO(br != size, ERR_OS_ERROR, i);
          buffer = ((PHYSFS_uint8 *) buffer) + size;
      } /* for */
--- 740,745 ----
      {
          br = size;
!         BAIL_IF_MACRO(oserr(FSRead(ref, &br, buffer)) != noErr, NULL, i);
!         BAIL_IF_MACRO(br != size, NULL, i);  /* !!! FIXME: seek back if only 
read part of an object! */
          buffer = ((PHYSFS_uint8 *) buffer) + size;
      } /* for */
***************
*** 671,676 ****
      {
          bw = size;
!         BAIL_IF_MACRO(FSWrite(ref, &bw, buffer) != noErr, ERR_OS_ERROR, i);
!         BAIL_IF_MACRO(bw != size, ERR_OS_ERROR, i);
          buffer = ((PHYSFS_uint8 *) buffer) + size;
      } /* for */
--- 759,764 ----
      {
          bw = size;
!         BAIL_IF_MACRO(oserr(FSWrite(ref, &bw, buffer)) != noErr, NULL, i);
!         BAIL_IF_MACRO(bw != size, NULL, i); /* !!! FIXME: seek back if only 
wrote part of an object! */
          buffer = ((PHYSFS_uint8 *) buffer) + size;
      } /* for */
***************
*** 684,688 ****
      SInt16 ref = *((SInt16 *) opaque);
      OSErr err = SetFPos(ref, fsFromStart, (SInt32) pos);
!     BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, 0);
      return(1);
  } /* __PHYSFS_platformSeek */
--- 772,776 ----
      SInt16 ref = *((SInt16 *) opaque);
      OSErr err = SetFPos(ref, fsFromStart, (SInt32) pos);
!     BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
      return(1);
  } /* __PHYSFS_platformSeek */
***************
*** 693,697 ****
      SInt16 ref = *((SInt16 *) opaque);
      SInt32 curPos;
!     BAIL_IF_MACRO(GetFPos(ref, &curPos) != noErr, ERR_OS_ERROR, -1);
      return((PHYSFS_sint64) curPos);
  } /* __PHYSFS_platformTell */
--- 781,785 ----
      SInt16 ref = *((SInt16 *) opaque);
      SInt32 curPos;
!     BAIL_IF_MACRO(oserr(GetFPos(ref, &curPos)) != noErr, NULL, -1);
      return((PHYSFS_sint64) curPos);
  } /* __PHYSFS_platformTell */
***************
*** 702,706 ****
      SInt16 ref = *((SInt16 *) opaque);
      SInt32 eofPos;
!     BAIL_IF_MACRO(GetEOF(ref, &eofPos) != noErr, ERR_OS_ERROR, -1);
      return((PHYSFS_sint64) eofPos);
  } /* __PHYSFS_platformFileLength */
--- 790,794 ----
      SInt16 ref = *((SInt16 *) opaque);
      SInt32 eofPos;
!     BAIL_IF_MACRO(oserr(GetEOF(ref, &eofPos)) != noErr, NULL, -1);
      return((PHYSFS_sint64) eofPos);
  } /* __PHYSFS_platformFileLength */
***************
*** 711,716 ****
      SInt16 ref = *((SInt16 *) opaque);
      SInt32 eofPos, curPos;
!     BAIL_IF_MACRO(GetEOF(ref, &eofPos) != noErr, ERR_OS_ERROR, 1);
!     BAIL_IF_MACRO(GetFPos(ref, &curPos) != noErr, ERR_OS_ERROR, 1);
      return(curPos >= eofPos);
  } /* __PHYSFS_platformEOF */
--- 799,804 ----
      SInt16 ref = *((SInt16 *) opaque);
      SInt32 eofPos, curPos;
!     BAIL_IF_MACRO(oserr(GetEOF(ref, &eofPos)) != noErr, NULL, 1);
!     BAIL_IF_MACRO(oserr(GetFPos(ref, &curPos)) != noErr, NULL, 1);
      return(curPos >= eofPos);
  } /* __PHYSFS_platformEOF */
***************
*** 723,727 ****
      memset(&pb, '\0', sizeof (ParamBlockRec));
      pb.ioParam.ioRefNum = ref;
!     BAIL_IF_MACRO(PBFlushFileSync(&pb) != noErr, ERR_OS_ERROR, 0);
      return(1);
  } /* __PHYSFS_platformFlush */
--- 811,815 ----
      memset(&pb, '\0', sizeof (ParamBlockRec));
      pb.ioParam.ioRefNum = ref;
!     BAIL_IF_MACRO(oserr(PBFlushFileSync(&pb)) != noErr, NULL, 0);
      return(1);
  } /* __PHYSFS_platformFlush */
***************
*** 732,750 ****
      SInt16 ref = *((SInt16 *) opaque);
      SInt16 vRefNum;
-     HParamBlockRec hpbr;
      Str63 volName;
  
!     BAIL_IF_MACRO(GetVRefNum (ref, &vRefNum) != noErr, ERR_OS_ERROR, 0);
! 
!     memset(&hpbr, '\0', sizeof (HParamBlockRec));
!     hpbr.volumeParam.ioNamePtr = volName;
!     hpbr.volumeParam.ioVRefNum = vRefNum;
!     hpbr.volumeParam.ioVolIndex = 0;
!     BAIL_IF_MACRO(PBHGetVInfoSync(&hpbr) != noErr, ERR_OS_ERROR, 0);
  
!     BAIL_IF_MACRO(FSClose(ref) != noErr, ERR_OS_ERROR, 0);
      free(opaque);
  
!     FlushVol(volName, vRefNum);
      return(1);
  } /* __PHYSFS_platformClose */
--- 820,843 ----
      SInt16 ref = *((SInt16 *) opaque);
      SInt16 vRefNum;
      Str63 volName;
+     int flushVol = 0;
  
!     if (GetVRefNum(ref, &vRefNum) == noErr)
!     {
!         HParamBlockRec hpbr;
!         memset(&hpbr, '\0', sizeof (HParamBlockRec));
!         hpbr.volumeParam.ioNamePtr = volName;
!         hpbr.volumeParam.ioVRefNum = vRefNum;
!         hpbr.volumeParam.ioVolIndex = 0;
!         if (PBHGetVInfoSync(&hpbr) == noErr)
!             flushVol = 1;
!     } /* if */
  
!     BAIL_IF_MACRO(oserr(FSClose(ref)) != noErr, NULL, 0);
      free(opaque);
  
!     if (flushVol)
!         FlushVol(volName, vRefNum);  /* update catalog info, etc. */
! 
      return(1);
  } /* __PHYSFS_platformClose */
***************
*** 755,761 ****
      FSSpec spec;
      OSErr err;
!     BAIL_IF_MACRO(fnameToFSSpec(path, &spec) != noErr, ERR_OS_ERROR, 0);
      err = HDelete(spec.vRefNum, spec.parID, spec.name);
!     BAIL_IF_MACRO(err != noErr, ERR_OS_ERROR, 0);
      return(1);
  } /* __PHYSFS_platformDelete */
--- 848,854 ----
      FSSpec spec;
      OSErr err;
!     BAIL_IF_MACRO(fnameToFSSpec(path, &spec) != noErr, NULL, 0);
      err = HDelete(spec.vRefNum, spec.parID, spec.name);
!     BAIL_IF_MACRO(oserr(err) != noErr, NULL, 0);
      return(1);
  } /* __PHYSFS_platformDelete */
***************
*** 792,796 ****
      UInt32 modDate;
  
!     BAIL_IF_MACRO(fnameToFSSpec(fname, &spec) != noErr, ERR_OS_ERROR, -1);
  
      memset(&infoPB, '\0', sizeof (CInfoPBRec));
--- 885,890 ----
      UInt32 modDate;
  
!     if (fnameToFSSpec(fname, &spec) != noErr)
!         return(-1); /* fnameToFSSpec() sets physfs error message. */
  
      memset(&infoPB, '\0', sizeof (CInfoPBRec));
***************
*** 799,803 ****
      infoPB.dirInfo.ioDrDirID = spec.parID;
      infoPB.dirInfo.ioFDirIndex = 0;
!     BAIL_IF_MACRO(PBGetCatInfoSync(&infoPB) != noErr, ERR_OS_ERROR, -1);
  
      modDate = ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0) ?
--- 893,897 ----
      infoPB.dirInfo.ioDrDirID = spec.parID;
      infoPB.dirInfo.ioFDirIndex = 0;
!     BAIL_IF_MACRO(oserr(PBGetCatInfoSync(&infoPB)) != noErr, NULL, -1);
  
      modDate = ((infoPB.dirInfo.ioFlAttrib & kioFlAttribDirMask) != 0) ?

Index: posix.c
===================================================================
RCS file: /cvsroot/paragui/paragui/src/physfs/platform/posix.c,v
retrieving revision 1.1.2.4
retrieving revision 1.1.2.5
diff -C2 -r1.1.2.4 -r1.1.2.5
*** posix.c     25 Jul 2002 07:27:38 -0000      1.1.2.4
--- posix.c     30 Jul 2002 20:50:27 -0000      1.1.2.5
***************
*** 472,475 ****
--- 472,476 ----
      int fd = *((int *) opaque);
      BAIL_IF_MACRO(close(fd) == -1, strerror(errno), 0);
+     free(opaque);
      return(1);
  } /* __PHYSFS_platformClose */

Index: unix.c
===================================================================
RCS file: /cvsroot/paragui/paragui/src/physfs/platform/unix.c,v
retrieving revision 1.1.1.1.6.6
retrieving revision 1.1.1.1.6.7
diff -C2 -r1.1.1.1.6.6 -r1.1.1.1.6.7
*** unix.c      25 Jul 2002 07:27:38 -0000      1.1.1.1.6.6
--- unix.c      30 Jul 2002 20:50:27 -0000      1.1.1.1.6.7
***************
*** 18,22 ****
  #include <string.h>
  #include <ctype.h>
- #include <pthread.h>
  #include <unistd.h>
  #include <sys/types.h>
--- 18,21 ----
***************
*** 29,32 ****
--- 28,35 ----
  #include <sys/mount.h>
  
+ #if (!defined PHYSFS_NO_PTHREADS_SUPPORT)
+ #include <pthread.h>
+ #endif
+ 
  #ifdef PHYSFS_HAVE_SYS_UCRED_H
  #  ifdef PHYSFS_HAVE_MNTENT_H
***************
*** 257,266 ****
  
  
- PHYSFS_uint64 __PHYSFS_platformGetThreadID(void)
- {
-     return((PHYSFS_uint64) pthread_self());
- } /* __PHYSFS_platformGetThreadID */
- 
- 
  /* Much like my college days, try to sleep for 10 milliseconds at a time... */
  void __PHYSFS_platformTimeslice(void)
--- 260,263 ----
***************
*** 284,287 ****
--- 281,302 ----
  
  
+ #if (defined PHYSFS_NO_PTHREADS_SUPPORT)
+ 
+ PHYSFS_uint64 __PHYSFS_platformGetThreadID(void) { return(0x0001); }
+ void *__PHYSFS_platformCreateMutex(void) { return((void *) 0x0001); }
+ void __PHYSFS_platformDestroyMutex(void *mutex) {}
+ int __PHYSFS_platformGrabMutex(void *mutex) { return(1); }
+ void __PHYSFS_platformReleaseMutex(void *mutex) {}
+ 
+ #else
+ 
+ #define PHTREAD_TO_UI64(thr) ((PHYSFS_uint64) (thr))
+ 
+ PHYSFS_uint64 __PHYSFS_platformGetThreadID(void)
+ {
+     return(PHTREAD_TO_UI64(pthread_self()));
+ } /* __PHYSFS_platformGetThreadID */
+ 
+ 
  void *__PHYSFS_platformCreateMutex(void)
  {
***************
*** 317,320 ****
--- 332,338 ----
      pthread_mutex_unlock((pthread_mutex_t *) mutex);
  } /* __PHYSFS_platformReleaseMutex */
+ 
+ #endif /* !PHYSFS_NO_PTHREADS_SUPPORT */
+ 
  
  #endif /* !defined __BEOS__ && !defined WIN32 */

Index: win32.c
===================================================================
RCS file: /cvsroot/paragui/paragui/src/physfs/platform/win32.c,v
retrieving revision 1.1.1.1.6.13
retrieving revision 1.1.1.1.6.14
diff -C2 -r1.1.1.1.6.13 -r1.1.1.1.6.14
*** win32.c     25 Jul 2002 07:27:38 -0000      1.1.1.1.6.13
--- win32.c     30 Jul 2002 20:50:27 -0000      1.1.1.1.6.14
***************
*** 126,135 ****
              /* make sure the string was not truncated. */
          if (__PHYSFS_platformStricmp(&retval[buflen - 4], ".exe") != 0)
!             __PHYSFS_setError("WIN32: GetModuleFileName() got truncated.");
          else
          {
              ptr = strrchr(retval, '\\');
              if (ptr == NULL)
!                 __PHYSFS_setError("WIN32: GetModuleFileName() had no dir.");
              else
              {
--- 126,135 ----
              /* make sure the string was not truncated. */
          if (__PHYSFS_platformStricmp(&retval[buflen - 4], ".exe") != 0)
!             __PHYSFS_setError(ERR_GOTMODFN_TRUNC);
          else
          {
              ptr = strrchr(retval, '\\');
              if (ptr == NULL)
!                 __PHYSFS_setError(ERR_GETMODFN_NO_DIR);
              else
              {
***************
*** 145,149 ****
      {
          if (argv0 == NULL)
!             __PHYSFS_setError("WIN32: argv0 is NULL.");
          else
          {
--- 145,149 ----
      {
          if (argv0 == NULL)
!             __PHYSFS_setError(ERR_ARGV0_IS_NULL);
          else
          {
***************
*** 152,156 ****
                  __PHYSFS_setError(win32strerror());
              else if (buflen > MAX_PATH)
!                 __PHYSFS_setError("Win32: SearchPath() got truncated.");
              else
                  success = 1;
--- 152,156 ----
                  __PHYSFS_setError(win32strerror());
              else if (buflen > MAX_PATH)
!                 __PHYSFS_setError(ERR_SEARCHPATH_TRUNC);
              else
                  success = 1;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]