#!/usr/bin/env ruby
# encoding: UTF-8

require_relative '.utils'

if `sysctl -nq security.bsd.unprivileged_chroot`.to_i != 1
  perr "This script requires security.bsd.unprivileged_chroot=1"
  exit(1)
end

if ARGV.length < 2
  perr "lsu-run-in-chroot <steam runtime dir> <executable>"
  exit(1)
end

SLR_NAME_OR_PATH = ARGV[0]

if !system(File.join(__dir__, 'lsu-mount-runtime'), SLR_NAME_OR_PATH)
  perr "Unable to prepare chroot dir"
  exit(1)
end

mroot = File.join(LSU_TMPDIR_PATH, File.basename(SLR_NAME_OR_PATH))

ENV['LSU_LINUX_PATH'] ||= '/bin:/usr/bin'
Dir.chdir(File.join(mroot, 'lib/x86_64-linux-gnu')) do
  if `readelf -s libc.so.6 | grep GLIBC_2.34`.chomp == ''
    pwarn 'Found glibc < 2.34, preloading shmfix.so'
    ENV['LSU_LINUX_LD_LIBRARY_PATH'] = [
      File.join(LSU_IN_CHROOT, 'lib32/shmfix'),
      File.join(LSU_IN_CHROOT, 'lib64/shmfix'),
      ENV['LSU_LINUX_LD_LIBRARY_PATH']
    ].compact.join(':')
    ENV['LSU_LINUX_LD_PRELOAD'] = ['shmfix.so', ENV['LSU_LINUX_LD_PRELOAD']].compact.join(':')
  end
end

wrapper = case ENV['LSU_DEBUG']
  when 'ktrace'
    ['/usr/bin/ktrace', '-i', '-d']
  else
    []
end

command = [
  '. "$1" && cd "$2" && shift 2 && exec "$@"',
  '-',
  File.join(LSU_IN_CHROOT, 'bin/lsu-freebsd-to-linux-env.sh'),
  ENV['PWD'],
  *ARGV[1..-1]
]

# yes, Linux /bin/sh receives FreeBSD LD_* and PATH vars here,
# fortunately that is mostly benign
exec(*wrapper, 'chroot', '-n', mroot, '/bin/sh', '-c', *command)
