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