Annotation of XNU/bsd/kern/vnode_if.sh, revision 1.1.1.1

1.1       root        1: #!/bin/sh -
                      2: #
                      3: # Copyright (c) 1992, 1993
                      4: #      The Regents of the University of California.  All rights reserved.
                      5: #
                      6: # Redistribution and use in source and binary forms, with or without
                      7: # modification, are permitted provided that the following conditions
                      8: # are met:
                      9: # 1. Redistributions of source code must retain the above copyright
                     10: #    notice, this list of conditions and the following disclaimer.
                     11: # 2. Redistributions in binary form must reproduce the above copyright
                     12: #    notice, this list of conditions and the following disclaimer in the
                     13: #    documentation and/or other materials provided with the distribution.
                     14: # 3. All advertising materials mentioning features or use of this software
                     15: #    must display the following acknowledgement:
                     16: #      This product includes software developed by the University of
                     17: #      California, Berkeley and its contributors.
                     18: # 4. Neither the name of the University nor the names of its contributors
                     19: #    may be used to endorse or promote products derived from this software
                     20: #    without specific prior written permission.
                     21: #
                     22: # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     23: # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     24: # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     25: # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     26: # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     27: # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     28: # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     29: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     30: # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     31: # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     32: # SUCH DAMAGE.
                     33: #
                     34: #      @(#)vnode_if.sh 8.1 (Berkeley) 6/10/93
                     35: #
                     36: 
                     37: # Script to produce VFS front-end sugar.
                     38: #
                     39: # usage: vnode_if.sh srcfile
                     40: #      (where srcfile is currently /sys/kern/vnode_if.src)
                     41: #
                     42: # These awk scripts are not particularly well written, specifically they
                     43: # don't use arrays well and figure out the same information repeatedly.
                     44: # Please rewrite them if you actually understand how to use awk.  Note,
                     45: # they use nawk extensions and gawk's toupper.
                     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: CFILE=vnode_if.c
                     57: HEADER=vnode_if.h
                     58: 
                     59: # Awk program (must support nawk extensions and gawk's "toupper")
                     60: # Use "awk" at Berkeley, "gawk" elsewhere.
                     61: AWK=gawk
                     62: 
                     63: # Print out header information for vnode_if.h.
                     64: cat << END_OF_LEADING_COMMENT > $HEADER
                     65: /*
                     66:  * This file is produced automatically.
                     67:  * Do not modify anything in here by hand.
                     68:  *
                     69:  * Created from @(#)vnode_if.sh        8.1 (Berkeley) 6/10/93
                     70:  */
                     71: 
                     72: extern struct vnodeop_desc vop_default_desc;
                     73: END_OF_LEADING_COMMENT
                     74: 
                     75: # Awk script to take vnode_if.src and turn it into vnode_if.h.
                     76: $AWK '
                     77:        NF == 0 || $0 ~ "^#" {
                     78:                next;
                     79:        }
                     80:        {
                     81:                # Get the function name.
                     82:                name = $1;
                     83:                uname = toupper(name);
                     84: 
                     85:                # Get the function arguments.
                     86:                for (c1 = 0;; ++c1) {
                     87:                        if (getline <= 0)
                     88:                                exit
                     89:                        if ($0 ~ "^};")
                     90:                                break;
                     91:                        a[c1] = $0;
                     92:                }
                     93: 
                     94:                # Print out the vop_F_args structure.
                     95:                printf("struct %s_args {\n\tstruct vnodeop_desc *a_desc;\n",
                     96:                    name);
                     97:                for (c2 = 0; c2 < c1; ++c2) {
                     98:                        c3 = split(a[c2], t);
                     99:                        printf("\t");
                    100:                        if (t[2] ~ "WILLRELE")
                    101:                                c4 = 3;
                    102:                        else 
                    103:                                c4 = 2;
                    104:                        for (; c4 < c3; ++c4)
                    105:                                printf("%s ", t[c4]);
                    106:                        beg = match(t[c3], "[^*]");
                    107:                        printf("%sa_%s\n",
                    108:                            substr(t[c4], 0, beg - 1), substr(t[c4], beg));
                    109:                }
                    110:                printf("};\n");
                    111: 
                    112:                # Print out extern declaration.
                    113:                printf("extern struct vnodeop_desc %s_desc;\n", name);
                    114: 
                    115:                # Print out inline struct.
                    116:                printf("static inline int %s(", uname);
                    117:                sep = ", ";
                    118:                for (c2 = 0; c2 < c1; ++c2) {
                    119:                        if (c2 == c1 - 1)
                    120:                                sep = ")\n";
                    121:                        c3 = split(a[c2], t);
                    122:                        beg = match(t[c3], "[^*]");
                    123:                        end = match(t[c3], ";");
                    124:                        printf("%s%s", substr(t[c3], beg, end - beg), sep);
                    125:                }
                    126:                for (c2 = 0; c2 < c1; ++c2) {
                    127:                        c3 = split(a[c2], t);
                    128:                        printf("\t");
                    129:                        if (t[2] ~ "WILLRELE")
                    130:                                c4 = 3;
                    131:                        else
                    132:                                c4 = 2;
                    133:                        for (; c4 < c3; ++c4)
                    134:                                printf("%s ", t[c4]);
                    135:                        beg = match(t[c3], "[^*]");
                    136:                        printf("%s%s\n",
                    137:                            substr(t[c4], 0, beg - 1), substr(t[c4], beg));
                    138:                }
                    139:                printf("{\n\tstruct %s_args a;\n\n", name);
                    140:                printf("\ta.a_desc = VDESC(%s);\n", name);
                    141:                for (c2 = 0; c2 < c1; ++c2) {
                    142:                        c3 = split(a[c2], t);
                    143:                        printf("\t");
                    144:                        beg = match(t[c3], "[^*]");
                    145:                        end = match(t[c3], ";");
                    146:                        printf("a.a_%s = %s\n",
                    147:                            substr(t[c3], beg, end - beg), substr(t[c3], beg));
                    148:                }
                    149:                c1 = split(a[0], t);
                    150:                beg = match(t[c1], "[^*]");
                    151:                end = match(t[c1], ";");
                    152:                printf("\treturn (VCALL(%s, VOFFSET(%s), &a));\n}\n",
                    153:                    substr(t[c1], beg, end - beg), name);
                    154:        }' < $SRC >> $HEADER
                    155: 
                    156: # Print out header information for vnode_if.c.
                    157: cat << END_OF_LEADING_COMMENT > $CFILE
                    158: /*
                    159:  * This file is produced automatically.
                    160:  * Do not modify anything in here by hand.
                    161:  *
                    162:  * Created from @(#)vnode_if.sh        8.1 (Berkeley) 6/10/93
                    163:  */
                    164: 
                    165: #include <sys/param.h>
                    166: #include <sys/mount.h>
                    167: #include <sys/vnode.h>
                    168: 
                    169: struct vnodeop_desc vop_default_desc = {
                    170:        0,
                    171:        "default",
                    172:        0,
                    173:        NULL,
                    174:        VDESC_NO_OFFSET,
                    175:        VDESC_NO_OFFSET,
                    176:        VDESC_NO_OFFSET,
                    177:        VDESC_NO_OFFSET,
                    178:        NULL,
                    179: };
                    180: 
                    181: END_OF_LEADING_COMMENT
                    182: 
                    183: # Awk script to take vnode_if.src and turn it into vnode_if.c.
                    184: $AWK 'function kill_surrounding_ws (s) {
                    185:                sub (/^[ \t]*/, "", s);
                    186:                sub (/[ \t]*$/, "", s);
                    187:                return s;
                    188:        }
                    189: 
                    190:        function read_args() {
                    191:                numargs = 0;
                    192:                while (getline ln) {
                    193:                        if (ln ~ /}/) {
                    194:                                break;
                    195:                        };
                    196:        
                    197:                        # Delete comments, if any.
                    198:                        gsub (/\/\*.*\*\//, "", ln);
                    199:                        
                    200:                        # Delete leading/trailing space.
                    201:                        ln = kill_surrounding_ws(ln);
                    202:        
                    203:                        # Pick off direction.
                    204:                        if (1 == sub(/^INOUT[ \t]+/, "", ln))
                    205:                                dir = "INOUT";
                    206:                        else if (1 == sub(/^IN[ \t]+/, "", ln))
                    207:                                dir = "IN";
                    208:                        else if (1 == sub(/^OUT[ \t]+/, "", ln))
                    209:                                dir = "OUT";
                    210:                        else
                    211:                                bail("No IN/OUT direction for \"" ln "\".");
                    212: 
                    213:                        # check for "WILLRELE"
                    214:                        if (1 == sub(/^WILLRELE[ \t]+/, "", ln)) {
                    215:                                rele = "WILLRELE";
                    216:                        } else {
                    217:                                rele = "WONTRELE";
                    218:                        };
                    219:        
                    220:                        # kill trailing ;
                    221:                        if (1 != sub (/;$/, "", ln)) {
                    222:                                bail("Missing end-of-line ; in \"" ln "\".");
                    223:                        };
                    224:        
                    225:                        # pick off variable name
                    226:                        if (!(i = match(ln, /[A-Za-z0-9_]+$/))) {
                    227:                                bail("Missing var name \"a_foo\" in \"" ln "\".");
                    228:                        };
                    229:                        arg = substr (ln, i);
                    230:                        # Want to <<substr(ln, i) = "";>>, but nawk cannot.
                    231:                        # Hack around this.
                    232:                        ln = substr(ln, 1, i-1);
                    233:        
                    234:                        # what is left must be type
                    235:                        # (put clean it up some)
                    236:                        type = ln;
                    237:                        gsub (/[ \t]+/, " ", type);   # condense whitespace
                    238:                        type = kill_surrounding_ws(type);
                    239:        
                    240:                        # (boy this was easier in Perl)
                    241:        
                    242:                        numargs++;
                    243:                        dirs[numargs] = dir;
                    244:                        reles[numargs] = rele;
                    245:                        types[numargs] = type;
                    246:                        args[numargs] = arg;
                    247:                };
                    248:        }
                    249: 
                    250:        function generate_operation_vp_offsets() {
                    251:                printf ("int %s_vp_offsets[] = {\n", name);
                    252:                # as a side effect, figure out the releflags
                    253:                releflags = "";
                    254:                vpnum = 0;
                    255:                for (i=1; i<=numargs; i++) {
                    256:                        if (types[i] == "struct vnode *") {
                    257:                                printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n",
                    258:                                        name, args[i]);
                    259:                                if (reles[i] == "WILLRELE") {
                    260:                                        releflags = releflags "|VDESC_VP" vpnum "_WILLRELE";
                    261:                                };
                    262:                                vpnum++;
                    263:                        };
                    264:                };
                    265:                sub (/^\|/, "", releflags);
                    266:                print "\tVDESC_NO_OFFSET";
                    267:                print "};";
                    268:        }
                    269:        
                    270:        function find_arg_with_type (type) {
                    271:                for (i=1; i<=numargs; i++) {
                    272:                        if (types[i] == type) {
                    273:                                return "VOPARG_OFFSETOF(struct " name "_args,a_" args[i] ")";
                    274:                        };
                    275:                };
                    276:                return "VDESC_NO_OFFSET";
                    277:        }
                    278:        
                    279:        function generate_operation_desc() {
                    280:                printf ("struct vnodeop_desc %s_desc = {\n", name);
                    281:                # offset
                    282:                printf ("\t0,\n");
                    283:                # printable name
                    284:                printf ("\t\"%s\",\n", name);
                    285:                # flags
                    286:                vppwillrele = "";
                    287:                for (i=1; i<=numargs; i++) {
                    288:                        if (types[i] == "struct vnode **" &&
                    289:                                (reles[i] == "WILLRELE")) {
                    290:                                vppwillrele = "|VDESC_VPP_WILLRELE";
                    291:                        };
                    292:                };
                    293:                if (releflags == "") {
                    294:                        printf ("\t0%s,\n", vppwillrele);
                    295:                } else {
                    296:                        printf ("\t%s%s,\n", releflags, vppwillrele);
                    297:                };
                    298:                # vp offsets
                    299:                printf ("\t%s_vp_offsets,\n", name);
                    300:                # vpp (if any)
                    301:                printf ("\t%s,\n", find_arg_with_type("struct vnode **"));
                    302:                # cred (if any)
                    303:                printf ("\t%s,\n", find_arg_with_type("struct ucred *"));
                    304:                # proc (if any)
                    305:                printf ("\t%s,\n", find_arg_with_type("struct proc *"));
                    306:                # componentname
                    307:                printf ("\t%s,\n", find_arg_with_type("struct componentname *"));
                    308:                # transport layer information
                    309:                printf ("\tNULL,\n};\n");
                    310:        }
                    311: 
                    312:        NF == 0 || $0 ~ "^#" {
                    313:                next;
                    314:        }
                    315:        {
                    316:                # get the function name
                    317:                name = $1;
                    318: 
                    319:                # get the function arguments
                    320:                read_args();
                    321: 
                    322:                # Print out the vop_F_vp_offsets structure.  This all depends
                    323:                # on naming conventions and nothing else.
                    324:                generate_operation_vp_offsets();
                    325: 
                    326:                # Print out the vnodeop_desc structure.
                    327:                generate_operation_desc();
                    328: 
                    329:                printf "\n";
                    330: 
                    331:        }' < $SRC >> $CFILE
                    332: # THINGS THAT DON'T WORK RIGHT YET.
                    333: # 
                    334: # Two existing BSD vnodeops (bwrite and strategy) don't take any vnodes as
                    335: # arguments.  This means that these operations can't function successfully
                    336: # through a bypass routine.
                    337: #
                    338: # Bwrite and strategy will be replaced when the VM page/buffer cache
                    339: # integration happens.
                    340: #
                    341: # To get around this problem for now we handle these ops as special cases.
                    342: 
                    343: cat << END_OF_SPECIAL_CASES >> $HEADER
                    344: #include <sys/buf.h>
                    345: struct vop_strategy_args {
                    346:        struct vnodeop_desc *a_desc;
                    347:        struct buf *a_bp;
                    348: };
                    349: extern struct vnodeop_desc vop_strategy_desc;
                    350: static inline int VOP_STRATEGY(bp)
                    351:        struct buf *bp;
                    352: {
                    353:        struct vop_strategy_args a;
                    354: 
                    355:        a.a_desc = VDESC(vop_strategy);
                    356:        a.a_bp = bp;
                    357:        return (VCALL((bp)->b_vp, VOFFSET(vop_strategy), &a));
                    358: }
                    359: 
                    360: struct vop_bwrite_args {
                    361:        struct vnodeop_desc *a_desc;
                    362:        struct buf *a_bp;
                    363: };
                    364: extern struct vnodeop_desc vop_bwrite_desc;
                    365: static inline int VOP_BWRITE(bp)
                    366:        struct buf *bp;
                    367: {
                    368:        struct vop_bwrite_args a;
                    369: 
                    370:        a.a_desc = VDESC(vop_bwrite);
                    371:        a.a_bp = bp;
                    372:        return (VCALL((bp)->b_vp, VOFFSET(vop_bwrite), &a));
                    373: }
                    374: END_OF_SPECIAL_CASES
                    375: 
                    376: cat << END_OF_SPECIAL_CASES >> $CFILE
                    377: int vop_strategy_vp_offsets[] = {
                    378:        VDESC_NO_OFFSET
                    379: };
                    380: struct vnodeop_desc vop_strategy_desc = {
                    381:        0,
                    382:        "vop_strategy",
                    383:        0,
                    384:        vop_strategy_vp_offsets,
                    385:        VDESC_NO_OFFSET,
                    386:        VDESC_NO_OFFSET,
                    387:        VDESC_NO_OFFSET,
                    388:        VDESC_NO_OFFSET,
                    389:        NULL,
                    390: };
                    391: int vop_bwrite_vp_offsets[] = {
                    392:        VDESC_NO_OFFSET
                    393: };
                    394: struct vnodeop_desc vop_bwrite_desc = {
                    395:        0,
                    396:        "vop_bwrite",
                    397:        0,
                    398:        vop_bwrite_vp_offsets,
                    399:        VDESC_NO_OFFSET,
                    400:        VDESC_NO_OFFSET,
                    401:        VDESC_NO_OFFSET,
                    402:        VDESC_NO_OFFSET,
                    403:        NULL,
                    404: };
                    405: END_OF_SPECIAL_CASES
                    406: 
                    407: # Add the vfs_op_descs array to the C file.
                    408: $AWK '
                    409:        BEGIN {
                    410:                printf("\nstruct vnodeop_desc *vfs_op_descs[] = {\n");
                    411:                printf("\t&vop_default_desc,    /* MUST BE FIRST */\n");
                    412:                printf("\t&vop_strategy_desc,   /* XXX: SPECIAL CASE */\n");
                    413:                printf("\t&vop_bwrite_desc,     /* XXX: SPECIAL CASE */\n");
                    414:        }
                    415:        END {
                    416:                printf("\tNULL\n};\n");
                    417:        }
                    418:        NF == 0 || $0 ~ "^#" {
                    419:                next;
                    420:        }
                    421:        {
                    422:                # Get the function name.
                    423:                printf("\t&%s_desc,\n", $1);
                    424: 
                    425:                # Skip the function arguments.
                    426:                for (;;) {
                    427:                        if (getline <= 0)
                    428:                                exit
                    429:                        if ($0 ~ "^};")
                    430:                                break;
                    431:                }
                    432:        }' < $SRC >> $CFILE
                    433: 

unix.superglobalmegacorp.com

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