]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Improve errors - return reason in mail_transaction_log_file_open()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 18 Nov 2016 14:52:31 +0000 (16:52 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Fri, 18 Nov 2016 15:07:39 +0000 (17:07 +0200)
src/lib-index/mail-transaction-log-file.c
src/lib-index/mail-transaction-log-private.h
src/lib-index/mail-transaction-log.c

index 796c5d20bcf178030a10a4a29da4198c99fd8c7d..93bf40f31ebd19dbfa8f287e8241efb728a013f6 100644 (file)
@@ -881,7 +881,8 @@ int mail_transaction_log_file_create(struct mail_transaction_log_file *file,
        return ret;
 }
 
-int mail_transaction_log_file_open(struct mail_transaction_log_file *file)
+int mail_transaction_log_file_open(struct mail_transaction_log_file *file,
+                                  const char **reason_r)
 {
        struct mail_index *index = file->log->index;
         unsigned int i;
@@ -900,10 +901,13 @@ int mail_transaction_log_file_open(struct mail_transaction_log_file *file)
                        index->readonly = TRUE;
                }
                if (file->fd == -1) {
-                       if (errno == ENOENT)
+                       if (errno == ENOENT) {
+                               *reason_r = "File doesn't exist";
                                return 0;
+                       }
 
                        log_file_set_syscall_error(file, "open()");
+                       *reason_r = t_strdup_printf("open() failed: %m");
                        return -1;
                 }
 
@@ -915,6 +919,7 @@ int mail_transaction_log_file_open(struct mail_transaction_log_file *file)
                           renamed to .log.2 and we're trying to reopen it.
                           also possible that hit a race condition where .log
                           and .log.2 are linked. */
+                       *reason_r = "File is already open";
                        return 0;
                } else {
                        ret = mail_transaction_log_file_read_hdr(file,
@@ -932,11 +937,13 @@ int mail_transaction_log_file_open(struct mail_transaction_log_file *file)
                        } else {
                                i_unlink_if_exists(file->filepath);
                        }
+                       *reason_r = "File is corrupted";
                        return 0;
                }
                if (errno != ESTALE ||
                    i == MAIL_INDEX_ESTALE_RETRY_COUNT) {
                        /* syscall error */
+                       *reason_r = t_strdup_printf("fstat() failed: %m");
                        return -1;
                }
 
index 8def0da2047ee82bd878f7b4a947c763145aee5e..61ff3542d3adc8d060cebf8b6c8fe41461f74a60 100644 (file)
@@ -116,7 +116,10 @@ mail_transaction_log_file_alloc(struct mail_transaction_log *log,
                                const char *path);
 void mail_transaction_log_file_free(struct mail_transaction_log_file **file);
 
-int mail_transaction_log_file_open(struct mail_transaction_log_file *file);
+/* Returns 1 if log was opened, 0 if it didn't exist or was already open,
+   -1 if error. */
+int mail_transaction_log_file_open(struct mail_transaction_log_file *file,
+                                  const char **reason_r);
 int mail_transaction_log_file_create(struct mail_transaction_log_file *file,
                                     bool reset);
 int mail_transaction_log_file_lock(struct mail_transaction_log_file *file);
index fa1c9ce4dbd75607894864e7b37f1b84779a008f..eec4375ffc47aeb7446a1edfa9fb5a9ec23fd9a8 100644 (file)
@@ -59,6 +59,7 @@ static void mail_transaction_log_2_unlink_old(struct mail_transaction_log *log)
 int mail_transaction_log_open(struct mail_transaction_log *log)
 {
        struct mail_transaction_log_file *file;
+       const char *reason;
        int ret;
 
        i_free(log->filepath);
@@ -79,7 +80,7 @@ int mail_transaction_log_open(struct mail_transaction_log *log)
                return 0;
 
        file = mail_transaction_log_file_alloc(log, log->filepath);
-       if ((ret = mail_transaction_log_file_open(file)) <= 0) {
+       if ((ret = mail_transaction_log_file_open(file, &reason)) <= 0) {
                /* leave the file for _create() */
                log->open_file = file;
                return ret;
@@ -287,6 +288,7 @@ mail_transaction_log_refresh(struct mail_transaction_log *log, bool nfs_flush)
 {
         struct mail_transaction_log_file *file;
        struct stat st;
+       const char *reason;
 
        i_assert(log->head != NULL);
 
@@ -330,7 +332,7 @@ mail_transaction_log_refresh(struct mail_transaction_log *log, bool nfs_flush)
        }
 
        file = mail_transaction_log_file_alloc(log, log->filepath);
-       if (mail_transaction_log_file_open(file) <= 0) {
+       if (mail_transaction_log_file_open(file, &reason) <= 0) {
                mail_transaction_log_file_free(&file);
                return -1;
        }
@@ -415,12 +417,8 @@ int mail_transaction_log_find_file(struct mail_transaction_log *log,
 
        /* see if we have it in log.2 file */
        file = mail_transaction_log_file_alloc(log, log->filepath2);
-       if ((ret = mail_transaction_log_file_open(file)) <= 0) {
+       if ((ret = mail_transaction_log_file_open(file, reason_r)) <= 0) {
                mail_transaction_log_file_free(&file);
-               if (ret < 0)
-                       *reason_r = "Failed to open .log.2";
-               else
-                       *reason_r = ".log.2 doesn't exist";
                return ret;
        }