Annotation of kernel/bsd/vfs/vnode_if.sh, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.