#!/bin/sh
#
# Copyright (c) 2017, Piotr Durlej
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#

set -e
i=0

exec > systab.tmp

cat << EOT

/* file generated by tabgen.sh; do not edit */

EOT

max=0
while read nr priv name
do
	[ "$nr" ] || continue
	[ "$nr" -gt "$max" ] && max="$nr"
	
	echo "extern int sys_$name();"
done < syslist

echo "#define NR_SYS\t$(expr "$max" + 1)" > systab.h.tmp

cat << EOT

struct syscall
{
	void *	proc;
	int	uidz;
} syscall_tab[$(expr "$max" + 1)] = 
{
EOT

while read nr priv name
do
	[ "$nr" ] || continue
	
	str="\t[$nr]\t= { sys_$name,"
	[ ${#name} -lt 15 ] && str="$str\t"
	[ ${#name} -lt 7  ] && str="$str\t"
	case "$priv" in
		root)
			str="$str\t1 },"
			;;
		user)
			str="$str\t0 },"
			;;
		*)
			echo "$0: wrong privilege level: $priv" >&2
			exit 1
			;;
	esac
	echo "$str"
done < syslist

cat << EOT
};
EOT

mv -f systab.h.tmp	systab.h
mv -f systab.tmp	systab.c
