]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Add fs_write_stream_abort_parent and use it
authorAki Tuomi <aki.tuomi@dovecot.fi>
Mon, 22 Aug 2016 06:42:26 +0000 (09:42 +0300)
committerGitLab <gitlab@git.dovecot.net>
Tue, 23 Aug 2016 10:27:37 +0000 (13:27 +0300)
Will do all the things abort_error does, but leaves
error untouched. You are expected to set one yourself.

src/lib-fs/fs-api.c
src/lib-fs/fs-api.h
src/lib-fs/fs-metawrap.c
src/lib-fs/fs-sis-queue.c
src/lib-fs/fs-sis.c
src/lib-fs/fs-wrapper.c
src/plugins/fs-compress/fs-compress.c

index 344bf0206f9a338b0e77025b6d3bdeda4e05d341..585abbccf87f6de4b1f92df1144010b9af263017 100644 (file)
@@ -719,11 +719,9 @@ int fs_write_stream_finish_async(struct fs_file *file)
        return fs_write_stream_finish_int(file, TRUE);
 }
 
-void fs_write_stream_abort_error(struct fs_file *file, struct ostream **output, const char *error_fmt, ...)
+static void fs_write_stream_abort(struct fs_file *file, struct ostream **output)
 {
        int ret;
-       va_list args;
-       va_start(args, error_fmt);
 
        i_assert(*output == file->output);
        i_assert(file->output != NULL);
@@ -732,13 +730,26 @@ void fs_write_stream_abort_error(struct fs_file *file, struct ostream **output,
        *output = NULL;
        o_stream_ignore_last_errors(file->output);
        /* make sure we don't have an old error lying around */
-       fs_set_verror(file->fs, error_fmt, args);
        ret = fs_write_stream_finish_int(file, FALSE);
        i_assert(ret != 0);
+}
 
+void fs_write_stream_abort_error(struct fs_file *file, struct ostream **output, const char *error_fmt, ...)
+{
+       va_list args;
+       va_start(args, error_fmt);
+       fs_set_verror(file->fs, error_fmt, args);
+       fs_write_stream_abort(file, output);
        va_end(args);
 }
 
+void fs_write_stream_abort_parent(struct fs_file *file, struct ostream **output)
+{
+       i_assert(file->parent != NULL);
+       i_assert(fs_filelast_error(file->parent) != NULL);
+       fs_write_stream_abort(file, output);
+}
+
 void fs_write_set_hash(struct fs_file *file, const struct hash_method *method,
                       const void *digest)
 {
index f4cbfc096385128ffdb1586272e9aa53f7b8e86e..be4b800cef798e6bd77975d8fe2026a3986eb2ac 100644 (file)
@@ -276,6 +276,9 @@ int fs_write_stream_finish_async(struct fs_file *file);
    write. */
 void fs_write_stream_abort_error(struct fs_file *file, struct ostream **output, const char *error_fmt, ...) ATTR_FORMAT(3, 4);
 
+/* Same as above, except it closes the *parent* file and error is left untouched */
+void fs_write_stream_abort_parent(struct fs_file *file, struct ostream **output);
+
 /* Set a hash to the following write. The storage can then verify that the
    input data matches the specified hash, or fail if it doesn't. Typically
    implemented by Content-MD5 header. */
index 663adad8831836265225a853d529e900c779f4a2..481bdcdbeee2818ed83d4d922fcf24ce2ad38392 100644 (file)
@@ -364,9 +364,7 @@ static int fs_metawrap_write_stream_finish(struct fs_file *_file, bool success)
                if (file->super_output != NULL) {
                        /* no metawrap */
                        i_assert(file->temp_output == NULL);
-                       fs_write_stream_abort_error(_file->parent, &file->super_output, "error(%s): %s",
-                                                   o_stream_get_name(file->super_output),
-                                                   o_stream_get_error(file->super_output));
+                       fs_write_stream_abort_parent(_file->parent, &file->super_output);
                } else {
                        i_assert(file->temp_output != NULL);
                        o_stream_destroy(&file->temp_output);
index 3936933355e3db5b54cc29cb6aab48776d72d35e..a317a9aa830de3fb09ea3d0f7f1cc1990926aa2e 100644 (file)
@@ -149,10 +149,7 @@ static int fs_sis_queue_write_stream_finish(struct fs_file *_file, bool success)
 
        if (!success) {
                if (_file->parent != NULL)
-                       fs_write_stream_abort_error(_file->parent, &_file->output,
-                                                   "write(%s) failed: %s",
-                                                   o_stream_get_name(_file->output),
-                                                   o_stream_get_error(_file->output));
+                       fs_write_stream_abort_parent(_file->parent, &_file->output);
                return -1;
        }
 
index e17aea586ac5ce04585dca6c9305d7e24e91e3fe..a806fa5609532eb0f5be0d7ced198a5d2ebc4c91 100644 (file)
@@ -287,10 +287,7 @@ static int fs_sis_write_stream_finish(struct fs_file *_file, bool success)
 
        if (!success) {
                if (_file->parent != NULL)
-                       fs_write_stream_abort_error(_file->parent, &file->fs_output,
-                                                   "write(%s) error: %s",
-                                                   o_stream_get_name(file->fs_output),
-                                                   o_stream_get_error(file->fs_output));
+                       fs_write_stream_abort_parent(_file->parent, &file->fs_output);
                o_stream_unref(&_file->output);
                return -1;
        }
@@ -300,9 +297,7 @@ static int fs_sis_write_stream_finish(struct fs_file *_file, bool success)
            i_stream_is_eof(file->hash_input)) {
                o_stream_unref(&_file->output);
                if (fs_sis_try_link(file)) {
-                       fs_write_stream_abort_error(_file->parent, &file->fs_output,
-                                                   "fs_sis_try_link(%s) failed",
-                                                   o_stream_get_name(file->fs_output));
+                       fs_write_stream_abort_parent(_file->parent, &file->fs_output);
                        return 1;
                }
        }
index 85c194b99e39713260fdbf2f1f88844e37ad8f40..2dcfd1bb2a86e8cb48f6a1a6ca228408eb256f45 100644 (file)
@@ -79,10 +79,7 @@ void fs_wrapper_write_stream(struct fs_file *file)
 int fs_wrapper_write_stream_finish(struct fs_file *file, bool success)
 {
        if (!success) {
-               fs_write_stream_abort_error(file->parent, &file->output,
-                                           "write(%s) failed: %s",
-                                           o_stream_get_name(file->output),
-                                           o_stream_get_error(file->output));
+               fs_write_stream_abort_parent(file->parent, &file->output);
                return -1;
        }
 
index f582c3bd5484a71f1a524d699e0c0c5f73147a1b..d8fbcd8b6e97528c856cb8e65e39956b10b21274 100644 (file)
@@ -201,10 +201,7 @@ static int fs_compress_write_stream_finish(struct fs_file *_file, bool success)
                if (file->temp_output != NULL)
                        o_stream_destroy(&file->temp_output);
                if (file->super_output != NULL)
-                       fs_write_stream_abort_error(_file->parent, &file->super_output,
-                                                   "write(%s) failed: %s",
-                                                   o_stream_get_name(file->super_output),
-                                                   o_stream_get_error(file->super_output));
+                       fs_write_stream_abort_parent(_file->parent, &file->super_output);
                return -1;
        }