On 01/22/2013 12:03 PM, Jakub Filak wrote:
> +int dd_chown(struct dump_dir *dd, uid_t new_uid)
> +{
...

> +    errno = 0;
> +    struct stat statbuf;
> +    if (!(stat(dd->dd_dirname, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)))
> +    {
> +        perror_msg("stat");
> +        errno = 0;
           ^^^^^^^^^^^
> +        return 1;
> +    }

Why do you clear errno? I think it should be removed
(maybe both "errno = 0"'s should be removed).

> +    int chown_res = lchown(dd->dd_dirname, owners_uid, groups_gid);
> +    int chown_errno = errno;
> +    dd_init_next_file(dd);
> +    char *full_name;
> +    while (chown_res == 0 && dd_get_next_file(dd, /*short_name*/ NULL, 
> &full_name))
> +    {
> +        VERB3 log("chowning %s", full_name);
> +        chown_res = lchown(full_name, owners_uid, groups_gid);
> +        chown_errno = errno;
> +        free(full_name);
> +    }
> +
> +    if (chown_res != 0)
> +    {
> +        errno = chown_errno;
> +        perror_msg("chown");
> +        errno = 0;
> +        return 1;
> +    }
  +
  +    return 0;
  +}

Here too...
I propose slightly different code:


> +    int chown_res = lchown(dd->dd_dirname, owners_uid, groups_gid);
       if (chown_res)
           perror_msg("lchown('%s')", dd->dd_dirname);
       else
       {
> +        dd_init_next_file(dd);
> +        char *full_name;
> +        while (chown_res == 0 && dd_get_next_file(dd, /*short_name*/ NULL, 
> &full_name))
> +        {
> +            VERB3 log("chowning %s", full_name);
> +            chown_res = lchown(full_name, owners_uid, groups_gid);
               if (chown_res)
                   perror_msg("lchown('%s')", full_name);
> +            free(full_name);
> +        }
       }

       return chown_res;
   }

-- 
vda

Reply via email to