xref: /xnu-10002.81.5/tests/iokit/service_helpers.c (revision 5e3eaea39dcf651e66cb99ba7d70e32cc4a99587)
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 Distributions IOTestServiceFindService(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