diff options
-rw-r--r-- | tools/save.c | 11 | ||||
-rw-r--r-- | tools/save.h | 4 | ||||
-rw-r--r-- | tools/tests/files/empty-file | 0 | ||||
-rw-r--r-- | tools/tests/files/simple-string | 1 | ||||
-rw-r--r-- | tools/tests/test-save.c | 50 |
5 files changed, 62 insertions, 4 deletions
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 --- /dev/null +++ b/tools/tests/files/empty-file 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); |