----- Original Message -----
> Hi!
> 
> Missing return statements here as well.

Hi, good proposal! 

************************************************************
void safe_file_scanf(const char *file, const int lineno,
                      void (*cleanup_fn)(void),              <=========
                     const char *path, const char *fmt, ...)
************************************************************
But I am not sure there still have necessary to involve 
void (*cleanup_fn)(void) in new function, If not, the patch 
like below:

Signed-off-by: Li Wang <liw...@redhat.com>
---
 include/safe_file_ops.h                            |  16 ++++
 lib/safe_file_ops.c                                | 105 +++++++++++++++++++++
 .../kernel/device-drivers/acpi/ltp_acpi_cpufreq.c  |   4 +-
 .../kernel/mem/hugetlb/hugeshmget/hugeshmget03.c   |   2 +-
 testcases/kernel/mem/ksm/ksm01.c                   |   2 +-
 testcases/kernel/mem/ksm/ksm02.c                   |   2 +-
 testcases/kernel/mem/ksm/ksm03.c                   |   2 +-
 testcases/kernel/mem/ksm/ksm04.c                   |   2 +-
 testcases/kernel/mem/ksm/ksm06.c                   |   6 +-
 testcases/kernel/mem/thp/thp04.c                   |  10 +-
 testcases/kernel/mem/thp/thp05.c                   |  10 +-
 testcases/kernel/syscalls/fork/fork13.c            |   2 +-
 12 files changed, 142 insertions(+), 21 deletions(-)

diff --git a/include/safe_file_ops.h b/include/safe_file_ops.h
index 1815984..e65ac55 100644
--- a/include/safe_file_ops.h
+++ b/include/safe_file_ops.h
@@ -42,6 +42,14 @@
 /*
  * All-in-one function to scanf value(s) from a file.
  */
+int file_scanf(const char *file, const int lineno,
+               const char *path, const char *fmt, ...)
+               __attribute__ ((format (scanf, 4, 5)));
+
+#define FILE_SCANF(path, fmt, ...) \
+       file_scanf(__FILE__, __LINE__, \
+                  (path), (fmt), ## __VA_ARGS__)
+
 void safe_file_scanf(const char *file, const int lineno,
                      void (*cleanup_fn)(void),
                     const char *path, const char *fmt, ...)
@@ -54,6 +62,14 @@ void safe_file_scanf(const char *file, const int lineno,
 /*
  * All-in-one function that lets you printf directly into a file.
  */
+int file_printf(const char *file, const int lineno,
+                      const char *path, const char *fmt, ...)
+                      __attribute__ ((format (printf, 4, 5)));
+
+#define FILE_PRINTF(path, fmt, ...) \
+       file_printf(__FILE__, __LINE__, \
+                   (path), (fmt), ## __VA_ARGS__)
+
 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..d0aa83a 100644
--- a/lib/safe_file_ops.c
+++ b/lib/safe_file_ops.c
@@ -73,6 +73,61 @@ static int count_scanf_conversions(const char *fmt)
        return cnt;
 }
 
+int file_scanf(const char *file, const int lineno,
+                    const char *path, const char *fmt, ...)
+{
+       va_list va;
+       FILE *f;
+       int exp_convs, ret;
+
+       f = fopen(path, "r");
+
+       if (f == NULL) {
+               tst_resm(TWARN,
+                       "Failed to close FILE '%s' at %s:%d",
+                        path, file, lineno);
+               return 1;
+       }
+
+       exp_convs = count_scanf_conversions(fmt);
+
+       va_start(va, fmt);
+       ret = vfscanf(f, fmt, va);
+       va_end(va);
+
+       if (ret == EOF) {
+               tst_resm(TWARN,
+                        "The FILE '%s' ended prematurely at %s:%d",
+                        path, file, lineno);
+               goto err;
+       }
+
+       if (ret != exp_convs) {
+               tst_resm(TWARN,
+                       "Expected %i conversions got %i FILE '%s' at %s:%d",
+                        exp_convs, ret, path, file, lineno);
+               goto err;
+       }
+
+       if (fclose(f)) {
+               tst_resm(TWARN,
+                        "Failed to close FILE '%s' at %s:%d",
+                        path, file, lineno);
+               return 1;
+       }
+
+       return 0;
+
+err:
+       if (fclose(f)) {
+               tst_resm(TWARN,
+                        "Failed to close FILE '%s' at %s:%d",
+                        path, file, lineno);
+               return 1;
+       }
+       return 1;
+}
+
 void safe_file_scanf(const char *file, const int lineno,
                     void (*cleanup_fn) (void),
                     const char *path, const char *fmt, ...)
@@ -107,6 +162,56 @@ void safe_file_scanf(const char *file, const int lineno,
                         exp_convs, ret, path, file, lineno);
        }
 
+       if (fclose(f)) {
+               tst_brkm(TBROK | TERRNO, cleanup_fn,
+                        "Failed to close FILE '%s' at %s:%d",
+                        path, file, lineno);
+       }
+}
+
+int file_printf(const char *file, const int lineno,
+                     const char *path, const char *fmt, ...)
+{
+       va_list va;
+       FILE *f;
+
+       f = fopen(path, "w");
+
+       if (f == NULL) {
+               tst_resm(TWARN,
+                        "Failed to open FILE '%s' at %s:%d",
+                        path, file, lineno);
+               return 1;
+       }
+
+       va_start(va, fmt);
+
+       if (vfprintf(f, fmt, va) < 0) {
+               tst_resm(TWARN,
+                       "Failed to print to FILE '%s' at %s:%d",
+                        path, file, lineno);
+               goto err;
+       }
+
+       va_end(va);
+
+       if (fclose(f)) {
+               tst_resm(TWARN,
+                        "Failed to close FILE '%s' at %s:%d",
+                        path, file, lineno);
+               return 1;
+       }
+
+       return 0;
+
+err:
+       if (fclose(f)) {
+               tst_resm(TWARN,
+                        "Failed to close FILE '%s' at %s:%d",
+                        path, file, lineno);
+               return 1;
+       }
+       return 1;
 }
 
 void safe_file_printf(const char *file, const int lineno,
diff --git a/testcases/kernel/device-drivers/acpi/ltp_acpi_cpufreq.c 
b/testcases/kernel/device-drivers/acpi/ltp_acpi_cpufreq.c
index 423188e..154699f 100644
--- a/testcases/kernel/device-drivers/acpi/ltp_acpi_cpufreq.c
+++ b/testcases/kernel/device-drivers/acpi/ltp_acpi_cpufreq.c
@@ -52,10 +52,10 @@ const char maxspeed[]       = SYSFS_CPU_DIR 
"cpu0/cpufreq/scaling_max_freq";
 
 static void cleanup(void)
 {
-       SAFE_FILE_PRINTF(NULL, boost, "%d", boost_value);
+       FILE_PRINTF(boost, "%d", boost_value);
 
        if (governor[0] != '\0')
-               SAFE_FILE_PRINTF(NULL, governor, "%s", governor_name);
+               FILE_PRINTF(governor, "%s", governor_name);
 
        TEST_CLEANUP;
 }
diff --git a/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget03.c 
b/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget03.c
index 8976854..2856613 100644
--- a/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget03.c
+++ b/testcases/kernel/mem/hugetlb/hugeshmget/hugeshmget03.c
@@ -159,7 +159,7 @@ void cleanup(void)
        for (i = 0; i < num_shms; i++)
                rm_shm(shm_id_arr[i]);
 
-       SAFE_FILE_PRINTF(NULL, PATH_SHMMNI, "%ld", orig_shmmni);
+       FILE_PRINTF(PATH_SHMMNI, "%ld", orig_shmmni);
        set_sys_tune("nr_hugepages", orig_hugepages, 0);
 
        tst_rmdir();
diff --git a/testcases/kernel/mem/ksm/ksm01.c b/testcases/kernel/mem/ksm/ksm01.c
index c1c3d9f..e1cbb41 100644
--- a/testcases/kernel/mem/ksm/ksm01.c
+++ b/testcases/kernel/mem/ksm/ksm01.c
@@ -130,7 +130,7 @@ void setup(void)
 void cleanup(void)
 {
        if (access(PATH_KSM "merge_across_nodes", F_OK) == 0)
-               SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes",
+               FILE_PRINTF(PATH_KSM "merge_across_nodes",
                                 "%d", merge_across_nodes);
 
        TEST_CLEANUP;
diff --git a/testcases/kernel/mem/ksm/ksm02.c b/testcases/kernel/mem/ksm/ksm02.c
index ed470a8..8986844 100644
--- a/testcases/kernel/mem/ksm/ksm02.c
+++ b/testcases/kernel/mem/ksm/ksm02.c
@@ -126,7 +126,7 @@ int main(int argc, char *argv[])
 void cleanup(void)
 {
        if (access(PATH_KSM "merge_across_nodes", F_OK) == 0)
-               SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes",
+               FILE_PRINTF(PATH_KSM "merge_across_nodes",
                                 "%d", merge_across_nodes);
 
        umount_mem(CPATH, CPATH_NEW);
diff --git a/testcases/kernel/mem/ksm/ksm03.c b/testcases/kernel/mem/ksm/ksm03.c
index 5be4f76..d94d348 100644
--- a/testcases/kernel/mem/ksm/ksm03.c
+++ b/testcases/kernel/mem/ksm/ksm03.c
@@ -125,7 +125,7 @@ void setup(void)
 void cleanup(void)
 {
        if (access(PATH_KSM "merge_across_nodes", F_OK) == 0)
-               SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes",
+               FILE_PRINTF(PATH_KSM "merge_across_nodes",
                                 "%d", merge_across_nodes);
 
        umount_mem(MEMCG_PATH, MEMCG_PATH_NEW);
diff --git a/testcases/kernel/mem/ksm/ksm04.c b/testcases/kernel/mem/ksm/ksm04.c
index 8768637..8f8efc8 100644
--- a/testcases/kernel/mem/ksm/ksm04.c
+++ b/testcases/kernel/mem/ksm/ksm04.c
@@ -128,7 +128,7 @@ int main(int argc, char *argv[])
 void cleanup(void)
 {
        if (access(PATH_KSM "merge_across_nodes", F_OK) == 0)
-               SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes",
+               FILE_PRINTF(PATH_KSM "merge_across_nodes",
                                 "%d", merge_across_nodes);
 
        umount_mem(CPATH, CPATH_NEW);
diff --git a/testcases/kernel/mem/ksm/ksm06.c b/testcases/kernel/mem/ksm/ksm06.c
index fb362f5..35a1803 100644
--- a/testcases/kernel/mem/ksm/ksm06.c
+++ b/testcases/kernel/mem/ksm/ksm06.c
@@ -114,11 +114,11 @@ void setup(void)
 
 void cleanup(void)
 {
-       SAFE_FILE_PRINTF(NULL, PATH_KSM "merge_across_nodes",
+       FILE_PRINTF(PATH_KSM "merge_across_nodes",
                         "%d", merge_across_nodes);
-       SAFE_FILE_PRINTF(NULL, PATH_KSM "sleep_millisecs",
+       FILE_PRINTF(PATH_KSM "sleep_millisecs",
                         "%d", sleep_millisecs);
-       SAFE_FILE_PRINTF(NULL, PATH_KSM "run", "%d", run);
+       FILE_PRINTF(PATH_KSM "run", "%d", run);
 
        TEST_CLEANUP;
 }
diff --git a/testcases/kernel/mem/thp/thp04.c b/testcases/kernel/mem/thp/thp04.c
index 0b6baeb..d79788e 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..7c80cc4 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;
 }
diff --git a/testcases/kernel/syscalls/fork/fork13.c 
b/testcases/kernel/syscalls/fork/fork13.c
index a5ae486..173b788 100644
--- a/testcases/kernel/syscalls/fork/fork13.c
+++ b/testcases/kernel/syscalls/fork/fork13.c
@@ -149,7 +149,7 @@ static void setup(void)
 static void cleanup(void)
 {
        /* Restore pid_max value. */
-       SAFE_FILE_PRINTF(NULL, PID_MAX_PATH, "%lu", pid_max);
+       FILE_PRINTF(PID_MAX_PATH, "%lu", pid_max);
 
        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=164703151&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