1*1031c584SApple OSS Distributions #include <sys/sysctl.h> 2*1031c584SApple OSS Distributions #include <IOKit/IOKitLib.h> 3*1031c584SApple OSS Distributions #include <errno.h> 4*1031c584SApple OSS Distributions #include <stdio.h> 5*1031c584SApple OSS Distributions 6*1031c584SApple OSS Distributions #include "service_helpers.h" 7*1031c584SApple OSS Distributions 8*1031c584SApple OSS Distributions #define MAX_RETRIES 10 9*1031c584SApple OSS Distributions 10*1031c584SApple OSS Distributions /* 11*1031c584SApple OSS Distributions * Helper method to find IOServices needed for testing. Use with T_ASSERT_POSIX_SUCCESS(...) 12*1031c584SApple OSS Distributions */ 13*1031c584SApple OSS Distributions int IOTestServiceFindService(const char * name,io_service_t * serviceOut)14*1031c584SApple OSS DistributionsIOTestServiceFindService(const char * name, io_service_t * serviceOut) 15*1031c584SApple OSS Distributions { 16*1031c584SApple OSS Distributions int err = 0; 17*1031c584SApple OSS Distributions int retries = 0; 18*1031c584SApple OSS Distributions io_service_t service = IO_OBJECT_NULL; 19*1031c584SApple OSS Distributions 20*1031c584SApple OSS Distributions #pragma clang diagnostic push 21*1031c584SApple OSS Distributions #pragma clang diagnostic ignored "-Wcast-qual" 22*1031c584SApple OSS Distributions err = sysctlbyname("kern.iokit_test_service_setup", NULL, 0, (void *)name, strlen(name)); 23*1031c584SApple OSS Distributions #pragma clang diagnostic pop 24*1031c584SApple OSS Distributions if (err) { 25*1031c584SApple OSS Distributions goto finish; 26*1031c584SApple OSS Distributions } 27*1031c584SApple OSS Distributions 28*1031c584SApple OSS Distributions do { 29*1031c584SApple OSS Distributions service = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching(name)); 30*1031c584SApple OSS Distributions if (service == IO_OBJECT_NULL) { 31*1031c584SApple OSS Distributions sleep(1); 32*1031c584SApple OSS Distributions retries += 1; 33*1031c584SApple OSS Distributions } 34*1031c584SApple OSS Distributions } while (service == IO_OBJECT_NULL && retries <= MAX_RETRIES); 35*1031c584SApple OSS Distributions 36*1031c584SApple OSS Distributions if (service == IO_OBJECT_NULL) { 37*1031c584SApple OSS Distributions err = ENOENT; 38*1031c584SApple OSS Distributions goto finish; 39*1031c584SApple OSS Distributions } 40*1031c584SApple OSS Distributions 41*1031c584SApple OSS Distributions err = 0; 42*1031c584SApple OSS Distributions 43*1031c584SApple OSS Distributions finish: 44*1031c584SApple OSS Distributions if (serviceOut && service != IO_OBJECT_NULL) { 45*1031c584SApple OSS Distributions *serviceOut = service; 46*1031c584SApple OSS Distributions } else if (service != IO_OBJECT_NULL) { 47*1031c584SApple OSS Distributions IOObjectRelease(service); 48*1031c584SApple OSS Distributions } 49*1031c584SApple OSS Distributions 50*1031c584SApple OSS Distributions return err; 51*1031c584SApple OSS Distributions } 52