OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "remoting/host/mac/me2me_preference_pane.h" | 5 #import "remoting/host/mac/me2me_preference_pane.h" |
6 | 6 |
7 #import <Cocoa/Cocoa.h> | 7 #import <Cocoa/Cocoa.h> |
8 #include <CommonCrypto/CommonHMAC.h> | 8 #include <CommonCrypto/CommonHMAC.h> |
9 #include <errno.h> | 9 #include <errno.h> |
10 #include <launch.h> | 10 #include <launch.h> |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 namespace mac { | 57 namespace mac { |
58 | 58 |
59 // MessageForJob sends a single message to launchd with a simple dictionary | 59 // MessageForJob sends a single message to launchd with a simple dictionary |
60 // mapping |operation| to |job_label|, and returns the result of calling | 60 // mapping |operation| to |job_label|, and returns the result of calling |
61 // launch_msg to send that message. On failure, returns nullptr. The caller | 61 // launch_msg to send that message. On failure, returns nullptr. The caller |
62 // assumes ownership of the returned launch_data_t object. | 62 // assumes ownership of the returned launch_data_t object. |
63 launch_data_t MessageForJob(const std::string& job_label, | 63 launch_data_t MessageForJob(const std::string& job_label, |
64 const char* operation) { | 64 const char* operation) { |
65 // launch_data_alloc returns something that needs to be freed. | 65 // launch_data_alloc returns something that needs to be freed. |
66 ScopedLaunchData message(launch_data_alloc(LAUNCH_DATA_DICTIONARY)); | 66 ScopedLaunchData message(launch_data_alloc(LAUNCH_DATA_DICTIONARY)); |
67 if (!message) { | 67 if (!message.is_valid()) { |
68 NSLog(@"launch_data_alloc"); | 68 NSLog(@"launch_data_alloc"); |
69 return nullptr; | 69 return nullptr; |
70 } | 70 } |
71 | 71 |
72 // launch_data_new_string returns something that needs to be freed, but | 72 // launch_data_new_string returns something that needs to be freed, but |
73 // the dictionary will assume ownership when launch_data_dict_insert is | 73 // the dictionary will assume ownership when launch_data_dict_insert is |
74 // called, so put it in a scoper and .release() it when given to the | 74 // called, so put it in a scoper and .release() it when given to the |
75 // dictionary. | 75 // dictionary. |
76 ScopedLaunchData job_label_launchd(launch_data_new_string(job_label.c_str())); | 76 ScopedLaunchData job_label_launchd(launch_data_new_string(job_label.c_str())); |
77 if (!job_label_launchd) { | 77 if (!job_label_launchd.is_valid()) { |
78 NSLog(@"launch_data_new_string"); | 78 NSLog(@"launch_data_new_string"); |
79 return nullptr; | 79 return nullptr; |
80 } | 80 } |
81 | 81 |
82 if (!launch_data_dict_insert(message, | 82 if (!launch_data_dict_insert(message.get(), |
83 job_label_launchd.release(), | 83 job_label_launchd.release(), |
84 operation)) { | 84 operation)) { |
85 return nullptr; | 85 return nullptr; |
86 } | 86 } |
87 | 87 |
88 return launch_msg(message); | 88 return launch_msg(message.get()); |
89 } | 89 } |
90 | 90 |
91 pid_t PIDForJob(const std::string& job_label) { | 91 pid_t PIDForJob(const std::string& job_label) { |
92 ScopedLaunchData response(MessageForJob(job_label, LAUNCH_KEY_GETJOB)); | 92 ScopedLaunchData response(MessageForJob(job_label, LAUNCH_KEY_GETJOB)); |
93 if (!response) { | 93 if (!response.is_valid()) { |
94 return -1; | 94 return -1; |
95 } | 95 } |
96 | 96 |
97 launch_data_type_t response_type = launch_data_get_type(response); | 97 launch_data_type_t response_type = launch_data_get_type(response.get()); |
98 if (response_type != LAUNCH_DATA_DICTIONARY) { | 98 if (response_type != LAUNCH_DATA_DICTIONARY) { |
99 if (response_type == LAUNCH_DATA_ERRNO) { | 99 if (response_type == LAUNCH_DATA_ERRNO) { |
100 NSLog(@"PIDForJob: error %d", launch_data_get_errno(response)); | 100 NSLog(@"PIDForJob: error %d", launch_data_get_errno(response.get())); |
101 } else { | 101 } else { |
102 NSLog(@"PIDForJob: expected dictionary, got %d", response_type); | 102 NSLog(@"PIDForJob: expected dictionary, got %d", response_type); |
103 } | 103 } |
104 return -1; | 104 return -1; |
105 } | 105 } |
106 | 106 |
107 launch_data_t pid_data = launch_data_dict_lookup(response, | 107 launch_data_t pid_data = launch_data_dict_lookup(response.get(), |
108 LAUNCH_JOBKEY_PID); | 108 LAUNCH_JOBKEY_PID); |
109 if (!pid_data) | 109 if (!pid_data) |
110 return 0; | 110 return 0; |
111 | 111 |
112 if (launch_data_get_type(pid_data) != LAUNCH_DATA_INTEGER) { | 112 if (launch_data_get_type(pid_data) != LAUNCH_DATA_INTEGER) { |
113 NSLog(@"PIDForJob: expected integer"); | 113 NSLog(@"PIDForJob: expected integer"); |
114 return -1; | 114 return -1; |
115 } | 115 } |
116 | 116 |
117 return launch_data_get_integer(pid_data); | 117 return launch_data_get_integer(pid_data); |
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 } else { | 576 } else { |
577 NSLog(@"%s failed with exit status %d", remoting::kHostHelperScriptPath, | 577 NSLog(@"%s failed with exit status %d", remoting::kHostHelperScriptPath, |
578 exit_status); | 578 exit_status); |
579 return NO; | 579 return NO; |
580 } | 580 } |
581 } | 581 } |
582 | 582 |
583 - (BOOL)sendJobControlMessage:(const char*)launch_key { | 583 - (BOOL)sendJobControlMessage:(const char*)launch_key { |
584 base::mac::ScopedLaunchData response( | 584 base::mac::ScopedLaunchData response( |
585 base::mac::MessageForJob(remoting::kServiceName, launch_key)); | 585 base::mac::MessageForJob(remoting::kServiceName, launch_key)); |
586 if (!response) { | 586 if (!response.is_valid()) { |
587 NSLog(@"Failed to send message to launchd"); | 587 NSLog(@"Failed to send message to launchd"); |
588 [self showError]; | 588 [self showError]; |
589 return NO; | 589 return NO; |
590 } | 590 } |
591 | 591 |
592 // Expect a response of type LAUNCH_DATA_ERRNO. | 592 // Expect a response of type LAUNCH_DATA_ERRNO. |
593 launch_data_type_t type = launch_data_get_type(response.get()); | 593 launch_data_type_t type = launch_data_get_type(response.get()); |
594 if (type != LAUNCH_DATA_ERRNO) { | 594 if (type != LAUNCH_DATA_ERRNO) { |
595 NSLog(@"launchd returned unexpected type: %d", type); | 595 NSLog(@"launchd returned unexpected type: %d", type); |
596 [self showError]; | 596 [self showError]; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
709 NSArray* arguments = [NSArray arrayWithObjects:@"--relaunch-prefpane", nil]; | 709 NSArray* arguments = [NSArray arrayWithObjects:@"--relaunch-prefpane", nil]; |
710 [task setLaunchPath:command]; | 710 [task setLaunchPath:command]; |
711 [task setArguments:arguments]; | 711 [task setArguments:arguments]; |
712 [task setStandardInput:[NSPipe pipe]]; | 712 [task setStandardInput:[NSPipe pipe]]; |
713 [task launch]; | 713 [task launch]; |
714 [task release]; | 714 [task release]; |
715 [NSApp terminate:nil]; | 715 [NSApp terminate:nil]; |
716 } | 716 } |
717 | 717 |
718 @end | 718 @end |
OLD | NEW |