Hi!
> 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);

This prototype is wrong, the last one should be ... not va_list.

>  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);

Here as well.

Have you complied the code? It should have produced quite a lot of
warnings.

>  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)

This function is not part of the public interface, therefore it would be
better to declare it as static.

> +{
> +     FILE *f;
> +     int ret;
> +
> +     f = fopen(file, "r");
> +
> +     if (f == NULL) {
> +             return -2;
> +     }

LKML coding style preffers not to include curly braces around single
line statements.

> +     ret = vfscanf(f, fmt, va);

Close the file here, otherwise you leak memory.

> +     return ret;
> +}
> +
> +/* Add file_scanf() to replace SAFE_FILE_SCANF() which used in cleanup()*/

Please do not add useless comments like this.

> +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)
> +{

Should be static function as well.

> +     FILE *f;
> +
> +     f = fopen(file, "w");
> +
> +     if (f == NULL) {
> +             return -2;
> +     }
> +
> +     if (vfprintf(f, fmt, va) < 0) {
> +             return -3;
> +     }
> +
> +     if (fclose(f)) {
> +             return -4;
> +     }

Useless curly braces as well.

> +}
> +
> +/* Add file_printf() to replace SAFE_FILE_PRINTF() which used in cleanup()*/

Useless comment as well.

> +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");

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?

-- 
Cyril Hrubis
chru...@suse.cz

------------------------------------------------------------------------------
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