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) <[email protected]> > --- > 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) { _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
