login.nix.txttxt · 63 linesall
# Copyright (c) 2019-2022, see AUTHORS. Licensed under MIT License, see LICENSE.

{ config, writeScript, writeText }:

let
  inherit (config.build) installationDir extraProotOptions;
  fakeProcStat = writeText "fakeProcStat" ''
    btime 0
  '';
  fakeProcUptime = writeText "fakeProcUptime" ''
    0.00 0.00
  '';
in

writeScript "login" ''
  #!/system/bin/sh
  # This file is generated by Nix-on-Droid. DO NOT EDIT.
  set -eu -o pipefail

  export USER="${config.user.userName}"
  export HOME="${config.user.home}"
  export PROOT_TMP_DIR=${installationDir}/tmp
  export PROOT_L2S_DIR=${installationDir}/.l2s

  if ! /system/bin/pgrep proot-static > /dev/null; then
    if test -e ${installationDir}/bin/.proot-static.new; then
      echo "Installing new proot-static..."
      /system/bin/mv ${installationDir}/bin/.proot-static.new ${installationDir}/bin/proot-static
    fi

    if test -e ${installationDir}/usr/lib/.login-inner.new; then
      echo "Installing new login-inner..."
      /system/bin/mv ${installationDir}/usr/lib/.login-inner.new ${installationDir}/usr/lib/login-inner
    fi
  fi

  if [ ! -r /proc/stat ] && [ -e ${installationDir}${fakeProcStat} ]; then
    BIND_PROC_STAT="-b ${installationDir}${fakeProcStat}:/proc/stat"
  else
    BIND_PROC_STAT=""
  fi

  if [ ! -r /proc/uptime ] && [ -e ${installationDir}${fakeProcUptime} ]; then
    BIND_PROC_UPTIME="-b ${installationDir}${fakeProcUptime}:/proc/uptime"
  else
    BIND_PROC_UPTIME=""
  fi

  exec ${installationDir}/bin/proot-static \
    -b ${installationDir}/nix:/nix \
    -b ${installationDir}/bin:/bin! \
    -b ${installationDir}/etc:/etc! \
    -b ${installationDir}/tmp:/tmp \
    -b ${installationDir}/usr:/usr \
    -b ${installationDir}/dev/shm:/dev/shm \
    $BIND_PROC_STAT \
    $BIND_PROC_UPTIME \
    -b /:/android \
    --link2symlink \
    --sysvipc \
    ${builtins.concatStringsSep " " extraProotOptions} \
    ${installationDir}/bin/sh ${installationDir}/usr/lib/login-inner "$@"
''