Line data Source code
1 : /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /* This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 :
6 : #ifndef __nsProfileLock_h___
7 : #define __nsProfileLock_h___
8 :
9 : #include "nsIFile.h"
10 :
11 : class nsIProfileUnlocker;
12 :
13 : #if defined (XP_WIN)
14 : #include <windows.h>
15 : #endif
16 :
17 : #if defined (XP_UNIX)
18 : #include <signal.h>
19 : #include "prclist.h"
20 : #endif
21 :
22 : class nsProfileLock
23 : #if defined (XP_UNIX)
24 : : public PRCList
25 : #endif
26 : {
27 : public:
28 : nsProfileLock();
29 : nsProfileLock(nsProfileLock& src);
30 :
31 : ~nsProfileLock();
32 :
33 : nsProfileLock& operator=(nsProfileLock& rhs);
34 :
35 : /**
36 : * Attempt to lock a profile directory.
37 : *
38 : * @param aProfileDir [in] The profile directory to lock.
39 : * @param aUnlocker [out] Optional. This is only returned when locking
40 : * fails with NS_ERROR_FILE_ACCESS_DENIED, and may not
41 : * be returned at all.
42 : * @throws NS_ERROR_FILE_ACCESS_DENIED if the profile is locked.
43 : */
44 : nsresult Lock(nsIFile* aProfileDir, nsIProfileUnlocker* *aUnlocker);
45 :
46 : /**
47 : * Unlock a profile directory. If you're unlocking the directory because
48 : * the application is in the process of shutting down because of a fatal
49 : * signal, set aFatalSignal to true.
50 : */
51 : nsresult Unlock(bool aFatalSignal = false);
52 :
53 : /**
54 : * Clean up any left over files in the directory.
55 : */
56 : nsresult Cleanup();
57 :
58 : /**
59 : * Get the modification time of a replaced profile lock, otherwise 0.
60 : */
61 : nsresult GetReplacedLockTime(PRTime* aResult);
62 :
63 : private:
64 : bool mHaveLock;
65 : PRTime mReplacedLockTime;
66 : nsCOMPtr<nsIFile> mLockFile;
67 :
68 : #if defined (XP_WIN)
69 : HANDLE mLockFileHandle;
70 : #elif defined (XP_UNIX)
71 :
72 : struct RemovePidLockFilesExiting {
73 1 : RemovePidLockFilesExiting() {}
74 0 : ~RemovePidLockFilesExiting() {
75 0 : RemovePidLockFiles(false);
76 0 : }
77 : };
78 :
79 : static void RemovePidLockFiles(bool aFatalSignal);
80 : static void FatalSignalHandler(int signo
81 : #ifdef SA_SIGINFO
82 : , siginfo_t *info, void *context
83 : #endif
84 : );
85 : static PRCList mPidLockList;
86 :
87 : nsresult LockWithFcntl(nsIFile *aLockFile);
88 :
89 : /**
90 : * @param aHaveFcntlLock if true, we've already acquired an fcntl lock so this
91 : * lock is merely an "obsolete" lock to keep out old Firefoxes
92 : */
93 : nsresult LockWithSymlink(nsIFile *aLockFile, bool aHaveFcntlLock);
94 :
95 : char* mPidLockFileName;
96 : int mLockFileDesc;
97 : #endif
98 :
99 : };
100 :
101 : #endif /* __nsProfileLock_h___ */
|