+#pragma mark -
+#pragma mark xpc conversion
+
+static void
+_asl_msg_to_xpc(asl_msg_t *msg, xpc_object_t dict)
+{
+ uint32_t x, len;
+ const char *key, *val, *nano;
+ uint16_t kx;
+
+ if (msg == NULL) return;
+ if (dict == NULL) return;
+
+ nano = NULL;
+ asl_msg_lookup(msg, ASL_KEY_TIME_NSEC, &nano, NULL);
+
+ for (x = asl_msg_fetch(msg, 0, &key, &val, NULL); x != IndexNull; x = asl_msg_fetch(msg, x, &key, &val, NULL))
+ {
+ if (key == NULL) continue;
+
+ len = strlen(key);
+ kx = _asl_msg_std_key(key, len);
+
+ if (val == NULL)
+ {
+ xpc_object_t obj = xpc_null_create();
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ else if (kx == 0)
+ {
+ if (streq(key, ASL_KEY_SENDER_MACH_UUID))
+ {
+ uuid_t v;
+ if (uuid_parse(val, v) == 0)
+ {
+ xpc_object_t obj = xpc_uuid_create(v);
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ }
+ else
+ {
+ xpc_object_t obj = xpc_string_create(val);
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ }
+ else if (kx == ASL_STD_KEY_TIME)
+ {
+ uint64_t t = NSEC_PER_SEC * asl_core_parse_time(val, NULL);
+ if (nano != NULL) t += atoll(nano);
+ xpc_object_t obj = xpc_date_create(t);
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ else if (kx == ASL_STD_KEY_NANO)
+ {
+ /* handled with ASL_STD_KEY_TIME */
+ }
+ else if ((kx == ASL_STD_KEY_PID) || (kx == ASL_STD_KEY_REF_PID))
+ {
+ int64_t v = atoll(val);
+ xpc_object_t obj = xpc_int64_create(v);
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ else if ((kx == ASL_STD_KEY_UID) || (kx == ASL_STD_KEY_GID))
+ {
+ int64_t v = atoll(val);
+ xpc_object_t obj = xpc_int64_create(v);
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ else if (kx == ASL_STD_KEY_LEVEL)
+ {
+ int64_t v = atoll(val);
+ xpc_object_t obj = xpc_int64_create(v);
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ else if ((kx == ASL_STD_KEY_READ_UID) || (kx == ASL_STD_KEY_READ_GID))
+ {
+ int64_t v = atoll(val);
+ xpc_object_t obj = xpc_int64_create(v);
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ else if (kx == ASL_STD_KEY_MSG_ID)
+ {
+ /* ignore */
+ }
+ else
+ {
+ xpc_object_t obj = xpc_string_create(val);
+ xpc_dictionary_set_value(dict, key, obj);
+ xpc_release(obj);
+ }
+ }
+}
+
+void
+_asl_log_args_to_xpc(asl_object_t client, asl_object_t msg, xpc_object_t dict)
+{
+ _asl_msg_to_xpc(asl_client_kvdict((asl_client_t *)client), dict);
+ _asl_msg_to_xpc((asl_msg_t *)msg, dict);
+}
+