Annotation of sys/kern/vnode_if.sh, Revision 1.1.1.1
1.1 nbrk 1: #!/bin/sh -
2: copyright="\
3: /*
4: * Copyright (c) 1992, 1993
5: * The Regents of the University of California. 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. Neither the name of the University nor the names of its contributors
16: * may be used to endorse or promote products derived from this software
17: * without specific prior written permission.
18: *
19: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29: * SUCH DAMAGE.
30: */
31: "
32: SCRIPT_ID='$OpenBSD: vnode_if.sh,v 1.15 2006/01/02 05:05:11 jsg Exp $'
33: # SCRIPT_ID='$NetBSD: vnode_if.sh,v 1.9 1996/02/29 20:58:22 cgd Exp $'
34:
35: # Script to produce VFS front-end sugar.
36: #
37: # usage: vnode_if.sh srcfile
38: # (where srcfile is currently /sys/kern/vnode_if.src)
39: #
40:
41: if [ $# -ne 1 ] ; then
42: echo 'usage: vnode_if.sh srcfile'
43: exit 1
44: fi
45:
46: # Name and revision of the source file.
47: src=$1
48: SRC_ID=`head -1 $src | sed -e 's/.*\$\(.*\)\$.*/\1/'`
49:
50: # Names of the created files.
51: out_c=vnode_if.c
52: out_h=../sys/vnode_if.h
53:
54: # Awk program (must support nawk extensions)
55: # Use "awk" at Berkeley, "nawk" or "gawk" elsewhere.
56: awk=${AWK:-awk}
57:
58: # Does this awk have a "toupper" function? (i.e. is it GNU awk)
59: isgawk=`$awk 'BEGIN { print toupper("true"); exit; }' 2>/dev/null`
60:
61: # If this awk does not define "toupper" then define our own.
62: if [ "$isgawk" = TRUE ] ; then
63: # GNU awk provides it.
64: toupper=
65: else
66: # Provide our own toupper()
67: toupper='
68: function toupper(str) {
69: _toupper_cmd = "echo "str" |tr a-z A-Z"
70: _toupper_cmd | getline _toupper_str;
71: close(_toupper_cmd);
72: return _toupper_str;
73: }'
74: fi
75:
76: #
77: # This is the common part of all awk programs that read $src
78: # This parses the input for one function into the arrays:
79: # argdir, argtype, argname, willrele
80: # and calls "doit()" to generate output for the function.
81: #
82: # Input to this parser is pre-processed slightly by sed
83: # so this awk parser doesn't have to work so hard. The
84: # changes done by the sed pre-processing step are:
85: # insert a space beween * and pointer name
86: # replace semicolons with spaces
87: #
88: sed_prep='s:\*\([^\*/]\):\* \1:g
89: s/;/ /'
90: awk_parser='
91: # Comment line
92: /^#/ { next; }
93: # First line of description
94: /^vop_/ {
95: name=$1;
96: argc=0;
97: next;
98: }
99: # Last line of description
100: /^}/ {
101: doit();
102: next;
103: }
104: # Middle lines of description
105: {
106: argdir[argc] = $1; i=2;
107: if ($2 == "WILLRELE" ||
108: $3 == "WILLRELE") {
109: willrele[argc] = 1;
110: i++;
111: } else if ($2 == "WILLUNLOCK" ||
112: $3 == "WILLUNLOCK") {
113: willrele[argc] = 2;
114: i++;
115: } else if ($2 == "WILLPUT" ||
116: $3 == "WILLPUT") {
117: willrele[argc] = 3;
118: i++;
119: } else
120: willrele[argc] = 0;
121:
122: if ($2 == "SHOULDBELOCKED") {
123: shouldbelocked[argc] = 1;
124: i++;
125: } else
126: shouldbelocked[argc] = 0;
127:
128: argtype[argc] = $i; i++;
129: while (i < NF) {
130: argtype[argc] = argtype[argc]" "$i;
131: i++;
132: }
133: argname[argc] = $i;
134: argc++;
135: next;
136: }
137: '
138:
139: # This is put after the copyright on each generated file.
140: warning="\
141: /*
142: * Warning: This file is generated automatically.
143: * (Modifications made here may easily be lost!)
144: *
145: * Created from the file:
146: * ${SRC_ID}
147: * by the script:
148: * ${SCRIPT_ID}
149: */
150: "
151:
152: # This is to satisfy McKusick (get rid of evil spaces 8^)
153: anal_retentive='s:\([^/]\*\) :\1:g'
154:
155: #
156: # Redirect stdout to the H file.
157: #
158: echo "$0: Creating $out_h" 1>&2
159: exec > $out_h
160:
161: # Begin stuff
162: echo -n "$warning" | sed -e 's/\$//g'
163: echo ""
164: echo -n "$copyright"
165: echo '
166: extern struct vnodeop_desc vop_default_desc;
167: '
168:
169: echo '#include "systm.h"'
170:
171: # Body stuff
172: # This awk program needs toupper() so define it if necessary.
173: sed -e "$sed_prep" $src | $awk "$toupper"'
174: function doit() {
175: # Declare arg struct, descriptor.
176: printf("\nstruct %s_args {\n", name);
177: printf("\tstruct vnodeop_desc * a_desc;\n");
178: for (i=0; i<argc; i++) {
179: printf("\t%s a_%s;\n", argtype[i], argname[i]);
180: }
181: printf("};\n");
182: printf("extern struct vnodeop_desc %s_desc;\n", name);
183: # Prototype it.
184: protoarg = sprintf("int %s(", toupper(name));
185: protolen = length(protoarg);
186: printf("%s", protoarg);
187: for (i=0; i<argc; i++) {
188: protoarg = sprintf("%s", argtype[i]);
189: if (i < (argc-1)) protoarg = (protoarg ", ");
190: arglen = length(protoarg);
191: if ((protolen + arglen) > 77) {
192: protoarg = ("\n " protoarg);
193: arglen += 4;
194: protolen = 0;
195: }
196: printf("%s", protoarg);
197: protolen += arglen;
198: }
199: printf(");\n");
200: }
201: BEGIN {
202: arg0special="";
203: }
204: END {
205: printf("\n/* Special cases: */\n#include <sys/buf.h>\n");
206: argc=1;
207: argtype[0]="struct buf *";
208: argname[0]="bp";
209: shouldbelocked[0] = 0;
210: arg0special="->b_vp";
211: name="vop_strategy";
212: doit();
213: name="vop_bwrite";
214: doit();
215: }
216: '"$awk_parser" | sed -e "$anal_retentive"
217:
218: # End stuff
219: echo '
220: /* End of special cases. */'
221:
222:
223: #
224: # Redirect stdout to the C file.
225: #
226: echo "$0: Creating $out_c" 1>&2
227: exec > $out_c
228:
229: # Begin stuff
230: echo -n "$warning" | sed -e 's/\$//g'
231: echo ""
232: echo -n "$copyright"
233: echo '
234: #include <sys/param.h>
235: #include <sys/mount.h>
236: #include <sys/vnode.h>
237:
238: struct vnodeop_desc vop_default_desc = {
239: 0,
240: "default",
241: 0,
242: NULL,
243: VDESC_NO_OFFSET,
244: VDESC_NO_OFFSET,
245: VDESC_NO_OFFSET,
246: VDESC_NO_OFFSET,
247: NULL,
248: };
249: '
250:
251: # Body stuff
252: sed -e "$sed_prep" $src | $awk '
253: function do_offset(typematch) {
254: for (i=0; i<argc; i++) {
255: if (argtype[i] == typematch) {
256: printf("\tVOPARG_OFFSETOF(struct %s_args, a_%s),\n",
257: name, argname[i]);
258: return i;
259: };
260: };
261: print "\tVDESC_NO_OFFSET,";
262: return -1;
263: }
264:
265: function doit() {
266: # Define offsets array
267: printf("\nint %s_vp_offsets[] = {\n", name);
268: for (i=0; i<argc; i++) {
269: if (argtype[i] == "struct vnode *") {
270: printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n",
271: name, argname[i]);
272: }
273: }
274: print "\tVDESC_NO_OFFSET";
275: print "};";
276: # Define F_desc
277: printf("struct vnodeop_desc %s_desc = {\n", name);
278: # offset
279: printf ("\t0,\n");
280: # printable name
281: printf ("\t\"%s\",\n", name);
282: # flags
283: printf("\t0");
284: vpnum = 0;
285: for (i=0; i<argc; i++) {
286: if (willrele[i]) {
287: if (willrele[i] == 2) {
288: word = "UNLOCK";
289: } else if (willrele[i] == 3) {
290: word = "PUT";
291: } else {
292: word = "RELE";
293: }
294: if (argdir[i] ~ /OUT/) {
295: printf(" | VDESC_VPP_WILL%s", word);
296: } else {
297: printf(" | VDESC_VP%s_WILL%s", vpnum, word);
298: };
299: vpnum++;
300: }
301: }
302: print ",";
303: # vp offsets
304: printf ("\t%s_vp_offsets,\n", name);
305: # vpp (if any)
306: do_offset("struct vnode **");
307: # cred (if any)
308: do_offset("struct ucred *");
309: # proc (if any)
310: do_offset("struct proc *");
311: # componentname
312: do_offset("struct componentname *");
313: # transport layer information
314: printf ("\tNULL,\n};\n");
315:
316: # Define inline function.
317: printf("\nint %s(", toupper(name));
318: desclen = 5 + length(name);
319: for (i=0; i<argc; i++) {
320: arglen = length(argtype[i]) + length(argname[i]);
321:
322: if (arglen + desclen > 77) {
323: printf("\n ");
324: arglen += 4;
325: desclen = 0;
326: }
327: printf("%s %s", argtype[i], argname[i]);
328: if (i < (argc-1)) {
329: printf(", ");
330: desclen += 2;
331: }
332: desclen += arglen;
333: }
334: printf(")\n");
335: printf("{\n\tstruct %s_args a;\n", name);
336: printf("\ta.a_desc = VDESC(%s);\n", name);
337: for (i=0; i<argc; i++) {
338: printf("\ta.a_%s = %s;\n", argname[i], argname[i]);
339: if (shouldbelocked[i]) {
340: printf ("#ifdef VFSDEBUG\n");
341: printf ("\tif ((%s->v_flag & VLOCKSWORK) && !VOP_ISLOCKED(%s))\n", argname[i], argname[i]);
342: printf ("\t\tpanic(\"%s: %s\");\n", name, argname[i]);
343: printf ("#endif\n");
344: }
345: }
346: printf("\treturn (VCALL(%s%s, VOFFSET(%s), &a));\n}\n",
347: argname[0], arg0special, name);
348:
349: }
350: BEGIN {
351: arg0special="";
352: }
353: END {
354: printf("\n/* Special cases: */\n");
355: argc=1;
356: argtype[0]="struct buf *";
357: argdir[0]="IN";
358: argname[0]="bp";
359: shouldbelocked[0] = 0;
360: arg0special="->b_vp";
361: willrele[0]=0;
362: name="vop_strategy";
363: doit();
364: name="vop_bwrite";
365: doit();
366: }
367: '"$awk_parser" | sed -e "$anal_retentive"
368:
369: # End stuff
370: echo '
371: /* End of special cases. */'
372:
373: # Add the vfs_op_descs array to the C file.
374: # Begin stuff
375: echo '
376: struct vnodeop_desc *vfs_op_descs[] = {
377: &vop_default_desc, /* MUST BE FIRST */
378: &vop_strategy_desc, /* XXX: SPECIAL CASE */
379: &vop_bwrite_desc, /* XXX: SPECIAL CASE */
380: '
381:
382: # Body stuff
383: sed -e "$sed_prep" $src | $awk '
384: function doit() {
385: printf("\t&%s_desc,\n", name);
386: }
387: '"$awk_parser"
388:
389: # End stuff
390: echo ' NULL
391: };
392: '
393:
394: exit 0
395:
396: # Local Variables:
397: # tab-width: 4
398: # End:
CVSweb