Marc Espie wrote:
> hey, your commit to install(1) broke something.
>
> Specifically lang/go-boostrap now produces a broken package which can't
> be used to build go.
>
> All the go/bootstrap/pkg/tool/openbsd_amd64/*
> have lost their x bit
>
> Relevant fake install information, it definitely looks like the last line
> is now a no-op.
> # These get installed via `find' however we need them to be executable
> /pobj/go-bootstrap-1.4.20171003/bin/install -d -m 755
> /pobj/go-bootstrap-1.4.20171003/fake-amd64/usr/local/go/bootstrap/pkg/tool//openbsd_amd64
> /pobj/go-bootstrap-1.4.20171003/bin/install -c -m 755 -p
> /pobj/go-bootstrap-1.4.20171003/go/pkg/tool//openbsd_amd64/*
> /pobj/go-bootstrap-1.4.20171003/fake-amd64/usr/local/go/bootstrap/pkg/tool//openbsd_amd64
Yes. This is a weird way to invoke chmod, but that's what it wants.
I think this was a long standing bug in install? If the files match, we need
to continue on with to_fd == existing file so that metadata updates work.
Index: xinstall.c
===================================================================
RCS file: /cvs/src/usr.bin/xinstall/xinstall.c,v
retrieving revision 1.68
diff -u -p -r1.68 xinstall.c
--- xinstall.c 8 Feb 2019 12:53:44 -0000 1.68
+++ xinstall.c 9 Feb 2019 22:21:03 -0000
@@ -313,8 +313,12 @@ install(char *from_name, char *to_name,
(void)unlink(tempfile);
}
}
- (void)close(to_fd);
- to_fd = temp_fd;
+ if (!files_match) {
+ (void)close(to_fd);
+ to_fd = temp_fd;
+ } else {
+ close(temp_fd);
+ }
}
/*