Merge pull request 'fix minifakeroot on macos' (#2542) from minifakeroot into main
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
zt-tcp-relay = pkgs.callPackage ./zt-tcp-relay { };
|
||||
moonlight-sunshine-accept = pkgs.callPackage ./moonlight-sunshine-accept { };
|
||||
merge-after-ci = pkgs.callPackage ./merge-after-ci { inherit (config.packages) tea-create-pr; };
|
||||
minifakeroot = pkgs.callPackage ./minifakeroot { };
|
||||
pending-reviews = pkgs.callPackage ./pending-reviews { };
|
||||
editor = pkgs.callPackage ./editor/clan-edit-codium.nix { };
|
||||
classgen = pkgs.callPackage ./classgen { };
|
||||
|
||||
18
pkgs/minifakeroot/default.nix
Normal file
18
pkgs/minifakeroot/default.nix
Normal file
@@ -0,0 +1,18 @@
|
||||
{ stdenv }:
|
||||
let
|
||||
varName = if stdenv.isDarwin then "DYLD_INSERT_LIBRARIES" else "LD_PRELOAD";
|
||||
linkerFlags = if stdenv.isDarwin then "-dynamiclib" else "-shared";
|
||||
sharedLibrary = stdenv.hostPlatform.extensions.sharedLibrary;
|
||||
in
|
||||
stdenv.mkDerivation {
|
||||
name = "minifakeroot";
|
||||
dontUnpack = true;
|
||||
installPhase = ''
|
||||
mkdir -p $out/lib
|
||||
$CC ${linkerFlags} -o $out/lib/libfakeroot${sharedLibrary} ${./main.c}
|
||||
mkdir -p $out/share/minifakeroot
|
||||
cat > $out/share/minifakeroot/rc <<EOF
|
||||
export ${varName}=$out/lib/libfakeroot${sharedLibrary}
|
||||
EOF
|
||||
'';
|
||||
}
|
||||
32
pkgs/minifakeroot/main.c
Normal file
32
pkgs/minifakeroot/main.c
Normal file
@@ -0,0 +1,32 @@
|
||||
#include <stdint.h>
|
||||
#ifdef __APPLE__
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
typedef uint32_t uid_t;
|
||||
|
||||
#ifdef __APPLE__
|
||||
struct dyld_interpose {
|
||||
const void * replacement;
|
||||
const void * replacee;
|
||||
};
|
||||
#define WRAPPER(ret, name) static ret _fakeroot_wrapper_##name
|
||||
#define WRAPPER_DEF(name) \
|
||||
__attribute__((used)) static struct dyld_interpose _fakeroot_interpose_##name \
|
||||
__attribute__((section("__DATA,__interpose"))) = { &_fakeroot_wrapper_##name, &name };
|
||||
#else
|
||||
#define WRAPPER(ret, name) ret name
|
||||
#define WRAPPER_DEF(name)
|
||||
#endif
|
||||
|
||||
WRAPPER(uid_t, geteuid)(const char * path, int flags, ...)
|
||||
{
|
||||
return 0; // Fake root
|
||||
}
|
||||
WRAPPER_DEF(geteuid)
|
||||
|
||||
WRAPPER(uid_t, getuid)(const char * path, int flags, ...)
|
||||
{
|
||||
return 0; // Fake root
|
||||
}
|
||||
WRAPPER_DEF(getuid)
|
||||
Reference in New Issue
Block a user