• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_MAC_LAUNCHD_H_
6 #define CHROME_COMMON_MAC_LAUNCHD_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:
ScopedInstance(Launchd * instance)80     explicit ScopedInstance(Launchd* instance) {
81       Launchd::SetInstance(instance);
82     }
~ScopedInstance()83     ~ScopedInstance() {
84       Launchd::SetInstance(NULL);
85     }
86   };
87 
88  protected:
Launchd()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_MAC_LAUNCHD_H_
101