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;
+}