DADiskEject causing problems with error code 12 (kDAReturnUnsupported)

889 views Asked by At

I try to eject external USB drives and Disk Images after being unmounted in the following callback function:

void __unmountCallback(DADiskRef disk, DADissenterRef dissenter, void *context )
{
    ...
    if (!dissenter) 
    {
        DADiskEject(disk, 
                    kDADiskEjectOptionDefault, 
                    __ejectCallback, 
                    NULL);
    }
}

Unfortunately I get an error in __ejectCallback...

void __ejectCallback(DADiskRef disk, DADissenterRef dissenter, void * context)
{
    if(dissenter) 
    {
       DAReturn status = DADissenterGetStatus(dissenter);
       if(unix_err(status)) 
       {
        int code = err_get_code(status);
            ...
       }
    }
}

The error code is 12 meaning kDAReturnUnsupported. I don't really know what is going wrong. Can anyone please comment on this? Does this mean disk images can not be ejected??? Many thanks in advance!!

1

There are 1 answers

0
Pripyat On

The documentation is pretty unclear on this. Therefore, it's a good idea to look into the actual source code of the DARequest class to find out what causes the kDAReturnUnsupported response.

It reveals the following conditions that return a kDAReturnUnsupported response:

Does your DADisk instance represent the entire volume or not?

if ( DADiskGetDescription(disk, kDADiskDescriptionMediaWholeKey) == NULL )
{
    status = kDAReturnUnsupported;
}

if ( DADiskGetDescription(disk, kDADiskDescriptionMediaWholeKey) == kCFBooleanFalse )
{
     status = kDAReturnUnsupported;
}

Looking into the IO Kit documentation (for which DiscArbitation.framework is a wrapper for), we find that kDADiskDescriptionMediaWholeKey describes whether the media is whole or not (that is, it represents the whole disk or a partition on it), so check that you're ejecting the entire disc and not a partition. Remember, you can unmount a partition, but you can't eject it. (that wouldn't make sense)

Is the disc mountable?

Another condition in DARequest.c is whether the volume is mountable or not, so make sure it is:

if (DADiskGetDescription(disk, kDADiskDescriptionVolumeMountableKey) == kCFBooleanFalse )
{
     status = kDAReturnUnsupported;
}

Is the DADisk instance's name valid?

A third check validates the volume's name. Some system provided (internal) volumes don't have a name and can't be ejected. The check is very simple and simply looks for any name, so this shouldn't be a big deal.

if (DARequestGetArgument2(request) == NULL)
{
    status = kDAReturnUnsupported;
}

Go through these three checks and see if they apply to you. This way you're bound to find out what's wrong.