[PATCH] makedevs: make special node creation idempotent
walter harms
wharms at bfs.de
Sat Nov 5 14:36:42 UTC 2016
Am 05.11.2016 14:37, schrieb Arnout Vandecappelle (Essensium/Mind):
> When makedevs is called for a second time with the same device file, it
> will fail because the files already exist and mknod() gives -EEXISTS.
>
> To avoid this, check if the file already exists and if so, if it is of
> the right type. The chmod and chown changes are still done.
>
i am not familiar with that program. Is this std. behavior ?
re,
wh
> function old new delta
> makedevs_main 1086 1201 +115
> .rodata 138731 138832 +101
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 2/0 up/down: 216/0) Total: 216 bytes
> text data bss dec hex filename
> 856021 15958 1968 873947 d55db busybox_old
> 856237 15958 1968 874163 d56b3 busybox_unstripped
>
> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout at mind.be>
> ---
> miscutils/makedevs.c | 18 ++++++++++++++++--
> 1 file changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c
> index c945a13..49f011d 100644
> --- a/miscutils/makedevs.c
> +++ b/miscutils/makedevs.c
> @@ -225,6 +225,7 @@ int makedevs_main(int argc UNUSED_PARAM, char **argv)
> dev_t rdev;
> unsigned i;
> char *full_name_inc;
> + struct stat st;
>
> if (type == 'p') {
> mode |= S_IFIFO;
> @@ -244,10 +245,23 @@ int makedevs_main(int argc UNUSED_PARAM, char **argv)
> for (i = start; i <= start + count; i++) {
> sprintf(full_name_inc, count ? "%s%u" : "%s", full_name, i);
> rdev = makedev(major, minor + (i - start) * increment);
> - if (mknod(full_name_inc, mode, rdev) < 0) {
> + if (stat(full_name_inc, &st) == 0) {
> + if ((mode & S_IFMT) != (st.st_mode & S_IFMT)) {
> + bb_error_msg("line %d: node %s exists but is of wrong file type", linenum, full_name_inc);
> + ret = EXIT_FAILURE;
> + continue;
> + }
> + if (st.st_rdev != rdev) {
> + bb_error_msg("line %d: node %s exists but is wrong device number", linenum, full_name_inc);
> + ret = EXIT_FAILURE;
> + continue;
> + }
> + } else if (mknod(full_name_inc, mode, rdev) < 0) {
> bb_perror_msg("line %d: can't create node %s", linenum, full_name_inc);
> ret = EXIT_FAILURE;
> - } else if (chown(full_name_inc, uid, gid) < 0) {
> + continue;
> + }
> + if (chown(full_name_inc, uid, gid) < 0) {
> bb_perror_msg("line %d: can't chown %s", linenum, full_name_inc);
> ret = EXIT_FAILURE;
> } else if (chmod(full_name_inc, mode) < 0) {
More information about the busybox
mailing list