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