#!/bin/bash -x

SYD_DIR='/srv/syd'
export SYZ_SYD_BIN="${SYD_DIR}/syd"

# Enable coredumps.
ulimit -c unlimited

# Enable quick boot for meaningful coredumps.
export SYD_QUICK_BOOT=1

# Disable Syd thread name randomization for meaningful coredumps.
export SYD_SKIP_NAME=1

# Save compressed core(5) dumps to SYD_DIR/core.
save_core() {
    t=$(date '+%s')
    mkdir -m700 -p "${SYD_DIR}/core"
    if ! mountpoint -q "${SYD_DIR}/core"; then
        mount -t 9p -o trans=virtio,version=9p2000.L sydcore "${SYD_DIR}/core"
    fi
    coredumpctl dump | xz -7e > "${SYD_DIR}/core/syd-${t}.core.xz"
    xz -7e < "$SYZ_SYD_BIN" > "${SYD_DIR}/core/syd-${t}.elf.xz"
}

# Mount private tmpfs(5) as executor work directory.
use_tmpdir() {
    mkdir -m1777 -p "${SYD_DIR}/tmp"
    if ! mountpoint -q "${SYD_DIR}/tmp"; then
        mount -t tmpfs tmpfs "${SYD_DIR}/tmp"
    fi
    cd "${SYD_DIR}/tmp"
}

case "${1:-}" in
  runner)
      use_tmpdir
      "${SYZ_SYD_BIN}" -pkcov /syz-executor.orig "$@"; r=$?
      save_core
      exit $r
      ;;
  *)
      exec /syz-executor.orig "$@"
      ;;
esac
