Hi, how about this one?

----- Original Message -----
> The ideal solution would be to create a base functions file_scanf() and
> file_printf() that would look like safe_file_scanf() and
> safe_file_printf() but without the file, lineno and cleanup parameters.
> 
> These would return non-zero return value on failure and then we can base the
> safe_file_scanf() on the top of these functions.
> 
> I.e. safe_file_scanf() would call file_scanf() and call tst_brkm() if
> file_scanf() has reported a failure. Then we can use file_scanf() in test
> cleanup. But as these functions use variable number of arguments this needs
> one
> more indirection with functions that takes va_list.
> 

Signed-off-by: Li Wang <liw...@redhat.com>
---
 include/safe_file_ops.h          |  5 ++-
 lib/safe_file_ops.c              | 92 ++++++++++++++++++++++++++++++++--------
 testcases/kernel/mem/thp/thp04.c | 10 ++---
 testcases/kernel/mem/thp/thp05.c | 10 ++---
 4 files changed, 88 insertions(+), 29 deletions(-)

diff --git a/include/safe_file_ops.h b/include/safe_file_ops.h
index 1815984..17d009e 100644
--- a/include/safe_file_ops.h
+++ b/include/safe_file_ops.h
@@ -42,6 +42,8 @@
 /*
  * All-in-one function to scanf value(s) from a file.
  */
+int file_scanf(const char *file, const char *fmt, va_list va);
+
 void safe_file_scanf(const char *file, const int lineno,
                      void (*cleanup_fn)(void),
                     const char *path, const char *fmt, ...)
@@ -50,10 +52,11 @@ void safe_file_scanf(const char *file, const int lineno,
 #define SAFE_FILE_SCANF(cleanup_fn, path, fmt, ...) \
        safe_file_scanf(__FILE__, __LINE__, (cleanup_fn), \
                        (path), (fmt), ## __VA_ARGS__)
-
 /*
  * All-in-one function that lets you printf directly into a file.
  */
+int file_printf(const char *file, const char *fmt, va_list va);
+
 void safe_file_printf(const char *file, const int lineno,
                       void (*cleanup_fn)(void),
                       const char *path, const char *fmt, ...)
diff --git a/lib/safe_file_ops.c b/lib/safe_file_ops.c
index 0325ce2..3ce53ff 100644
--- a/lib/safe_file_ops.c
+++ b/lib/safe_file_ops.c
@@ -73,28 +73,54 @@ static int count_scanf_conversions(const char *fmt)
        return cnt;
 }
 
+int file_vscanf(const char *file, const char *fmt, va_list va)
+{
+       FILE *f;
+       int ret;
+
+       f = fopen(file, "r");
+
+       if (f == NULL) {
+               return -2;
+       }
+
+       ret = vfscanf(f, fmt, va);
+
+       return ret;
+}
+
+/* Add file_scanf() to replace SAFE_FILE_SCANF() which used in cleanup()*/
+int file_scanf(const char *file, const char *fmt, ...)
+{
+       va_list va;
+       int ret;
+
+       va_start(va, fmt);
+       ret = file_vscanf(file, fmt, va);
+       va_end(va);
+
+       return ret;
+}
+
 void safe_file_scanf(const char *file, const int lineno,
                     void (*cleanup_fn) (void),
                     const char *path, const char *fmt, ...)
 {
        va_list va;
-       FILE *f;
        int exp_convs, ret;
 
-       f = fopen(path, "r");
+       exp_convs = count_scanf_conversions(fmt);
 
-       if (f == NULL) {
+       va_start(va, fmt);
+       ret = file_vscanf(path, fmt, va);
+       va_end(va);
+
+       if (ret == -2) {
                tst_brkm(TBROK | TERRNO, cleanup_fn,
                         "Failed to open FILE '%s' for reading at %s:%d",
                         path, file, lineno);
        }
 
-       exp_convs = count_scanf_conversions(fmt);
-
-       va_start(va, fmt);
-       ret = vfscanf(f, fmt, va);
-       va_end(va);
-
        if (ret == EOF) {
                tst_brkm(TBROK, cleanup_fn,
                         "The FILE '%s' ended prematurely at %s:%d",
@@ -109,32 +135,62 @@ void safe_file_scanf(const char *file, const int lineno,
 
 }
 
+int file_vprintf(const char *file, const char *fmt, va_list va)
+{
+       FILE *f;
+
+       f = fopen(file, "w");
+
+       if (f == NULL) {
+               return -2;
+       }
+
+       if (vfprintf(f, fmt, va) < 0) {
+               return -3;
+       }
+
+       if (fclose(f)) {
+               return -4;
+       }
+}
+
+/* Add file_printf() to replace SAFE_FILE_PRINTF() which used in cleanup()*/
+int file_printf(const char *file, const char *fmt, ...)
+{
+       va_list va;
+       int ret;
+
+       va_start(va, fmt);
+       ret = file_vprintf(file, fmt, va);
+       va_end(va);
+
+       return ret;
+}
+
 void safe_file_printf(const char *file, const int lineno,
                      void (*cleanup_fn) (void),
                      const char *path, const char *fmt, ...)
 {
        va_list va;
-       FILE *f;
+       int ret;
 
-       f = fopen(path, "w");
+       va_start(va, fmt);
+       ret = file_vprintf(path, fmt, va);
+       va_end(va);
 
-       if (f == NULL) {
+       if (ret == -2) {
                tst_brkm(TBROK | TERRNO, cleanup_fn,
                         "Failed to open FILE '%s' for writing at %s:%d",
                         path, file, lineno);
        }
 
-       va_start(va, fmt);
-
-       if (vfprintf(f, fmt, va) < 0) {
+       if (ret == -3) {
                tst_brkm(TBROK, cleanup_fn,
                         "Failed to print to FILE '%s' at %s:%d",
                         path, file, lineno);
        }
 
-       va_end(va);
-
-       if (fclose(f)) {
+       if (ret == -4) {
                tst_brkm(TBROK | TERRNO, cleanup_fn,
                         "Failed to close FILE '%s' at %s:%d",
                         path, file, lineno);
diff --git a/testcases/kernel/mem/thp/thp04.c b/testcases/kernel/mem/thp/thp04.c
index 0b6baeb..db9defc 100644
--- a/testcases/kernel/mem/thp/thp04.c
+++ b/testcases/kernel/mem/thp/thp04.c
@@ -120,10 +120,10 @@ void setup(void)
 
 void cleanup(void)
 {
-       SAFE_FILE_PRINTF(NULL, PATH_KHPD "scan_sleep_millisecs",
+       file_printf(PATH_KHPD "scan_sleep_millisecs",
                         "%d", pre_thp_scan_sleep_millisecs);
 
-       SAFE_FILE_PRINTF(NULL, PATH_KHPD "alloc_sleep_millisecs",
+       file_printf(PATH_KHPD "alloc_sleep_millisecs",
                         "%d", pre_thp_alloc_sleep_millisecs);
 
        /*
@@ -132,11 +132,11 @@ void cleanup(void)
         * the three mode: always, madvise, never.
         */
        if (strcmp(pre_thp_enabled, "[always] madvise never") == 0)
-               SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "always");
+               file_printf(PATH_THP "enabled", "always");
        else if (strcmp(pre_thp_enabled, "always [madvise] never") == 0)
-               SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "madvise");
+               file_printf(PATH_THP "enabled", "madvise");
        else
-               SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "never");
+               file_printf(PATH_THP "enabled", "never");
 
        TEST_CLEANUP;
 }
diff --git a/testcases/kernel/mem/thp/thp05.c b/testcases/kernel/mem/thp/thp05.c
index 8b595ca..b20d9bd 100644
--- a/testcases/kernel/mem/thp/thp05.c
+++ b/testcases/kernel/mem/thp/thp05.c
@@ -129,18 +129,18 @@ void setup(void)
 
 void cleanup(void)
 {
-       SAFE_FILE_PRINTF(NULL, PATH_KHPD "scan_sleep_millisecs",
+       file_printf(PATH_KHPD "scan_sleep_millisecs",
                         "%d", pre_thp_scan_sleep_millisecs);
 
-       SAFE_FILE_PRINTF(NULL, PATH_KHPD "alloc_sleep_millisecs",
+       file_printf(PATH_KHPD "alloc_sleep_millisecs",
                         "%d", pre_thp_alloc_sleep_millisecs);
 
        if (strcmp(pre_thp_enabled, "[always] madvise never") == 0)
-               SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "always");
+               file_printf(PATH_THP "enabled", "always");
        else if (strcmp(pre_thp_enabled, "always [madvise] never") == 0)
-               SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "madvise");
+               file_printf(PATH_THP "enabled", "madvise");
        else
-               SAFE_FILE_PRINTF(NULL, PATH_THP "enabled", "never");
+               file_printf(PATH_THP "enabled", "never");
 
        TEST_CLEANUP;
 }
-- 
1.9.3


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to