xref: /xnu-10002.1.13/tests/iokit/service_helpers.c (revision 1031c584a5e37aff177559b9f69dbd3c8c3fd30a)
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 Distributions IOTestServiceFindService(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