On 2026/07/22 16:16, David Uhden Collado wrote:
> Stuart Henderson wrote:
> > On 2026/07/22 15:25, David Uhden Collado wrote:
> > > Stuart Henderson wrote:
> > > > we are pretty conservative in what is automatically run by pkg_add,
> > > > to my eye this is too much.
> > > > 
> > > > I wouldn't object to installing a script and asking the user to run it,
> > > > though I think by default it should just print the operations needed so
> > > > the user can review (maybe with a flag to run them automatically after
> > > > checking).
> > > > 
> > > > there should not be an @bin marker for scripts.
> > > > 
> > > > the revised pledge still feels like shoehorning it into a program
> > > > which has not been designed to actually work with it. big clue
> > > > is having file access and network access in the same process.
> > > > (sure, there's worse in ports, and it's not a total blocker, but
> > > > it does make me wonder how well tested it's been, because clearly
> > > > there hasn't been too much careful thought about how to use this
> > > > prior to it being committed uptream..)
> > > > 
> > > Hello Stuart,
> > > 
> > > Earlier, you mentioned that users would not normally make these changes
> > > themselves, so the migration should be automated and made as robust as
> > > possible. That is what I have tried to implement.
> > 
> > I think you refer to this that I wrote earlier?
> > 
> > +-----
> > | >  @newgroup _i2pd:838
> > | > -@newuser _i2pd:838:838::i2pd 
> > account:${LOCALSTATEDIR}/lib/i2pd:/sbin/nologin
> > | > +@newuser _i2pd:838:838::i2pd 
> > account:${LOCALSTATEDIR}/i2pd:/sbin/nologin
> > |
> > | This will not get changed for users with existing installs
> > | so there will need to be some documentation about how to do that.
> > +-----
> > 
> > What I mean is: pkg_add will not automatically change this if the user
> > has previously installed an old version. (We generally consider this
> > too risky if the user changed something in a way that pkg_add / the
> > package doesn't expect).
> > 
> > We normally don't make changes like this in ports because of the extra
> > hassle for upgrading users. However if it is unavoidable then there must
> > be information for users to follow. I didn't say anything about
> > automating it (and actually making the changes automatically without
> > user review first seems risky in the same way it would be for pkg_add
> > to update /etc/passwd lines directly).
> > 
> Hello Stuart,
> 
> Thanks for the clarification. I misunderstood your earlier comment and
> assumed that the migration should be performed without first asking the
> user.
> 
> I have now added an @ask-update entry so that pkg_add explains the directory
> migration and asks the user for confirmation before running the migration
> script. The script itself remains non-interactive.
> 
> The migration only runs during an update from an older i2pd package. It
> copies existing .dat files without overwriting destination files, leaves the
> original files under /var/lib/i2pd untouched, and changes the _i2pd home
> directory only if it is still set to the old default.
> 
> I have attached the revised patch.
> 
> Best regards,
> David.

> ? patches
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/net/i2pd/Makefile,v
> diff -u -p -u -r1.33 Makefile
> --- Makefile  21 Feb 2026 14:20:20 -0000      1.33
> +++ Makefile  22 Jul 2026 16:09:34 -0000
> @@ -2,7 +2,7 @@ COMMENT =     client for the I2P anonymous n
>  
>  GH_ACCOUNT = PurpleI2P
>  GH_PROJECT = i2pd
> -GH_TAGNAME = 2.59.0
> +GH_TAGNAME = 2.61.0
>  
>  CATEGORIES = net
>  HOMEPAGE =   https://i2pd.website
> @@ -12,9 +12,10 @@ MAINTAINER =       SystemFailure <openbsd@syst
>  # BSD
>  PERMIT_PACKAGE = Yes
>  
> +# uses pledge() and unveil()
>  WANTLIB += ${COMPILER_LIBCXX}
>  WANTLIB += boost_filesystem-mt boost_program_options-mt
> -WANTLIB += boost_atomic-mt c crypto m miniupnpc ssl z
> +WANTLIB += boost_atomic-mt boost_container-mt c crypto m miniupnpc ssl z
>  
>  COMPILER =   base-clang ports-gcc
>  MODULES =    devel/cmake
> @@ -29,6 +30,8 @@ CONFIGURE_ARGS =    -DWITH_UPNP=ON
>  WRKSRC =     ${WRKDIST}/build
>  
>  post-install:
> +     ${INSTALL_DATA_DIR} ${PREFIX}/libexec
> +     ${INSTALL_SCRIPT} ${FILESDIR}/i2pd-migrate 
> ${PREFIX}/libexec/i2pd-migrate
>       ${INSTALL_DATA_DIR} ${PREFIX}/include/i2pd
>       ${INSTALL_DATA} ${WRKDIST}/libi2pd{,_client}/*.h \
>                ${PREFIX}/include/i2pd
> Index: distinfo
> ===================================================================
> RCS file: /cvs/ports/net/i2pd/distinfo,v
> diff -u -p -u -r1.26 distinfo
> --- distinfo  21 Feb 2026 14:20:20 -0000      1.26
> +++ distinfo  22 Jul 2026 16:09:34 -0000
> @@ -1,2 +1,2 @@
> -SHA256 (i2pd-2.59.0.tar.gz) = Dr6wXk82qzgJRJVhoJXcdnrYIaxqYclWI6tJvk/9OYs=
> -SIZE (i2pd-2.59.0.tar.gz) = 743516
> +SHA256 (i2pd-2.61.0.tar.gz) = QJzTwCV0kShmEatqr2kJQMckj7iYN3wT+ttlqDbioKs=
> +SIZE (i2pd-2.61.0.tar.gz) = 779272
> Index: files/i2pd-migrate
> ===================================================================
> RCS file: files/i2pd-migrate
> diff -N files/i2pd-migrate
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ files/i2pd-migrate        22 Jul 2026 16:09:34 -0000
> @@ -0,0 +1,94 @@
> +#!/bin/ksh
> +
> +# Copy the old package data directory before changing the _i2pd home.
> +# This script is run by pkg_add, not while the package is being built.
> +
> +old=/var/lib/i2pd
> +new=/var/i2pd
> +
> +failed()
> +{
> +     printf '%s\n' "$2" >>"$1"
> +     printf 'i2pd migration: unable to copy %s\n' "$2" >&2
> +}
> +
> +copy_dat()
> +{
> +     status_file=$1
> +     src=$2
> +     rel=${src#"$old"/}
> +     dst=$new/$rel
> +     dir=${dst%/*}
> +
> +     if [ -e "$dst" ] || [ -L "$dst" ]; then
> +             if [ -f "$dst" ] && [ ! -L "$dst" ]; then
> +                     printf 'i2pd migration: leaving existing file 
> unchanged: %s\n' \
> +                             "$dst" >&2
> +                     return 0
> +             fi
> +             failed "$status_file" "$src (destination is not a regular file)"
> +             return 1
> +     fi
> +
> +     if ! mkdir -p "$dir" || ! chown _i2pd:_i2pd "$dir" || \
> +             ! chmod 0750 "$dir"; then
> +             failed "$status_file" "$src (cannot prepare $dir)"
> +             return 1
> +     fi
> +     if ! cp -p "$src" "$dst" || ! chown _i2pd:_i2pd "$dst"; then
> +             failed "$status_file" "$src -> $dst"
> +             return 1
> +     fi
> +     printf 'i2pd migration: copied %s -> %s\n' "$src" "$dst"
> +}
> +
> +if [ "$1" = --copy ]; then
> +     copy_dat "$2" "$3"
> +     exit $?
> +fi
> +
> +if [ ! -d "$old" ]; then
> +     exit 0
> +fi
> +
> +if [ -L "$old" ]; then
> +     printf 'i2pd migration: refusing to follow symbolic-link directory: 
> %s\n' \
> +             "$old" >&2
> +     exit 1
> +fi
> +
> +status=$(mktemp -d /tmp/i2pd-migrate.XXXXXXXX) || exit 1
> +trap 'rm -rf "$status"' EXIT
> +
> +if ! mkdir -p "$new" || ! chown _i2pd:_i2pd "$new" || \
> +     ! chmod 0750 "$new"; then
> +     printf 'i2pd migration: unable to prepare %s\n' "$new" >&2
> +     exit 1
> +fi
> +
> +if [ -d "$old" ]; then
> +     if ! find "$old" -type f -name '*.dat' -exec "$0" \
> +             --copy "$status/status" {} \;; then
> +             printf 'i2pd migration: error while searching %s\n' "$old" >&2
> +             exit 1
> +     fi
> +     if [ -s "$status/status" ]; then
> +             printf 'i2pd migration: one or more files were not copied; 
> keeping _i2pd home unchanged\n' >&2
> +             exit 1
> +     fi
> +fi
> +
> +entry=$(getent passwd _i2pd) || {
> +     printf 'i2pd migration: cannot inspect _i2pd account; keeping home 
> unchanged\n' >&2
> +     exit 1
> +}
> +home=$(printf '%s\n' "$entry" | cut -d: -f6)
> +if [ "$home" = /var/lib/i2pd ]; then
> +     if ! usermod -d /var/i2pd _i2pd; then
> +             printf 'i2pd migration: unable to change _i2pd home 
> directory\n' >&2
> +             exit 1
> +     fi
> +     printf 'i2pd migration: changed _i2pd home to /var/i2pd\n'
> +fi
> +
> +exit 0
> Index: pkg/PLIST
> ===================================================================
> RCS file: /cvs/ports/net/i2pd/pkg/PLIST,v
> diff -u -p -u -r1.18 PLIST
> --- pkg/PLIST 21 Feb 2026 14:20:20 -0000      1.18
> +++ pkg/PLIST 22 Jul 2026 16:09:34 -0000
> @@ -1,7 +1,9 @@
>  @newgroup _i2pd:838
> -@newuser _i2pd:838:838::i2pd account:${LOCALSTATEDIR}/lib/i2pd:/sbin/nologin
> +@newuser _i2pd:838:838::i2pd account:${LOCALSTATEDIR}/i2pd:/sbin/nologin
>  @rcscript ${RCDIR}/i2pd
>  @bin bin/i2pd
> +@ask-update i2pd-<2.61.0 The i2pd data directory has moved from 
> /var/lib/i2pd to /var/i2pd. Existing .dat files will be copied without 
> overwriting files.
> +@bin libexec/i2pd-migrate
>  include/i2pd/
>  include/i2pd/AddressBook.h
>  include/i2pd/BOB.h
> @@ -29,6 +31,7 @@ include/i2pd/I2NPProtocol.h
>  include/i2pd/I2PEndian.h
>  include/i2pd/I2PService.h
>  include/i2pd/I2PTunnel.h
> +include/i2pd/IdentMetrics.h
>  include/i2pd/Identity.h
>  include/i2pd/KadDHT.h
>  include/i2pd/LeaseSet.h
> @@ -54,6 +57,7 @@ include/i2pd/Socks5.h
>  include/i2pd/Streaming.h
>  include/i2pd/Tag.h
>  include/i2pd/Timestamp.h
> +include/i2pd/Torrents.h
>  include/i2pd/TransitTunnel.h
>  include/i2pd/TransportSession.h
>  include/i2pd/Transports.h
> @@ -69,14 +73,17 @@ include/i2pd/util.h
>  include/i2pd/version.h
>  @static-lib lib/libi2pd.a
>  @static-lib lib/libi2pdclient.a
> +@mode 0750
>  @owner _i2pd
>  @group _i2pd
>  @sample ${SYSCONFDIR}/i2pd/
> -@sample ${LOCALSTATEDIR}/lib/i2pd/
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/family/
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/router/
> +@mode
> +@sample ${LOCALSTATEDIR}/i2pd/
> +@exec-update %D/libexec/i2pd-migrate
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/family/
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/router/
>  @owner
>  @group
>  @static-lib lib/libi2pdlang.a
> @@ -87,139 +94,150 @@ share/examples/i2pd/certificates/family/
>  share/examples/i2pd/certificates/family/gostcoin.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/family/gostcoin.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/family/gostcoin.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/family/i2p-dev.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/family/i2p-dev.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/family/i2p-dev.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/family/i2pd-dev.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/family/i2pd-dev.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/family/i2pd-dev.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/family/mca2-i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/family/mca2-i2p.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/family/mca2-i2p.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/family/stormycloud.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/family/stormycloud.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/family/stormycloud.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/family/volatile.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/family/volatile.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/family/volatile.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/
> +share/examples/i2pd/certificates/reseed/acetone_at_mail.i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/acetone_at_mail.i2p.crt
>  @owner
>  @group
> -share/examples/i2pd/certificates/reseed/acetone_at_mail.i2p.crt
> +share/examples/i2pd/certificates/reseed/admin_at_likogan.dev.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/acetone_at_mail.i2p.crt 
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/admin_at_likogan.dev.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/admin_at_stormycloud.org.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/admin_at_stormycloud.org.crt
> +@sample 
> ${LOCALSTATEDIR}/i2pd/certificates/reseed/admin_at_stormycloud.org.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/creativecowpat_at_mail.i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/creativecowpat_at_mail.i2p.crt
> +@sample 
> ${LOCALSTATEDIR}/i2pd/certificates/reseed/creativecowpat_at_mail.i2p.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/diyarciftci_at_protonmail.com.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/diyarciftci_at_protonmail.com.crt
> +@sample 
> ${LOCALSTATEDIR}/i2pd/certificates/reseed/diyarciftci_at_protonmail.com.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/echelon3_at_mail.i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/echelon3_at_mail.i2p.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/echelon3_at_mail.i2p.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/hankhill19580_at_gmail.com.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/hankhill19580_at_gmail.com.crt 
> +@sample 
> ${LOCALSTATEDIR}/i2pd/certificates/reseed/hankhill19580_at_gmail.com.crt 
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/i2p-reseed_at_mk16.de.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/i2p-reseed_at_mk16.de.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/i2p-reseed_at_mk16.de.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/igor_at_novg.net.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/igor_at_novg.net.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/igor_at_novg.net.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/lazygravy_at_mail.i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/lazygravy_at_mail.i2p.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/lazygravy_at_mail.i2p.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/orignal_at_mail.i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/orignal_at_mail.i2p.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/orignal_at_mail.i2p.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/r4sas-reseed_at_mail.i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/r4sas-reseed_at_mail.i2p.crt
> +@sample 
> ${LOCALSTATEDIR}/i2pd/certificates/reseed/r4sas-reseed_at_mail.i2p.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/rambler_at_mail.i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/rambler_at_mail.i2p.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/rambler_at_mail.i2p.crt
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/reseed_at_diva.exchange.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample 
> ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/reseed_at_diva.exchange.crt 
> +@sample 
> ${LOCALSTATEDIR}/i2pd/certificates/reseed/reseed_at_diva.exchange.crt 
>  @owner
>  @group
>  share/examples/i2pd/certificates/reseed/sahil_at_mail.i2p.crt
>  @owner _i2pd
>  @group _i2pd
> -@sample ${LOCALSTATEDIR}/lib/i2pd/certificates/reseed/sahil_at_mail.i2p.crt
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/sahil_at_mail.i2p.crt
>  @owner
>  @group
> -share/examples/i2pd/i2pd.conf
> +share/examples/i2pd/certificates/reseed/vserod1488_at_proton.me.crt
>  @owner _i2pd
>  @group _i2pd
> +@sample ${LOCALSTATEDIR}/i2pd/certificates/reseed/vserod1488_at_proton.me.crt
> +@owner
> +@group
> +share/examples/i2pd/i2pd.conf
> +@mode 0640
> +@owner root
> +@group _i2pd
>  @sample ${SYSCONFDIR}/i2pd/i2pd.conf
> +@mode
>  @owner
>  @group
>  share/examples/i2pd/tunnels.conf
> -@owner _i2pd
> +@mode 0640
> +@owner root
>  @group _i2pd
>  @sample ${SYSCONFDIR}/i2pd/tunnels.conf
> +@mode
>  @owner
>  @group
>  share/examples/login.conf.d/i2pd
> Index: pkg/README
> ===================================================================
> RCS file: /cvs/ports/net/i2pd/pkg/README,v
> diff -u -p -u -r1.4 README
> --- pkg/README        16 Apr 2024 15:22:32 -0000      1.4
> +++ pkg/README        22 Jul 2026 16:09:34 -0000
> @@ -5,7 +5,7 @@
>  Resource Limits: File Descriptors
>  =================================
>  
> -${PKGSTEM} needs to open a lot of file descriptors.
> +i2pd needs to open a lot of file descriptors.
>  
>  For a regular node, you should raise the system-wide maxfiles limit to
>  8192:
> @@ -24,3 +24,67 @@ and also edit /etc/login.conf.d/i2pd:
>               :openfiles-cur=8192:\
>               :openfiles-max=8192:\
>               :tc=daemon:
> +
> +
> +The HTTP interface
> +==================
> +
> +On OpenBSD, i2pd's HTTP interface is disabled by default, because it
> +allows any user on the system to perform actions on the daemon, such
> +as shutting it down, or access private data, such as the router
> +identity and the tunnels' B32 addresses.
> +
> +If you want to use this interface anyway, you can reenable it in
> +${SYSCONFDIR}/i2pd/i2pd.conf under the [http] section.
> +
> +
> +Data directory migration
> +=========================
> +
> +When this package is installed or upgraded, any .dat files found under
> +/var/lib/i2pd are copied to the same relative paths under /var/i2pd.
> +Existing destination files are never overwritten. The old files and
> +/var/lib/i2pd are not deleted. The _i2pd home directory is changed to
> +/var/i2pd only when it still has the old package default,
> +/var/lib/i2pd. Administrators should verify the migration before
> +manually removing /var/lib/i2pd.
> +
> +
> +Graceful shutdown
> +=================
> +
> +It is good practice to shutdown the i2pd daemon gracefully, to avoid
> +immediately severing all connections, which would disconnect all
> +your peers and affect the overall operation of the I2P network.
> +
> +You can initiate a graceful shutdown without the HTTP interface by
> +sending a signal to the i2pd daemon like this:
> +
> +     kill -INT $(cat /var/i2pd/i2pd.pid)
> +
> +When it shuts down gracefully, the i2pd daemon waits for all transit
> +tunnels to expire, which usually takes 10 minutes.
> +
> +
> +Logging
> +=======
> +
> +By default, this package sends its log messages to
> +syslogd(8), which writes them to the /var/log/daemon file.
> +
> +The default log level of i2pd ("warn") can be very verbose. You
> +may want to reduce this log verbosity by changing the "loglevel"
> +parameter in ${SYSCONFDIR}/i2pd/i2pd.conf.
> +
> +If you want log messages to be written to another file, e.g.
> +${LOCALSTATEDIR}/i2pd/i2pd.log, you can change the "log" and "logfile"
> +parameters in ${SYSCONFDIR}/i2pd/i2pd.conf. To have this log file
> +rotated automatically, you can add an entry to /etc/newsyslog.conf using the 
> i2pd pid
> +file so that newsyslog(8) can send SIGHUP to the daemon after rotation.
> +
> +For example:
> +
> +     ${LOCALSTATEDIR}/i2pd/i2pd.log  _i2pd:_i2pd  644  6  *  $D13  Z 
> ${LOCALSTATEDIR}/i2pd/i2pd.pid
> +
> +Sending SIGHUP is enough for log rotation, and also makes i2pd reload
> +its tunnel configuration and rotate transient keys.
> Index: pkg/i2pd.rc
> ===================================================================
> RCS file: /cvs/ports/net/i2pd/pkg/i2pd.rc,v
> diff -u -p -u -r1.4 i2pd.rc
> --- pkg/i2pd.rc       11 Mar 2022 19:46:04 -0000      1.4
> +++ pkg/i2pd.rc       22 Jul 2026 16:09:34 -0000
> @@ -2,7 +2,12 @@
>  
>  daemon="${TRUEPREFIX}/bin/i2pd --daemon"
>  daemon_user="_i2pd"
> -daemon_flags="--service --datadir=${LOCALSTATEDIR}/lib/i2pd 
> --conf=${SYSCONFDIR}/i2pd/i2pd.conf --tunconf=${SYSCONFDIR}/i2pd/tunnels.conf 
> --tunnelsdir=${SYSCONFDIR}/i2pd/tunnels.d"
> +daemon_flags="--service \
> +     --datadir=${LOCALSTATEDIR}/i2pd \
> +     --conf=${SYSCONFDIR}/i2pd/i2pd.conf \
> +     --tunconf=${SYSCONFDIR}/i2pd/tunnels.conf \
> +     --tunnelsdir=${SYSCONFDIR}/i2pd/tunnels.d \
> +     --certsdir=${LOCALSTATEDIR}/i2pd/certificates"
>  
>  . /etc/rc.d/rc.subr
>  
> Index: patches/patch-daemon_Daemon_cpp
> ===================================================================
> RCS file: patches/patch-daemon_Daemon_cpp
> diff -N patches/patch-daemon_Daemon_cpp
> --- /dev/null 1 Jan 1970 00:00:00 -0000
> +++ patches/patch-daemon_Daemon_cpp   22 Jul 2026 16:09:35 -0000
> @@ -0,0 +1,13 @@
> +Use only the pledge promises required by i2pd.  It forks when daemonizing
> +and locks its pidfile, but does not use the other promises from upstream's
> +default set.
> +
> +Index: daemon/Daemon.cpp
> +--- daemon/Daemon.cpp.orig
> ++++ daemon/Daemon.cpp
> +@@ -115,4 +115,3 @@
> +                             LogPrint(eLogDebug, "Use default pledge 
> values");
> +-                            // TODO: remove that not need
> +-                            pledge("stdio rpath wpath cpath inet dns unix 
> recvfd sendfd proc error mcast chown flock",nullptr);
> ++                            pledge("stdio rpath wpath cpath inet dns unix 
> proc flock", nullptr);
> +                     } else {


When I say "user review" I mean "actual review of the changes that it
intends to make", not "is it ok if I do some stuff as root from a shell
script that I'm not going to show you first"

Reply via email to