#!/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_LD_LIBRARY_PATH']    ||= '/lib/i386-linux-gnu:/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu/nss'
ENV['LSU_LINUX_PATH']               ||= '/bin:/usr/bin'
ENV['LSU_LINUX_LIBGL_DRIVERS_PATH'] ||= '/lib/i386-linux-gnu/dri:/lib/x86_64-linux-gnu/dri'

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'),
      File.join(LSU_IN_CHROOT, 'lib64'),
      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

exec(*wrapper, 'chroot', '-n', mroot,
  File.join(LSU_IN_CHROOT, 'bin/lsu-freebsd-to-linux-env'),
    '/bin/sh', '-c', 'cd "$1" && shift 1 && "$@"', '-', ENV['PWD'], *ARGV[1..-1])
