On Mon, Jul 06, 2015 at 07:15:06PM -0600, Dale Lindskog wrote: > It is discouraged but possible to run pkg_add(1) with -n or -s as a user > other than root. However, if pkg_add(1) does not have write permission to > $PKG_CACHE, then unclear error messages are produced. For example: > > $ ls -ld $PKG_CACHE > drwxr-xr-x 2 root wheel 3072 Jul 2 12:13 /var/pkg_cache > $ pkg_add -vn gcal > pkg_add should be run as root > Update candidates: quirks-2.54 -> quirks-2.54 > quirks-2.54 signed on 2015-03-08T12:33:05Z > Fatal error: Ustar > [ftp://ftp.openbsd.org/pub/OpenBSD/5.7/packages/amd64/gcal-3.6.3p0.tgz][?]: > Error while reading header > at /usr/libdata/perl5/OpenBSD/Ustar.pm line 89. > > One solution is for pkg_add(1) to silently omit the attempt to copy the > package to an unwritable $PKG_CACHE. Below is a diff that achieves this, > and modifies pkg_add(1)'s man page accordingly. > > Index: pkg_add.1 > =================================================================== > RCS file: /cvs/src/usr.sbin/pkg_add/pkg_add.1,v > retrieving revision 1.132 > diff -u -p -r1.132 pkg_add.1 > --- pkg_add.1 16 Apr 2015 20:01:39 -0000 1.132 > +++ pkg_add.1 7 Jul 2015 00:51:22 -0000 > @@ -371,7 +371,7 @@ Don't actually install a package, just r > would be taken if it was. > Will still copy packages to > .Ev PKG_CACHE > -if applicable. > +if applicable, and if pkg_add has write permission to that directory. > .It Fl P Ar type > Check permissions for distribution, where > .Ar type > Index: OpenBSD/PackageRepository.pm > =================================================================== > RCS file: /cvs/src/usr.sbin/pkg_add/OpenBSD/PackageRepository.pm,v > retrieving revision 1.113 > diff -u -p -r1.113 PackageRepository.pm > --- OpenBSD/PackageRepository.pm 4 Mar 2015 13:55:32 -0000 1.113 > +++ OpenBSD/PackageRepository.pm 7 Jul 2015 00:51:22 -0000 > @@ -534,7 +534,7 @@ sub open_pipe > $object->{pid2} = $pid2; > } else { > open STDERR, '>', $object->{errors}; > - if (defined $object->{cache_dir}) { > + if (defined $object->{cache_dir} and -w $object->{cache_dir}) { > my $pid3 = open(my $in, "-|"); > $self->did_it_fork($pid3); > if ($pid3) { I object to the "silent" part... if you're trying to actually use PKG_CACHE then, having it fail silently and then discovering several GB later that oops, it didn't save anything anywhere looks like a huge mistake.
But I'll try to make the error message be completely explicit.