| 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 #include "chrome/common/service_process_util_posix.h" | 5 #include "chrome/common/service_process_util_posix.h" |
| 6 | 6 |
| 7 #import <Foundation/Foundation.h> | 7 #import <Foundation/Foundation.h> |
| 8 #include <launch.h> | 8 #include <launch.h> |
| 9 | 9 |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 return @"ServiceProcessSocket"; | 60 return @"ServiceProcessSocket"; |
| 61 } | 61 } |
| 62 | 62 |
| 63 bool GetParentFSRef(const FSRef& child, FSRef* parent) { | 63 bool GetParentFSRef(const FSRef& child, FSRef* parent) { |
| 64 return FSGetCatalogInfo(&child, 0, NULL, NULL, NULL, parent) == noErr; | 64 return FSGetCatalogInfo(&child, 0, NULL, NULL, NULL, parent) == noErr; |
| 65 } | 65 } |
| 66 | 66 |
| 67 bool RemoveFromLaunchd() { | 67 bool RemoveFromLaunchd() { |
| 68 // We're killing a file. | 68 // We're killing a file. |
| 69 base::ThreadRestrictions::AssertIOAllowed(); | 69 base::ThreadRestrictions::AssertIOAllowed(); |
| 70 base::mac::ScopedCFTypeRef<CFStringRef> name(CopyServiceProcessLaunchDName()); | 70 base::ScopedCFTypeRef<CFStringRef> name(CopyServiceProcessLaunchDName()); |
| 71 return Launchd::GetInstance()->DeletePlist(Launchd::User, | 71 return Launchd::GetInstance()->DeletePlist(Launchd::User, |
| 72 Launchd::Agent, | 72 Launchd::Agent, |
| 73 name); | 73 name); |
| 74 } | 74 } |
| 75 | 75 |
| 76 class ExecFilePathWatcherCallback { | 76 class ExecFilePathWatcherCallback { |
| 77 public: | 77 public: |
| 78 ExecFilePathWatcherCallback() {} | 78 ExecFilePathWatcherCallback() {} |
| 79 ~ExecFilePathWatcherCallback() {} | 79 ~ExecFilePathWatcherCallback() {} |
| 80 | 80 |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 return reinterpret_cast<CFDictionaryRef>(launchd_plist); | 288 return reinterpret_cast<CFDictionaryRef>(launchd_plist); |
| 289 } | 289 } |
| 290 | 290 |
| 291 // Writes the launchd property list into the user's LaunchAgents directory, | 291 // Writes the launchd property list into the user's LaunchAgents directory, |
| 292 // creating that directory if needed. This will cause the service process to be | 292 // creating that directory if needed. This will cause the service process to be |
| 293 // auto launched on the next user login. | 293 // auto launched on the next user login. |
| 294 bool ServiceProcessState::AddToAutoRun() { | 294 bool ServiceProcessState::AddToAutoRun() { |
| 295 // We're creating directories and writing a file. | 295 // We're creating directories and writing a file. |
| 296 base::ThreadRestrictions::AssertIOAllowed(); | 296 base::ThreadRestrictions::AssertIOAllowed(); |
| 297 DCHECK(autorun_command_line_.get()); | 297 DCHECK(autorun_command_line_.get()); |
| 298 base::mac::ScopedCFTypeRef<CFStringRef> name(CopyServiceProcessLaunchDName()); | 298 base::ScopedCFTypeRef<CFStringRef> name(CopyServiceProcessLaunchDName()); |
| 299 base::mac::ScopedCFTypeRef<CFDictionaryRef> plist( | 299 base::ScopedCFTypeRef<CFDictionaryRef> plist( |
| 300 CreateServiceProcessLaunchdPlist(autorun_command_line_.get(), true)); | 300 CreateServiceProcessLaunchdPlist(autorun_command_line_.get(), true)); |
| 301 return Launchd::GetInstance()->WritePlistToFile(Launchd::User, | 301 return Launchd::GetInstance()->WritePlistToFile(Launchd::User, |
| 302 Launchd::Agent, | 302 Launchd::Agent, |
| 303 name, | 303 name, |
| 304 plist); | 304 plist); |
| 305 } | 305 } |
| 306 | 306 |
| 307 bool ServiceProcessState::RemoveFromAutoRun() { | 307 bool ServiceProcessState::RemoveFromAutoRun() { |
| 308 return RemoveFromLaunchd(); | 308 return RemoveFromLaunchd(); |
| 309 } | 309 } |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 bool needs_shutdown = false; | 351 bool needs_shutdown = false; |
| 352 bool needs_restart = false; | 352 bool needs_restart = false; |
| 353 bool good_bundle = false; | 353 bool good_bundle = false; |
| 354 | 354 |
| 355 FSRef macos_fsref; | 355 FSRef macos_fsref; |
| 356 if (GetParentFSRef(executable_fsref_, &macos_fsref)) { | 356 if (GetParentFSRef(executable_fsref_, &macos_fsref)) { |
| 357 FSRef contents_fsref; | 357 FSRef contents_fsref; |
| 358 if (GetParentFSRef(macos_fsref, &contents_fsref)) { | 358 if (GetParentFSRef(macos_fsref, &contents_fsref)) { |
| 359 FSRef bundle_fsref; | 359 FSRef bundle_fsref; |
| 360 if (GetParentFSRef(contents_fsref, &bundle_fsref)) { | 360 if (GetParentFSRef(contents_fsref, &bundle_fsref)) { |
| 361 base::mac::ScopedCFTypeRef<CFURLRef> bundle_url( | 361 base::ScopedCFTypeRef<CFURLRef> bundle_url( |
| 362 CFURLCreateFromFSRef(kCFAllocatorDefault, &bundle_fsref)); | 362 CFURLCreateFromFSRef(kCFAllocatorDefault, &bundle_fsref)); |
| 363 if (bundle_url.get()) { | 363 if (bundle_url.get()) { |
| 364 base::mac::ScopedCFTypeRef<CFBundleRef> bundle( | 364 base::ScopedCFTypeRef<CFBundleRef> bundle( |
| 365 CFBundleCreate(kCFAllocatorDefault, bundle_url)); | 365 CFBundleCreate(kCFAllocatorDefault, bundle_url)); |
| 366 // Check to see if the bundle still has a minimal structure. | 366 // Check to see if the bundle still has a minimal structure. |
| 367 good_bundle = CFBundleGetIdentifier(bundle) != NULL; | 367 good_bundle = CFBundleGetIdentifier(bundle) != NULL; |
| 368 } | 368 } |
| 369 } | 369 } |
| 370 } | 370 } |
| 371 } | 371 } |
| 372 if (!good_bundle) { | 372 if (!good_bundle) { |
| 373 needs_shutdown = true; | 373 needs_shutdown = true; |
| 374 } else { | 374 } else { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 387 was_moved = false; | 387 was_moved = false; |
| 388 } | 388 } |
| 389 } | 389 } |
| 390 if (was_moved) { | 390 if (was_moved) { |
| 391 needs_restart = true; | 391 needs_restart = true; |
| 392 } | 392 } |
| 393 } | 393 } |
| 394 } | 394 } |
| 395 if (needs_shutdown || needs_restart) { | 395 if (needs_shutdown || needs_restart) { |
| 396 // First deal with the plist. | 396 // First deal with the plist. |
| 397 base::mac::ScopedCFTypeRef<CFStringRef> name( | 397 base::ScopedCFTypeRef<CFStringRef> name(CopyServiceProcessLaunchDName()); |
| 398 CopyServiceProcessLaunchDName()); | |
| 399 if (needs_restart) { | 398 if (needs_restart) { |
| 400 base::mac::ScopedCFTypeRef<CFMutableDictionaryRef> plist( | 399 base::ScopedCFTypeRef<CFMutableDictionaryRef> plist( |
| 401 Launchd::GetInstance()->CreatePlistFromFile(Launchd::User, | 400 Launchd::GetInstance()->CreatePlistFromFile( |
| 402 Launchd::Agent, | 401 Launchd::User, Launchd::Agent, name)); |
| 403 name)); | |
| 404 if (plist.get()) { | 402 if (plist.get()) { |
| 405 NSMutableDictionary* ns_plist = base::mac::CFToNSCast(plist); | 403 NSMutableDictionary* ns_plist = base::mac::CFToNSCast(plist); |
| 406 std::string new_path = base::mac::PathFromFSRef(executable_fsref_); | 404 std::string new_path = base::mac::PathFromFSRef(executable_fsref_); |
| 407 NSString* ns_new_path = base::SysUTF8ToNSString(new_path); | 405 NSString* ns_new_path = base::SysUTF8ToNSString(new_path); |
| 408 [ns_plist setObject:ns_new_path forKey:@ LAUNCH_JOBKEY_PROGRAM]; | 406 [ns_plist setObject:ns_new_path forKey:@ LAUNCH_JOBKEY_PROGRAM]; |
| 409 scoped_nsobject<NSMutableArray> args( | 407 scoped_nsobject<NSMutableArray> args( |
| 410 [[ns_plist objectForKey:@ LAUNCH_JOBKEY_PROGRAMARGUMENTS] | 408 [[ns_plist objectForKey:@ LAUNCH_JOBKEY_PROGRAMARGUMENTS] |
| 411 mutableCopy]); | 409 mutableCopy]); |
| 412 [args replaceObjectAtIndex:0 withObject:ns_new_path]; | 410 [args replaceObjectAtIndex:0 withObject:ns_new_path]; |
| 413 [ns_plist setObject:args forKey:@ LAUNCH_JOBKEY_PROGRAMARGUMENTS]; | 411 [ns_plist setObject:args forKey:@ LAUNCH_JOBKEY_PROGRAMARGUMENTS]; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 438 session_type)) { | 436 session_type)) { |
| 439 DLOG(ERROR) << "RestartLaunchdJob"; | 437 DLOG(ERROR) << "RestartLaunchdJob"; |
| 440 needs_shutdown = true; | 438 needs_shutdown = true; |
| 441 } | 439 } |
| 442 } | 440 } |
| 443 if (needs_shutdown) { | 441 if (needs_shutdown) { |
| 444 CFStringRef label = | 442 CFStringRef label = |
| 445 base::mac::NSToCFCast(GetServiceProcessLaunchDLabel()); | 443 base::mac::NSToCFCast(GetServiceProcessLaunchDLabel()); |
| 446 CFErrorRef err = NULL; | 444 CFErrorRef err = NULL; |
| 447 if (!Launchd::GetInstance()->RemoveJob(label, &err)) { | 445 if (!Launchd::GetInstance()->RemoveJob(label, &err)) { |
| 448 base::mac::ScopedCFTypeRef<CFErrorRef> scoped_err(err); | 446 base::ScopedCFTypeRef<CFErrorRef> scoped_err(err); |
| 449 DLOG(ERROR) << "RemoveJob " << err; | 447 DLOG(ERROR) << "RemoveJob " << err; |
| 450 // Exiting with zero, so launchd doesn't restart the process. | 448 // Exiting with zero, so launchd doesn't restart the process. |
| 451 exit(0); | 449 exit(0); |
| 452 } | 450 } |
| 453 } | 451 } |
| 454 } | 452 } |
| 455 } | 453 } |
| OLD | NEW |