OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
| 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at |
| 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. |
| 14 |
| 15 #include "util/mach/bootstrap.h" |
| 16 |
| 17 #include <AvailabilityMacros.h> |
| 18 #include <servers/bootstrap.h> |
| 19 |
| 20 #include "base/basictypes.h" |
| 21 #include "base/mac/scoped_mach_port.h" |
| 22 #include "util/mac/mac_util.h" |
| 23 |
| 24 #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_5 |
| 25 namespace { |
| 26 |
| 27 // Wraps bootstrap_register to avoid the deprecation warning. It needs to be |
| 28 // used on 10.5. |
| 29 kern_return_t BootstrapRegister(mach_port_t bp, |
| 30 name_t service_name, |
| 31 mach_port_t sp) { |
| 32 #pragma GCC diagnostic push |
| 33 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" |
| 34 return bootstrap_register(bp, service_name, sp); |
| 35 #pragma GCC diagnostic pop |
| 36 } |
| 37 |
| 38 } // namespace |
| 39 #endif |
| 40 |
| 41 namespace crashpad { |
| 42 |
| 43 kern_return_t BootstrapCheckIn(mach_port_t bp, |
| 44 const std::string& service_name, |
| 45 mach_port_t* service_port) { |
| 46 // bootstrap_check_in (until the 10.6 SDK) and bootstrap_register (all SDKs) |
| 47 // are declared with a char* argument, but they don’t actually modify the char |
| 48 // data, so this is safe. |
| 49 char* service_name_mutable = const_cast<char*>(service_name.c_str()); |
| 50 |
| 51 kern_return_t kr = bootstrap_check_in(bp, service_name_mutable, service_port); |
| 52 |
| 53 #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_5 |
| 54 if (kr == BOOTSTRAP_UNKNOWN_SERVICE && MacOSXMinorVersion() <= 5) { |
| 55 // This code path should only be entered on 10.5 or earlier. |
| 56 mach_port_t local_service_port; |
| 57 kr = mach_port_allocate( |
| 58 mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &local_service_port); |
| 59 if (kr != KERN_SUCCESS) { |
| 60 return kr; |
| 61 } |
| 62 base::mac::ScopedMachReceiveRight service_port_receive_right_owner( |
| 63 local_service_port); |
| 64 |
| 65 kr = mach_port_insert_right(mach_task_self(), |
| 66 local_service_port, |
| 67 local_service_port, |
| 68 MACH_MSG_TYPE_MAKE_SEND); |
| 69 if (kr != KERN_SUCCESS) { |
| 70 return kr; |
| 71 } |
| 72 base::mac::ScopedMachSendRight service_port_send_right_owner( |
| 73 local_service_port); |
| 74 |
| 75 kr = BootstrapRegister(bp, service_name_mutable, local_service_port); |
| 76 if (kr != BOOTSTRAP_SUCCESS) { |
| 77 return kr; |
| 78 } |
| 79 |
| 80 ignore_result(service_port_receive_right_owner.release()); |
| 81 *service_port = local_service_port; |
| 82 } |
| 83 #endif |
| 84 |
| 85 return kr; |
| 86 } |
| 87 |
| 88 } // namespace crashpad |
OLD | NEW |