dovecot: Removed unlink_lockfiles() and replaced it with a simpl...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Dec 8 17:11:19 EET 2007
details: http://hg.dovecot.org/dovecot/rev/d421f14ba797
changeset: 6957:d421f14ba797
user: Timo Sirainen <tss at iki.fi>
date: Sat Dec 08 17:05:17 2007 +0200
description:
Removed unlink_lockfiles() and replaced it with a simpler unlink_old_files()
diffstat:
5 files changed, 93 insertions(+), 98 deletions(-)
src/lib/Makefile.am | 4 +-
src/lib/unlink-lockfiles.c | 82 -------------------------------------------
src/lib/unlink-lockfiles.h | 14 -------
src/lib/unlink-old-files.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
src/lib/unlink-old-files.h | 8 ++++
diffs (224 lines):
diff -r f0dbbc1f0586 -r d421f14ba797 src/lib/Makefile.am
--- a/src/lib/Makefile.am Sat Dec 08 16:41:35 2007 +0200
+++ b/src/lib/Makefile.am Sat Dec 08 17:05:17 2007 +0200
@@ -95,7 +95,7 @@ liblib_a_SOURCES = \
strfuncs.c \
unix-socket-create.c \
unlink-directory.c \
- unlink-lockfiles.c \
+ unlink-old-files.c \
unichar.c \
utc-offset.c \
utc-mktime.c \
@@ -177,7 +177,7 @@ headers = \
strfuncs.h \
unix-socket-create.h \
unlink-directory.h \
- unlink-lockfiles.h \
+ unlink-old-files.h \
unichar.h \
utc-offset.h \
utc-mktime.h \
diff -r f0dbbc1f0586 -r d421f14ba797 src/lib/unlink-lockfiles.c
--- a/src/lib/unlink-lockfiles.c Sat Dec 08 16:41:35 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/* Copyright (c) 2002-2007 Dovecot authors, see the included COPYING file */
-
-#include "lib.h"
-#include "str.h"
-#include "unlink-lockfiles.h"
-
-#include <stdlib.h>
-#include <signal.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/stat.h>
-
-static int
-unlink_lockfiles_dir(DIR *dirp, const char *dir, const char *pidprefix,
- const char *otherprefix, time_t other_min_time)
-{
- struct dirent *d;
- struct stat st;
- string_t *path;
- unsigned int pidlen, otherlen;
- int ret = 1;
-
- path = t_str_new(512);
- pidlen = pidprefix == NULL ? 0 : strlen(pidprefix);
- otherlen = otherprefix == NULL ? 0 : strlen(otherprefix);
-
- while ((d = readdir(dirp)) != NULL) {
- const char *fname = d->d_name;
-
- if (pidprefix != NULL &&
- strncmp(fname, pidprefix, pidlen) == 0 &&
- is_numeric(fname+pidlen, '\0')) {
- /* found a lock file from our host - see if the PID
- is valid (meaning it exists, and the it's with
- the same UID as us) */
- if (kill(atol(fname+pidlen), 0) == 0 || errno != ESRCH)
- continue; /* valid */
-
- str_truncate(path, 0);
- str_printfa(path, "%s/%s", dir, fname);
- if (unlink(str_c(path)) < 0 && errno != ENOENT) {
- i_error("unlink(%s) failed: %m", str_c(path));
- ret = 0;
- }
- } else if (otherprefix != NULL &&
- strncmp(fname, otherprefix, otherlen) == 0) {
- str_truncate(path, 0);
- str_printfa(path, "%s/%s", dir, fname);
- if (stat(str_c(path), &st) == 0 &&
- st.st_mtime < other_min_time &&
- st.st_ctime < other_min_time)
- if (unlink(str_c(path)) < 0 &&
- errno != ENOENT) {
- i_error("unlink(%s) failed: %m",
- str_c(path));
- ret = 0;
- }
- }
- }
- return ret;
-}
-
-int unlink_lockfiles(const char *dir, const char *pidprefix,
- const char *otherprefix, time_t other_min_time)
-{
- DIR *dirp;
- int ret;
-
- /* check for any invalid access files */
- dirp = opendir(dir);
- if (dirp == NULL)
- return -1;
-
- T_FRAME(
- ret = unlink_lockfiles_dir(dirp, dir, pidprefix,
- otherprefix, other_min_time);
- );
-
- if (closedir(dirp) < 0)
- i_error("closedir(%s) failed: %m", dir);
- return ret;
-}
diff -r f0dbbc1f0586 -r d421f14ba797 src/lib/unlink-lockfiles.h
--- a/src/lib/unlink-lockfiles.h Sat Dec 08 16:41:35 2007 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,14 +0,0 @@
-#ifndef UNLINK_LOCKFILES_H
-#define UNLINK_LOCKFILES_H
-
-/* Delete stale lock files. Filenames beginning with pidprefix<PID> are
- deleted immediately if PID doesn't exist. Filenames beginning with
- otherprefix are deleted if their mtime and ctime is older than
- other_min_time.
-
- Returns 1 if everything was successful, 0 if some of the files
- couldn't be deleted, -1 if directory couldn't be opened at all. */
-int unlink_lockfiles(const char *dir, const char *pidprefix,
- const char *otherprefix, time_t other_min_time);
-
-#endif
diff -r f0dbbc1f0586 -r d421f14ba797 src/lib/unlink-old-files.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/unlink-old-files.c Sat Dec 08 17:05:17 2007 +0200
@@ -0,0 +1,83 @@
+/* Copyright (c) 2002-2007 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "ioloop.h"
+#include "str.h"
+#include "unlink-old-files.h"
+
+#include <stdlib.h>
+#include <signal.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <utime.h>
+
+static int
+unlink_old_files_real(const char *dir, const char *prefix, time_t min_time)
+{
+ DIR *dirp;
+ struct dirent *d;
+ struct stat st;
+ string_t *path;
+ unsigned int prefix_len, dir_len;
+
+ dirp = opendir(dir);
+ if (dirp == NULL) {
+ if (errno != ENOENT)
+ i_error("opendir(%s) failed: %m", dir);
+ return -1;
+ }
+
+ path = t_str_new(256);
+ str_printfa(path, "%s/", dir);
+ dir_len = str_len(path);
+
+ prefix_len = strlen(prefix);
+ while ((d = readdir(dirp)) != NULL) {
+ if (d->d_name[0] == '.' &&
+ (d->d_name[1] == '\0' ||
+ (d->d_name[1] == '.' && d->d_name[2] == '\0'))) {
+ /* skip . and .. */
+ continue;
+ }
+ if (strncmp(d->d_name, prefix, prefix_len) != 0)
+ continue;
+
+ str_truncate(path, dir_len);
+ str_append(path, d->d_name);
+ if (stat(str_c(path), &st) < 0) {
+ if (errno != ENOENT)
+ i_error("stat(%s) failed: %m", str_c(path));
+ } else if (!S_ISDIR(st.st_mode) && st.st_ctime < min_time) {
+ if (unlink(str_c(path)) < 0 && errno != ENOENT)
+ i_error("unlink(%s) failed: %m", str_c(path));
+ }
+ }
+
+#ifdef HAVE_DIRFD
+ if (fstat(dirfd(dirp), &st) < 0)
+ i_error("fstat(%s) failed: %m", dir);
+#else
+ if (stat(dir, &st) < 0)
+ i_error("stat(%s) failed: %m", dir);
+#endif
+ else if (st.st_atime < ioloop_time) {
+ /* mounted with noatime. update it ourself. */
+ if (utime(dir, NULL) < 0 && errno != ENOENT)
+ i_error("utime(%s) failed: %m", dir);
+ }
+
+ if (closedir(dirp) < 0)
+ i_error("closedir(%s) failed: %m", dir);
+ return 0;
+}
+
+int unlink_old_files(const char *dir, const char *prefix, time_t min_time)
+{
+ int ret;
+
+ T_FRAME(
+ ret = unlink_old_files_real(dir, prefix, min_time);
+ );
+ return ret;
+}
diff -r f0dbbc1f0586 -r d421f14ba797 src/lib/unlink-old-files.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib/unlink-old-files.h Sat Dec 08 17:05:17 2007 +0200
@@ -0,0 +1,8 @@
+#ifndef UNLINK_OLD_FILES_H
+#define UNLINK_OLD_FILES_H
+
+/* Unlink all files from directory beginning with given prefix and having
+ ctime older than min_time. Returns -1 if there were some errors. */
+int unlink_old_files(const char *dir, const char *prefix, time_t min_time);
+
+#endif
More information about the dovecot-cvs
mailing list