From 58e1e3764250fbda96c5ef7244e891a6be04d4cb Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Fri, 15 Mar 2013 08:18:42 +0100 Subject: extract: Allow p11_save_write() to automatically calculate length Also if automatically calculating length, then ignore input that is NULL, as something that shouldn't be written out. This allows easier chaining of optional output, such as comments. https://bugs.freedesktop.org/show_bug.cgi?id=62029 --- tools/save.c | 11 +++++++-- tools/save.h | 4 ++-- tools/tests/files/empty-file | 0 tools/tests/files/simple-string | 1 + tools/tests/test-save.c | 50 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 tools/tests/files/empty-file create mode 100644 tools/tests/files/simple-string diff --git a/tools/save.c b/tools/save.c index 34caca1..1f886ad 100644 --- a/tools/save.c +++ b/tools/save.c @@ -66,7 +66,7 @@ struct _p11_save_dir { bool p11_save_write_and_finish (p11_save_file *file, const void *data, - size_t length) + ssize_t length) { bool ret; @@ -128,7 +128,7 @@ p11_save_open_file (const char *path, bool p11_save_write (p11_save_file *file, const void *data, - size_t length) + ssize_t length) { const unsigned char *buf = data; ssize_t written = 0; @@ -137,6 +137,13 @@ p11_save_write (p11_save_file *file, if (!file) return false; + /* Automatically calculate length */ + if (length < 0) { + if (!data) + return true; + length = strlen (data); + } + while (written < length) { res = write (file->fd, buf + written, length - written); if (res <= 0) { diff --git a/tools/save.h b/tools/save.h index bfa0990..f68d054 100644 --- a/tools/save.h +++ b/tools/save.h @@ -49,11 +49,11 @@ p11_save_file * p11_save_open_file (const char *path, bool p11_save_write (p11_save_file *file, const void *data, - size_t length); + ssize_t length); bool p11_save_write_and_finish (p11_save_file *file, const void *data, - size_t length); + ssize_t length); bool p11_save_finish_file (p11_save_file *file, bool commit); diff --git a/tools/tests/files/empty-file b/tools/tests/files/empty-file new file mode 100644 index 0000000..e69de29 diff --git a/tools/tests/files/simple-string b/tools/tests/files/simple-string new file mode 100644 index 0000000..be13474 --- /dev/null +++ b/tools/tests/files/simple-string @@ -0,0 +1 @@ +The simple string is hairy \ No newline at end of file diff --git a/tools/tests/test-save.c b/tools/tests/test-save.c index 41f4e08..88d1ecd 100644 --- a/tools/tests/test-save.c +++ b/tools/tests/test-save.c @@ -191,6 +191,54 @@ test_file_overwrite (CuTest *tc) } static void +test_file_auto_empty (CuTest *tc) +{ + p11_save_file *file; + char *filename; + bool ret; + + setup (tc); + + if (asprintf (&filename, "%s/%s", test.directory, "extract-file") < 0) + CuFail (tc, "asprintf() failed"); + + file = p11_save_open_file (filename, 0); + CuAssertPtrNotNull (tc, file); + + ret = p11_save_write_and_finish (file, NULL, -1); + CuAssertIntEquals (tc, true, ret); + free (filename); + + test_check_file (tc, test.directory, "extract-file", SRCDIR "/files/empty-file"); + + teardown (tc); +} + +static void +test_file_auto_length (CuTest *tc) +{ + p11_save_file *file; + char *filename; + bool ret; + + setup (tc); + + if (asprintf (&filename, "%s/%s", test.directory, "extract-file") < 0) + CuFail (tc, "asprintf() failed"); + + file = p11_save_open_file (filename, 0); + CuAssertPtrNotNull (tc, file); + + ret = p11_save_write_and_finish (file, "The simple string is hairy", -1); + CuAssertIntEquals (tc, true, ret); + free (filename); + + test_check_file (tc, test.directory, "extract-file", SRCDIR "/files/simple-string"); + + teardown (tc); +} + +static void test_write_with_null (CuTest *tc) { bool ret; @@ -496,6 +544,8 @@ main (void) SUITE_ADD_TEST (suite, test_file_exists); SUITE_ADD_TEST (suite, test_file_bad_directory); SUITE_ADD_TEST (suite, test_file_overwrite); + SUITE_ADD_TEST (suite, test_file_auto_empty); + SUITE_ADD_TEST (suite, test_file_auto_length); SUITE_ADD_TEST (suite, test_write_with_null); SUITE_ADD_TEST (suite, test_write_and_finish_with_null); SUITE_ADD_TEST (suite, test_file_abort); -- cgit v1.1