fs-sis-queue.c revision 5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainenstatic void fs_sis_queue_copy_error(struct sis_queue_fs *fs)
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen fs_set_error(&fs->fs, "%s", fs_last_error(fs->super));
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstatic void fs_sis_queue_file_copy_error(struct sis_queue_fs_file *file)
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen struct sis_queue_fs *fs = (struct sis_queue_fs *)file->file.fs;
1f166c4a7498b4b6bdf6f072edeaebb388cc53ebSergey Kitovfs_sis_queue_init(struct fs *_fs, const char *args,
1f166c4a7498b4b6bdf6f072edeaebb388cc53ebSergey Kitov struct sis_queue_fs *fs = (struct sis_queue_fs *)_fs;
1f166c4a7498b4b6bdf6f072edeaebb388cc53ebSergey Kitov const char *p, *parent_name, *parent_args, *error;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen /* <queue_dir>:<parent fs>[:<args>] */
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen fs_set_error(_fs, "Parent filesystem not given as parameter");
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen parent_name = t_strdup_until(parent_name, parent_args++);
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk if (fs_init(parent_name, parent_args, set, &fs->super, &error) < 0) {
f0339f522dc9c8e2e8a29ef9a3f937c431c6bd1bTimo Sirainen fs_set_error(_fs, "%s: %s", parent_name, error);
9346506a9f4dd9a6285fe8595588e73161849235Timo Sirainenstatic void fs_sis_queue_deinit(struct fs *_fs)
9346506a9f4dd9a6285fe8595588e73161849235Timo Sirainen struct sis_queue_fs *fs = (struct sis_queue_fs *)_fs;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstatic enum fs_properties fs_sis_queue_get_properties(struct fs *_fs)
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct sis_queue_fs *fs = (struct sis_queue_fs *)_fs;
3764f786a6d13b23c49c9990b816be1e23a1adccAki Tuomistatic struct fs_file *
3764f786a6d13b23c49c9990b816be1e23a1adccAki Tuomifs_sis_queue_file_init(struct fs *_fs, const char *path,
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen enum fs_open_mode mode, enum fs_open_flags flags)
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct sis_queue_fs *fs = (struct sis_queue_fs *)_fs;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen fs_set_error(_fs, "APPEND mode not supported");
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen file->super = fs_file_init(fs->super, path, mode | flags);
2b4e421b76d997e2ad18c74200d9d8521bed165cMartti Rannanjärvistatic void fs_sis_queue_file_deinit(struct fs_file *_file)
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainenstatic const char *fs_sis_queue_file_get_path(struct fs_file *_file)
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
5729882717902b5f3f5d62f71ddf2894b67fc7a6Martti Rannanjärvifs_sis_queue_set_async_callback(struct fs_file *_file,
5729882717902b5f3f5d62f71ddf2894b67fc7a6Martti Rannanjärvi struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
5729882717902b5f3f5d62f71ddf2894b67fc7a6Martti Rannanjärvi fs_file_set_async_callback(file->super, callback, context);
1bb7fb04a0583f0d5160706f24b2df08d31ada46Timo Sirainenstatic int fs_sis_queue_wait_async(struct fs *_fs)
1bb7fb04a0583f0d5160706f24b2df08d31ada46Timo Sirainen struct sis_queue_fs *fs = (struct sis_queue_fs *)_fs;
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainenfs_sis_queue_set_metadata(struct fs_file *_file, const char *key,
a525be16a69367f43765d20c873b5f168c5b7ea3Martti Rannanjärvi struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenfs_sis_queue_get_metadata(struct fs_file *_file,
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen return fs_get_metadata(file->super, metadata_r);
5729882717902b5f3f5d62f71ddf2894b67fc7a6Martti Rannanjärvistatic bool fs_sis_queue_prefetch(struct fs_file *_file, uoff_t length)
5729882717902b5f3f5d62f71ddf2894b67fc7a6Martti Rannanjärvi struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
2b4e421b76d997e2ad18c74200d9d8521bed165cMartti Rannanjärvistatic ssize_t fs_sis_queue_read(struct fs_file *_file, void *buf, size_t size)
995c0a88e9a32e0ec1460567ce5f2ce6e7ba1f13Martti Rannanjärvi struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
995c0a88e9a32e0ec1460567ce5f2ce6e7ba1f13Martti Rannanjärvi if ((ret = fs_read(file->super, buf, size)) < 0)
995c0a88e9a32e0ec1460567ce5f2ce6e7ba1f13Martti Rannanjärvifs_sis_queue_read_stream(struct fs_file *_file, size_t max_buffer_size)
995c0a88e9a32e0ec1460567ce5f2ce6e7ba1f13Martti Rannanjärvi struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen return fs_read_stream(file->super, max_buffer_size);
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainenstatic void fs_sis_queue_add(struct sis_queue_fs_file *file)
2b4e421b76d997e2ad18c74200d9d8521bed165cMartti Rannanjärvi struct sis_queue_fs *fs = (struct sis_queue_fs *)file->file.fs;
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen queue_path = t_strdup_printf("%s/%s", fs->queue_dir, fname);
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainen queue_file = fs_file_init(fs->super, queue_path, FS_OPEN_MODE_CREATE);
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen if (fs_write(queue_file, "", 0) < 0 && errno != EEXIST)
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen i_error("fs-sis-queue: %s", fs_last_error(fs->super));
661998e2ccd772ad92a9d4a75cb712692a8c94b3Timo Sirainenstatic int fs_sis_queue_write(struct fs_file *_file, const void *data, size_t size)
02d91785bcf42ced46080db91c29bb534fbe2d1cTimo Sirainen struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
7b3b617e946d5b32078baa821f5fc05f775e1dfeMartti Rannanjärvi if (fs_write(file->super, data, size) < 0) {
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainenstatic void fs_sis_queue_write_stream(struct fs_file *_file)
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen _file->output = o_stream_create_error(EINVAL);
8f7e81b327b8b5bf34262f6755df6d4481760d23Timo Sirainen o_stream_set_name(_file->output, _file->path);
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainenstatic int fs_sis_queue_write_stream_finish(struct fs_file *_file, bool success)
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
048e40f9364fa68482bc276dd4a5d595a3d742e9Timo Sirainen fs_write_stream_abort(file->super, &_file->output);
54a8bb6e9b852d9a96a8cdda1bb55a85ce0e10daTimo Sirainen if (fs_write_stream_finish(file->super, &_file->output) < 0) {
5997118fa7aee2535edac28092261ca085a958aeMartti Rannanjärvifs_sis_queue_lock(struct fs_file *_file, unsigned int secs,
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen struct sis_queue_fs_file *file = (struct sis_queue_fs_file *)_file;
i_unreached();
T_BEGIN {
} T_END;
static struct fs_iter *
NULL,