static void fill_job_info(launch_data_t data, const char *key, LaunchJobStatus * info) { switch (launch_data_get_type(data)) { case LAUNCH_DATA_STRING: if (strcmp(key, LAUNCH_JOBKEY_LABEL) == 0) { info->m_label = std::string(launch_data_get_string(data)); } else if (strcmp(key, LAUNCH_JOBKEY_PROGRAM) == 0) { info->m_program = std::string(launch_data_get_string(data)); } return; case LAUNCH_DATA_INTEGER: if (strcmp(key, LAUNCH_JOBKEY_PID) == 0) { info->m_pid = (pid_t)launch_data_get_integer(data); } return; case LAUNCH_DATA_DICTIONARY: launch_data_dict_iterate(data, (dict_iterate_callback)fill_job_info, info); return; default: return; /* do nothing */ } }
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); }
int main(void) { launch_data_t output_obj = NULL; assert(vproc_swap_complex(NULL, VPROC_GSK_ENVIRONMENT, NULL, &output_obj) == 0); assert(launch_data_get_type(output_obj) == LAUNCH_DATA_DICTIONARY); launch_data_dict_iterate(output_obj, my_callback, stdout); return 0; }
static PyObject* launchdict2python(launch_data_t data) { PyObject* result = PyDict_New(); launch_data_dict_iterate(data, launchdict_cb, result); if (PyErr_Occurred()) { Py_DECREF(result); return NULL; } return result; }
int main(int argc, char *argv[]) { auto request(launch_data_new_string(LAUNCH_KEY_GETJOBS)); auto response(launch_msg(request)); launch_data_free(request); _assert(response != NULL); _assert(launch_data_get_type(response) == LAUNCH_DATA_DICTIONARY); auto parent(getppid()); auto cydia(false); launch_data_dict_iterate(response, [=, &cydia](const char *name, launch_data_t value) { if (launch_data_get_type(response) != LAUNCH_DATA_DICTIONARY) return; auto integer(launch_data_dict_lookup(value, LAUNCH_JOBKEY_PID)); if (integer == NULL || launch_data_get_type(integer) != LAUNCH_DATA_INTEGER) return; auto pid(launch_data_get_integer(integer)); if (pid != parent) return; auto variables(launch_data_dict_lookup(value, LAUNCH_JOBKEY_ENVIRONMENTVARIABLES)); if (variables != NULL && launch_data_get_type(variables) == LAUNCH_DATA_DICTIONARY) { auto dyld(false); launch_data_dict_iterate(variables, [&dyld](const char *name, launch_data_t value) { if (strncmp(name, "DYLD_", 5) == 0) dyld = true; }); if (dyld) return; } auto string(launch_data_dict_lookup(value, LAUNCH_JOBKEY_PROGRAM)); if (string == NULL || launch_data_get_type(string) != LAUNCH_DATA_STRING) { auto array(launch_data_dict_lookup(value, LAUNCH_JOBKEY_PROGRAMARGUMENTS)); if (array == NULL || launch_data_get_type(array) != LAUNCH_DATA_ARRAY) return; if (launch_data_array_get_count(array) == 0) return; string = launch_data_array_get_index(array, 0); if (string == NULL || launch_data_get_type(string) != LAUNCH_DATA_STRING) return; } auto program(launch_data_get_string(string)); if (program == NULL) return; if (strcmp(program, "/Applications/Cydia.app/Cydia") == 0) cydia = true; }); if (!cydia) { fprintf(stderr, "thou shalt not pass\n"); return EX_NOPERM; } setuid(0); setgid(0); if (argc < 2 || argv[1][0] != '/') argv[0] = "/usr/bin/dpkg"; else { --argc; ++argv; } execv(argv[0], argv); return EX_UNAVAILABLE; }
void launch_data_dict_iterate(launch_data_t data, LaunchDataIterator code) { launch_data_dict_iterate(data, [](launch_data_t value, const char *name, void *baton) { (*static_cast<LaunchDataIterator *>(baton))(name, value); }, &code); }
CFTypeRef GTMCFTypeCreateFromLaunchData(launch_data_t ldata, bool convert_non_standard_objects, CFErrorRef *error) { CFTypeRef cf_type_ref = NULL; CFErrorRef local_error = NULL; if (ldata == NULL) { local_error = GTMCFLaunchCreateUnlocalizedError(EINVAL, CFSTR("NULL ldata")); goto exit; } launch_data_type_t ldata_type = launch_data_get_type(ldata); switch (ldata_type) { case LAUNCH_DATA_STRING: cf_type_ref = CFStringCreateWithCString(kCFAllocatorDefault, launch_data_get_string(ldata), kCFStringEncodingUTF8); break; case LAUNCH_DATA_INTEGER: { long long value = launch_data_get_integer(ldata); cf_type_ref = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongLongType, &value); break; } case LAUNCH_DATA_REAL: { double value = launch_data_get_real(ldata); cf_type_ref = CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &value); break; } case LAUNCH_DATA_BOOL: { bool value = launch_data_get_bool(ldata); cf_type_ref = value ? kCFBooleanTrue : kCFBooleanFalse; CFRetain(cf_type_ref); break; } case LAUNCH_DATA_OPAQUE: { size_t size = launch_data_get_opaque_size(ldata); void *data = launch_data_get_opaque(ldata); cf_type_ref = CFDataCreate(kCFAllocatorDefault, data, size); break; } case LAUNCH_DATA_ARRAY: { size_t count = launch_data_array_get_count(ldata); cf_type_ref = CFArrayCreateMutable(kCFAllocatorDefault, count, &kCFTypeArrayCallBacks); if (cf_type_ref) { for (size_t i = 0; !local_error && i < count; i++) { launch_data_t l_sub_data = launch_data_array_get_index(ldata, i); CFTypeRef cf_sub_type = GTMCFTypeCreateFromLaunchData(l_sub_data, convert_non_standard_objects, &local_error); if (cf_sub_type) { CFArrayAppendValue((CFMutableArrayRef)cf_type_ref, cf_sub_type); CFRelease(cf_sub_type); } } } break; } case LAUNCH_DATA_DICTIONARY: cf_type_ref = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); if (cf_type_ref) { GTMLToCFDictContext context = { (CFMutableDictionaryRef)cf_type_ref, convert_non_standard_objects, &local_error }; launch_data_dict_iterate(ldata, GTMConvertLaunchDataDictEntryToCFDictEntry, &context); } break; case LAUNCH_DATA_FD: if (convert_non_standard_objects) { int file_descriptor = launch_data_get_fd(ldata); cf_type_ref = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &file_descriptor); } break; case LAUNCH_DATA_MACHPORT: if (convert_non_standard_objects) { mach_port_t port = launch_data_get_machport(ldata); cf_type_ref = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &port); } break; default: local_error = GTMCFLaunchCreateUnlocalizedError(EINVAL, CFSTR("Unknown launchd type %d"), ldata_type); break; } exit: if (error) { *error = local_error; } else if (local_error) { #ifdef DEBUG CFShow(local_error); #endif // DEBUG CFRelease(local_error); } return cf_type_ref; }