···
cp ${./setuid-wrapper.c} setuid-wrapper.c
+
gcc -Wall -O2 -DWRAPPER_DIR=\"/run/setuid-wrapper-dirs\" \
setuid-wrapper.c -o $out/bin/setuid-wrapper
···
source=/nix/var/nix/profiles/default/bin/${program}
+
cp ${setuidWrapper}/bin/setuid-wrapper $wrapperDir/${program}
+
echo -n "$source" > $wrapperDir/${program}.real
+
chmod 0000 $wrapperDir/${program} # to prevent races
+
chown ${owner}.${group} $wrapperDir/${program}
+
chmod "u${if setuid then "+" else "-"}s,g${if setgid then "+" else "-"}s,${permissions}" $wrapperDir/${program}
in stringAfter [ "users" ]
···
# programs to be wrapped.
SETUID_PATH=${config.system.path}/bin:${config.system.path}/sbin
+
mkdir -p /run/setuid-wrapper-dirs
+
wrapperDir=$(mktemp --directory --tmpdir=/run/setuid-wrapper-dirs setuid-wrappers.XXXXXXXXXX)
${concatMapStrings makeSetuidWrapper setuidPrograms}
+
if [ -L ${wrapperDir} ]; then
+
# Atomically replace the symlink
+
# See https://axialcorps.com/2013/07/03/atomically-replacing-files-and-directories/
+
old=$(readlink ${wrapperDir})
+
ln --symbolic --force --no-dereference $wrapperDir ${wrapperDir}-tmp
+
mv --no-target-directory ${wrapperDir}-tmp ${wrapperDir}
+
rm --force --recursive $old
+
elif [ -d ${wrapperDir} ]; then
+
# Compatibility with old state, just remove the folder and symlink
+
# if it happens to be a tmpfs
+
umount ${wrapperDir} || true
+
ln -d --symbolic $wrapperDir ${wrapperDir}
+
ln --symbolic $wrapperDir ${wrapperDir}