]> git.saurik.com Git - apple/launchd.git/blobdiff - launchd/testing/mach_via_launchd.c
launchd-152.tar.gz
[apple/launchd.git] / launchd / testing / mach_via_launchd.c
diff --git a/launchd/testing/mach_via_launchd.c b/launchd/testing/mach_via_launchd.c
new file mode 100644 (file)
index 0000000..851db4b
--- /dev/null
@@ -0,0 +1,47 @@
+#include <launch.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+void print_mach_service(launch_data_t obj, const char *key, void *context)
+{
+       if (launch_data_get_type(obj) == LAUNCH_DATA_MACHPORT) {
+               fprintf(stdout, "%s: %d\n", key, launch_data_get_machport(obj));
+               mach_port_deallocate(mach_task_self(), launch_data_get_machport(obj));
+               mach_port_mod_refs(mach_task_self(), launch_data_get_machport(obj), MACH_PORT_RIGHT_RECEIVE, -1);
+       } else {
+               fprintf(stdout, "%s: not a mach port\n", key);
+       }
+}
+
+int main(void)
+{
+       launch_data_t resp, tmp, msg = launch_data_new_string(LAUNCH_KEY_CHECKIN);
+
+       resp = launch_msg(msg);
+
+       if (resp == NULL) {
+               fprintf(stderr, "launch_msg(): %s\n", strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if (launch_data_get_type(resp) == LAUNCH_DATA_ERRNO) {
+               errno = launch_data_get_errno(resp);
+               fprintf(stderr, "launch_msg() response: %s\n", strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       tmp = launch_data_dict_lookup(resp, LAUNCH_JOBKEY_MACHSERVICES);
+
+       if (tmp == NULL) {
+               fprintf(stderr, "no mach services found!\n");
+               exit(EXIT_FAILURE);
+       }
+
+       launch_data_dict_iterate(tmp, print_mach_service, NULL);
+
+       sleep(1);
+       exit(EXIT_SUCCESS);
+}