1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_COMMON_LAUNCHD_MAC_H_ 6 #define CHROME_COMMON_LAUNCHD_MAC_H_ 7 8 #include <CoreFoundation/CoreFoundation.h> 9 10 #include "base/basictypes.h" 11 #include "base/memory/singleton.h" 12 13 class Launchd { 14 public: 15 enum Type { 16 Agent, // LaunchAgent 17 Daemon // LaunchDaemon 18 }; 19 20 // Domains map to NSSearchPathDomainMask so Foundation does not need to be 21 // included. 22 enum Domain { 23 User = 1, // ~/Library/Launch* 24 Local = 2, // /Library/Launch* 25 Network = 4, // /Network/Library/Launch* 26 System = 8 // /System/Library/Launch* 27 }; 28 29 // TODO(dmaclach): Get rid of this pseudo singleton, and inject it 30 // appropriately wherever it is used. 31 // http://crbug.com/76925 32 static Launchd* GetInstance(); 33 34 virtual ~Launchd(); 35 36 // Return a dictionary with the launchd export settings. 37 virtual CFDictionaryRef CopyExports(); 38 39 // Return a dictionary with the launchd entries for job labeled |name|. 40 virtual CFDictionaryRef CopyJobDictionary(CFStringRef label); 41 42 // Return a dictionary for launchd process. 43 virtual CFDictionaryRef CopyDictionaryByCheckingIn(CFErrorRef* error); 44 45 // Remove a launchd process from launchd. 46 virtual bool RemoveJob(CFStringRef label, CFErrorRef* error); 47 48 // Used by a process controlled by launchd to restart itself. 49 // |session_type| can be "Aqua", "LoginWindow", "Background", "StandardIO" or 50 // "System". 51 // RestartLaunchdJob starts up a separate process to tell launchd to 52 // send this process a SIGTERM. This call will return, but a SIGTERM will be 53 // received shortly. 54 virtual bool RestartJob(Domain domain, 55 Type type, 56 CFStringRef name, 57 CFStringRef session_type); 58 59 // Read a launchd plist from disk. 60 // |name| should not have an extension. 61 virtual CFMutableDictionaryRef CreatePlistFromFile(Domain domain, 62 Type type, 63 CFStringRef name); 64 // Write a launchd plist to disk. 65 // |name| should not have an extension. 66 virtual bool WritePlistToFile(Domain domain, 67 Type type, 68 CFStringRef name, 69 CFDictionaryRef dict); 70 71 // Delete a launchd plist. 72 // |name| should not have an extension. 73 virtual bool DeletePlist(Domain domain, Type type, CFStringRef name); 74 75 // TODO(dmaclach): remove this once http://crbug.com/76925 is fixed. 76 // Scaffolding for doing unittests with our singleton. 77 static void SetInstance(Launchd* instance); 78 class ScopedInstance { 79 public: 80 explicit ScopedInstance(Launchd* instance) { 81 Launchd::SetInstance(instance); 82 } 83 ~ScopedInstance() { 84 Launchd::SetInstance(NULL); 85 } 86 }; 87 88 protected: 89 Launchd() { } 90 91 private: 92 // TODO(dmaclach): remove this once http://crbug.com/76925 is fixed. 93 // Scaffolding for doing unittests with our singleton. 94 friend struct DefaultSingletonTraits<Launchd>; 95 static Launchd* g_instance_; 96 97 DISALLOW_COPY_AND_ASSIGN(Launchd); 98 }; 99 100 #endif // CHROME_COMMON_LAUNCHD_MAC_H_ 101