chunk: Externalize error reporting in chunk_write()

This avoids passing that arbitrary label just for error messages, and gives
greater flexibility in handling errors.
This commit is contained in:
Martin Willi
2014-01-23 15:55:32 +01:00
parent 37374a292a
commit b9ee059ca9
6 changed files with 52 additions and 30 deletions
+10 -1
View File
@@ -521,7 +521,16 @@ METHOD(stroke_cred_t, cache_cert, void,
if (cert->get_encoding(cert, CERT_ASN1_DER, &chunk)) if (cert->get_encoding(cert, CERT_ASN1_DER, &chunk))
{ {
chunk_write(chunk, buf, "crl", 022, TRUE); if (chunk_write(chunk, buf, 022, TRUE))
{
DBG1(DBG_CFG, " written crl file '%s' (%d bytes)",
buf, chunk.len);
}
else
{
DBG1(DBG_CFG, " writing crl file '%s' failed: %s",
buf, strerror(errno));
}
free(chunk.ptr); free(chunk.ptr);
} }
} }
+2 -2
View File
@@ -789,7 +789,7 @@ START_TEST(test_chunk_map)
chunk_t *map, contents = chunk_from_chars(0x01,0x02,0x03,0x04,0x05); chunk_t *map, contents = chunk_from_chars(0x01,0x02,0x03,0x04,0x05);
char *path = "/tmp/strongswan-chunk-map-test"; char *path = "/tmp/strongswan-chunk-map-test";
ck_assert(chunk_write(contents, path, "chunk_map", 022, TRUE)); ck_assert(chunk_write(contents, path, 022, TRUE));
/* read */ /* read */
map = chunk_map(path, FALSE); map = chunk_map(path, FALSE);
@@ -827,7 +827,7 @@ START_TEST(test_chunk_from_fd_file)
char *path = "/tmp/strongswan-chunk-fd-test"; char *path = "/tmp/strongswan-chunk-fd-test";
int fd; int fd;
ck_assert(chunk_write(contents, path, "chunk_fd", 022, TRUE)); ck_assert(chunk_write(contents, path, 022, TRUE));
fd = open(path, O_RDONLY); fd = open(path, O_RDONLY);
ck_assert(fd != -1); ck_assert(fd != -1);
+6 -9
View File
@@ -28,7 +28,6 @@
#include <ctype.h> #include <ctype.h>
#include "chunk.h" #include "chunk.h"
#include "debug.h"
/** /**
* Empty chunk. * Empty chunk.
@@ -209,15 +208,16 @@ void chunk_split(chunk_t chunk, const char *mode, ...)
/** /**
* Described in header. * Described in header.
*/ */
bool chunk_write(chunk_t chunk, char *path, char *label, mode_t mask, bool force) bool chunk_write(chunk_t chunk, char *path, mode_t mask, bool force)
{ {
mode_t oldmask; mode_t oldmask;
FILE *fd; FILE *fd;
bool good = FALSE; bool good = FALSE;
int tmp = 0;
if (!force && access(path, F_OK) == 0) if (!force && access(path, F_OK) == 0)
{ {
DBG1(DBG_LIB, " %s file '%s' already exists", label, path); errno = EEXIST;
return FALSE; return FALSE;
} }
oldmask = umask(mask); oldmask = umask(mask);
@@ -226,23 +226,20 @@ bool chunk_write(chunk_t chunk, char *path, char *label, mode_t mask, bool force
{ {
if (fwrite(chunk.ptr, sizeof(u_char), chunk.len, fd) == chunk.len) if (fwrite(chunk.ptr, sizeof(u_char), chunk.len, fd) == chunk.len)
{ {
DBG1(DBG_LIB, " written %s file '%s' (%d bytes)",
label, path, chunk.len);
good = TRUE; good = TRUE;
} }
else else
{ {
DBG1(DBG_LIB, " writing %s file '%s' failed: %s", tmp = errno;
label, path, strerror(errno));
} }
fclose(fd); fclose(fd);
} }
else else
{ {
DBG1(DBG_LIB, " could not open %s file '%s': %s", label, path, tmp = errno;
strerror(errno));
} }
umask(oldmask); umask(oldmask);
errno = tmp;
return good; return good;
} }
+3 -2
View File
@@ -90,14 +90,15 @@ void chunk_split(chunk_t chunk, const char *mode, ...);
/** /**
* Write the binary contents of a chunk_t to a file * Write the binary contents of a chunk_t to a file
* *
* If the write fails, errno is set appropriately.
*
* @param chunk contents to write to file * @param chunk contents to write to file
* @param path path where file is written to * @param path path where file is written to
* @param label label specifying file type
* @param mask file mode creation mask * @param mask file mode creation mask
* @param force overwrite existing file by force * @param force overwrite existing file by force
* @return TRUE if write operation was successful * @return TRUE if write operation was successful
*/ */
bool chunk_write(chunk_t chunk, char *path, char *label, mode_t mask, bool force); bool chunk_write(chunk_t chunk, char *path, mode_t mask, bool force);
/** /**
* Store data read from FD into a chunk * Store data read from FD into a chunk
+9 -1
View File
@@ -29,6 +29,7 @@
#include <getopt.h> #include <getopt.h>
#include <ctype.h> #include <ctype.h>
#include <time.h> #include <time.h>
#include <errno.h>
#include <library.h> #include <library.h>
#include <utils/debug.h> #include <utils/debug.h>
@@ -515,11 +516,18 @@ int main(int argc, char **argv)
/* write the attribute certificate to file */ /* write the attribute certificate to file */
if (attr_cert->get_encoding(attr_cert, CERT_ASN1_DER, &attr_chunk)) if (attr_cert->get_encoding(attr_cert, CERT_ASN1_DER, &attr_chunk))
{ {
if (chunk_write(attr_chunk, outfile, "attribute cert", 0022, TRUE)) if (chunk_write(attr_chunk, outfile, 0022, TRUE))
{ {
DBG1(DBG_APP, " written attribute cert file '%s' (%d bytes)",
outfile, attr_chunk.len);
write_serial(serial); write_serial(serial);
status = 0; status = 0;
} }
else
{
DBG1(DBG_APP, " writing attribute cert file '%s' failed: %s",
outfile, strerror(errno));
}
} }
} }
else else
+22 -15
View File
@@ -24,6 +24,7 @@
#include <time.h> #include <time.h>
#include <limits.h> #include <limits.h>
#include <syslog.h> #include <syslog.h>
#include <errno.h>
#include <library.h> #include <library.h>
#include <utils/debug.h> #include <utils/debug.h>
@@ -975,9 +976,10 @@ int main(int argc, char **argv)
{ /* no PKCS#7 encoded CA+RA certificates, assume simple CA cert */ { /* no PKCS#7 encoded CA+RA certificates, assume simple CA cert */
DBG1(DBG_APP, "unable to parse PKCS#7, assuming plain CA cert"); DBG1(DBG_APP, "unable to parse PKCS#7, assuming plain CA cert");
if (!chunk_write(scep_response, ca_path, "ca cert", 0022, force)) if (!chunk_write(scep_response, ca_path, 0022, force))
{ {
exit_scepclient("could not write ca cert file '%s'", ca_path); exit_scepclient("could not write ca cert file '%s': %s",
ca_path, strerror(errno));
} }
} }
else else
@@ -1031,10 +1033,10 @@ int main(int argc, char **argv)
} }
if (!cert->get_encoding(cert, CERT_ASN1_DER, &encoding) || if (!cert->get_encoding(cert, CERT_ASN1_DER, &encoding) ||
!chunk_write(encoding, path, !chunk_write(encoding, path, 0022, force))
ca_cert ? "ca cert" : "ra cert", 0022, force))
{ {
exit_scepclient("could not write cert file '%s'", path); exit_scepclient("could not write cert file '%s': %s",
path, strerror(errno));
} }
chunk_free(&encoding); chunk_free(&encoding);
} }
@@ -1149,9 +1151,10 @@ int main(int argc, char **argv)
join_paths(path, sizeof(path), REQ_PATH, file_out_pkcs10); join_paths(path, sizeof(path), REQ_PATH, file_out_pkcs10);
if (!chunk_write(pkcs10_encoding, path, "pkcs10", 0022, force)) if (!chunk_write(pkcs10_encoding, path, 0022, force))
{ {
exit_scepclient("could not write pkcs10 file '%s'", path); exit_scepclient("could not write pkcs10 file '%s': %s",
path, strerror(errno));
} }
filetype_out &= ~PKCS10; /* delete PKCS10 flag */ filetype_out &= ~PKCS10; /* delete PKCS10 flag */
} }
@@ -1172,9 +1175,10 @@ int main(int argc, char **argv)
DBG2(DBG_APP, "building pkcs1 object:"); DBG2(DBG_APP, "building pkcs1 object:");
if (!private_key->get_encoding(private_key, PRIVKEY_ASN1_DER, &pkcs1) || if (!private_key->get_encoding(private_key, PRIVKEY_ASN1_DER, &pkcs1) ||
!chunk_write(pkcs1, path, "pkcs1", 0066, force)) !chunk_write(pkcs1, path, 0066, force))
{ {
exit_scepclient("could not write pkcs1 file '%s'", path); exit_scepclient("could not write pkcs1 file '%s': %s",
path, strerror(errno));
} }
filetype_out &= ~PKCS1; /* delete PKCS1 flag */ filetype_out &= ~PKCS1; /* delete PKCS1 flag */
} }
@@ -1236,9 +1240,10 @@ int main(int argc, char **argv)
{ {
exit_scepclient("encoding certificate failed"); exit_scepclient("encoding certificate failed");
} }
if (!chunk_write(encoding, path, "self-signed cert", 0022, force)) if (!chunk_write(encoding, path, 0022, force))
{ {
exit_scepclient("could not write self-signed cert file '%s'", path); exit_scepclient("could not write self-signed cert file '%s': %s",
path, strerror(errno));
} }
chunk_free(&encoding); chunk_free(&encoding);
filetype_out &= ~CERT_SELF; /* delete CERT_SELF flag */ filetype_out &= ~CERT_SELF; /* delete CERT_SELF flag */
@@ -1300,9 +1305,10 @@ int main(int argc, char **argv)
join_paths(path, sizeof(path), REQ_PATH, file_out_pkcs7); join_paths(path, sizeof(path), REQ_PATH, file_out_pkcs7);
if (!chunk_write(pkcs7, path, "pkcs7 encrypted request", 0022, force)) if (!chunk_write(pkcs7, path, 0022, force))
{ {
exit_scepclient("could not write pkcs7 file '%s'", path); exit_scepclient("could not write pkcs7 file '%s': %s",
path, strerror(errno));
} }
filetype_out &= ~PKCS7; /* delete PKCS7 flag */ filetype_out &= ~PKCS7; /* delete PKCS7 flag */
} }
@@ -1460,9 +1466,10 @@ int main(int argc, char **argv)
exit_scepclient("multiple certs received, only first stored"); exit_scepclient("multiple certs received, only first stored");
} }
if (!cert->get_encoding(cert, CERT_ASN1_DER, &encoding) || if (!cert->get_encoding(cert, CERT_ASN1_DER, &encoding) ||
!chunk_write(encoding, path, "requested cert", 0022, force)) !chunk_write(encoding, path, 0022, force))
{ {
exit_scepclient("could not write cert file '%s'", path); exit_scepclient("could not write cert file '%s': %s",
path, strerror(errno));
} }
chunk_free(&encoding); chunk_free(&encoding);
stored = TRUE; stored = TRUE;