dovecot-2.2: lib-fs: Added fs-test to easily test FS API calls.
dovecot at dovecot.org
dovecot at dovecot.org
Sat Dec 1 06:56:06 EET 2012
details: http://hg.dovecot.org/dovecot-2.2/rev/cea9a269311a
changeset: 15442:cea9a269311a
user: Timo Sirainen <tss at iki.fi>
date: Sat Dec 01 06:56:02 2012 +0200
description:
lib-fs: Added fs-test to easily test FS API calls.
diffstat:
.hgignore | 1 +
src/lib-fs/Makefile.am | 12 +++
src/lib-fs/fs-test.c | 155 +++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 168 insertions(+), 0 deletions(-)
diffs (197 lines):
diff -r 009287402687 -r cea9a269311a .hgignore
--- a/.hgignore Sat Dec 01 06:54:55 2012 +0200
+++ b/.hgignore Sat Dec 01 06:56:02 2012 +0200
@@ -77,6 +77,7 @@
src/ipc/ipc
src/lib/unicodemap.c
src/lib/UnicodeData.txt
+src/lib-fs/fs-test
src/lib-dict/dict-drivers-register.c
src/lib-sql/sql-drivers-register.c
src/lib-storage/register/mail-storage-register.c
diff -r 009287402687 -r cea9a269311a src/lib-fs/Makefile.am
--- a/src/lib-fs/Makefile.am Sat Dec 01 06:54:55 2012 +0200
+++ b/src/lib-fs/Makefile.am Sat Dec 01 06:56:02 2012 +0200
@@ -1,5 +1,7 @@
noinst_LTLIBRARIES = libfs.la
+noinst_PROGRAMS = fs-test
+
AM_CPPFLAGS = \
-I$(top_srcdir)/src/lib \
-DMODULE_DIR=\""$(moduledir)"\"
@@ -18,5 +20,15 @@
fs-sis-common.h \
ostream-cmp.h
+fs_test_SOURCES = fs-test.c
+fs_test_LDFLAGS = -export-dynamic
+fs_test_DEPENDENCIES = \
+ libfs.la \
+ ../lib-http/libhttp.la \
+ ../lib-ssl-iostream/libssl_iostream.la \
+ ../lib-dns/libdns.la \
+ ../lib/liblib.la
+fs_test_LDADD = $(fs_test_DEPENDENCIES) $(MODULE_LIBS)
+
pkginc_libdir=$(pkgincludedir)
pkginc_lib_HEADERS = $(headers)
diff -r 009287402687 -r cea9a269311a src/lib-fs/fs-test.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lib-fs/fs-test.c Sat Dec 01 06:56:02 2012 +0200
@@ -0,0 +1,155 @@
+/* Copyright (c) 2012 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "ioloop.h"
+#include "istream.h"
+#include "ostream.h"
+#include "fs-api.h"
+
+#include <stdio.h>
+
+static const struct fs_settings fs_set = {
+ .temp_dir = "/tmp"
+};
+
+static void fs_test_file_get(struct fs *fs, const char *path)
+{
+ struct fs_file *file;
+ struct istream *input;
+ const unsigned char *data;
+ size_t size;
+ ssize_t ret;
+
+ file = fs_file_init(fs, path, FS_OPEN_MODE_READONLY);
+ input = fs_read_stream(file, IO_BLOCK_SIZE);
+ while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
+ fwrite(data, 1, size, stdout);
+ i_stream_skip(input, size);
+ }
+ i_stream_unref(&input);
+ fs_file_deinit(&file);
+}
+
+static void
+fs_test_file_put(struct fs *fs, const char *src_path, const char *dest_path)
+{
+ struct fs_file *file;
+ struct istream *input;
+ struct ostream *output;
+ off_t ret;
+
+ if (dest_path == NULL)
+ i_fatal("dest path missing");
+
+ file = fs_file_init(fs, dest_path, FS_OPEN_MODE_REPLACE);
+ output = fs_write_stream(file);
+ input = i_stream_create_file(src_path, IO_BLOCK_SIZE);
+ if ((ret = o_stream_send_istream(output, input)) < 0) {
+ if (output->stream_errno != 0)
+ i_error("write(%s) failed: %m", dest_path);
+ else
+ i_error("read(%s) failed: %m", src_path);
+ } else {
+ printf("%"PRIuUOFF_T" bytes written\n", ret);
+ }
+ i_stream_destroy(&input);
+ if (fs_write_stream_finish(file, &output) < 0) {
+ i_error("fs_write_stream_finish() failed: %s",
+ fs_file_last_error(file));
+ }
+ fs_file_deinit(&file);
+}
+
+static void
+fs_test_file_copy(struct fs *fs, const char *src_path, const char *dest_path)
+{
+ struct fs_file *src_file, *dest_file;
+
+ if (dest_path == NULL)
+ i_fatal("dest path missing");
+
+ src_file = fs_file_init(fs, src_path, FS_OPEN_MODE_READONLY);
+ dest_file = fs_file_init(fs, dest_path, FS_OPEN_MODE_REPLACE);
+ if (fs_copy(src_file, dest_file) < 0) {
+ i_error("fs_copy(%s, %s) failed: %s",
+ src_path, dest_path, fs_last_error(fs));
+ }
+ fs_file_deinit(&src_file);
+ fs_file_deinit(&dest_file);
+}
+
+static void fs_test_file_stat(struct fs *fs, const char *path)
+{
+ struct fs_file *file;
+ struct stat st;
+
+ file = fs_file_init(fs, path, FS_OPEN_MODE_READONLY);
+ if (fs_stat(file, &st) < 0) {
+ i_error("fs_stat(%s) failed: %s",
+ path, fs_file_last_error(file));
+ } else {
+ printf("%s size=%lld\n", path, (long long)st.st_size);
+ }
+ fs_file_deinit(&file);
+}
+
+static void fs_test_file_delete(struct fs *fs, const char *path)
+{
+ struct fs_file *file;
+
+ file = fs_file_init(fs, path, FS_OPEN_MODE_READONLY);
+ if (fs_delete(file) < 0) {
+ i_error("fs_delete(%s) failed: %s",
+ path, fs_file_last_error(file));
+ }
+ fs_file_deinit(&file);
+}
+
+static void fs_test_file_iter(struct fs *fs, const char *path)
+{
+ struct fs_iter *iter;
+ const char *fname;
+
+ iter = fs_iter_init(fs, path);
+ while ((fname = fs_iter_next(iter)) != NULL)
+ printf("%s\n", fname);
+ if (fs_iter_deinit(&iter) < 0) {
+ i_error("fs_iter_deinit(%s) failed: %s",
+ path, fs_last_error(fs));
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ struct ioloop *ioloop;
+ struct fs *fs;
+ const char *error;
+
+ lib_init();
+ ioloop = io_loop_create();
+
+ if (argc < 5)
+ i_fatal("Usage: <driver> <driver args> <cmd> <args>");
+ if (fs_init(argv[1], argv[2], &fs_set, &fs, &error) < 0)
+ i_fatal("fs_init() failed: %s", error);
+
+ if (strcmp(argv[3], "get") == 0)
+ fs_test_file_get(fs, argv[4]);
+ else if (strcmp(argv[3], "put") == 0)
+ fs_test_file_put(fs, argv[4], argv[5]);
+ else if (strcmp(argv[3], "copy") == 0)
+ fs_test_file_copy(fs, argv[4], argv[5]);
+ else if (strcmp(argv[3], "stat") == 0)
+ fs_test_file_stat(fs, argv[4]);
+ else if (strcmp(argv[3], "delete") == 0)
+ fs_test_file_delete(fs, argv[4]);
+ else if (strcmp(argv[3], "iter") == 0)
+ fs_test_file_iter(fs, argv[4]);
+ else
+ i_fatal("Unknown command: %s", argv[3]);
+
+ fs_deinit(&fs);
+ io_loop_destroy(&ioloop);
+ lib_deinit();
+ return 0;
+}
More information about the dovecot-cvs
mailing list