/[imapfilter]/imapfilter/lock.c
ViewVC logotype

Contents of /imapfilter/lock.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (show annotations)
Thu Jul 31 15:53:19 2003 UTC (20 years, 8 months ago) by lefcha
Branch: MAIN
Changes since 1.10: +11 -4 lines
File MIME type: text/plain
Broke up program files and created some new header files.

1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include <errno.h>
5 #include <limits.h>
6 #include <signal.h>
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <fcntl.h>
10
11 #include "config.h"
12 #include "imapfilter.h"
13 #include "pathnames.h"
14
15
16 extern char *home;
17
18 static char *lockfile = NULL; /* Lock file to stop new imapfilter processes. */
19
20
21 pid_t lockfile_pid(void);
22
23
24 /*
25 * Create lockfile with the PID of imapfilter as its contents.
26 */
27 void
28 lockfile_create(void)
29 {
30 FILE *fd;
31
32 create_file(lockfile, S_IRUSR | S_IWUSR);
33
34 fd = fopen(lockfile, "w");
35 if (fd == NULL)
36 fatal(ERROR_FILE_OPEN, "opening lockfile; %s\n",
37 strerror(errno));
38 fprintf(fd, "%s\n", ultostr(getpid(), 10));
39 fclose(fd);
40 }
41
42
43 /*
44 * Die if another instance of imapfilter is running.
45 */
46 void
47 lockfile_check(void)
48 {
49 pid_t n;
50
51 if ((n = lockfile_pid())) {
52 errno = 0;
53 kill(n, 0);
54 if (errno == ESRCH) { /* Process does not exist. */
55 fprintf(stderr, "imapfilter: removing stale lockfile\n");
56 lockfile_remove();
57 } else {
58 fprintf(stderr,
59 "imapfilter: another imapfilter "
60 "is running with pid %d\n", (int)(n));
61 exit(ERROR_LOCKFILE);
62 }
63 }
64 }
65
66
67 /*
68 * Check if lockfile exists and if so, return the PID of the other
69 * imapfilter running.
70 */
71 pid_t
72 lockfile_pid(void)
73 {
74 char line[LINE_MAX];
75 char lockf[PATH_MAX];
76 FILE *fd;
77 pid_t n;
78
79 n = 0;
80
81 snprintf(lockf, PATH_MAX, "%s/%s", home, PATHNAME_LOCK_FILE);
82 lockfile = xstrdup(lockf);
83
84 if (exists_file(lockfile)) {
85 fd = fopen(lockfile, "r");
86 if (fd == NULL)
87 fatal(ERROR_FILE_OPEN, "opening lockfile; %s\n",
88 strerror(errno));
89 if (fgets(line, LINE_MAX - 1, fd)) {
90 errno = 0;
91 n = strtoul(line, NULL, 10);
92 if (errno)
93 n = 0;
94 }
95 fclose(fd);
96 }
97 return n;
98 }
99
100
101 /*
102 * Unlink the lockfile.
103 */
104 int
105 lockfile_remove(void)
106 {
107 if (lockfile == NULL)
108 return 0;
109
110 if (unlink(lockfile) && errno != ENOENT) {
111 error("removing lockfile; %s\n", strerror(errno));
112 return ERROR_FILE_OPEN;
113 }
114 return 0;
115 }
116
117
118 /*
119 * Kill the other instance of imapfilter (if one is running).
120 */
121 void
122 kill_imapfilter(void)
123 {
124 pid_t n;
125
126 n = lockfile_pid();
127
128 if (n > 0) {
129 if (kill(n, SIGTERM))
130 fprintf(stderr, "imapfilter: killing process with "
131 "pid %d; %s\n", (int)(n), strerror(errno));
132 lockfile_remove();
133 exit(0);
134 } else {
135 fprintf(stderr, "imapfilter: no other imapfilter is running\n");
136 exit(ERROR_UNDEFINED);
137 }
138 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26