Implement common logging function

When used as a library, it's desirable to be able to suppress logging,
or pipe logging through a different path.  This commit changes behavior
such that logging is disabled by default, and introduces 2 new methods,
cper_set_log_stdio and cper_set_log_custom.

These allow library integrators to specify their logging mode.  In
practice, this also allows fuzzing to run faster by not printing errors
to the log.

Change-Id: I941476627bc9b8261ba5f6c0b2b2338fdf931dd2
Signed-off-by: Ed Tanous <etanous@nvidia.com>
diff --git a/sections/cper-section-arm.c b/sections/cper-section-arm.c
index cd06131..6961d16 100644
--- a/sections/cper-section-arm.c
+++ b/sections/cper-section-arm.c
@@ -12,6 +12,7 @@
 #include <libcper/Cper.h>
 #include <libcper/cper-utils.h>
 #include <libcper/sections/cper-section-arm.h>
+#include <libcper/log.h>
 
 //Private pre-definitions.
 json_object *
@@ -123,7 +124,8 @@
 	    (record->ErrInfoNum * sizeof(EFI_ARM_ERROR_INFORMATION_ENTRY))) {
 		json_object_put(error_info_array);
 		json_object_put(section_ir);
-		printf("Invalid CPER file: Invalid processor error info num.\n");
+		cper_print_log(
+			"Invalid CPER file: Invalid processor error info num.\n");
 		return NULL;
 	}
 	for (int i = 0; i < record->ErrInfoNum; i++) {
@@ -147,7 +149,8 @@
 		    sizeof(EFI_ARM_CONTEXT_INFORMATION_HEADER)) {
 			json_object_put(context_info_array);
 			json_object_put(section_ir);
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			return NULL;
 		}
 		EFI_ARM_CONTEXT_INFORMATION_HEADER *header =
@@ -161,7 +164,8 @@
 		if (processor_context == NULL) {
 			json_object_put(context_info_array);
 			json_object_put(section_ir);
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			return NULL;
 		}
 		json_object_array_add(context_info_array, processor_context);
@@ -177,7 +181,8 @@
 			if (remaining_size < input_size) {
 				json_object_put(vendor_specific);
 				json_object_put(section_ir);
-				printf("Invalid CPER file: Invalid vendor-specific info length.\n");
+				cper_print_log(
+					"Invalid CPER file: Invalid vendor-specific info length.\n");
 				return NULL;
 			}
 			int32_t encoded_len = 0;
@@ -186,7 +191,8 @@
 			if (encoded == NULL) {
 				json_object_put(vendor_specific);
 				json_object_put(section_ir);
-				printf("base64 encode of vendorSpecificInfo failed\n");
+				cper_print_log(
+					"base64 encode of vendorSpecificInfo failed\n");
 				return NULL;
 			}
 			json_object_object_add(vendor_specific, "data",
@@ -197,7 +203,8 @@
 			json_object_object_add(section_ir, "vendorSpecificInfo",
 					       vendor_specific);
 		} else {
-			printf("vendorSpecificInfo is marked valid but not present in binary\n");
+			cper_print_log(
+				"vendorSpecificInfo is marked valid but not present in binary\n");
 		}
 	}
 
@@ -497,7 +504,8 @@
 				 const UINT8 **cur_pos, UINT32 *remaining_size)
 {
 	if (header->RegisterArraySize > *remaining_size) {
-		printf("Invalid CPER file: Invalid processor context info num.\n");
+		cper_print_log(
+			"Invalid CPER file: Invalid processor context info num.\n");
 		return NULL;
 	}
 
@@ -526,12 +534,14 @@
 	switch (header->RegisterContextType) {
 	case EFI_ARM_CONTEXT_TYPE_AARCH32_GPR:
 		if (*remaining_size < sizeof(EFI_ARM_V8_AARCH32_GPR)) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_V8_AARCH32_GPR)) {
-			printf("Invalid CPER file: Not enough bytes for aarch32 gpr\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for aarch32 gpr\n");
 			goto fail;
 		}
 		register_array = uniform_struct_to_ir(
@@ -542,12 +552,14 @@
 	case EFI_ARM_CONTEXT_TYPE_AARCH32_EL1:
 		if (*remaining_size <
 		    sizeof(EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Not enough bytes for aarch32 el1\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for aarch32 el1\n");
 			goto fail;
 		}
 		register_array = uniform_struct_to_ir(
@@ -559,12 +571,14 @@
 	case EFI_ARM_CONTEXT_TYPE_AARCH32_EL2:
 		if (*remaining_size <
 		    sizeof(EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Not enough bytes for aarch32 el2\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for aarch32 el2\n");
 			goto fail;
 		}
 		register_array = uniform_struct_to_ir(
@@ -578,12 +592,14 @@
 		if (*remaining_size <
 		    sizeof(EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS)) {
 			json_object_put(context_ir);
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			return NULL;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Not enough bytes for aarch32 secure\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for aarch32 secure\n");
 			goto fail;
 		}
 		register_array = uniform_struct_to_ir(
@@ -594,12 +610,14 @@
 		break;
 	case EFI_ARM_CONTEXT_TYPE_AARCH64_GPR:
 		if (*remaining_size < sizeof(EFI_ARM_V8_AARCH64_GPR)) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_V8_AARCH64_GPR)) {
-			printf("Invalid CPER file: Not enough bytes for aarch64 gpr\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for aarch64 gpr\n");
 			goto fail;
 		}
 		register_array = uniform_struct64_to_ir(
@@ -610,12 +628,14 @@
 	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL1:
 		if (*remaining_size <
 		    sizeof(EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Not enough bytes for aarch64 el1\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for aarch64 el1\n");
 			goto fail;
 		}
 		register_array = uniform_struct64_to_ir(
@@ -627,12 +647,14 @@
 	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL2:
 		if (*remaining_size <
 		    sizeof(EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Not enough bytes for aarch64 el2\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for aarch64 el2\n");
 			goto fail;
 		}
 		register_array = uniform_struct64_to_ir(
@@ -644,12 +666,14 @@
 	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL3:
 		if (*remaining_size <
 		    sizeof(EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS)) {
-			printf("Invalid CPER file: Not enough bytes for aarch64 el3\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for aarch64 el3\n");
 			goto fail;
 		}
 		register_array = uniform_struct64_to_ir(
@@ -660,12 +684,14 @@
 		break;
 	case EFI_ARM_CONTEXT_TYPE_MISC:
 		if (*remaining_size < sizeof(EFI_ARM_MISC_CONTEXT_REGISTER)) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		if (header->RegisterArraySize <
 		    sizeof(EFI_ARM_MISC_CONTEXT_REGISTER)) {
-			printf("Invalid CPER file: Not enough bytes for misc\n");
+			cper_print_log(
+				"Invalid CPER file: Not enough bytes for misc\n");
 			goto fail;
 		}
 		register_array = cper_arm_misc_register_array_to_ir(
@@ -673,7 +699,8 @@
 		break;
 	default:
 		if (*remaining_size < header->RegisterArraySize) {
-			printf("Invalid CPER file: Invalid processor context info num.\n");
+			cper_print_log(
+				"Invalid CPER file: Invalid processor context info num.\n");
 			goto fail;
 		}
 		//Unknown register array type, add as base64 data instead.
@@ -1274,7 +1301,7 @@
 				       &decoded_len);
 
 	if (decoded == NULL) {
-		printf("Failed to allocate decode output buffer. \n");
+		cper_print_log("Failed to allocate decode output buffer. \n");
 	} else {
 		//Flush out to stream.
 		fwrite(&decoded, decoded_len, 1, out);