summary refs log tree commit diff
path: root/pkgs/build-support/trivial-builders.nix
diff options
context:
space:
mode:
authorNicolas Pierron <nicolas.b.pierron@gmail.com>2010-01-03 11:08:45 +0000
committerNicolas Pierron <nicolas.b.pierron@gmail.com>2010-01-03 11:08:45 +0000
commit9d62d5a35c8c1c2178e8f7c64b7575cd177c447d (patch)
tree23675add46a0457c15af5e1f369a75f923c6b730 /pkgs/build-support/trivial-builders.nix
parent1e0b14522ac929abb3f7d51480f2357b7a61b1aa (diff)
downloadnixpkgs-9d62d5a35c8c1c2178e8f7c64b7575cd177c447d.tar
nixpkgs-9d62d5a35c8c1c2178e8f7c64b7575cd177c447d.tar.gz
nixpkgs-9d62d5a35c8c1c2178e8f7c64b7575cd177c447d.tar.bz2
nixpkgs-9d62d5a35c8c1c2178e8f7c64b7575cd177c447d.tar.lz
nixpkgs-9d62d5a35c8c1c2178e8f7c64b7575cd177c447d.tar.xz
nixpkgs-9d62d5a35c8c1c2178e8f7c64b7575cd177c447d.tar.zst
nixpkgs-9d62d5a35c8c1c2178e8f7c64b7575cd177c447d.zip
* Add a wrapper to find any set-uid version of a program in the environment.
svn path=/nixpkgs/trunk/; revision=19181
Diffstat (limited to 'pkgs/build-support/trivial-builders.nix')
-rw-r--r--pkgs/build-support/trivial-builders.nix25
1 files changed, 25 insertions, 0 deletions
diff --git a/pkgs/build-support/trivial-builders.nix b/pkgs/build-support/trivial-builders.nix
index cbbc5ae0628..25ae340629b 100644
--- a/pkgs/build-support/trivial-builders.nix
+++ b/pkgs/build-support/trivial-builders.nix
@@ -73,4 +73,29 @@ rec {
   linkFarm = name: entries: runCommand name {} ("mkdir -p $out; cd $out; \n" +
     (stdenv.lib.concatMapStrings (x: "ln -s '${x.path}' '${x.name}';\n") entries));
 
+  # 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 = stdenv.lib.basename 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} "$@"
+      '';
+
 }