misc/libphysfs/platform_macosx.c
author unc0rr
Wed, 17 Jan 2018 00:32:34 +0100
branch0.9.23
changeset 12894 ff54aca22bb5
parent 12213 bb5522e88ab2
permissions -rw-r--r--
Proper rejoin desyncs fix now
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     1
/*
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     2
 * Mac OS X support routines for PhysicsFS.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     3
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     4
 * Please see the file LICENSE.txt in the source's root directory.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     5
 *
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     6
 *  This file written by Ryan C. Gordon.
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     7
 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     8
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
     9
#define __PHYSICSFS_INTERNAL__
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    10
#include "physfs_platforms.h"
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    11
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    12
#ifdef PHYSFS_PLATFORM_MACOSX
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    13
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    14
#include <CoreFoundation/CoreFoundation.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    15
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    16
#if !defined(PHYSFS_NO_CDROM_SUPPORT)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    17
#include <Carbon/Carbon.h>  /* !!! FIXME */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    18
#include <IOKit/storage/IOMedia.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    19
#include <IOKit/storage/IOCDMedia.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    20
#include <IOKit/storage/IODVDMedia.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    21
#include <sys/mount.h>
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    22
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    23
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    24
/* Seems to get defined in some system header... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    25
#ifdef Free
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    26
#undef Free
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    27
#endif
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    28
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    29
#include "physfs_internal.h"
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    30
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    31
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    32
/* Wrap PHYSFS_Allocator in a CFAllocator... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    33
static CFAllocatorRef cfallocator = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    34
12213
bb5522e88ab2 bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
nemo
parents: 10017
diff changeset
    35
static CFStringRef cfallocCopyDesc(const void *info)
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    36
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    37
    return CFStringCreateWithCString(cfallocator, "PhysicsFS",
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    38
                                     kCFStringEncodingASCII);
12213
bb5522e88ab2 bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
nemo
parents: 10017
diff changeset
    39
} /* cfallocCopyDesc */
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    40
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    41
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    42
static void *cfallocMalloc(CFIndex allocSize, CFOptionFlags hint, void *info)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    43
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    44
    return allocator.Malloc(allocSize);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    45
} /* cfallocMalloc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    46
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    47
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    48
static void cfallocFree(void *ptr, void *info)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    49
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    50
    allocator.Free(ptr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    51
} /* cfallocFree */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    52
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    53
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    54
static void *cfallocRealloc(void *ptr, CFIndex newsize,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    55
                            CFOptionFlags hint, void *info)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    56
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    57
    if ((ptr == NULL) || (newsize <= 0))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    58
        return NULL;  /* ADC docs say you should always return NULL here. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    59
    return allocator.Realloc(ptr, newsize);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    60
} /* cfallocRealloc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    61
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    62
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    63
int __PHYSFS_platformInit(void)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    64
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    65
    /* set up a CFAllocator, so Carbon can use the physfs allocator, too. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    66
    CFAllocatorContext ctx;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    67
    memset(&ctx, '\0', sizeof (ctx));
12213
bb5522e88ab2 bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
nemo
parents: 10017
diff changeset
    68
    ctx.copyDescription = cfallocCopyDesc;
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    69
    ctx.allocate = cfallocMalloc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    70
    ctx.reallocate = cfallocRealloc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    71
    ctx.deallocate = cfallocFree;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    72
    cfallocator = CFAllocatorCreate(kCFAllocatorUseContext, &ctx);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    73
    BAIL_IF_MACRO(!cfallocator, PHYSFS_ERR_OUT_OF_MEMORY, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    74
    return 1;  /* success. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    75
} /* __PHYSFS_platformInit */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    76
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    77
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    78
int __PHYSFS_platformDeinit(void)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    79
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    80
    CFRelease(cfallocator);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    81
    cfallocator = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    82
    return 1;  /* always succeed. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    83
} /* __PHYSFS_platformDeinit */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    84
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    85
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    86
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    87
/* CD-ROM detection code... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    88
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    89
/*
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    90
 * Code based on sample from Apple Developer Connection:
12213
bb5522e88ab2 bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
nemo
parents: 10017
diff changeset
    91
 *  https://developer.apple.com/samplecode/Sample_Code/Devices_and_Hardware/Disks/VolumeToBSDNode/VolumeToBSDNode.c.htm
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    92
 */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    93
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    94
#if !defined(PHYSFS_NO_CDROM_SUPPORT)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    95
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    96
static int darwinIsWholeMedia(io_service_t service)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    97
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    98
    int retval = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
    99
    CFTypeRef wholeMedia;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   100
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   101
    if (!IOObjectConformsTo(service, kIOMediaClass))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   102
        return 0;
12213
bb5522e88ab2 bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
nemo
parents: 10017
diff changeset
   103
        
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   104
    wholeMedia = IORegistryEntryCreateCFProperty(service,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   105
                                                 CFSTR(kIOMediaWholeKey),
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   106
                                                 cfallocator, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   107
    if (wholeMedia == NULL)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   108
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   109
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   110
    retval = CFBooleanGetValue(wholeMedia);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   111
    CFRelease(wholeMedia);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   112
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   113
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   114
} /* darwinIsWholeMedia */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   115
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   116
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   117
static int darwinIsMountedDisc(char *bsdName, mach_port_t masterPort)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   118
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   119
    int retval = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   120
    CFMutableDictionaryRef matchingDict;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   121
    kern_return_t rc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   122
    io_iterator_t iter;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   123
    io_service_t service;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   124
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   125
    if ((matchingDict = IOBSDNameMatching(masterPort, 0, bsdName)) == NULL)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   126
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   127
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   128
    rc = IOServiceGetMatchingServices(masterPort, matchingDict, &iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   129
    if ((rc != KERN_SUCCESS) || (!iter))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   130
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   131
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   132
    service = IOIteratorNext(iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   133
    IOObjectRelease(iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   134
    if (!service)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   135
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   136
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   137
    rc = IORegistryEntryCreateIterator(service, kIOServicePlane,
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   138
             kIORegistryIterateRecursively | kIORegistryIterateParents, &iter);
12213
bb5522e88ab2 bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
nemo
parents: 10017
diff changeset
   139
    
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   140
    if (!iter)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   141
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   142
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   143
    if (rc != KERN_SUCCESS)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   144
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   145
        IOObjectRelease(iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   146
        return 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   147
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   148
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   149
    IOObjectRetain(service);  /* add an extra object reference... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   150
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   151
    do
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   152
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   153
        if (darwinIsWholeMedia(service))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   154
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   155
            if ( (IOObjectConformsTo(service, kIOCDMediaClass)) ||
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   156
                 (IOObjectConformsTo(service, kIODVDMediaClass)) )
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   157
            {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   158
                retval = 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   159
            } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   160
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   161
        IOObjectRelease(service);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   162
    } while ((service = IOIteratorNext(iter)) && (!retval));
12213
bb5522e88ab2 bulk copy of latest physfs to our misc/libphysfs since this seems to fix an off-by-1 error reliably hit in readln read of 1 byte probably introduced in the addition of the buffered read. Whether this is excessive or whether libphysfs should even be maintained by us is another matter. But at least we shouldn't crash
nemo
parents: 10017
diff changeset
   163
                
7768
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   164
    IOObjectRelease(iter);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   165
    IOObjectRelease(service);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   166
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   167
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   168
} /* darwinIsMountedDisc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   169
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   170
#endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   171
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   172
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   173
void __PHYSFS_platformDetectAvailableCDs(PHYSFS_StringCallback cb, void *data)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   174
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   175
#if !defined(PHYSFS_NO_CDROM_SUPPORT)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   176
    const char *devPrefix = "/dev/";
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   177
    const int prefixLen = strlen(devPrefix);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   178
    mach_port_t masterPort = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   179
    struct statfs *mntbufp;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   180
    int i, mounts;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   181
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   182
    if (IOMasterPort(MACH_PORT_NULL, &masterPort) != KERN_SUCCESS)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   183
        BAIL_MACRO(PHYSFS_ERR_OS_ERROR, ) /*return void*/;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   184
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   185
    mounts = getmntinfo(&mntbufp, MNT_WAIT);  /* NOT THREAD SAFE! */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   186
    for (i = 0; i < mounts; i++)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   187
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   188
        char *dev = mntbufp[i].f_mntfromname;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   189
        char *mnt = mntbufp[i].f_mntonname;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   190
        if (strncmp(dev, devPrefix, prefixLen) != 0)  /* a virtual device? */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   191
            continue;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   192
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   193
        dev += prefixLen;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   194
        if (darwinIsMountedDisc(dev, masterPort))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   195
            cb(data, mnt);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   196
    } /* for */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   197
#endif /* !defined(PHYSFS_NO_CDROM_SUPPORT) */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   198
} /* __PHYSFS_platformDetectAvailableCDs */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   199
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   200
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   201
static char *convertCFString(CFStringRef cfstr)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   202
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   203
    CFIndex len = CFStringGetMaximumSizeForEncoding(CFStringGetLength(cfstr),
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   204
                                                    kCFStringEncodingUTF8) + 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   205
    char *retval = (char *) allocator.Malloc(len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   206
    BAIL_IF_MACRO(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   207
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   208
    if (CFStringGetCString(cfstr, retval, len, kCFStringEncodingUTF8))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   209
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   210
        /* shrink overallocated buffer if possible... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   211
        CFIndex newlen = strlen(retval) + 1;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   212
        if (newlen < len)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   213
        {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   214
            void *ptr = allocator.Realloc(retval, newlen);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   215
            if (ptr != NULL)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   216
                retval = (char *) ptr;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   217
        } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   218
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   219
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   220
    else  /* probably shouldn't fail, but just in case... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   221
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   222
        allocator.Free(retval);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   223
        BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   224
    } /* else */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   225
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   226
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   227
} /* convertCFString */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   228
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   229
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   230
char *__PHYSFS_platformCalcBaseDir(const char *argv0)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   231
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   232
    CFURLRef cfurl = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   233
    CFStringRef cfstr = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   234
    CFMutableStringRef cfmutstr = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   235
    char *retval = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   236
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   237
    cfurl = CFBundleCopyBundleURL(CFBundleGetMainBundle());
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   238
    BAIL_IF_MACRO(cfurl == NULL, PHYSFS_ERR_OS_ERROR, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   239
    cfstr = CFURLCopyFileSystemPath(cfurl, kCFURLPOSIXPathStyle);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   240
    CFRelease(cfurl);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   241
    BAIL_IF_MACRO(!cfstr, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   242
    cfmutstr = CFStringCreateMutableCopy(cfallocator, 0, cfstr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   243
    CFRelease(cfstr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   244
    BAIL_IF_MACRO(!cfmutstr, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   245
    CFStringAppendCString(cfmutstr, "/", kCFStringEncodingUTF8);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   246
    retval = convertCFString(cfmutstr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   247
    CFRelease(cfmutstr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   248
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   249
    return retval;  /* whew. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   250
} /* __PHYSFS_platformCalcBaseDir */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   251
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   252
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   253
char *__PHYSFS_platformCalcPrefDir(const char *org, const char *app)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   254
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   255
    /* !!! FIXME: there's a real API to determine this */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   256
    const char *userdir = __PHYSFS_getUserDir();
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   257
    const char *append = "Library/Application Support/";
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   258
    const size_t len = strlen(userdir) + strlen(append) + strlen(app) + 2;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   259
    char *retval = allocator.Malloc(len);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   260
    BAIL_IF_MACRO(!retval, PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   261
    snprintf(retval, len, "%s%s%s/", userdir, append, app);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   262
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   263
} /* __PHYSFS_platformCalcPrefDir */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   264
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   265
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   266
/* Platform allocator uses default CFAllocator at PHYSFS_init() time. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   267
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   268
static CFAllocatorRef cfallocdef = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   269
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   270
static int macosxAllocatorInit(void)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   271
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   272
    int retval = 0;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   273
    cfallocdef = CFAllocatorGetDefault();
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   274
    retval = (cfallocdef != NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   275
    if (retval)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   276
        CFRetain(cfallocdef);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   277
    return retval;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   278
} /* macosxAllocatorInit */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   279
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   280
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   281
static void macosxAllocatorDeinit(void)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   282
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   283
    if (cfallocdef != NULL)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   284
    {
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   285
        CFRelease(cfallocdef);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   286
        cfallocdef = NULL;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   287
    } /* if */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   288
} /* macosxAllocatorDeinit */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   289
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   290
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   291
static void *macosxAllocatorMalloc(PHYSFS_uint64 s)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   292
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   293
    if (!__PHYSFS_ui64FitsAddressSpace(s))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   294
        BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   295
    return CFAllocatorAllocate(cfallocdef, (CFIndex) s, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   296
} /* macosxAllocatorMalloc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   297
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   298
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   299
static void *macosxAllocatorRealloc(void *ptr, PHYSFS_uint64 s)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   300
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   301
    if (!__PHYSFS_ui64FitsAddressSpace(s))
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   302
        BAIL_MACRO(PHYSFS_ERR_OUT_OF_MEMORY, NULL);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   303
    return CFAllocatorReallocate(cfallocdef, ptr, (CFIndex) s, 0);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   304
} /* macosxAllocatorRealloc */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   305
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   306
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   307
static void macosxAllocatorFree(void *ptr)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   308
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   309
    CFAllocatorDeallocate(cfallocdef, ptr);
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   310
} /* macosxAllocatorFree */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   311
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   312
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   313
int __PHYSFS_platformSetDefaultAllocator(PHYSFS_Allocator *a)
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   314
{
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   315
    allocator.Init = macosxAllocatorInit;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   316
    allocator.Deinit = macosxAllocatorDeinit;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   317
    allocator.Malloc = macosxAllocatorMalloc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   318
    allocator.Realloc = macosxAllocatorRealloc;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   319
    allocator.Free = macosxAllocatorFree;
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   320
    return 1;  /* return non-zero: we're supplying custom allocator. */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   321
} /* __PHYSFS_platformSetDefaultAllocator */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   322
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   323
#endif /* PHYSFS_PLATFORM_MACOSX */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   324
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   325
/* end of macosx.c ... */
13e2037ebc79 Try using PhysicsFS.
unc0rr
parents:
diff changeset
   326