libsparse: add error reporting functions

Change-Id: I2f21355b6c5339d1d724b4c121ea30d575b2d366
diff --git a/libsparse/Android.mk b/libsparse/Android.mk
index dbe4d18..d3eeae6 100644
--- a/libsparse/Android.mk
+++ b/libsparse/Android.mk
@@ -6,7 +6,8 @@
         backed_block.c \
         output_file.c \
         sparse.c \
-        sparse_crc32.c
+        sparse_crc32.c \
+        sparse_err.c
 
 include $(CLEAR_VARS)
 
diff --git a/libsparse/include/sparse/sparse.h b/libsparse/include/sparse/sparse.h
index 6484333..09a5137 100644
--- a/libsparse/include/sparse/sparse.h
+++ b/libsparse/include/sparse/sparse.h
@@ -157,4 +157,22 @@
 int sparse_file_write(struct sparse_file *s, int fd, bool gz, bool sparse,
 		bool crc);
 
+/**
+ * sparse_file_verbose - set a sparse file cookie to print verbose errors
+ *
+ * @s - sparse file cookie
+ *
+ * Print verbose sparse file errors whenever using the sparse file cookie.
+ */
+void sparse_file_verbose(struct sparse_file *s);
+
+/**
+ * sparse_print_verbose - function called to print verbose errors
+ *
+ * By default, verbose errors will print to standard error.
+ * sparse_print_verbose may be overridden to log verbose errors somewhere else.
+ *
+ */
+extern void (*sparse_print_verbose)(const char *fmt, ...);
+
 #endif
diff --git a/libsparse/sparse.c b/libsparse/sparse.c
index 4ebcf0f..3403604 100644
--- a/libsparse/sparse.c
+++ b/libsparse/sparse.c
@@ -151,3 +151,8 @@
 
 	return 0;
 }
+
+void sparse_file_verbose(struct sparse_file *s)
+{
+	s->verbose = true;
+}
diff --git a/libsparse/sparse_err.c b/libsparse/sparse_err.c
new file mode 100644
index 0000000..0f392ad
--- /dev/null
+++ b/libsparse/sparse_err.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sparse/sparse.h>
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <unistd.h>
+
+void sparse_default_print(const char *fmt, ...)
+{
+	va_list argp;
+
+	va_start(argp, fmt);
+	vfprintf(stderr, fmt, argp);
+	va_end(argp);
+}
+
+void (*sparse_print_error)(const char *fmt, ...) = sparse_default_print;
+void (*sparse_print_verbose)(const char *fmt, ...) = sparse_default_print;
diff --git a/libsparse/sparse_file.h b/libsparse/sparse_file.h
index fae1c16..91a12e6 100644
--- a/libsparse/sparse_file.h
+++ b/libsparse/sparse_file.h
@@ -22,6 +22,7 @@
 struct sparse_file {
 	unsigned int block_size;
 	int64_t len;
+	bool verbose;
 
 	struct backed_block_list *backed_block_list;
 	struct output_file *out;