#include <stdio.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>

trit (io_iterator_t it)
{
	io_service_t ioserv;
	io_name_t ioname;

	IORegistryIteratorEnterEntry( it );
	printf ("{\n");

    while ( ioserv = IOIteratorNext(it))
        {
                IOObjectGetClass(ioserv,ioname);
                printf ("Found: %s\n",ioname);
		trit (it);
        }
	printf ("}\n");

}

main (int argc, char **argv)
{

	mach_port_t masterPort;
	kern_return_t kerr;
        CFMutableDictionaryRef iomatch;
	io_service_t ioserv;
	io_name_t ioname;
	io_iterator_t iterator;
	const char *name ="IOSCSIParallelController";

	if (argv[1] > 0 )
		name = argv[1];

	printf ("scanning for %s\n",name);

	kerr = IOMasterPort( MACH_PORT_NULL, &masterPort );

	if (kerr) {
		printf ("Kernel error opening Master port %d\n",kerr);
		exit (-1);
	}

	printf ("IO service Name Matching: \"%s\"\n",name);
	iomatch = IOServiceMatching(name);
	//iomatch = IOServiceMatching(kIOSCSIDeviceClassName);

//	NSLog (iomatch);
//	printf ("iomatch: %x\n" ,iomatch);
/*
	ioserv = IOServiceGetMatchingService( kIOMasterPortDefault, iomatch );
*/



   kerr = IOServiceGetMatchingServices(masterPort, iomatch, &iterator);
    
    if (kerr != KERN_SUCCESS)
    {
        printf("IOServiceGetMatchingServices returned %d\n\n", kerr);
        return 0;
    }
    
/*IOObjectGetClass*/
    while (ioserv = IOIteratorNext(iterator))
	{
		IOObjectGetClass(ioserv,ioname);
		printf ("Found: %s...",ioname);
		kerr= IOServiceRequestProbe(ioserv,0);
		if (kerr) {
			printf ("Scan failed\n");
		} else {
			printf ("Scan success\n");
		}
//		trit(iterator);
	}

    IOObjectRelease(iterator);


}

