| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_COMMON_LAUNCHD_MAC_H_ |
| #define CHROME_COMMON_LAUNCHD_MAC_H_ |
| |
| #include <CoreFoundation/CoreFoundation.h> |
| |
| #include "base/basictypes.h" |
| #include "base/memory/singleton.h" |
| |
| class Launchd { |
| public: |
| enum Type { |
| Agent, // LaunchAgent |
| Daemon // LaunchDaemon |
| }; |
| |
| // Domains map to NSSearchPathDomainMask so Foundation does not need to be |
| // included. |
| enum Domain { |
| User = 1, // ~/Library/Launch* |
| Local = 2, // /Library/Launch* |
| Network = 4, // /Network/Library/Launch* |
| System = 8 // /System/Library/Launch* |
| }; |
| |
| // TODO(dmaclach): Get rid of this pseudo singleton, and inject it |
| // appropriately wherever it is used. |
| // http://crbug.com/76925 |
| static Launchd* GetInstance(); |
| |
| virtual ~Launchd(); |
| |
| // Return a dictionary with the launchd export settings. |
| virtual CFDictionaryRef CopyExports(); |
| |
| // Return a dictionary with the launchd entries for job labeled |name|. |
| virtual CFDictionaryRef CopyJobDictionary(CFStringRef label); |
| |
| // Return a dictionary for launchd process. |
| virtual CFDictionaryRef CopyDictionaryByCheckingIn(CFErrorRef* error); |
| |
| // Remove a launchd process from launchd. |
| virtual bool RemoveJob(CFStringRef label, CFErrorRef* error); |
| |
| // Used by a process controlled by launchd to restart itself. |
| // |session_type| can be "Aqua", "LoginWindow", "Background", "StandardIO" or |
| // "System". |
| // RestartLaunchdJob starts up a separate process to tell launchd to |
| // send this process a SIGTERM. This call will return, but a SIGTERM will be |
| // received shortly. |
| virtual bool RestartJob(Domain domain, |
| Type type, |
| CFStringRef name, |
| CFStringRef session_type); |
| |
| // Read a launchd plist from disk. |
| // |name| should not have an extension. |
| virtual CFMutableDictionaryRef CreatePlistFromFile(Domain domain, |
| Type type, |
| CFStringRef name); |
| // Write a launchd plist to disk. |
| // |name| should not have an extension. |
| virtual bool WritePlistToFile(Domain domain, |
| Type type, |
| CFStringRef name, |
| CFDictionaryRef dict); |
| |
| // Delete a launchd plist. |
| // |name| should not have an extension. |
| virtual bool DeletePlist(Domain domain, Type type, CFStringRef name); |
| |
| // TODO(dmaclach): remove this once http://crbug.com/76925 is fixed. |
| // Scaffolding for doing unittests with our singleton. |
| static void SetInstance(Launchd* instance); |
| class ScopedInstance { |
| public: |
| explicit ScopedInstance(Launchd* instance) { |
| Launchd::SetInstance(instance); |
| } |
| ~ScopedInstance() { |
| Launchd::SetInstance(NULL); |
| } |
| }; |
| |
| protected: |
| Launchd() { } |
| |
| private: |
| // TODO(dmaclach): remove this once http://crbug.com/76925 is fixed. |
| // Scaffolding for doing unittests with our singleton. |
| friend struct DefaultSingletonTraits<Launchd>; |
| static Launchd* g_instance_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Launchd); |
| }; |
| |
| #endif // CHROME_COMMON_LAUNCHD_MAC_H_ |