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); | 
