rev |
line source |
yuuji@0
|
1 /* ========================================================================
|
yuuji@0
|
2 * Copyright 1988-2006 University of Washington
|
yuuji@0
|
3 *
|
yuuji@0
|
4 * Licensed under the Apache License, Version 2.0 (the "License");
|
yuuji@0
|
5 * you may not use this file except in compliance with the License.
|
yuuji@0
|
6 * You may obtain a copy of the License at
|
yuuji@0
|
7 *
|
yuuji@0
|
8 * http://www.apache.org/licenses/LICENSE-2.0
|
yuuji@0
|
9 *
|
yuuji@0
|
10 *
|
yuuji@0
|
11 * ========================================================================
|
yuuji@0
|
12 */
|
yuuji@0
|
13
|
yuuji@0
|
14 /*
|
yuuji@0
|
15 * Program: flock() emulation via fcntl() locking
|
yuuji@0
|
16 *
|
yuuji@0
|
17 * Author: Mark Crispin
|
yuuji@0
|
18 * Networks and Distributed Computing
|
yuuji@0
|
19 * Computing & Communications
|
yuuji@0
|
20 * University of Washington
|
yuuji@0
|
21 * Administration Building, AG-44
|
yuuji@0
|
22 * Seattle, WA 98195
|
yuuji@0
|
23 * Internet: MRC@CAC.Washington.EDU
|
yuuji@0
|
24 *
|
yuuji@0
|
25 * Date: 10 April 2001
|
yuuji@0
|
26 * Last Edited: 20 December 2006
|
yuuji@0
|
27 */
|
yuuji@0
|
28
|
yuuji@0
|
29
|
yuuji@0
|
30 #include "dummy.h" /* get scan_contents() prototype */
|
yuuji@0
|
31
|
yuuji@0
|
32 #define flock flocksim /* use ours instead of theirs */
|
yuuji@0
|
33
|
yuuji@0
|
34 #undef LOCK_SH
|
yuuji@0
|
35 #define LOCK_SH 1 /* shared lock */
|
yuuji@0
|
36 #undef LOCK_EX
|
yuuji@0
|
37 #define LOCK_EX 2 /* exclusive lock */
|
yuuji@0
|
38 #undef LOCK_NB
|
yuuji@0
|
39 #define LOCK_NB 4 /* no blocking */
|
yuuji@0
|
40 #undef LOCK_UN
|
yuuji@0
|
41 #define LOCK_UN 8 /* unlock */
|
yuuji@0
|
42
|
yuuji@0
|
43 /* Safe locking definitions */
|
yuuji@0
|
44
|
yuuji@0
|
45 extern int lockslavep; /* non-zero means slave process */
|
yuuji@0
|
46
|
yuuji@0
|
47 #undef SAFE_DELETE
|
yuuji@0
|
48 #define SAFE_DELETE(dtb,stream,mbx) (dtb->flags & DR_LOCKING) ? \
|
yuuji@0
|
49 safe_delete (dtb,stream,mbx) : (*dtb->mbxdel) (stream,mbx)
|
yuuji@0
|
50 #undef SAFE_RENAME
|
yuuji@0
|
51 #define SAFE_RENAME(dtb,stream,old,newname) (dtb->flags & DR_LOCKING) ? \
|
yuuji@0
|
52 safe_rename (dtb,stream,old,newname) : (*dtb->mbxren) (stream,old,newname)
|
yuuji@0
|
53 #undef SAFE_STATUS
|
yuuji@0
|
54 #define SAFE_STATUS(dtb,stream,mbx,bits) (dtb->flags & DR_LOCKING) ? \
|
yuuji@0
|
55 safe_status (dtb,stream,mbx,bits) : (*dtb->status) (stream,mbx,bits)
|
yuuji@0
|
56 #undef SAFE_SCAN_CONTENTS
|
yuuji@0
|
57 #define SAFE_SCAN_CONTENTS(dtb,name,contents,csiz,fsiz) \
|
yuuji@0
|
58 (!dtb || (dtb->flags & DR_LOCKING)) ? \
|
yuuji@0
|
59 safe_scan_contents (dtb,name,contents,csiz,fsiz) : \
|
yuuji@0
|
60 scan_contents (dtb,name,contents,csiz,fsiz)
|
yuuji@0
|
61 #undef SAFE_COPY
|
yuuji@0
|
62 #define SAFE_COPY(dtb,stream,seq,mbx,bits) (dtb->flags & DR_LOCKING) ? \
|
yuuji@0
|
63 safe_copy (dtb,stream,seq,mbx,bits) : (*dtb->copy) (stream,seq,mbx,bits)
|
yuuji@0
|
64 #undef SAFE_APPEND
|
yuuji@0
|
65 #define SAFE_APPEND(dtb,stream,mbx,af,data) (dtb->flags & DR_LOCKING) ? \
|
yuuji@0
|
66 safe_append (dtb,stream,mbx,af,data) : (*dtb->append) (stream,mbx,af,data)
|
yuuji@0
|
67
|
yuuji@0
|
68 #undef MM_EXISTS
|
yuuji@0
|
69 #define MM_EXISTS (lockslavep ? slave_exists : mm_exists)
|
yuuji@0
|
70 #undef MM_EXPUNGED
|
yuuji@0
|
71 #define MM_EXPUNGED (lockslavep ? slave_expunged : mm_expunged)
|
yuuji@0
|
72 #undef MM_FLAGS
|
yuuji@0
|
73 #define MM_FLAGS (lockslavep ? slave_flags : mm_flags)
|
yuuji@0
|
74 #undef MM_NOTIFY
|
yuuji@0
|
75 #define MM_NOTIFY (lockslavep ? slave_notify : mm_notify)
|
yuuji@0
|
76 #undef MM_STATUS
|
yuuji@0
|
77 #define MM_STATUS (lockslavep ? slave_status : mm_status)
|
yuuji@0
|
78 #undef MM_LOG
|
yuuji@0
|
79 #define MM_LOG (lockslavep ? slave_log : mm_log)
|
yuuji@0
|
80 #undef MM_CRITICAL
|
yuuji@0
|
81 #define MM_CRITICAL (lockslavep ? slave_critical : mm_critical)
|
yuuji@0
|
82 #undef MM_NOCRITICAL
|
yuuji@0
|
83 #define MM_NOCRITICAL (lockslavep ? slave_nocritical : mm_nocritical)
|
yuuji@0
|
84 #undef MM_DISKERROR
|
yuuji@0
|
85 #define MM_DISKERROR (lockslavep ? slave_diskerror : mm_diskerror)
|
yuuji@0
|
86 #undef MM_FATAL
|
yuuji@0
|
87 #define MM_FATAL (lockslavep ? slave_fatal : mm_fatal)
|
yuuji@0
|
88 #undef MM_APPEND
|
yuuji@0
|
89 #define MM_APPEND(af) (lockslavep ? slave_append : (*af))
|
yuuji@0
|
90
|
yuuji@0
|
91 /* Function prototypes */
|
yuuji@0
|
92
|
yuuji@0
|
93 int flocksim (int fd,int operation);
|
yuuji@0
|
94
|
yuuji@0
|
95 long safe_delete (DRIVER *dtb,MAILSTREAM *stream,char *mbx);
|
yuuji@0
|
96 long safe_rename (DRIVER *dtb,MAILSTREAM *stream,char *old,char *newname);
|
yuuji@0
|
97 long safe_status (DRIVER *dtb,MAILSTREAM *stream,char *mbx,long flags);
|
yuuji@0
|
98 long safe_scan_contents (DRIVER *dtb,char *name,char *contents,
|
yuuji@0
|
99 unsigned long csiz,unsigned long fsiz);
|
yuuji@0
|
100 long safe_copy (DRIVER *dtb,MAILSTREAM *stream,char *seq,char *mbx,long flags);
|
yuuji@0
|
101 long safe_append (DRIVER *dtb,MAILSTREAM *stream,char *mbx,append_t af,
|
yuuji@0
|
102 void *data);
|
yuuji@0
|
103
|
yuuji@0
|
104 void slave_exists (MAILSTREAM *stream,unsigned long number);
|
yuuji@0
|
105 void slave_expunged (MAILSTREAM *stream,unsigned long number);
|
yuuji@0
|
106 void slave_flags (MAILSTREAM *stream,unsigned long number);
|
yuuji@0
|
107 void slave_notify (MAILSTREAM *stream,char *string,long errflg);
|
yuuji@0
|
108 void slave_status (MAILSTREAM *stream,char *mailbox,MAILSTATUS *status);
|
yuuji@0
|
109 void slave_log (char *string,long errflg);
|
yuuji@0
|
110 void slave_critical (MAILSTREAM *stream);
|
yuuji@0
|
111 void slave_nocritical (MAILSTREAM *stream);
|
yuuji@0
|
112 long slave_diskerror (MAILSTREAM *stream,long errcode,long serious);
|
yuuji@0
|
113 void slave_fatal (char *string);
|
yuuji@0
|
114 long slave_append (MAILSTREAM *stream,void *data,char **flags,char **date,
|
yuuji@0
|
115 STRING **message);
|
yuuji@0
|
116 long slaveproxycopy (MAILSTREAM *stream,char *sequence,char *mailbox,
|
yuuji@0
|
117 long options);
|