Years ago I added the -l option to cp. I was looking at it recently and I saw that it was opening and closing the file even though it never did anything except link it.
I want to make the following change. Basically it moves the link code to the start of the function bypassing all that extra work. I think it is safe but thought that I would pass it by others to make sure that I am not missing a security hole somewhere. By the way, a simple test indicates that this change makes an order of magnitude speedup to the operation. Index: utils.c =================================================================== RCS file: /cvsroot/src/bin/cp/utils.c,v retrieving revision 1.45 diff -u -u -r1.45 utils.c --- utils.c 29 Feb 2016 04:22:21 -0000 1.45 +++ utils.c 16 Jul 2018 18:38:08 -0000 @@ -99,7 +99,17 @@ int ch, checkch, from_fd, rcount, rval, to_fd, tolnk, wcount; char *p; off_t ptotal = 0; - + + /* if hard linking then simply close the open fds, link and return */ + if (lflag) { + (void)unlink(to.p_path); + if (link(entp->fts_path, to.p_path)) { + warn("%s", to.p_path); + return (1); + } + return (0); + } + if ((from_fd = open(entp->fts_path, O_RDONLY, 0)) == -1) { warn("%s", entp->fts_path); return (1); @@ -164,18 +174,6 @@ rval = 0; - /* if hard linking then simply close the open fds, link and return */ - if (lflag) { - (void)close(from_fd); - (void)close(to_fd); - (void)unlink(to.p_path); - if (link(entp->fts_path, to.p_path)) { - warn("%s", to.p_path); - return (1); - } - return (0); - } - /* * There's no reason to do anything other than close the file * now if it's empty, so let's not bother. -- D'Arcy J.M. Cain <da...@netbsd.org> http://www.NetBSD.org/ IM:da...@vex.net