1
0
mirror of synced 2026-01-27 20:57:19 +00:00
Files
Interlisp.medley/scripts/medley/medley_run.sh

341 lines
8.6 KiB
Bash

#!only-to-be-sourced
# shellcheck shell=sh
# shellcheck disable=SC2154,SC2164,SC2086
###############################################################################
#
# medley_run.sh - script for processing actually running maiko/medley
# for the medley.sh script.
#
# !!!! This script is meant to be SOURCEd from the scripts/medley.sh script.
# !!!! It should not be run as a standlone script.
#
# 2024-04-21 Frank Halasz
#
# Copyright 2024 Interlisp.org
#
###############################################################################
# Figure out LOGINDIR situation
if [ -z "${logindir_arg}" ]
then
LOGINDIR="${HOME}/il"
else
LOGINDIR="${logindir_arg}"
fi
export LOGINDIR
if [ ! -e "${LOGINDIR}" ];
then
mkdir -p "${LOGINDIR}"
elif [ ! -d "${LOGINDIR}" ];
then
echo "ERROR: Medley requires a directory named ${LOGINDIR}."
echo "But ${LOGINDIR} exists but appears not be a directory."
echo "Exiting"
exit 2
fi
mkdir -p "${LOGINDIR}"/vmem
# Set LDEDESTSYSOUT env variable based on id
# if LDEDESRTSYSOUT has not already been set
# during arg processing
if [ -z "${vmem_arg}" ]
then
if [ "${run_id}" = "default" ]
then
LDEDESTSYSOUT="${LOGINDIR}/vmem/lisp.virtualmem"
else
LDEDESTSYSOUT="${LOGINDIR}/vmem/lisp_${run_id}.virtualmem"
fi
else
LDEDESTSYSOUT="${vmem_arg}"
fi
export LDEDESTSYSOUT
# Figure out the sysout situation
loadups_dir="${MEDLEYDIR}/loadups"
if [ -z "${sysout_arg}" ]
then
if [ -f "${LDEDESTSYSOUT}" ]
then
src_sysout="${LDEDESTSYSOUT}"
else
src_sysout="${loadups_dir}/full.sysout"
fi
else
case "${sysout_arg}" in
lisp | full | apps)
if [ ! -d "${loadups_dir}" ]
then
err_msg="Error: The sysout argument --${sysout_arg} was specified in ${sysout_stage},
but the directory \"${loadups_dir}\" where ${sysout_arg}.sysout is supposed to be located
cannot be found.
Exiting."
output_error_msg "${err_msg}"
exit 62
fi
src_sysout="${loadups_dir}/${sysout_arg}.sysout"
;;
*)
src_sysout="${sysout_arg}"
;;
esac
fi
if [ ! -f "${src_sysout}" ]
then
err_msg="Error: Cannot find the specified sysout file \"${src_sysout}\".
Exiting."
output_error_msg "${err_msg}"
fi
# Figure out screensize and geometry based on arguments
# shellcheck source=./medley_geometry.sh
. "${SCRIPTDIR}/medley_geometry.sh"
# Figure out border width situation
borderwidth_flag=""
borderwidth_value=""
if [ -n "${borderwidth_arg}" ]
then
borderwidth_flag="-bw"
borderwidth_value="${borderwidth_arg}"
fi
# Figure out pixelscale situation
pixelscale_flag=""
pixelscale_value=""
if [ -n "${pixelscale_arg}" ]
then
pixelscale_flag="-pixelscale"
pixelscale_value="${pixelscale_arg}"
fi
# figure out greet files situation
if [ -z "${greet_arg}" ]
then
if [ "${sysout_arg}" = "apps" ]
then
LDEINIT="${MEDLEYDIR}/greetfiles/APPS-INIT.LCOM"
else
LDEINIT="${MEDLEYDIR}/greetfiles/MEDLEYDIR-INIT.LCOM"
fi
else
if [ "${greet_arg}" = "--nogreet--" ]
then
LDEINIT="${MEDLEYDIR}/greetfiles/NOGREET"
else
LDEINIT="${greet_arg}"
fi
fi
export LDEINIT
# figure out noscroll situation
noscroll_arg=""
if [ "${noscroll}" = true ]
then
noscroll_arg="-noscroll"
fi
# figure out -m situatiom
mem_flag=""
mem_value=""
if [ -n "${mem_arg}" ]
then
mem_flag="-m"
mem_value="${mem_arg}"
fi
# figure out the nethub situation
nh_host_flag=""
nh_host_value=""
nh_port_flag=""
nh_port_value=""
nh_mac_flag=""
nh_mac_value=""
nh_debug_flag=""
nh_debug_value=""
if [ -n "${nh_host_arg}" ]
then
nh_host_flag="-nh-host"
nh_host_value="${nh_host_arg}"
if [ -n "${nh_port_arg}" ]
then
nh_port_flag="-nh-port"
nh_port_value="${nh_port_arg}"
fi
if [ -n "${nh_mac_arg}" ]
then
nh_mac_flag="-nh-mac"
nh_mac_value="${nh_mac_arg}"
fi
if [ -n "${nh_debug_arg}" ]
then
nh_debug_flag="-nh-loglevel"
nh_debug_value="${nh_debug_arg}"
fi
fi
# figure out the keyboard type
if [ -z "${LDEKBDTYPE}" ]; then
export LDEKBDTYPE="X"
fi
# figure out title situation
if [ -z "${title}" ]
then
title="Medley Interlisp %i"
fi
if [ ! "${run_id}" = default ]
then
title="$(printf %s "${title}" | sed -e "s/%i/:: ${run_id}/")"
else
title="$(printf %s "${title}" | sed -e "s/%i//")"
fi
# Figure out the maiko executable name
# used for loadups (ldeinit)
if [ -z "${maikoprog_arg}" ]
then
maikoprog_arg="lde"
fi
# Figure out the maiko directory maiko
check_if_maiko_dir () {
if [ -d "$1" ] \
&& [ -d "$1/bin" ] \
&& [ -x "$1/bin/osversion" ] \
&& [ -x "$1/bin/machinetype" ]
then
maiko_exe_subdir="$("$1/bin/osversion").$("$1/bin/machinetype")"
return 0
fi
return 1
}
check_for_maiko_exe () {
if ! check_if_maiko_dir "$1"
then
return 1
fi
maiko_exe="$1/${maiko_exe_subdir}/${maikoprog_arg}"
if [ -x "${maiko_exe}" ]
then
return 0
else
maiko_exe=""
return 1
fi
}
if [ -z "${maikodir_arg}" ]
then
if check_for_maiko_exe "${MEDLEYDIR}/maiko"
then
maikodir_arg="${MEDLEYDIR}/maiko"
elif check_for_maiko_exe "${MEDLEYDIR}/../maiko"
then
maikodir_arg="$(cd "${MEDLEYDIR}/../maiko"; pwd)"
else
if ! check_if_maiko_dir "${MEDLEYDIR}/maiko" && ! check_if_maiko_dir "${MEDLEYDIR}/../maiko"
then
err_msg="ERROR: Cannot find the Maiko directory at either
\"${MEDLEYDIR}/maiko\" or \"${MEDLEYDIR}/../maiko\".
You can use the --maikodir argument to specify the Maiko directory.
Exiting."
output_error_msg "${err_msg}"
exit 53
else
err_msg="ERROR: Cannot find the Maiko executable (${maiko_exe_subdir}/${maikoprog_arg}) in either
\"${MEDLEYDIR}/maiko\" or \"${MEDLEYDIR}/../maiko\".
Exiting."
output_error_msg "${err_msg}"
exit 54
fi
fi
elif ! check_if_maiko_dir "${maikodir_arg}" || ! check_for_maiko_exe "${maikodir_arg}"
then
err_msg="In ${maikodir_stage}:
ERROR: The value of the --maikodir argument is not in fact a directory containing
the Maiko emulator (${maiko_exe_subdir}/${maikoprog_arg}).
Exiting."
output_error_msg "${err_msg}"
exit 53
fi
maiko="${maiko_exe}"
# Define function to start up maiko given all arguments
# Arg to this function should be "$@", the main args
# array that at this point should just include the pass-on args
start_maiko() {
echo \
\"${maiko}\" \"${src_sysout}\" \
-id \"${run_id}\" \
-title \"${title}\" \
-g ${geometry} \
-sc ${screensize} \
${borderwidth_flag} ${borderwidth_value} \
${pixelscale_flag} ${pixelscale_value} \
${noscroll_arg} \
${mem_flag} ${mem_value} \
${nh_host_flag} ${nh_host_value} \
${nh_port_flag} ${nh_port_value} \
${nh_mac_flag} ${nh_mac_value} \
${nh_debug_flag} ${nh_debug_value} \
${nofork_arg} \
"$@" ;
echo "MEDLEYDIR: \"${MEDLEYDIR}\""
echo "LOGINDIR: \"${LOGINDIR}\""
echo "GREET FILE: \"${LDEINIT}\""
echo "VMEM FILE: \"${LDEDESTSYSOUT}\""
#
# Temp workaround for issues in Maiko sysout arg
# processing. See Issue #1702. FGH 2024-05-09
#
LDESOURCESYSOUT="${src_sysout}"
export LDESOURCESYSOUT
#
# End work around
#
"${maiko}" "${src_sysout}" \
-id "${run_id}" \
-title "${title}" \
-g "${geometry}" \
-sc "${screensize}" \
${borderwidth_flag} ${borderwidth_value} \
${pixelscale_flag} ${pixelscale_value} \
${noscroll_arg} \
${mem_flag} ${mem_value} \
${nh_host_flag} ${nh_host_value} \
${nh_port_flag} ${nh_port_value} \
${nh_mac_flag} ${nh_mac_value} \
${nh_debug_flag} ${nh_debug_value} \
${nofork_arg} \
"$@" ;
exit_code=$?
}
# temp fix for cygwin to workaround issue #1685
# 2024-04-29
if [ "${cygwin}" = true ]
then
MEDLEYDIR="${MEDLEYDIR}/"
fi
# Run maiko either directly or with vnc
if [ "${wsl}" = true ] && [ "${use_vnc}" = true ]
then
# do the vnc thing on wsl (if called for)
# shellcheck source=./medley_vnc.sh
. "${SCRIPTDIR}/medley_vnc.sh"
else
# If not using vnc, just exec maiko directly
# handing over the pass-on args which are all thats left in the main args array
start_maiko "$@"
fi
exit ${exit_code}