summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/save.c11
-rw-r--r--tools/save.h4
-rw-r--r--tools/tests/files/empty-file0
-rw-r--r--tools/tests/files/simple-string1
-rw-r--r--tools/tests/test-save.c50
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);