lib: safe_macros: Add SAFE_FOPEN(), SAFE_FCLOSE()

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
diff --git a/include/safe_macros.h b/include/safe_macros.h
index 1047437..3a26df6 100644
--- a/include/safe_macros.h
+++ b/include/safe_macros.h
@@ -23,6 +23,7 @@
 #include <libgen.h>
 #include <stdarg.h>
 #include <unistd.h>
+#include <stdio.h>
 
 char*	safe_basename(const char *file, const int lineno,
 	    void (*cleanup_fn)(void), char *path);
@@ -173,5 +174,15 @@
 #define SAFE_SYSCONF(cleanup_fn, name) \
 	safe_sysconf(__FILE__, __LINE__, cleanup_fn, name)
 
+FILE *safe_fopen(const char *file, const int lineno, void (cleanup_fn)(void),
+                 const char *path, const char *mode);
+#define SAFE_FOPEN(cleanup_fn, path, mode) \
+	safe_fopen(__FILE__, __LINE__, cleanup_fn, path, mode)
+
+int safe_fclose(const char *file, const int lineno, void (cleanup_fn)(void),
+                FILE *f);
+#define SAFE_FCLOSE(cleanup_fn, f) \
+	safe_fclose(__FILE__, __LINE__, cleanup_fn, f)
+
 #endif /* __SAFE_MACROS_H__ */
 #endif /* __TEST_H__ */
diff --git a/lib/safe_macros.c b/lib/safe_macros.c
index 4da9914..fb02796 100644
--- a/lib/safe_macros.c
+++ b/lib/safe_macros.c
@@ -438,3 +438,32 @@
 
 	return rval;
 }
+
+FILE *safe_fopen(const char *file, const int lineno, void (cleanup_fn)(void),
+                 const char *path, const char *mode)
+{
+	FILE *f = fopen(path, mode);
+
+	if (f == NULL) {
+		tst_brkm(TBROK | TERRNO, cleanup_fn,
+		         "fopen(%s) failed at %s:%d", path, file, lineno);
+		return NULL;
+	}
+
+	return f;
+}
+
+int safe_fclose(const char *file, const int lineno, void (cleanup_fn)(void),
+                FILE *f)
+{
+	int ret;
+
+	ret = fclose(f);
+
+	if (ret) {
+		tst_brkm(TBROK | TERRNO, cleanup_fn,
+		         "fclose failed at %s:%d", file, lineno);
+	}
+
+	return ret;
+}