----- Original Message ----- > Hi! > Looking at the change here, it would be better if file_printf() will > issue tst_resm(TWARN, "xyz has failed") in case that the file_printf() > will fail. Because otherwise it would be close to impossible to track > down the failure. Maybe it would be even better to create FILE_PRINTF() > macro similary to the SAFE_FILE_PRINTF(), what do you think?
Hi, after thinking over, I feel there is no need to create a static function file_vscanf() and file_vprintf(). I'd love to create FILE_PRINTF() macro that is not calling the tst_brkm() and issues only a warning. Then we can use FILE_PRINTF() to replace all the safe macros in cleanup(). So, new patch like this: Signed-off-by: Li Wang <liw...@redhat.com> --- include/safe_file_ops.h | 10 ++++ lib/safe_file_ops.c | 59 ++++++++++++++++++++++ .../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, 90 insertions(+), 21 deletions(-) diff --git a/include/safe_file_ops.h b/include/safe_file_ops.h index 1815984..865575a 100644 --- a/include/safe_file_ops.h +++ b/include/safe_file_ops.h @@ -42,6 +42,11 @@ /* * All-in-one function to scanf value(s) from a file. */ +void file_scanf(const char *file, const char *fmt, ...); + +#define FILE_SCANF(file, fmt, ...) \ + file_scanf((file), (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 +59,11 @@ void safe_file_scanf(const char *file, const int lineno, /* * All-in-one function that lets you printf directly into a file. */ +void file_printf(const char *file, const char *fmt, ...); + +#define FILE_PRINTF(file, fmt, ...) \ + file_printf((file), (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..6c25ea5 100644 --- a/lib/safe_file_ops.c +++ b/lib/safe_file_ops.c @@ -73,6 +73,37 @@ static int count_scanf_conversions(const char *fmt) return cnt; } +void file_scanf(const char *file, const char *fmt, ...) +{ + va_list va; + FILE *f; + int exp_convs, ret; + + f = fopen(file, "r"); + + if (f == NULL) { + tst_resm(TWARN, + "Failed to open FILE '%s' for reading", file); + } + + 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", file); + + if (ret != exp_convs) { + tst_resm(TWARN, "Expected %i conversions got %i FILE '%s'", + exp_convs, ret, file); + } + + if (fclose(f)) + tst_resm(TWARN, "Failed to close FILE '%s'", file); +} + void safe_file_scanf(const char *file, const int lineno, void (*cleanup_fn) (void), const char *path, const char *fmt, ...) @@ -107,6 +138,34 @@ 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); + } +} + +void file_printf(const char *file, const char *fmt, ...) +{ + va_list va; + FILE *f; + + f = fopen(file, "w"); + + if (f == NULL) { + tst_resm(TWARN, + "Failed to open FILE '%s' for writing", file); + } + + va_start(va, fmt); + + if (vfprintf(f, fmt, va) < 0) + tst_resm(TWARN, "Failed to print to FILE '%s'", file); + + va_end(va); + + if (fclose(f)) + tst_resm(TWARN, "Failed to close FILE '%s'", file); } 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