----- 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 <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list