Hi Daniel,

> Use stat before open the file to find out if the
> file already exists. Only if file exists and
> the header is invalid trigger connman_error
> ---
>  src/stats.c |   24 +++++++++++++++---------
>  1 files changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/src/stats.c b/src/stats.c
> index 08f3dd2..9e14021 100644
> --- a/src/stats.c
> +++ b/src/stats.c
> @@ -250,11 +250,12 @@ static int stats_open_file(struct connman_service 
> *service,
>                               struct stats_file *file,
>                               connman_bool_t roaming)
>  {
> -     struct stat stat;
> +     struct stat buf;

please don't. The common declaration here is this:

        struct stat st;

And buf is the worst variable name you could have picked ;)

>       char *name;
>       int err;
>       size_t size;
>       struct stats_file_header *hdr;
> +     connman_bool_t new_file = FALSE;
>  
>       if (roaming == FALSE) {
>               name = g_strdup_printf("%s/%s.data", STORAGEDIR,
> @@ -265,6 +266,13 @@ static int stats_open_file(struct connman_service 
> *service,
>       }
>  
>       file->name = name;
> +
> +     err = stat(file->name, &buf);
> +     if (err < 0) {
> +             /* according documentation the only possible error is ENOENT */
> +             new_file = TRUE;
> +     }
> +
>       file->fd = open(name, O_RDWR | O_CREAT, 0644);
>  
>       if (file->fd == -1) {

I prefer these checks like this btw.:

        if (fd < 0)
                error...

> @@ -275,14 +283,11 @@ static int stats_open_file(struct connman_service 
> *service,
>  
>       file->max_len = STATS_MAX_FILE_SIZE;
>  
> -     err = fstat(file->fd, &stat);
> -     if (err < 0)
> -             return -errno;
> -
> -     if (stat.st_size < sysconf(_SC_PAGESIZE))
> +     if (buf.st_size < sysconf(_SC_PAGESIZE))
>               size = sysconf(_SC_PAGESIZE);
>       else
> -             size = (size_t)stat.st_size;
> +             size = (size_t)buf.st_size;
> +

What is this cast for. I don't really like casts like this.
 
>       err = stats_file_remap(file, size);
>       if (err < 0)
> @@ -290,12 +295,13 @@ static int stats_open_file(struct connman_service 
> *service,
>  
>       hdr = get_hdr(file);
>  
> -     if (hdr->magic != MAGIC ||
> +     if (new_file == TRUE || hdr->magic != MAGIC ||
>                       hdr->begin < sizeof(struct stats_file_header) ||
>                       hdr->end < sizeof(struct stats_file_header) ||
>                       hdr->begin > file->len ||
>                       hdr->end > file->len) {
> -             connman_warn("invalid file header for %s", file->name);
> +             if (new_file == FALSE)
> +                     connman_warn("invalid file header for %s", file->name);

First check for new_file == TRUE and now for new_file == FALSE. That
logic seems a bit too complicated for me. Makes my brain hurt ;)

Regards

Marcel


_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to