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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }