Hi,

I ran into a permission problem when using proot(1). The ${PORTSDIR}/bulk
directory cannot be created when you decide to place the other directories
outside the ports tree.

Here's my configuration:

$ cat proot.cfg
chroot=/prootports2
PORT_USER=denis
extra=/etc/doas.conf
      /etc/installurl
WRKOBJDIR=/bportbuild/pobj
PLIST_REPOSITORY=/bportbuild/plist
DISTDIR=/bportbuild/distfiles
PACKAGE_REPOSITORY=/bportbuild/packages
LOGDIR=/bportbuild/logs
actions=unpopulate_light
        copy_ports
mkconf_tail=proot_mkadd.cfg

$ cat proot_mkadd.cfg
PARALLEL_MAKE_JOBS=yes
MAKE_JOBS=10
#BULK=No

If the BULK line is commented out as here, "BULK=Auto" is used and the
permission problem is encountered:

$ doas /usr/ports/infrastructure/bin/proot -c proot.cfg
$ doas chroot -u denis /prootports2

$ cd /usr/port/sysutils/flashrom
$ make fake
[...]
===>  Building package for dwz-0.15
Create /bportbuild/packages/amd64/all/dwz-0.15.tgz
Creating package dwz-0.15
Creating package debug-dwz-0.15
Link to /bportbuild/packages/amd64/ftp/dwz-0.15.tgz
Link to /bportbuild/packages/amd64/ftp/debug-dwz-0.15.tgz
mkdir: /usr/ports/bulk: Permission denied

Of course, with "BULK=No", everything works straight away.

I've modified proot(1) to include BULK_COOKIES_DIR in the configuration
file in the same way as DISTDIR, WRKOBJDIR, PLIST_REPOSITORY, and so on.

A patch for proot(1) is attached here. Not sure this is the right approach.

-- 
Denis
Index: infrastructure/bin/proot
===================================================================
RCS file: /cvs/ports/infrastructure/bin/proot,v
diff -u -p -u -r1.74 proot
--- infrastructure/bin/proot    6 May 2023 05:21:15 -0000       1.74
+++ infrastructure/bin/proot    3 Aug 2024 09:05:53 -0000
@@ -151,12 +151,16 @@ sub do_parm($state, $k, $v)
                    $state->{PACKAGE_REPOSITORY} = File::Spec->canonpath($v);
            }, PLIST_REPOSITORY => sub() {
                    $state->{PLIST_REPOSITORY} = File::Spec->canonpath($v);
+           }, BULK_COOKIES_DIR => sub() {
+                   $state->{BULK_COOKIES_DIR} = File::Spec->canonpath($v);
            }, NFSDIR => sub() {
                    $state->{DISTDIR} = File::Spec->canonpath("$v/distfiles");
                    $state->{PACKAGE_REPOSITORY} = 
                        File::Spec->canonpath("$v/packages");
                    $state->{PLIST_REPOSITORY} =
                        File::Spec->canonpath("$v/plist");
+                   $state->{BULK_COOKIES_DIR} =
+                       File::Spec->canonpath("$v/bulk");
            }, LOCALDIR => sub() {
                    $state->{WRKOBJDIR} = File::Spec->canonpath("$v/pobj");
                    $state->{LOCKDIR} = File::Spec->canonpath("$v/locks");
@@ -325,7 +329,7 @@ sub handle_options($state)
        if ($< != 0) {
                $state->fatal("Must be root");
        }
-       for my $i (qw(PORTSDIR DISTDIR WRKOBJDIR PACKAGE_REPOSITORY 
PLIST_REPOSITORY LOCKDIR LOGDIR FETCH_USER BUILD_USER)) {
+       for my $i (qw(PORTSDIR DISTDIR WRKOBJDIR PACKAGE_REPOSITORY 
PLIST_REPOSITORY BULK_COOKIES_DIR LOCKDIR LOGDIR FETCH_USER BUILD_USER)) {
                if (defined $state->{$i}) {
                        $state->{write}{$i} = 1;
                }
@@ -340,8 +344,9 @@ sub handle_options($state)
        $state->{loguser} //= $state->{builduser};
        $state->{PACKAGE_REPOSITORY} //= join('/', $state->{PORTSDIR}, 
'packages');
        $state->{PLIST_REPOSITORY} //= join('/', $state->{PORTSDIR}, 'plist');
+       $state->{BULK_COOKIES_DIR} //= join('/', $state->{PORTSDIR}, 'bulk');
        $state->{sysdir} //= '/usr/src/sys';
-       for my $dir (qw(DISTDIR WRKOBJDIR LOGDIR PACKAGE_REPOSITORY 
PLIST_REPOSITORY LOCKDIR)) {
+       for my $dir (qw(DISTDIR WRKOBJDIR LOGDIR PACKAGE_REPOSITORY 
PLIST_REPOSITORY BULK_COOKIES_DIR LOCKDIR)) {
                $state->{$dir} = $state->canonical_dir($state->{$dir});
                $state->add_preserved($state->{$dir});
        }
@@ -357,7 +362,7 @@ sub handle_options($state)
        }
        for my $i (qw(chroot srcroot 
            PORTSDIR DISTDIR WRKOBJDIR LOCKDIR LOGDIR 
-           PACKAGE_REPOSITORY PLIST_REPOSITORY)) {
+           PACKAGE_REPOSITORY PLIST_REPOSITORY BULK_COOKIES_DIR)) {
                if (defined $state->{$i}) {
                        $state->say("#1=#2", $i, $state->{$i});
                }
@@ -689,6 +694,9 @@ sub best_user($state, $path)
        if (m/^\Q$state->{PLIST_REPOSITORY}\E/) {
                return $state->{builduser};
        }
+       if (m/^\Q$state->{BULK_COOKIES_DIR}\E/) {
+               return $state->{builduser};
+       }
        if (m/^\Q$state->{PACKAGE_REPOSITORY}\E/) {
                return $state->{builduser};
        }
@@ -1062,6 +1070,7 @@ sub make_ports_subdirs($state)
                $state->build_dir(WHINE|MKPATH , "builduser", "WRKOBJDIR");
                $state->build_dir(0, "builduser", "PACKAGE_REPOSITORY");
                $state->build_dir(0, "builduser", "PLIST_REPOSITORY");
+               $state->build_dir(0, "builduser", "BULK_COOKIES_DIR");
                $state->build_dir(WHINE, "builduser", "LOCKDIR");
            });
 }

Reply via email to