makesyscalls.sh revision 14331
11541Srgrimes#! /bin/sh -
21541Srgrimes#	@(#)makesyscalls.sh	8.1 (Berkeley) 6/10/93
314331Speter# $Id: makesyscalls.sh,v 1.16 1995/10/07 23:56:18 swallace Exp $
41541Srgrimes
51541Srgrimesset -e
61541Srgrimes
71541Srgrimes# name of compat option:
81541Srgrimescompat=COMPAT_43
91541Srgrimes
101541Srgrimes# output files:
111541Srgrimessysnames="syscalls.c"
1210905Sbdesysproto="../sys/sysproto.h"
1310905Sbdesysproto_h=_SYS_SYSPROTO_H_
141541Srgrimessyshdr="../sys/syscall.h"
151541Srgrimessyssw="init_sysent.c"
162700Swollmansyshide="../sys/syscall-hide.h"
1711294Sswallacesyscallprefix="SYS_"
1811294Sswallaceswitchname="sysent"
1911294Sswallacenamesname="syscallnames"
201541Srgrimes
211541Srgrimes# tmp files:
221541Srgrimessysdcl="sysent.dcl"
231541Srgrimessyscompat="sysent.compat"
2411294Sswallacesyscompatdcl="sysent.compatdcl"
251541Srgrimessysent="sysent.switch"
2611294Sswallacesysinc="sysinc.switch"
2711294Sswallacesysarg="sysarg.switch"
281541Srgrimes
2911294Sswallacetrap "rm $sysdcl $syscompat $syscompatdcl $sysent $sysinc $sysarg" 0
301541Srgrimes
311541Srgrimescase $# in
3211294Sswallace    0)	echo "Usage: $0 input-file <config-file>" 1>&2
331541Srgrimes	exit 1
341541Srgrimes	;;
351541Srgrimesesac
361541Srgrimes
3711294Sswallaceif [ -f $2 ]; then
3811294Sswallace	. $2
3911294Sswallacefi
4011294Sswallace
4111294Sswallacesed -e '
4211294Sswallaces/\$//g
4311294Sswallace:join
4411294Sswallace	/\\$/{a\
4511294Sswallace
4611294Sswallace	N
4711294Sswallace	s/\\\n//
4811294Sswallace	b join
4911294Sswallace	}
5011294Sswallace2,${
5111294Sswallace	/^#/!s/\([{}()*,]\)/ \1 /g
5211294Sswallace}
5311294Sswallace' < $1 | awk "
541541Srgrimes	BEGIN {
551541Srgrimes		sysdcl = \"$sysdcl\"
5610905Sbde		sysproto = \"$sysproto\"
5710905Sbde		sysproto_h = \"$sysproto_h\"
581541Srgrimes		syscompat = \"$syscompat\"
5911294Sswallace		syscompatdcl = \"$syscompatdcl\"
601541Srgrimes		sysent = \"$sysent\"
6111294Sswallace		sysinc = \"$sysinc\"
6211294Sswallace		sysarg = \"$sysarg\"
631541Srgrimes		sysnames = \"$sysnames\"
641541Srgrimes		syshdr = \"$syshdr\"
651541Srgrimes		compat = \"$compat\"
662700Swollman		syshide = \"$syshide\"
6711294Sswallace		syscallprefix = \"$syscallprefix\"
6811294Sswallace		switchname = \"$switchname\"
6911294Sswallace		namesname = \"$namesname\"
701541Srgrimes		infile = \"$1\"
711541Srgrimes		"'
721541Srgrimes
7311294Sswallace		printf "/*\n * System call switch table.\n *\n" > sysinc
7411294Sswallace		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysinc
7510905Sbde
7611294Sswallace		printf "/*\n * System call prototypes.\n *\n" > sysarg
7711294Sswallace		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarg
781541Srgrimes
7910905Sbde		printf "\n#ifdef %s\n\n", compat > syscompat
801541Srgrimes
811541Srgrimes		printf "/*\n * System call names.\n *\n" > sysnames
821541Srgrimes		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
831541Srgrimes
841541Srgrimes		printf "/*\n * System call numbers.\n *\n" > syshdr
851541Srgrimes		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
862700Swollman		printf "/*\n * System call hiders.\n *\n" > syshide
872700Swollman		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshide
881541Srgrimes	}
891541Srgrimes	NR == 1 {
9010906Sbde		gsub("[$]Id: ", "", $0)
9110906Sbde		gsub(" [$]", "", $0)
9211294Sswallace
9311294Sswallace		printf " * created from%s\n */\n\n", $0 > sysinc
9411294Sswallace
9511294Sswallace		printf "\n#ifdef %s\n", compat > sysent
9610905Sbde		printf "#define compat(n, name) n, (sy_call_t *)__CONCAT(o,name)\n" > sysent
9710905Sbde		printf("#else\n") > sysent
9810905Sbde		printf("#define compat(n, name) 0, (sy_call_t *)nosys\n") > sysent
9910905Sbde		printf("#endif\n\n") > sysent
10010905Sbde		printf("/* The casts are bogus but will do for now. */\n") > sysent
10111294Sswallace		printf "struct sysent %s[] = {\n",switchname > sysent
10210905Sbde
10311294Sswallace		printf " * created from%s\n */\n\n", $0 > sysarg
10411294Sswallace		printf("#ifndef %s\n", sysproto_h) > sysarg
10511294Sswallace		printf("#define\t%s\n\n", sysproto_h) > sysarg
10611294Sswallace		printf "#include <sys/types.h>\n", $0 > sysarg
10711294Sswallace		printf "#include <sys/param.h>\n", $0 > sysarg
10811294Sswallace		printf "#include <sys/mount.h>\n\n", $0 > sysarg
1091541Srgrimes
1101541Srgrimes		printf " * created from%s\n */\n\n", $0 > sysnames
11111294Sswallace		printf "char *%s[] = {\n", namesname > sysnames
1121541Srgrimes
1131541Srgrimes		printf " * created from%s\n */\n\n", $0 > syshdr
1142700Swollman
1152700Swollman		printf " * created from%s\n */\n\n", $0 > syshide
1161541Srgrimes		next
1171541Srgrimes	}
1181541Srgrimes	NF == 0 || $1 ~ /^;/ {
1191541Srgrimes		next
1201541Srgrimes	}
12111294Sswallace	$1 ~ /^#[ 	]*include/ {
12211294Sswallace		print > sysinc
12311294Sswallace		next
12411294Sswallace	}
1251541Srgrimes	$1 ~ /^#[ 	]*if/ {
1261541Srgrimes		print > sysent
1271541Srgrimes		print > sysdcl
12811294Sswallace		print > sysarg
1291541Srgrimes		print > syscompat
1301541Srgrimes		print > sysnames
1312700Swollman		print > syshide
1321541Srgrimes		savesyscall = syscall
1331541Srgrimes		next
1341541Srgrimes	}
1351541Srgrimes	$1 ~ /^#[ 	]*else/ {
1361541Srgrimes		print > sysent
1371541Srgrimes		print > sysdcl
13811294Sswallace		print > sysarg
1391541Srgrimes		print > syscompat
1401541Srgrimes		print > sysnames
1412700Swollman		print > syshide
1421541Srgrimes		syscall = savesyscall
1431541Srgrimes		next
1441541Srgrimes	}
1451541Srgrimes	$1 ~ /^#/ {
1461541Srgrimes		print > sysent
1471541Srgrimes		print > sysdcl
14811294Sswallace		print > sysarg
1491541Srgrimes		print > syscompat
1501541Srgrimes		print > sysnames
1512700Swollman		print > syshide
1521541Srgrimes		next
1531541Srgrimes	}
1541541Srgrimes	syscall != $1 {
1551541Srgrimes		printf "%s: line %d: syscall number out of sync at %d\n", \
1561541Srgrimes		   infile, NR, syscall
1571541Srgrimes		printf "line is:\n"
1581541Srgrimes		print
1591541Srgrimes		exit 1
1601541Srgrimes	}
16111294Sswallace	function parserr(was, wanted) {
16211294Sswallace		printf "%s: line %d: unexpected %s (expected %s)\n", \
16311294Sswallace		    infile, NR, was, wanted
16411294Sswallace		exit 1
16511294Sswallace	}
16611294Sswallace	function parseline() {
16711294Sswallace		f=4			# toss number and type
16811294Sswallace		argc= 0;
16911294Sswallace		bigargc = 0;
17011294Sswallace		if ($NF != "}") {
17111294Sswallace			funcalias=$(NF-2)
17211294Sswallace			argalias=$(NF-1)
17311294Sswallace			rettype=$NF
17411294Sswallace			end=NF-3
17511294Sswallace		} else {
17611294Sswallace			funcalias=""
17711294Sswallace			argalias=""
17811294Sswallace			rettype="int"
17911294Sswallace			end=NF
18010905Sbde		}
18111294Sswallace		if ($2 == "NODEF") {
18211294Sswallace			funcname=$4
18311294Sswallace			return
18411294Sswallace		}
18511294Sswallace		if ($f != "{")
18611294Sswallace			parserr($f, "{")
18711294Sswallace		f++
18811294Sswallace		if ($end != "}")
18911294Sswallace			parserr($end, "}")
19011294Sswallace		end--
19111294Sswallace		if ($end != ";")
19211294Sswallace			parserr($end, ";")
19311294Sswallace		end--
19411294Sswallace		if ($end != ")")
19511294Sswallace			parserr($end, ")")
19611294Sswallace		end--
19711294Sswallace
19811294Sswallace		f++	#function return type
19911294Sswallace
20011294Sswallace		funcname=$f
20111294Sswallace		if (funcalias == "")
20211294Sswallace			funcalias = funcname
20311294Sswallace		if (argalias == "") {
20411294Sswallace			argalias = funcname "_args"
20511330Sswallace			if ($2 == "COMPAT")
20611330Sswallace				argalias = "o" argalias
20711294Sswallace		}
20811294Sswallace		f++
20911294Sswallace
21011294Sswallace		if ($f != "(")
21111294Sswallace			parserr($f, ")")
21211294Sswallace		f++
21311294Sswallace
21411294Sswallace		if (f == end) {
21511294Sswallace			if ($f != "void")
21611294Sswallace				parserr($f, "argument definition")
21711294Sswallace			return
21811294Sswallace		}
21911294Sswallace
22011294Sswallace		while (f <= end) {
22111294Sswallace			argc++
22211294Sswallace			argtype[argc]=""
22311294Sswallace			oldf=""
22411294Sswallace			while (f < end && $(f+1) != ",") {
22511294Sswallace				if (argtype[argc] != "" && oldf != "*")
22611294Sswallace					argtype[argc] = argtype[argc]" ";
22711294Sswallace				argtype[argc] = argtype[argc]$f;
22811294Sswallace				oldf = $f;
22911294Sswallace				f++
23011294Sswallace			}
23111294Sswallace			if (argtype[argc] == "")
23211294Sswallace				parserr($f, "argument definition")
23311294Sswallace			if (argtype[argc] == "off_t")
23411294Sswallace				bigargc++
23511294Sswallace			argname[argc]=$f;
23611294Sswallace			f += 2;			# skip name, and any comma
23711294Sswallace		}
2381541Srgrimes	}
23911294Sswallace	{	comment = $4
24011294Sswallace		if (NF < 7)
24111294Sswallace			for (i = 5; i <= NF; i++)
24211294Sswallace				comment = comment " " $i
24311294Sswallace	}
24411294Sswallace	$2 == "STD" || $2 == "NODEF" || $2 == "NOARGS"  || $2 == "NOPROTO" {
24511294Sswallace		parseline()
24611330Sswallace		if ((!nosys || funcname != "nosys") && \
24711330Sswallace		    (funcname != "lkmnosys")) {
24811294Sswallace			if (argc != 0 && $2 != "NOARGS" && $2 != "NOPROTO") {
24911294Sswallace				printf("struct\t%s {\n", argalias) > sysarg
25011294Sswallace				for (i = 1; i <= argc; i++)
25111294Sswallace					printf("\t%s %s;\n", argtype[i],
25211294Sswallace					    argname[i]) > sysarg
25311294Sswallace				printf("};\n") > sysarg
25411294Sswallace			}
25511330Sswallace			else if($2 != "NOARGS" && $2 != "NOPROTO")
25611330Sswallace				printf("struct\t%s {\n\tint dummy;\n};\n", \
25711330Sswallace					argalias) > sysarg
25810905Sbde		}
25911330Sswallace		if ($2 != "NOPROTO" && (!nosys || funcname != "nosys") && \
26011330Sswallace		    (!lkmnosys || funcname != "lkmnosys")) {
26111330Sswallace			if (funcname == "exit")
26211330Sswallace				printf("__dead ") > sysdcl
26311330Sswallace			printf("%s\t%s __P((struct proc *, struct %s *, int []));\n", \
26411330Sswallace			    rettype, funcname, argalias) > sysdcl
26511330Sswallace		}
26611294Sswallace		if (funcname == "nosys")
2672671Sats			nosys = 1
26811294Sswallace		if (funcname == "lkmnosys")
2694216Sats			lkmnosys = 1
27011294Sswallace		printf("\t{ %d, (sy_call_t *)%s },\t\t", \
27111294Sswallace		    argc+bigargc, funcname) > sysent
27211294Sswallace		if(length(funcname) < 11)
27311294Sswallace			printf("\t") > sysent
27411294Sswallace		printf("/* %d = %s */\n", syscall, funcalias) > sysent
2751541Srgrimes		printf("\t\"%s\",\t\t\t/* %d = %s */\n", \
27611294Sswallace		    funcalias, syscall, funcalias) > sysnames
27711294Sswallace		if ($2 != "NODEF")
27811294Sswallace			printf("#define\t%s%s\t%d\n", syscallprefix, \
27911294Sswallace		    	    funcalias, syscall) > syshdr
28011294Sswallace		if ($3 != "NOHIDE")
28111294Sswallace			printf("HIDE_%s(%s)\n", $3, funcname) > syshide
2821541Srgrimes		syscall++
2831541Srgrimes		next
2841541Srgrimes	}
28511330Sswallace	$2 == "COMPAT" || $2 == "CPT_NOA" {
28611294Sswallace		parseline()
28711330Sswallace		if (argc != 0 && $2 != "CPT_NOA") {
28811294Sswallace			printf("struct\t%s {\n", argalias) > syscompat
28911294Sswallace			for (i = 1; i <= argc; i++)
29011294Sswallace				printf("\t%s %s;\n", argtype[i],
29111294Sswallace				    argname[i]) > syscompat
29211294Sswallace			printf("};\n") > syscompat
29311294Sswallace		}
29411330Sswallace		else if($2 != "CPT_NOA")
29511330Sswallace			printf("struct\t%s {\n\tint dummy;\n};\n", \
29611330Sswallace				argalias) > sysarg
29710905Sbde		printf("%s\to%s __P((struct proc *, struct %s *, int []));\n", \
29811294Sswallace		    rettype, funcname, argalias) > syscompatdcl
2991541Srgrimes		printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \
30011294Sswallace		    argc+bigargc, funcname, syscall, funcalias) > sysent
3011541Srgrimes		printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
30211294Sswallace		    funcalias, syscall, funcalias) > sysnames
3031541Srgrimes		printf("\t\t\t\t/* %d is old %s */\n", \
30411294Sswallace		    syscall, funcalias) > syshdr
30511294Sswallace		if ($3 != "NOHIDE")
30611294Sswallace			printf("HIDE_%s(%s)\n", $3, funcname) > syshide
3071541Srgrimes		syscall++
3081541Srgrimes		next
3091541Srgrimes	}
3101541Srgrimes	$2 == "LIBCOMPAT" {
31111294Sswallace		parseline()
31211294Sswallace		printf("%s\to%s();\n", rettype, funcname) > syscompatdcl
3131541Srgrimes		printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \
31411294Sswallace		    argc+bigargc, funcname, syscall, funcalias) > sysent
3151541Srgrimes		printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
31611294Sswallace		    funcalias, syscall, funcalias) > sysnames
31711294Sswallace		printf("#define\t%s%s\t%d\t/* compatibility; still used by libc */\n", \
31811294Sswallace		    syscallprefix, funcalias, syscall) > syshdr
31911294Sswallace		if ($3 != "NOHIDE")
32011294Sswallace			printf("HIDE_%s(%s)\n", $3, funcname) > syshide
3211541Srgrimes		syscall++
3221541Srgrimes		next
3231541Srgrimes	}
3241541Srgrimes	$2 == "OBSOL" {
32510905Sbde		printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = obsolete %s */\n", \
3261541Srgrimes		    syscall, comment) > sysent
3271541Srgrimes		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", \
32811294Sswallace		    $4, syscall, comment) > sysnames
3291541Srgrimes		printf("\t\t\t\t/* %d is obsolete %s */\n", \
3301541Srgrimes		    syscall, comment) > syshdr
33111294Sswallace		if ($3 != "NOHIDE")
33211294Sswallace			printf("HIDE_%s(%s)\n", $3, $4) > syshide
3331541Srgrimes		syscall++
3341541Srgrimes		next
3351541Srgrimes	}
3361541Srgrimes	$2 == "UNIMPL" {
33710905Sbde		printf("\t{ 0, (sy_call_t *)nosys },\t\t\t/* %d = %s */\n", \
3381541Srgrimes		    syscall, comment) > sysent
3391541Srgrimes		printf("\t\"#%d\",\t\t\t/* %d = %s */\n", \
3401541Srgrimes		    syscall, syscall, comment) > sysnames
34111294Sswallace		if ($3 != "NOHIDE")
34211294Sswallace			printf("HIDE_%s(%s)\n", $3, $4) > syshide
3431541Srgrimes		syscall++
3441541Srgrimes		next
3451541Srgrimes	}
3461541Srgrimes	{
3471541Srgrimes		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
3481541Srgrimes		exit 1
3491541Srgrimes	}
3501541Srgrimes	END {
35111294Sswallace		printf("\n#endif /* %s */\n", compat) > syscompatdcl
35211294Sswallace		printf("\n#endif /* !%s */\n", sysproto_h) > syscompatdcl
3531541Srgrimes
35414331Speter		printf("};\n") > sysent
3551541Srgrimes		printf("};\n") > sysnames
35611294Sswallace		printf("#define\t%sMAXSYSCALL\t%d\n", syscallprefix, syscall) \
35711294Sswallace			> syshdr
3581541Srgrimes	} '
3591541Srgrimes
36011294Sswallacecat $sysinc $sysent >$syssw
36111294Sswallacecat $sysarg $sysdcl $syscompat $syscompatdcl > $sysproto
362