1 /* $Id$ */
2 /*
3 * Copyright (c) 1990-1996 Sam Leffler
4 * Copyright (c) 1991-1996 Silicon Graphics, Inc.
5 * HylaFAX is a trademark of Silicon Graphics
6 *
7 * Permission to use, copy, modify, distribute, and sell this software and
8 * its documentation for any purpose is hereby granted without fee, provided
9 * that (i) the above copyright notices and this permission notice appear in
10 * all copies of the software and related documentation, and (ii) the names of
11 * Sam Leffler and Silicon Graphics may not be used in any advertising or
12 * publicity relating to the software without the specific, prior written
13 * permission of Sam Leffler and Silicon Graphics.
14 *
15 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
17 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
18 *
19 * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
20 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
21 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
23 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
24 * OF THIS SOFTWARE.
25 */
26 #ifndef _UUCPLOCK_
27 #define _UUCPLOCK_
28 /*
29 * UUCP Locking Support.
30 */
31 #include <unistd.h>
32 #include "Str.h"
33
34 class UUCPLock {
35 private:
36 fxStr file; // lock file pathname
37 mode_t mode; // lock file mode
38 bool locked; // is lock currently held
39
40 static uid_t UUCPuid;
41 static gid_t UUCPgid;
42 static void setupIDs();
43
44 static time_t lockTimeout;
45
46 bool create(); // create lock file
47 bool isNewer(time_t age); // is lock file newer than age
48 bool ownerExists(int fd); // does owning process exist
49 protected:
50 UUCPLock(const fxStr& pathname, mode_t mode);
51
52 virtual void setPID(pid_t) = 0;
53 virtual bool writeData(int fd) = 0;
54 virtual bool readData(int fd, pid_t& pid) = 0;
55 public:
56 virtual ~UUCPLock();
57
58 static uid_t getUUCPUid();
59 static gid_t getUUCPGid();
60 static void setLockTimeout(time_t);
61
62 static UUCPLock* newLock( // public interface to create a lock
63 const char* type, // lock file type
64 const fxStr& prefix, // lock file directory+prefix
65 const fxStr& device, // device pathname
66 mode_t mode); // file creation mode
67
68 bool isLocked() const; // device is locked
69 bool lock(); // lock device
70 void unlock(); // unlock device
71 bool check(); // check if lock exists
72 bool setOwner(pid_t); // force process owner identity
73 };
74
isLocked()75 inline bool UUCPLock::isLocked() const { return locked; }
76 #endif /* _UUCPLOCK_ */
77