Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib/unlink-old-files.c @ 8590:b9faf4db2a9f HEAD
Updated copyright notices to include year 2009.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 06 Jan 2009 09:25:38 -0500 |
parents | e6693a0ec8e1 |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */ |
6957
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "unlink-old-files.h" |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include <stdlib.h> |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include <signal.h> |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include <unistd.h> |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #include <dirent.h> |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <sys/stat.h> |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include <utime.h> |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 static int |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 unlink_old_files_real(const char *dir, const char *prefix, time_t min_time) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 { |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 DIR *dirp; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct dirent *d; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 struct stat st; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 string_t *path; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 unsigned int prefix_len, dir_len; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 dirp = opendir(dir); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 if (dirp == NULL) { |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 if (errno != ENOENT) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 i_error("opendir(%s) failed: %m", dir); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 return -1; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 } |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 path = t_str_new(256); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 str_printfa(path, "%s/", dir); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 dir_len = str_len(path); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 prefix_len = strlen(prefix); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 while ((d = readdir(dirp)) != NULL) { |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 if (d->d_name[0] == '.' && |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 (d->d_name[1] == '\0' || |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 (d->d_name[1] == '.' && d->d_name[2] == '\0'))) { |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 /* skip . and .. */ |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 continue; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 } |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 if (strncmp(d->d_name, prefix, prefix_len) != 0) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 continue; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 str_truncate(path, dir_len); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 str_append(path, d->d_name); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 if (stat(str_c(path), &st) < 0) { |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 if (errno != ENOENT) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 i_error("stat(%s) failed: %m", str_c(path)); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 } else if (!S_ISDIR(st.st_mode) && st.st_ctime < min_time) { |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 if (unlink(str_c(path)) < 0 && errno != ENOENT) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 i_error("unlink(%s) failed: %m", str_c(path)); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 } |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 } |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 #ifdef HAVE_DIRFD |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 if (fstat(dirfd(dirp), &st) < 0) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 i_error("fstat(%s) failed: %m", dir); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 #else |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 if (stat(dir, &st) < 0) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 i_error("stat(%s) failed: %m", dir); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 #endif |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 else if (st.st_atime < ioloop_time) { |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 /* mounted with noatime. update it ourself. */ |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 if (utime(dir, NULL) < 0 && errno != ENOENT) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 i_error("utime(%s) failed: %m", dir); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 } |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 if (closedir(dirp) < 0) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 i_error("closedir(%s) failed: %m", dir); |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 return 0; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 } |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 int unlink_old_files(const char *dir, const char *prefix, time_t min_time) |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 { |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 int ret; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
79 T_BEGIN { |
6957
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 ret = unlink_old_files_real(dir, prefix, min_time); |
7226
e6693a0ec8e1
Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
81 } T_END; |
6957
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 return ret; |
d421f14ba797
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 } |