summary refs log tree commit diff
path: root/pkgs/os-specific/linux/pam_usb/default.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-09-27 14:18:26 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-09-29 13:05:28 +0200
commitc5ddb7dd56d9eb71cbe0430bcf85596d298caef8 (patch)
tree8e73568ce2758af4f217637c9b257d5ed9f15650 /pkgs/os-specific/linux/pam_usb/default.nix
parent030e20f759d5a4e4962eabd4069fd06ae059e6f3 (diff)
downloadnixpkgs-c5ddb7dd56d9eb71cbe0430bcf85596d298caef8.tar
nixpkgs-c5ddb7dd56d9eb71cbe0430bcf85596d298caef8.tar.gz
nixpkgs-c5ddb7dd56d9eb71cbe0430bcf85596d298caef8.tar.bz2
nixpkgs-c5ddb7dd56d9eb71cbe0430bcf85596d298caef8.tar.lz
nixpkgs-c5ddb7dd56d9eb71cbe0430bcf85596d298caef8.tar.xz
nixpkgs-c5ddb7dd56d9eb71cbe0430bcf85596d298caef8.tar.zst
nixpkgs-c5ddb7dd56d9eb71cbe0430bcf85596d298caef8.zip
Move useSetUID to pam_usb, the only place where it's used
Diffstat (limited to 'pkgs/os-specific/linux/pam_usb/default.nix')
-rw-r--r--pkgs/os-specific/linux/pam_usb/default.nix28
1 files changed, 27 insertions, 1 deletions
diff --git a/pkgs/os-specific/linux/pam_usb/default.nix b/pkgs/os-specific/linux/pam_usb/default.nix
index a96e951bf9b..cedb9bca1a0 100644
--- a/pkgs/os-specific/linux/pam_usb/default.nix
+++ b/pkgs/os-specific/linux/pam_usb/default.nix
@@ -1,6 +1,32 @@
-{stdenv, fetchurl, makeWrapper, useSetUID, dbus, libxml2, pam, pkgconfig, pmount, pythonPackages}:
+{ stdenv, fetchurl, makeWrapper, useSetUID, dbus, libxml2, pam, pkgconfig, pmount, pythonPackages, writeScript }:
 
 let
+
+  # Search in the environment if the same program exists with a set uid or
+  # set gid bit.  If it exists, run the first program found, otherwise run
+  # the default binary.
+  useSetUID = drv: path:
+    let
+      name = baseNameOf path;
+      bin = "${drv}${path}";
+    in assert name != "";
+      writeScript "setUID-${name}" ''
+        #!${stdenv.shell}
+        inode=$(stat -Lc %i ${bin})
+        for file in $(type -ap ${name}); do
+          case $(stat -Lc %a $file) in
+            ([2-7][0-7][0-7][0-7])
+              if test -r "$file".real; then
+                orig=$(cat "$file".real)
+                if test $inode = $(stat -Lc %i "$orig"); then
+                  exec "$file" "$@"
+                fi
+              fi;;
+          esac
+        done
+        exec ${bin} "$@"
+      '';
+
   pmountBin = useSetUID pmount "/bin/pmount";
   pumountBin = useSetUID pmount "/bin/pumount";
   inherit (pythonPackages) python dbus-python;