/*
- * Copyright (c) 2012, 2013 Apple Inc. All rights reserved.
+ * Copyright (c) 2012, 2013, 2015, 2016, 2018, 2019 Apple Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
- *
+ *
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this
* file.
- *
+ *
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
- *
+ *
* @APPLE_LICENSE_HEADER_END@
*/
-#include <Availability.h>
#include <TargetConditionals.h>
-#include <asl.h>
#include <dispatch/dispatch.h>
+#include <dispatch/private.h>
+#include <os/log.h>
#include <vproc.h>
#include <vproc_priv.h>
#include <xpc/xpc.h>
#include "libSystemConfiguration_client.h"
+#include "libSystemConfiguration_internal.h"
#pragma mark -
#pragma mark libSC fork handlers
-__attribute__((weak_import)) bool _dispatch_is_multithreaded(void);
-
-static boolean_t _has_forked = FALSE;
+static boolean_t _available = TRUE;
// These functions are registered with libSystem to
// handle pthread_atfork callbacks.
void
_libSC_info_fork_child()
{
- if (_dispatch_is_multithreaded()) {
- // if dispatch was active before fork
- _has_forked = TRUE;
+ if (_dispatch_is_fork_of_multithreaded_parent()) {
+ _available = FALSE;
}
return;
char *desc;
desc = xpc_copy_description(obj);
- asl_log(NULL, NULL, ASL_LEVEL_ERR, "%s = %s", msg, desc);
+ os_log(OS_LOG_DEFAULT, "%s = %s", msg, desc);
free(desc);
}
+__private_extern__
+_Bool
+libSC_info_available()
+{
+ return _available;
+}
+
+
+static void
+libSC_info_client_dealloc(libSC_info_client_t *client)
+{
+ free(client->service_description);
+ free(client->service_name);
+ free(client);
+ return;
+}
+
+
__private_extern__
libSC_info_client_t *
libSC_info_client_create(dispatch_queue_t q,
{
xpc_connection_t c;
libSC_info_client_t *client;
-#if !TARGET_IPHONE_SIMULATOR
+#if !TARGET_OS_SIMULATOR || TARGET_OS_MACCATALYST
const uint64_t flags = XPC_CONNECTION_MACH_SERVICE_PRIVILEGED;
-#else // !TARGET_IPHONE_SIMULATOR
+#else // !TARGET_OS_SIMULATOR || TARGET_OS_MACCATALYST
const uint64_t flags = 0;
-#endif // !TARGET_IPHONE_SIMULATOR
+#endif // !TARGET_OS_SIMULATOR || TARGET_OS_MACCATALYST
- if (_has_forked) {
+ if (!_available) {
return NULL;
}
type = xpc_get_type(xobj);
if (type == XPC_TYPE_DICTIONARY) {
- asl_log(NULL, NULL, ASL_LEVEL_ERR, "%s: unexpected message", client->service_name);
+ os_log(OS_LOG_DEFAULT, "%s: unexpected message", client->service_name);
log_xpc_object(" dict = ", xobj);
} else if (type == XPC_TYPE_ERROR) {
if (xobj == XPC_ERROR_CONNECTION_INVALID) {
- asl_log(NULL, NULL, ASL_LEVEL_ERR, "%s: server not available", client->service_name);
+ os_log(OS_LOG_DEFAULT, "%s: server not available", client->service_name);
client->active = FALSE;
} else if (xobj == XPC_ERROR_CONNECTION_INTERRUPTED) {
- asl_log(NULL, NULL, ASL_LEVEL_DEBUG, "%s: server failed", client->service_name);
+ os_log_debug(OS_LOG_DEFAULT, "%s: server failed", client->service_name);
} else {
const char *desc;
desc = xpc_dictionary_get_string(xobj, XPC_ERROR_KEY_DESCRIPTION);
- asl_log(NULL, NULL, ASL_LEVEL_DEBUG,
- "%s: connection error: %d : %s",
- client->service_name,
- xpc_connection_get_pid(c),
- desc);
+ os_log_debug(OS_LOG_DEFAULT,
+ "%s: connection error: %d : %s",
+ client->service_name,
+ xpc_connection_get_pid(c),
+ desc);
}
-
} else {
- asl_log(NULL, NULL, ASL_LEVEL_ERR,
- "%s: unknown event type : %p",
- client->service_name,
- type);
+ os_log(OS_LOG_DEFAULT,
+ "%s: unknown event type : %p",
+ client->service_name,
+ type);
}
});
client->connection = c;
+ xpc_connection_set_context(c, client);
+ xpc_connection_set_finalizer_f(c, (xpc_finalizer_t)libSC_info_client_dealloc);
+
xpc_connection_resume(c);
return client;
libSC_info_client_release(libSC_info_client_t *client)
{
xpc_release(client->connection);
- free(client->service_description);
- free(client->service_name);
- free(client);
+ return;
}
}
if ((type == XPC_TYPE_ERROR) && (reply == XPC_ERROR_CONNECTION_INTERRUPTED)) {
- asl_log(NULL, NULL, ASL_LEVEL_DEBUG,
- "%s server failure, retrying",
- client->service_description);
+ os_log_debug(OS_LOG_DEFAULT,
+ "%s server failure, retrying",
+ client->service_description);
// retry request
xpc_release(reply);
continue;
}
if ((type == XPC_TYPE_ERROR) && (reply == XPC_ERROR_CONNECTION_INVALID)) {
- asl_log(NULL, NULL, ASL_LEVEL_ERR,
- "%s server not available",
- client->service_description);
+ os_log(OS_LOG_DEFAULT,
+ "%s server not available",
+ client->service_description);
client->active = FALSE;
} else {
- asl_log(NULL, NULL, ASL_LEVEL_ERR,
- "%s xpc_connection_send_message_with_reply_sync() with unexpected reply",
- client->service_description);
+ os_log(OS_LOG_DEFAULT,
+ "%s xpc_connection_send_message_with_reply_sync() with unexpected reply",
+ client->service_description);
log_xpc_object(" reply", reply);
}