Annotation of sys/kern/vnode_if.sh, Revision 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