Annotation of kernel/bsd/vfs/vnode_if.sh, revision 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.