X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=macosx.c;h=236bf4c012b658bf617f69f5671cb265e0e84558;hb=7f450f46bda085943df503d9d74ed1c8f9d42e7f;hp=71bf0a09cff1a8e4eda92c7750262776b3e0c74f;hpb=235269990bd62a906af871c34839ebb922eecb45;p=libserialport.git diff --git a/macosx.c b/macosx.c index 71bf0a0..236bf4c 100644 --- a/macosx.c +++ b/macosx.c @@ -21,7 +21,7 @@ #include "libserialport.h" #include "libserialport_internal.h" -enum sp_return get_port_details(struct sp_port *port) +SP_PRIV enum sp_return get_port_details(struct sp_port *port) { /* Description limited to 127 char, anything longer would not be user friendly anyway */ @@ -174,3 +174,52 @@ enum sp_return get_port_details(struct sp_port *port) RETURN_OK(); } + +SP_PRIV enum sp_return list_ports(struct sp_port ***list) +{ + CFMutableDictionaryRef classes; + io_iterator_t iter; + char path[PATH_MAX]; + io_object_t port; + CFTypeRef cf_path; + Boolean result; + int ret = SP_OK; + + DEBUG("Creating matching dictionary"); + if (!(classes = IOServiceMatching(kIOSerialBSDServiceValue))) { + SET_FAIL(ret, "IOServiceMatching() failed"); + goto out_done; + } + + DEBUG("Getting matching services"); + if (IOServiceGetMatchingServices(kIOMasterPortDefault, classes, + &iter) != KERN_SUCCESS) { + SET_FAIL(ret, "IOServiceGetMatchingServices() failed"); + goto out_done; + } + + DEBUG("Iterating over results"); + while ((port = IOIteratorNext(iter))) { + cf_path = IORegistryEntryCreateCFProperty(port, + CFSTR(kIOCalloutDeviceKey), kCFAllocatorDefault, 0); + if (cf_path) { + result = CFStringGetCString(cf_path, path, sizeof(path), + kCFStringEncodingASCII); + CFRelease(cf_path); + if (result) { + DEBUG("Found port %s", path); + if (!(*list = list_append(*list, path))) { + SET_ERROR(ret, SP_ERR_MEM, "list append failed"); + IOObjectRelease(port); + goto out; + } + } + } + IOObjectRelease(port); + } +out: + IOObjectRelease(iter); +out_done: + + return ret; +}