Home | History | Annotate | Line # | Download | only in kern
makesyscalls.sh revision 1.1.1.1
      1 #! /bin/sh -
      2 #	@(#)makesyscalls.sh	8.1 (Berkeley) 6/10/93
      3 
      4 set -e
      5 
      6 # name of compat option:
      7 compat=COMPAT_43
      8 
      9 # output files:
     10 sysnames="syscalls.c"
     11 syshdr="../sys/syscall.h"
     12 syssw="init_sysent.c"
     13 
     14 # tmp files:
     15 sysdcl="sysent.dcl"
     16 syscompat="sysent.compat"
     17 sysent="sysent.switch"
     18 
     19 trap "rm $sysdcl $syscompat $sysent" 0
     20 
     21 case $# in
     22     0)	echo "Usage: $0 input-file" 1>&2
     23 	exit 1
     24 	;;
     25 esac
     26 
     27 awk < $1 "
     28 	BEGIN {
     29 		sysdcl = \"$sysdcl\"
     30 		syscompat = \"$syscompat\"
     31 		sysent = \"$sysent\"
     32 		sysnames = \"$sysnames\"
     33 		syshdr = \"$syshdr\"
     34 		compat = \"$compat\"
     35 		infile = \"$1\"
     36 		"'
     37 
     38 		printf "/*\n * System call switch table.\n *\n" > sysdcl
     39 		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysdcl
     40 
     41 		printf "\n#ifdef %s\n", compat > syscompat
     42 		printf "#define compat(n, name) n, __CONCAT(o,name)\n\n" > syscompat
     43 
     44 		printf "/*\n * System call names.\n *\n" > sysnames
     45 		printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
     46 
     47 		printf "/*\n * System call numbers.\n *\n" > syshdr
     48 		printf " * DO NOT EDIT-- this file is automatically generated.\n" > syshdr
     49 	}
     50 	NR == 1 {
     51 		printf " * created from%s\n */\n\n", $0 > sysdcl
     52 		printf "#include <sys/param.h>\n" > sysdcl
     53 		printf "#include <sys/systm.h>\n\n" > sysdcl
     54 		printf "int\tnosys();\n\n" > sysdcl
     55 
     56 		printf "struct sysent sysent[] = {\n" > sysent
     57 
     58 		printf " * created from%s\n */\n\n", $0 > sysnames
     59 		printf "char *syscallnames[] = {\n" > sysnames
     60 
     61 		printf " * created from%s\n */\n\n", $0 > syshdr
     62 		next
     63 	}
     64 	NF == 0 || $1 ~ /^;/ {
     65 		next
     66 	}
     67 	$1 ~ /^#[ 	]*if/ {
     68 		print > sysent
     69 		print > sysdcl
     70 		print > syscompat
     71 		print > sysnames
     72 		savesyscall = syscall
     73 		next
     74 	}
     75 	$1 ~ /^#[ 	]*else/ {
     76 		print > sysent
     77 		print > sysdcl
     78 		print > syscompat
     79 		print > sysnames
     80 		syscall = savesyscall
     81 		next
     82 	}
     83 	$1 ~ /^#/ {
     84 		print > sysent
     85 		print > sysdcl
     86 		print > syscompat
     87 		print > sysnames
     88 		next
     89 	}
     90 	syscall != $1 {
     91 		printf "%s: line %d: syscall number out of sync at %d\n", \
     92 		   infile, NR, syscall
     93 		printf "line is:\n"
     94 		print
     95 		exit 1
     96 	}
     97 	{	comment = $4
     98 		for (i = 5; i <= NF; i++)
     99 			comment = comment " " $i
    100 		if (NF < 5)
    101 			$5 = $4
    102 	}
    103 	$2 == "STD" {
    104 		printf("int\t%s();\n", $4) > sysdcl
    105 		printf("\t{ %d, %s },\t\t\t/* %d = %s */\n", \
    106 		    $3, $4, syscall, $5) > sysent
    107 		printf("\t\"%s\",\t\t\t/* %d = %s */\n", \
    108 		    $5, syscall, $5) > sysnames
    109 		printf("#define\tSYS_%s\t%d\n", \
    110 		    $5, syscall) > syshdr
    111 		syscall++
    112 		next
    113 	}
    114 	$2 == "COMPAT" {
    115 		printf("int\to%s();\n", $4) > syscompat
    116 		printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \
    117 		    $3, $4, syscall, $5) > sysent
    118 		printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
    119 		    $5, syscall, $5) > sysnames
    120 		printf("\t\t\t\t/* %d is old %s */\n", \
    121 		    syscall, comment) > syshdr
    122 		syscall++
    123 		next
    124 	}
    125 	$2 == "LIBCOMPAT" {
    126 		printf("int\to%s();\n", $4) > syscompat
    127 		printf("\t{ compat(%d,%s) },\t\t/* %d = old %s */\n", \
    128 		    $3, $4, syscall, $5) > sysent
    129 		printf("\t\"old.%s\",\t\t/* %d = old %s */\n", \
    130 		    $5, syscall, $5) > sysnames
    131 		printf("#define\tSYS_%s\t%d\t/* compatibility; still used by libc */\n", \
    132 		    $5, syscall) > syshdr
    133 		syscall++
    134 		next
    135 	}
    136 	$2 == "OBSOL" {
    137 		printf("\t{ 0, nosys },\t\t\t/* %d = obsolete %s */\n", \
    138 		    syscall, comment) > sysent
    139 		printf("\t\"obs_%s\",\t\t\t/* %d = obsolete %s */\n", \
    140 		    $4, syscall, comment) > sysnames
    141 		printf("\t\t\t\t/* %d is obsolete %s */\n", \
    142 		    syscall, comment) > syshdr
    143 		syscall++
    144 		next
    145 	}
    146 	$2 == "UNIMPL" {
    147 		printf("\t{ 0, nosys },\t\t\t/* %d = %s */\n", \
    148 		    syscall, comment) > sysent
    149 		printf("\t\"#%d\",\t\t\t/* %d = %s */\n", \
    150 		    syscall, syscall, comment) > sysnames
    151 		syscall++
    152 		next
    153 	}
    154 	{
    155 		printf "%s: line %d: unrecognized keyword %s\n", infile, NR, $2
    156 		exit 1
    157 	}
    158 	END {
    159 		printf("\n#else /* %s */\n", compat) > syscompat
    160 		printf("#define compat(n, name) 0, nosys\n") > syscompat
    161 		printf("#endif /* %s */\n\n", compat) > syscompat
    162 
    163 		printf("};\n\n") > sysent
    164 		printf("int\tnsysent = sizeof(sysent) / sizeof(sysent[0]);\n") > sysent
    165 
    166 		printf("};\n") > sysnames
    167 	} '
    168 
    169 cat $sysdcl $syscompat $sysent >$syssw
    170 
    171 chmod 444 $sysnames $syshdr $syssw
    172