1993-04-06 14:37:09 +04:00
|
|
|
#! /bin/sh -
|
2001-05-30 15:27:46 +04:00
|
|
|
# $NetBSD: makesyscalls.sh,v 1.48 2001/05/30 11:27:46 mrg Exp $
|
1994-06-29 10:29:24 +04:00
|
|
|
#
|
2000-08-18 23:33:30 +04:00
|
|
|
# Copyright (c) 1994, 1996, 2000 Christopher G. Demetriou
|
1994-10-20 07:37:09 +03:00
|
|
|
# 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.
|
|
|
|
# 3. All advertising materials mentioning features or use of this software
|
|
|
|
# must display the following acknowledgement:
|
|
|
|
# This product includes software developed for the NetBSD Project
|
|
|
|
# by Christopher G. Demetriou.
|
|
|
|
# 4. The name of the author may not be used to endorse or promote products
|
|
|
|
# derived from this software without specific prior written permission
|
|
|
|
#
|
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
|
1994-10-29 02:14:46 +03:00
|
|
|
|
|
|
|
# @(#)makesyscalls.sh 8.1 (Berkeley) 6/10/93
|
1993-04-06 14:37:09 +04:00
|
|
|
|
|
|
|
set -e
|
|
|
|
|
1994-10-20 07:22:35 +03:00
|
|
|
case $# in
|
|
|
|
2) ;;
|
|
|
|
*) echo "Usage: $0 config-file input-file" 1>&2
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# the config file sets the following variables:
|
|
|
|
# sysnames the syscall names file
|
|
|
|
# sysnumhdr the syscall numbers file
|
|
|
|
# syssw the syscall switch file
|
|
|
|
# sysarghdr the syscall argument struct definitions
|
|
|
|
# compatopts those syscall types that are for 'compat' syscalls
|
|
|
|
# switchname the name for the 'struct sysent' we define
|
2000-12-09 08:27:08 +03:00
|
|
|
# namesname the name for the 'const char *[]' we define
|
1994-10-20 07:22:35 +03:00
|
|
|
# constprefix the prefix for the system call constants
|
1998-10-03 23:21:11 +04:00
|
|
|
# registertype the type for register_t
|
2000-12-09 08:27:08 +03:00
|
|
|
# nsysent the size of the sysent table
|
2001-03-30 20:56:36 +04:00
|
|
|
# sys_nosys [optional] name of function called for unsupported
|
|
|
|
# syscalls, if not sys_nosys()
|
1994-10-20 07:22:35 +03:00
|
|
|
#
|
|
|
|
# NOTE THAT THIS makesyscalls.sh DOES NOT SUPPORT 'LIBCOMPAT'.
|
1993-04-06 14:37:09 +04:00
|
|
|
|
2001-03-30 20:56:36 +04:00
|
|
|
# source the config file.
|
|
|
|
sys_nosys="sys_nosys" # default is sys_nosys(), if not specified otherwise
|
|
|
|
. ./$1
|
|
|
|
|
1993-04-06 14:37:09 +04:00
|
|
|
# tmp files:
|
|
|
|
sysdcl="sysent.dcl"
|
1995-09-20 01:28:56 +04:00
|
|
|
sysprotos="sys.protos"
|
1994-10-20 07:22:35 +03:00
|
|
|
syscompat_pref="sysent."
|
1993-04-06 14:37:09 +04:00
|
|
|
sysent="sysent.switch"
|
1998-02-19 02:14:55 +03:00
|
|
|
sysnamesbottom="sysnames.bottom"
|
1993-04-06 14:37:09 +04:00
|
|
|
|
1998-02-19 02:14:55 +03:00
|
|
|
trap "rm $sysdcl $sysprotos $sysent $sysnamesbottom" 0
|
1993-04-06 14:37:09 +04:00
|
|
|
|
1994-10-20 07:22:35 +03:00
|
|
|
# Awk program (must support nawk extensions)
|
|
|
|
# Use "awk" at Berkeley, "nawk" or "gawk" elsewhere.
|
|
|
|
awk=${AWK:-awk}
|
1993-04-06 14:37:09 +04:00
|
|
|
|
1994-10-20 07:22:35 +03:00
|
|
|
# Does this awk have a "toupper" function? (i.e. is it GNU awk)
|
|
|
|
isgawk=`$awk 'BEGIN { print toupper("true"); exit; }' 2>/dev/null`
|
1993-04-06 14:37:09 +04:00
|
|
|
|
1994-10-20 07:22:35 +03:00
|
|
|
# If this awk does not define "toupper" then define our own.
|
|
|
|
if [ "$isgawk" = TRUE ] ; then
|
|
|
|
# GNU awk provides it.
|
|
|
|
toupper=
|
|
|
|
else
|
|
|
|
# Provide our own toupper()
|
|
|
|
toupper='
|
|
|
|
function toupper(str) {
|
|
|
|
_toupper_cmd = "echo "str" |tr a-z A-Z"
|
|
|
|
_toupper_cmd | getline _toupper_str;
|
|
|
|
close(_toupper_cmd);
|
|
|
|
return _toupper_str;
|
|
|
|
}'
|
|
|
|
fi
|
1993-04-06 14:37:09 +04:00
|
|
|
|
1994-10-20 07:22:35 +03:00
|
|
|
# before handing it off to awk, make a few adjustments:
|
|
|
|
# (1) insert spaces around {, }, (, ), *, and commas.
|
|
|
|
# (2) get rid of any and all dollar signs (so that rcs id use safe)
|
|
|
|
#
|
|
|
|
# The awk script will deal with blank lines and lines that
|
|
|
|
# start with the comment character (';').
|
|
|
|
|
|
|
|
sed -e '
|
|
|
|
s/\$//g
|
|
|
|
:join
|
|
|
|
/\\$/{a\
|
|
|
|
|
|
|
|
N
|
|
|
|
s/\\\n//
|
|
|
|
b join
|
1993-04-06 14:37:09 +04:00
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
2,${
|
|
|
|
/^#/!s/\([{}()*,]\)/ \1 /g
|
|
|
|
}
|
|
|
|
' < $2 | $awk "
|
|
|
|
$toupper
|
|
|
|
BEGIN {
|
1996-03-15 04:25:12 +03:00
|
|
|
# to allow nested #if/#else/#endif sets
|
|
|
|
savedepth = 0
|
2001-01-01 19:41:43 +03:00
|
|
|
# to track already processed syscalls
|
|
|
|
syscallseen[0] = 0
|
1996-03-15 04:25:12 +03:00
|
|
|
|
1994-10-20 07:22:35 +03:00
|
|
|
sysnames = \"$sysnames\"
|
1995-09-20 01:28:56 +04:00
|
|
|
sysprotos = \"$sysprotos\"
|
1994-10-20 07:22:35 +03:00
|
|
|
sysnumhdr = \"$sysnumhdr\"
|
|
|
|
sysarghdr = \"$sysarghdr\"
|
|
|
|
switchname = \"$switchname\"
|
|
|
|
namesname = \"$namesname\"
|
|
|
|
constprefix = \"$constprefix\"
|
1998-10-03 23:21:11 +04:00
|
|
|
registertype = \"$registertype\"
|
|
|
|
if (!registertype) {
|
|
|
|
registertype = \"register_t\"
|
|
|
|
}
|
2000-12-09 08:27:08 +03:00
|
|
|
nsysent = \"$nsysent\"
|
1994-10-20 07:22:35 +03:00
|
|
|
|
|
|
|
sysdcl = \"$sysdcl\"
|
|
|
|
syscompat_pref = \"$syscompat_pref\"
|
|
|
|
sysent = \"$sysent\"
|
1998-02-19 02:14:55 +03:00
|
|
|
sysnamesbottom = \"$sysnamesbottom\"
|
2001-03-30 20:56:36 +04:00
|
|
|
sys_nosys = \"$sys_nosys\"
|
1994-10-20 07:22:35 +03:00
|
|
|
infile = \"$2\"
|
|
|
|
|
|
|
|
compatopts = \"$compatopts\"
|
|
|
|
"'
|
|
|
|
|
2000-08-18 23:33:30 +04:00
|
|
|
printf "/* \$NetBSD\$ */\n\n" > sysdcl
|
1994-10-20 07:22:35 +03:00
|
|
|
printf "/*\n * System call switch table.\n *\n" > sysdcl
|
|
|
|
printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysdcl
|
|
|
|
|
|
|
|
ncompat = split(compatopts,compat)
|
|
|
|
for (i = 1; i <= ncompat; i++) {
|
|
|
|
compat_upper[i] = toupper(compat[i])
|
|
|
|
|
1995-10-07 09:25:19 +03:00
|
|
|
printf "\n#ifdef %s\n", compat_upper[i] > sysent
|
2001-04-27 10:07:27 +04:00
|
|
|
printf "#define %s(func) __CONCAT(%s_,func)\n", compat[i], \
|
1995-10-07 09:25:19 +03:00
|
|
|
compat[i] > sysent
|
|
|
|
printf "#else\n" > sysent
|
2001-04-27 10:07:27 +04:00
|
|
|
printf "#define %s(func) %s\n", compat[i], sys_nosys > sysent
|
1995-10-07 09:25:19 +03:00
|
|
|
printf "#endif\n" > sysent
|
1993-04-06 14:37:09 +04:00
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
|
1995-10-07 09:25:19 +03:00
|
|
|
printf "\n#define\ts(type)\tsizeof(type)\n\n" > sysent
|
|
|
|
printf "struct sysent %s[] = {\n",switchname > sysent
|
|
|
|
|
2000-08-18 23:33:30 +04:00
|
|
|
printf "/* \$NetBSD\$ */\n\n" > sysnames
|
1994-10-20 07:22:35 +03:00
|
|
|
printf "/*\n * System call names.\n *\n" > sysnames
|
|
|
|
printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnames
|
|
|
|
|
1995-09-20 01:28:56 +04:00
|
|
|
printf "\n/*\n * System call prototypes.\n */\n\n" > sysprotos
|
|
|
|
|
2000-08-18 23:33:30 +04:00
|
|
|
printf "/* \$NetBSD\$ */\n\n" > sysnumhdr
|
1994-10-20 07:22:35 +03:00
|
|
|
printf "/*\n * System call numbers.\n *\n" > sysnumhdr
|
|
|
|
printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysnumhdr
|
|
|
|
|
2000-08-18 23:33:30 +04:00
|
|
|
printf "/* \$NetBSD\$ */\n\n" > sysarghdr
|
1994-10-21 02:22:38 +03:00
|
|
|
printf "/*\n * System call argument lists.\n *\n" > sysarghdr
|
1994-10-20 07:22:35 +03:00
|
|
|
printf " * DO NOT EDIT-- this file is automatically generated.\n" > sysarghdr
|
|
|
|
}
|
|
|
|
NR == 1 {
|
|
|
|
printf " * created from%s\n */\n\n", $0 > sysdcl
|
|
|
|
|
|
|
|
printf " * created from%s\n */\n\n", $0 > sysnames
|
1998-02-19 06:30:24 +03:00
|
|
|
|
|
|
|
# System call names are included by userland (kdump(1)), so
|
|
|
|
# hide the include files from it.
|
2001-05-30 15:27:46 +04:00
|
|
|
printf "#if defined(_KERNEL_OPT)\n" > sysnames
|
1998-02-19 06:30:24 +03:00
|
|
|
|
2001-05-30 15:27:46 +04:00
|
|
|
printf "#endif /* _KERNEL_OPT */\n\n" > sysnamesbottom
|
2000-12-09 08:33:27 +03:00
|
|
|
printf "const char *const %s[] = {\n",namesname > sysnamesbottom
|
1994-10-20 07:22:35 +03:00
|
|
|
|
|
|
|
printf " * created from%s\n */\n\n", $0 > sysnumhdr
|
|
|
|
|
|
|
|
printf " * created from%s\n */\n\n", $0 > sysarghdr
|
1999-01-03 07:25:26 +03:00
|
|
|
printf "#ifndef _" constprefix "_SYSCALLARGS_H_\n" > sysarghdr
|
2001-04-27 10:07:27 +04:00
|
|
|
printf "#define _" constprefix "_SYSCALLARGS_H_\n\n" > sysarghdr
|
1998-10-03 23:21:11 +04:00
|
|
|
printf "#ifdef\tsyscallarg\n" > sysarghdr
|
|
|
|
printf "#undef\tsyscallarg\n" > sysarghdr
|
|
|
|
printf "#endif\n\n" > sysarghdr
|
1999-08-20 23:07:31 +04:00
|
|
|
printf "#define\tsyscallarg(x)\t\t\t\t\t\t\t\\\n" > sysarghdr
|
|
|
|
printf "\tunion {\t\t\t\t\t\t\t\t\\\n" > sysarghdr
|
|
|
|
printf "\t\t%s pad;\t\t\t\t\t\t\\\n", registertype > sysarghdr
|
|
|
|
printf "\t\tstruct { x datum; } le;\t\t\t\t\t\\\n" > sysarghdr
|
|
|
|
printf "\t\tstruct {\t\t\t\t\t\t\\\n" > sysarghdr
|
|
|
|
printf "\t\t\tint8_t pad[ (sizeof (%s) < sizeof (x))\t\\\n", \
|
1998-10-03 23:21:11 +04:00
|
|
|
registertype > sysarghdr
|
1999-08-20 23:07:31 +04:00
|
|
|
printf "\t\t\t\t? 0\t\t\t\t\t\\\n" > sysarghdr
|
|
|
|
printf "\t\t\t\t: sizeof (%s) - sizeof (x)];\t\\\n", \
|
1998-10-03 23:21:11 +04:00
|
|
|
registertype > sysarghdr
|
1999-08-20 23:07:31 +04:00
|
|
|
printf "\t\t\tx datum;\t\t\t\t\t\\\n" > sysarghdr
|
|
|
|
printf "\t\t} be;\t\t\t\t\t\t\t\\\n" > sysarghdr
|
|
|
|
printf "\t}\n" > sysarghdr
|
1994-10-20 07:22:35 +03:00
|
|
|
next
|
|
|
|
}
|
|
|
|
NF == 0 || $1 ~ /^;/ {
|
|
|
|
next
|
|
|
|
}
|
2000-12-09 08:27:08 +03:00
|
|
|
$0 ~ /^%%$/ {
|
|
|
|
intable = 1
|
|
|
|
next
|
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
$1 ~ /^#[ ]*include/ {
|
|
|
|
print > sysdcl
|
1998-02-19 02:14:55 +03:00
|
|
|
print > sysnames
|
1994-10-20 07:22:35 +03:00
|
|
|
next
|
|
|
|
}
|
2000-12-09 08:27:08 +03:00
|
|
|
$1 ~ /^#/ && !intable {
|
|
|
|
print > sysdcl
|
|
|
|
print > sysnames
|
1994-10-20 07:22:35 +03:00
|
|
|
next
|
|
|
|
}
|
2000-12-09 08:27:08 +03:00
|
|
|
$1 ~ /^#/ && intable {
|
|
|
|
if ($1 ~ /^#[ ]*if/) {
|
|
|
|
savedepth++
|
|
|
|
savesyscall[savedepth] = syscall
|
|
|
|
}
|
|
|
|
if ($1 ~ /^#[ ]*else/) {
|
|
|
|
if (savedepth <= 0) {
|
|
|
|
printf("%s: line %d: unbalanced #else\n", \
|
|
|
|
infile, NR)
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
syscall = savesyscall[savedepth]
|
1996-03-15 04:25:12 +03:00
|
|
|
}
|
|
|
|
if ($1 ~ /^#[ ]*endif/) {
|
|
|
|
if (savedepth <= 0) {
|
2000-12-09 08:27:08 +03:00
|
|
|
printf("%s: line %d: unbalanced #endif\n", \
|
|
|
|
infile, NR)
|
1996-03-15 04:25:12 +03:00
|
|
|
exit 1
|
|
|
|
}
|
2000-12-09 08:27:08 +03:00
|
|
|
savedepth--
|
1996-03-15 04:25:12 +03:00
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
print > sysent
|
1995-09-20 01:28:56 +04:00
|
|
|
print > sysprotos
|
1998-02-19 02:14:55 +03:00
|
|
|
print > sysnamesbottom
|
1994-10-20 07:22:35 +03:00
|
|
|
next
|
|
|
|
}
|
|
|
|
syscall != $1 {
|
|
|
|
printf "%s: line %d: syscall number out of sync at %d\n", \
|
|
|
|
infile, NR, syscall
|
|
|
|
printf "line is:\n"
|
|
|
|
print
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
function parserr(was, wanted) {
|
|
|
|
printf "%s: line %d: unexpected %s (expected %s)\n", \
|
|
|
|
infile, NR, was, wanted
|
1999-02-11 12:32:01 +03:00
|
|
|
printf "line is:\n"
|
|
|
|
print
|
1994-10-20 07:22:35 +03:00
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
function parseline() {
|
|
|
|
f=3 # toss number and type
|
2001-01-27 10:21:43 +03:00
|
|
|
sycall_flags="0"
|
1994-10-20 07:22:35 +03:00
|
|
|
if ($NF != "}") {
|
|
|
|
funcalias=$NF
|
|
|
|
end=NF-1
|
|
|
|
} else {
|
|
|
|
funcalias=""
|
|
|
|
end=NF
|
1994-05-17 04:00:46 +04:00
|
|
|
}
|
2001-01-27 10:21:43 +03:00
|
|
|
if ($f == "MPSAFE") { # allow for MP-safe syscalls
|
|
|
|
sycall_flags = sprintf("SYCALL_MPSAFE | %s", sycall_flags)
|
|
|
|
f++
|
|
|
|
}
|
2000-12-12 20:32:45 +03:00
|
|
|
if ($f ~ /^[a-z0-9_]*$/) { # allow syscall alias
|
|
|
|
funcalias=$f
|
|
|
|
f++
|
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
if ($f != "{")
|
|
|
|
parserr($f, "{")
|
|
|
|
f++
|
|
|
|
if ($end != "}")
|
|
|
|
parserr($end, "}")
|
|
|
|
end--
|
|
|
|
if ($end != ";")
|
|
|
|
parserr($end, ";")
|
|
|
|
end--
|
|
|
|
if ($end != ")")
|
|
|
|
parserr($end, ")")
|
|
|
|
end--
|
|
|
|
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
returntype = oldf = "";
|
|
|
|
do {
|
|
|
|
if (returntype != "" && oldf != "*")
|
|
|
|
returntype = returntype" ";
|
|
|
|
returntype = returntype$f;
|
|
|
|
oldf = $f;
|
|
|
|
f++
|
|
|
|
} while (f < (end - 1) && $(f+1) != "(");
|
|
|
|
if (f == (end - 1)) {
|
|
|
|
parserr($f, "function argument definition (maybe \"(\"?)");
|
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
|
|
|
|
funcname=$f
|
1995-10-07 09:25:19 +03:00
|
|
|
if (funcalias == "") {
|
1994-10-20 07:22:35 +03:00
|
|
|
funcalias=funcname
|
1995-10-07 09:25:19 +03:00
|
|
|
sub(/^([^_]+_)*sys_/, "", funcalias)
|
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
f++
|
|
|
|
|
|
|
|
if ($f != "(")
|
|
|
|
parserr($f, ")")
|
|
|
|
f++
|
|
|
|
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
argc=0;
|
1994-10-20 07:22:35 +03:00
|
|
|
if (f == end) {
|
|
|
|
if ($f != "void")
|
|
|
|
parserr($f, "argument definition")
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
isvarargs = 0;
|
|
|
|
varargc = 0;
|
1994-10-20 07:22:35 +03:00
|
|
|
return
|
1993-04-06 14:37:09 +04:00
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
# some system calls (open() and fcntl()) can accept a variable
|
|
|
|
# number of arguments. If syscalls accept a variable number of
|
|
|
|
# arguments, they must still have arguments specified for
|
|
|
|
# the remaining argument "positions," because of the way the
|
|
|
|
# kernel system call argument handling works.
|
|
|
|
#
|
|
|
|
# Indirect system calls, e.g. syscall(), are exceptions to this
|
|
|
|
# rule, since they are handled entirely by machine-dependent code
|
|
|
|
# and do not need argument structures built.
|
|
|
|
|
|
|
|
isvarargs = 0;
|
1994-10-20 07:22:35 +03:00
|
|
|
while (f <= end) {
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
if ($f == "...") {
|
|
|
|
f++;
|
|
|
|
isvarargs = 1;
|
|
|
|
varargc = argc;
|
|
|
|
continue;
|
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
argc++
|
|
|
|
argtype[argc]=""
|
1994-10-29 02:14:46 +03:00
|
|
|
oldf=""
|
1994-10-20 07:22:35 +03:00
|
|
|
while (f < end && $(f+1) != ",") {
|
1994-10-29 02:14:46 +03:00
|
|
|
if (argtype[argc] != "" && oldf != "*")
|
1994-10-20 07:22:35 +03:00
|
|
|
argtype[argc] = argtype[argc]" ";
|
|
|
|
argtype[argc] = argtype[argc]$f;
|
1994-10-29 02:14:46 +03:00
|
|
|
oldf = $f;
|
1994-10-20 07:22:35 +03:00
|
|
|
f++
|
|
|
|
}
|
|
|
|
if (argtype[argc] == "")
|
|
|
|
parserr($f, "argument definition")
|
|
|
|
argname[argc]=$f;
|
|
|
|
f += 2; # skip name, and any comma
|
1993-04-06 14:37:09 +04:00
|
|
|
}
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
# must see another argument after varargs notice.
|
|
|
|
if (isvarargs) {
|
|
|
|
if (argc == varargc && $2 != "INDIR")
|
|
|
|
parserr($f, "argument definition")
|
|
|
|
} else
|
|
|
|
varargc = argc;
|
1994-10-20 07:22:35 +03:00
|
|
|
}
|
1995-10-07 09:25:19 +03:00
|
|
|
function putent(nodefs, compatwrap) {
|
1996-12-22 09:45:14 +03:00
|
|
|
# output syscall declaration for switch table. INDIR functions
|
|
|
|
# get none, since they always have sys_nosys() for their table
|
|
|
|
# entries.
|
|
|
|
if (nodefs != "INDIR") {
|
2000-08-18 23:14:33 +04:00
|
|
|
prototype = "(struct proc *, void *, register_t *)"
|
1996-12-22 09:45:14 +03:00
|
|
|
if (compatwrap == "")
|
2000-08-18 23:14:33 +04:00
|
|
|
printf("int\t%s%s;\n", funcname,
|
1996-12-22 09:45:14 +03:00
|
|
|
prototype) > sysprotos
|
|
|
|
else
|
2000-08-18 23:14:33 +04:00
|
|
|
printf("int\t%s_%s%s;\n", compatwrap, funcname,
|
1996-12-22 09:45:14 +03:00
|
|
|
prototype) > sysprotos
|
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
|
|
|
|
# output syscall switch entry
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
if (nodefs == "INDIR") {
|
2001-03-30 20:56:36 +04:00
|
|
|
printf("\t{ 0, 0, %s,\n\t %s },\t\t\t/* %d = %s (indir) */\n", \
|
|
|
|
sycall_flags, sys_nosys, syscall, funcalias) > sysent
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
} else {
|
|
|
|
# printf("\t{ { %d", argc) > sysent
|
|
|
|
# for (i = 1; i <= argc; i++) {
|
|
|
|
# if (i == 5) # wrap the line
|
|
|
|
# printf(",\n\t ") > sysent
|
|
|
|
# else
|
|
|
|
# printf(", ") > sysent
|
|
|
|
# printf("s(%s)", argtypenospc[i]) > sysent
|
|
|
|
# }
|
|
|
|
printf("\t{ %d, ", argc) > sysent
|
|
|
|
if (argc == 0)
|
|
|
|
printf("0") > sysent
|
|
|
|
else if (compatwrap == "")
|
|
|
|
printf("s(struct %s_args)", funcname) > sysent
|
|
|
|
else
|
|
|
|
printf("s(struct %s_%s_args)", compatwrap,
|
|
|
|
funcname) > sysent
|
|
|
|
if (compatwrap == "")
|
|
|
|
wfn = sprintf("%s", funcname);
|
|
|
|
else
|
|
|
|
wfn = sprintf("%s(%s)", compatwrap, funcname);
|
2001-01-27 10:21:43 +03:00
|
|
|
printf(", %s,\n\t %s },", sycall_flags, wfn) > sysent
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
for (i = 0; i < (33 - length(wfn)) / 8; i++)
|
|
|
|
printf("\t") > sysent
|
|
|
|
if (compatwrap == "")
|
|
|
|
printf("/* %d = %s */\n", syscall, funcalias) > sysent
|
|
|
|
else
|
|
|
|
printf("/* %d = %s %s */\n", syscall, compatwrap,
|
|
|
|
funcalias) > sysent
|
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
|
|
|
|
# output syscall name for names table
|
|
|
|
if (compatwrap == "")
|
|
|
|
printf("\t\"%s\",\t\t\t/* %d = %s */\n", funcalias, syscall,
|
1998-02-19 02:14:55 +03:00
|
|
|
funcalias) > sysnamesbottom
|
1994-10-20 07:22:35 +03:00
|
|
|
else
|
|
|
|
printf("\t\"%s_%s\",\t/* %d = %s %s */\n", compatwrap,
|
1998-02-19 02:14:55 +03:00
|
|
|
funcalias, syscall, compatwrap, funcalias) > sysnamesbottom
|
1994-10-20 07:22:35 +03:00
|
|
|
|
|
|
|
# output syscall number of header, if appropriate
|
2001-01-01 19:41:43 +03:00
|
|
|
if (syscallseen[syscall]) {
|
|
|
|
# nop
|
|
|
|
} else if (nodefs == "" || nodefs == "NOARGS" || nodefs == "INDIR") {
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
# output a prototype, to be used to generate lint stubs in
|
|
|
|
# libc.
|
|
|
|
printf("/* syscall: \"%s\" ret: \"%s\" args:", funcalias,
|
|
|
|
returntype) > sysnumhdr
|
|
|
|
for (i = 1; i <= varargc; i++)
|
|
|
|
printf(" \"%s\"", argtype[i]) > sysnumhdr
|
|
|
|
if (isvarargs)
|
|
|
|
printf(" \"...\"") > sysnumhdr
|
|
|
|
printf(" */\n") > sysnumhdr
|
|
|
|
|
|
|
|
printf("#define\t%s%s\t%d\n\n", constprefix, funcalias,
|
1994-10-20 07:22:35 +03:00
|
|
|
syscall) > sysnumhdr
|
1998-09-13 08:57:24 +04:00
|
|
|
} else if (nodefs == "COMPAT") {
|
|
|
|
# Just define the syscall number with a comment. These
|
|
|
|
# may be used by compatibility stubs in libc.
|
|
|
|
printf("#define\t%s%s_%s\t%d\n\n",
|
|
|
|
constprefix, compatwrap, funcalias, syscall) > sysnumhdr
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
} else if (nodefs != "NODEF")
|
|
|
|
printf("\t\t\t\t/* %d is %s %s */\n\n", syscall,
|
1994-10-20 07:22:35 +03:00
|
|
|
compatwrap, funcalias) > sysnumhdr
|
2001-01-01 19:41:43 +03:00
|
|
|
syscallseen[syscall] = 1
|
1994-10-20 07:22:35 +03:00
|
|
|
|
|
|
|
# output syscall argument structure, if it has arguments
|
1996-12-22 09:45:14 +03:00
|
|
|
if (argc != 0 && nodefs != "NOARGS" && nodefs != "INDIR") {
|
1994-10-20 07:22:35 +03:00
|
|
|
if (compatwrap == "")
|
|
|
|
printf("\nstruct %s_args {\n", funcname) > sysarghdr
|
|
|
|
else
|
|
|
|
printf("\nstruct %s_%s_args {\n", compatwrap,
|
|
|
|
funcname) > sysarghdr
|
|
|
|
for (i = 1; i <= argc; i++)
|
|
|
|
printf("\tsyscallarg(%s) %s;\n", argtype[i],
|
|
|
|
argname[i]) > sysarghdr
|
|
|
|
printf("};\n") > sysarghdr
|
1993-04-06 14:37:09 +04:00
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
}
|
|
|
|
$2 == "STD" {
|
|
|
|
parseline()
|
1995-10-07 09:25:19 +03:00
|
|
|
putent("", "");
|
1994-10-20 07:22:35 +03:00
|
|
|
syscall++
|
|
|
|
next
|
|
|
|
}
|
* remember (i.e. don't throw away) system call return types.
* Deal with multi-word system call return types (i.e. foo *, or
struct foo *, or struct foo, etc.).
* Add a new class of system calls "INDIR" (for "indirect"), which
is to be used to represent indirect syscalls like syscall() and
__syscall() which are implemented in MD code and which don't want
args structures defined. (The old way of declaring this type of
syscalls still works.)
* Allow system calls to be marked as having a variable number of
arguments, by inserting "..." (no trailing comma) before the
first hf the optional arguments in the syscall definition. Because
of the way syscall arguments are handled by MI code, _ALL_ syscall
arguments must actually be included in the definition, i.e.
"optional" arguments are either "are there or aren't," i.e. these
aren't really varargs functions. Therefore, for normal syscalls,
there _must_ be arguments listed after the "...". For INDIR
syscalls, which really do have a variable number of arguments and
which aren't handled via the normal mechanism, that requirement is
not in force.
* output primitive (machine-parsable) syscall descriptions as comments
in <sys/syscall.h>. These can be used to easily build real function
prototypes, or to build stub functions for use by lint.
1996-12-22 09:33:16 +03:00
|
|
|
$2 == "NODEF" || $2 == "NOARGS" || $2 == "INDIR" {
|
1994-10-20 07:22:35 +03:00
|
|
|
parseline()
|
1995-10-07 09:25:19 +03:00
|
|
|
putent($2, "")
|
1994-10-20 07:22:35 +03:00
|
|
|
syscall++
|
|
|
|
next
|
|
|
|
}
|
1999-06-09 08:25:30 +04:00
|
|
|
$2 == "OBSOL" || $2 == "UNIMPL" || $2 == "EXCL" {
|
1994-10-20 07:22:35 +03:00
|
|
|
if ($2 == "OBSOL")
|
|
|
|
comment="obsolete"
|
1999-06-09 08:25:30 +04:00
|
|
|
else if ($2 == "EXCL")
|
|
|
|
comment="excluded"
|
1994-10-20 07:22:35 +03:00
|
|
|
else
|
|
|
|
comment="unimplemented"
|
|
|
|
for (i = 3; i <= NF; i++)
|
|
|
|
comment=comment " " $i
|
|
|
|
|
2001-03-30 20:56:36 +04:00
|
|
|
printf("\t{ 0, 0, 0,\n\t %s },\t\t\t/* %d = %s */\n", \
|
|
|
|
sys_nosys, syscall, comment) > sysent
|
1994-10-20 07:22:35 +03:00
|
|
|
printf("\t\"#%d (%s)\",\t\t/* %d = %s */\n", \
|
1998-02-19 02:14:55 +03:00
|
|
|
syscall, comment, syscall, comment) > sysnamesbottom
|
1994-10-20 07:22:35 +03:00
|
|
|
if ($2 != "UNIMPL")
|
|
|
|
printf("\t\t\t\t/* %d is %s */\n", syscall, comment) > sysnumhdr
|
|
|
|
syscall++
|
|
|
|
next
|
|
|
|
}
|
|
|
|
{
|
|
|
|
for (i = 1; i <= ncompat; i++) {
|
|
|
|
if ($2 == compat_upper[i]) {
|
|
|
|
parseline();
|
1998-09-13 08:57:24 +04:00
|
|
|
putent("COMPAT", compat[i])
|
1994-10-20 07:22:35 +03:00
|
|
|
syscall++
|
|
|
|
next
|
|
|
|
}
|
1993-04-06 14:37:09 +04:00
|
|
|
}
|
2000-12-09 08:27:08 +03:00
|
|
|
printf("%s: line %d: unrecognized keyword %s\n", infile, NR, $2)
|
1994-10-20 07:22:35 +03:00
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
END {
|
2000-12-09 08:27:08 +03:00
|
|
|
maxsyscall = syscall
|
|
|
|
if (nsysent) {
|
|
|
|
if (syscall > nsysent) {
|
|
|
|
printf("%s: line %d: too many syscalls\n", infile, NR)
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
while (syscall < nsysent) {
|
2001-03-30 20:56:36 +04:00
|
|
|
printf("\t{ 0, 0, 0,\n\t %s },\t\t\t/* %d = filler */\n", \
|
|
|
|
sys_nosys, syscall) > sysent
|
2000-12-09 08:27:08 +03:00
|
|
|
syscall++
|
|
|
|
}
|
|
|
|
}
|
1994-10-20 07:22:35 +03:00
|
|
|
printf("};\n\n") > sysent
|
1998-02-19 02:14:55 +03:00
|
|
|
printf("};\n") > sysnamesbottom
|
2000-12-09 08:27:08 +03:00
|
|
|
printf("#define\t%sMAXSYSCALL\t%d\n", constprefix, maxsyscall) > sysnumhdr
|
|
|
|
if (nsysent)
|
|
|
|
printf("#define\t%sNSYSENT\t%d\n", constprefix, nsysent) > sysnumhdr
|
1994-10-20 07:22:35 +03:00
|
|
|
} '
|
1993-04-06 14:37:09 +04:00
|
|
|
|
1995-10-07 09:25:19 +03:00
|
|
|
cat $sysprotos >> $sysarghdr
|
1999-01-03 07:25:26 +03:00
|
|
|
echo "#endif /* _${constprefix}_SYSCALLARGS_H_ */" >> $sysarghdr
|
1995-09-20 01:28:56 +04:00
|
|
|
cat $sysdcl $sysent > $syssw
|
1998-02-19 02:14:55 +03:00
|
|
|
cat $sysnamesbottom >> $sysnames
|
1993-04-06 14:37:09 +04:00
|
|
|
|
1995-04-22 23:42:47 +04:00
|
|
|
#chmod 444 $sysnames $sysnumhdr $syssw
|