makelintstub revision 1.24 1 #!/bin/sh -
2 # $NetBSD: makelintstub,v 1.24 2012/02/01 05:34:40 dholland Exp $
3 #
4 # Copyright (c) 1996, 1997 Christopher G. Demetriou
5 # All rights reserved.
6 #
7 # Redistribution and use in source and binary forms, with or without
8 # modification, are permitted provided that the following conditions
9 # are met:
10 # 1. Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 # 3. All advertising materials mentioning features or use of this software
16 # must display the following acknowledgement:
17 # This product includes software developed for the
18 # NetBSD Project. See http://www.NetBSD.org/ for
19 # information about NetBSD.
20 # 4. The name of the author may not be used to endorse or promote products
21 # derived from this software without specific prior written permission.
22 #
23 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #
34 # <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>>
35
36 usage()
37 {
38
39 cat << _EOF 1>&2
40 Usage: $PROG [-n|-p] [-o filename] [-s syscall.h] object ...
41 -n Create SYSCALL_NOERROR.
42 -p Create PSEUDO_NOERROR.
43 (also removes leading "_" on syscall name).
44 -o filename Output to filename.
45 -s syscall.h Header to #include instead of <sys/syscall.h>.
46
47 The CPP environment variable must be set
48 to the path to the C preprocessor.
49 _EOF
50 exit 1
51 }
52
53 header()
54 {
55
56 cat <<- __EOF__
57 /*
58 * THIS IS AN AUTOMATICALLY GENERATED FILE. DO NOT EDIT.
59 */
60
61 #include <sys/param.h>
62 #include <sys/aio.h>
63 #include <sys/time.h>
64 #include <sys/mount.h>
65 #include <sys/stat.h>
66 #include <ufs/ufs/dinode.h>
67 #include <ufs/lfs/lfs.h>
68 #include <sys/resource.h>
69 #include <sys/poll.h>
70 #include <sys/uio.h>
71 #include <sys/ipc.h>
72 #include <sys/lwpctl.h>
73 #include <sys/mqueue.h>
74 #include <sys/msg.h>
75 #include <sys/sem.h>
76 #include <sys/shm.h>
77 #include <sys/sched.h>
78 #include <sys/timex.h>
79 #include <sys/socket.h>
80 #include <sys/event.h>
81 #include <sys/uuid.h>
82 #include <sys/quotactl.h>
83 #ifdef __STDC__
84 #include <stdarg.h>
85 #else
86 #include <varargs.h>
87 #endif
88
89 __EOF__
90 }
91
92 syscall_stub()
93 {
94
95 syscalldump="$1"
96 syscallname="$2"
97 funcname="$3"
98
99 arglist="$(
100 sed -e 'ta
101 :a
102 s,^/\* syscall: \"'"$syscallname"'\" ,,
103 tb
104 d
105 :b
106 s, \*/$,,' $syscalldump
107 )"
108
109 eval set -f -- "$arglist"
110
111 if [ $# -lt 3 ]; then
112 echo syscall $syscallname not found! 1>&2
113 exit 1
114 fi
115
116 shift # kill "ret:"
117 returntype=$1; shift
118 shift # kill "args:"
119
120 cat <<- __EOF__
121 /*ARGSUSED*/
122 $returntype
123 __EOF__
124
125 # do ANSI C function header
126 echo "#ifdef __STDC__"
127
128 echo "$funcname("
129 first=true; i=1
130 for arg; do
131 if $first; then
132 first=false
133 else
134 echo ", "
135 fi
136 case "$arg" in
137 "...") echo "...";;
138 *) echo "$arg arg$i"; i=$(($i + 1));;
139 esac
140 done
141 if $first; then
142 echo "void"
143 fi
144 echo ")"
145
146 # do K&R C function header
147 echo "#else"
148
149 echo "$funcname("
150 first=true; i=1
151 for arg; do
152 if $first; then
153 first=false
154 else
155 echo ", "
156 fi
157 case "$arg" in
158 "...") echo "va_alist";;
159 *) echo "arg$i"; i=$(($i + 1));;
160 esac
161 done
162 echo ")"
163 i=1
164 for arg; do
165 case "$arg" in
166 "...") echo " va_dcl";;
167 *) echo " $arg arg$i;"; i=$(($i + 1));;
168 esac
169 done
170
171 # do function body
172 echo "#endif"
173
174 echo "{"
175 if [ "$returntype" != "void" ]; then
176 echo " return (($returntype)0);"
177 fi
178 echo "}"
179 }
180
181 trailer()
182 {
183
184 cat <<- __EOF__
185 /* END */
186 __EOF__
187 }
188
189
190 pflag=false
191 nflag=false
192 oarg=""
193 syscallhdr=/usr/include/sys/syscall.h
194 syscalldump=/tmp/makelintstub.$$
195 PROG="$(basename "$0")"
196
197 if [ -z "${CPP}" ]; then
198 usage
199 fi
200
201 while getopts no:ps: i
202 do
203 case "$i" in
204 n) nflag=true;;
205 o) oarg=$OPTARG;;
206 p) pflag=true;;
207 s) syscallhdr=$OPTARG;;
208 *) usage;;
209 esac
210 done
211
212 shift $(expr $OPTIND - 1)
213
214 if $pflag && $nflag
215 then
216 echo "$PROG: -n flag and -p flag may not be used together" 1>&2
217 usage
218 fi
219
220 if [ -n "$oarg" ]; then
221 exec > $oarg
222 fi
223
224 trap "rm -f $syscalldump" 0 1 2 3 15
225
226 header
227
228 echo "#include \"$syscallhdr\"" | ${CPP} -D_LIBC -C > $syscalldump
229
230 for syscall; do
231 fnname=${syscall%.S}
232 if $pflag; then
233 scname=${fnname#_}
234 else
235 scname=$fnname
236 fi
237 syscall_stub $syscalldump $scname $fnname
238 echo ""
239 done
240
241 trailer
242
243 exit 0
244