154646Smckusick#!/bin/sh - 2*68305Scgdcopyright=' 3*68305Scgd/* 4*68305Scgd * Copyright (c) 1992, 1993, 1994 5*68305Scgd * The Regents of the University of California. All rights reserved. 6*68305Scgd * 7*68305Scgd * %sccs.include.redist.sh% 8*68305Scgd * 9*68305Scgd * from: NetBSD: vnode_if.sh,v 1.7 1994/08/25 03:04:28 cgd Exp $ 10*68305Scgd */ 11*68305Scgd' 12*68305ScgdSCRIPT_ID='@(#)vnode_if.sh 8.6 (Berkeley) 02/14/95' 1354646Smckusick 1454646Smckusick# Script to produce VFS front-end sugar. 1554725Sbostic# 1654725Sbostic# usage: vnode_if.sh srcfile 1754725Sbostic# (where srcfile is currently /sys/kern/vnode_if.src) 1854725Sbostic# 1954646Smckusick 2054725Sbosticif [ $# -ne 1 ] ; then 2155323Sheideman echo 'usage: vnode_if.sh srcfile' 2254725Sbostic exit 1 2354725Sbosticfi 2454725Sbostic 2554725Sbostic# Name of the source file. 2667635Smckusicksrc=$1 2754725Sbostic 2854725Sbostic# Names of the created files. 2967635Smckusickout_c=vnode_if.c 3067635Smckusickout_h=vnode_if.h 3154725Sbostic 3267635Smckusick# Awk program (must support nawk extensions) 3367635Smckusick# Use "awk" at Berkeley, "nawk" or "gawk" elsewhere. 3467635Smckusickawk=${AWK:-awk} 3555323Sheideman 3667635Smckusick# Does this awk have a "toupper" function? (i.e. is it GNU awk) 3767635Smckusickisgawk=`$awk 'BEGIN { print toupper("true"); exit; }' 2>/dev/null` 3867635Smckusick 3967635Smckusick# If this awk does not define "toupper" then define our own. 4067635Smckusickif [ "$isgawk" = TRUE ] ; then 4167635Smckusick # GNU awk provides it. 4267635Smckusick toupper= 4367635Smckusickelse 4467635Smckusick # Provide our own toupper() 4567635Smckusick toupper=' 4667635Smckusickfunction toupper(str) { 4767635Smckusick _toupper_cmd = "echo "str" |tr a-z A-Z" 4867635Smckusick _toupper_cmd | getline _toupper_str; 4967635Smckusick close(_toupper_cmd); 5067635Smckusick return _toupper_str; 5167635Smckusick}' 5267635Smckusickfi 5367635Smckusick 5467635Smckusick# 5567635Smckusick# This is the common part of all awk programs that read $src 5667635Smckusick# This parses the input for one function into the arrays: 5767635Smckusick# argdir, argtype, argname, willrele 5867635Smckusick# and calls "doit()" to generate output for the function. 5967635Smckusick# 6067635Smckusick# Input to this parser is pre-processed slightly by sed 6167635Smckusick# so this awk parser doesn't have to work so hard. The 6267635Smckusick# changes done by the sed pre-processing step are: 6367635Smckusick# insert a space beween * and pointer name 6467635Smckusick# replace semicolons with spaces 6567635Smckusick# 6667635Smckusicksed_prep='s:\*\([^\*/]\):\* \1:g 6767635Smckusicks/;/ /' 6867635Smckusickawk_parser=' 6967635Smckusick# Comment line 7067635Smckusick/^#/ { next; } 7167635Smckusick# First line of description 7267635Smckusick/^vop_/ { 7367635Smckusick name=$1; 7467635Smckusick argc=0; 7567635Smckusick next; 7667635Smckusick} 7767635Smckusick# Last line of description 7867635Smckusick/^}/ { 7967635Smckusick doit(); 8067635Smckusick next; 8167635Smckusick} 8267635Smckusick# Middle lines of description 8367635Smckusick{ 8467635Smckusick argdir[argc] = $1; i=2; 8567635Smckusick if ($2 == "WILLRELE") { 8667635Smckusick willrele[argc] = 1; 8767635Smckusick i++; 8867635Smckusick } else 8967635Smckusick willrele[argc] = 0; 9067793Smckusick argtype[argc] = $i; i++; 9167635Smckusick while (i < NF) { 9267793Smckusick argtype[argc] = argtype[argc]" "$i; 9367635Smckusick i++; 9467635Smckusick } 9567635Smckusick argname[argc] = $i; 9667635Smckusick argc++; 9767635Smckusick next; 9867635Smckusick} 9967635Smckusick' 10067635Smckusick 10167635Smckusick# This is put after the copyright on each generated file. 10267635Smckusickwarning=" 10354646Smckusick/* 10467635Smckusick * Warning: This file is generated automatically. 10567635Smckusick * (Modifications made here may easily be lost!) 10654646Smckusick * 10767635Smckusick * Created by the script: 10867635Smckusick * ${SCRIPT_ID} 10954646Smckusick */ 11067635Smckusick" 11154725Sbostic 11267793Smckusick# Get rid of ugly spaces 11367793Smckusickspace_elim='s:\([^/]\*\) :\1:g' 11467635Smckusick 11567635Smckusick# 11667635Smckusick# Redirect stdout to the H file. 11767635Smckusick# 11867635Smckusickecho "$0: Creating $out_h" 1>&2 11967635Smckusickexec > $out_h 12067635Smckusick 12167635Smckusick# Begin stuff 12267635Smckusickecho "$copyright" 12367635Smckusickecho "$warning" 12467635Smckusickecho ' 12554646Smckusickextern struct vnodeop_desc vop_default_desc; 12667635Smckusick' 12754646Smckusick 12867635Smckusick# Body stuff 12967635Smckusick# This awk program needs toupper() so define it if necessary. 13067635Smckusicksed -e "$sed_prep" $src | $awk "$toupper"' 13167635Smckusickfunction doit() { 13267635Smckusick # Declare arg struct, descriptor. 13367635Smckusick printf("\nstruct %s_args {\n", name); 13467793Smckusick printf("\tstruct vnodeop_desc * a_desc;\n"); 13567635Smckusick for (i=0; i<argc; i++) { 13667793Smckusick printf("\t%s a_%s;\n", argtype[i], argname[i]); 13754646Smckusick } 13867635Smckusick printf("};\n"); 13967635Smckusick printf("extern struct vnodeop_desc %s_desc;\n", name); 14067635Smckusick # Define inline function. 14167635Smckusick printf("static __inline int %s(", toupper(name)); 14267635Smckusick for (i=0; i<argc; i++) { 14367635Smckusick printf("%s", argname[i]); 14467635Smckusick if (i < (argc-1)) printf(", "); 14567635Smckusick } 14667635Smckusick printf(")\n"); 14767635Smckusick for (i=0; i<argc; i++) { 14867793Smckusick printf("\t%s %s;\n", argtype[i], argname[i]); 14967635Smckusick } 15067793Smckusick printf("{\n\tstruct %s_args a;\n", name); 15167635Smckusick printf("\ta.a_desc = VDESC(%s);\n", name); 15267635Smckusick for (i=0; i<argc; i++) { 15367635Smckusick printf("\ta.a_%s = %s;\n", argname[i], argname[i]); 15467635Smckusick } 15567635Smckusick printf("\treturn (VCALL(%s%s, VOFFSET(%s), &a));\n}\n", 15667635Smckusick argname[0], arg0special, name); 15767635Smckusick} 15867635SmckusickBEGIN { 15967635Smckusick arg0special=""; 16067635Smckusick} 16167635SmckusickEND { 16267635Smckusick printf("\n/* Special cases: */\n#include <sys/buf.h>\n"); 16367635Smckusick argc=1; 16467635Smckusick argtype[0]="struct buf *"; 16567635Smckusick argname[0]="bp"; 16667635Smckusick arg0special="->b_vp"; 16767635Smckusick name="vop_strategy"; 16867635Smckusick doit(); 16967635Smckusick name="vop_bwrite"; 17067635Smckusick doit(); 17167635Smckusick} 17267793Smckusick'"$awk_parser" | sed -e "$space_elim" 17354646Smckusick 17467635Smckusick# End stuff 17567635Smckusickecho ' 17667635Smckusick/* End of special cases. */' 17754646Smckusick 17854646Smckusick 17967635Smckusick# 18067635Smckusick# Redirect stdout to the C file. 18167635Smckusick# 18267635Smckusickecho "$0: Creating $out_c" 1>&2 18367635Smckusickexec > $out_c 18454646Smckusick 18567635Smckusick# Begin stuff 18667635Smckusickecho "$copyright" 18767635Smckusickecho "$warning" 18867635Smckusickecho ' 18954725Sbostic#include <sys/param.h> 19054725Sbostic#include <sys/mount.h> 19154725Sbostic#include <sys/vnode.h> 19254725Sbostic 19354725Sbosticstruct vnodeop_desc vop_default_desc = { 19454725Sbostic 0, 19554725Sbostic "default", 19654725Sbostic 0, 19754725Sbostic NULL, 19854725Sbostic VDESC_NO_OFFSET, 19954725Sbostic VDESC_NO_OFFSET, 20054725Sbostic VDESC_NO_OFFSET, 20155323Sheideman VDESC_NO_OFFSET, 20254725Sbostic NULL, 20354725Sbostic}; 20467635Smckusick' 20554725Sbostic 20667635Smckusick# Body stuff 20767635Smckusicksed -e "$sed_prep" $src | $awk ' 20867635Smckusickfunction do_offset(typematch) { 20967635Smckusick for (i=0; i<argc; i++) { 21067635Smckusick if (argtype[i] == typematch) { 21167635Smckusick printf("\tVOPARG_OFFSETOF(struct %s_args, a_%s),\n", 21267635Smckusick name, argname[i]); 21367635Smckusick return i; 21467635Smckusick }; 21567635Smckusick }; 21667635Smckusick print "\tVDESC_NO_OFFSET,"; 21767635Smckusick return -1; 21867635Smckusick} 21954725Sbostic 22067635Smckusickfunction doit() { 22167635Smckusick # Define offsets array 22267635Smckusick printf("\nint %s_vp_offsets[] = {\n", name); 22367635Smckusick for (i=0; i<argc; i++) { 22467635Smckusick if (argtype[i] == "struct vnode *") { 22567635Smckusick printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n", 22667635Smckusick name, argname[i]); 22767635Smckusick } 22855323Sheideman } 22967635Smckusick print "\tVDESC_NO_OFFSET"; 23067635Smckusick print "};"; 23167635Smckusick # Define F_desc 23267635Smckusick printf("struct vnodeop_desc %s_desc = {\n", name); 23367635Smckusick # offset 23467635Smckusick printf ("\t0,\n"); 23567635Smckusick # printable name 23667635Smckusick printf ("\t\"%s\",\n", name); 23767635Smckusick # flags 23867635Smckusick printf("\t0"); 23967635Smckusick vpnum = 0; 24067635Smckusick for (i=0; i<argc; i++) { 24167635Smckusick if (willrele[i]) { 24267635Smckusick if (argdir[i] ~ /OUT/) { 24367635Smckusick printf(" | VDESC_VPP_WILLRELE"); 24455323Sheideman } else { 24567635Smckusick printf(" | VDESC_VP%s_WILLRELE", vpnum); 24655323Sheideman }; 24767635Smckusick vpnum++; 24867635Smckusick } 24955323Sheideman } 25067635Smckusick print ","; 25167635Smckusick # vp offsets 25267635Smckusick printf ("\t%s_vp_offsets,\n", name); 25367635Smckusick # vpp (if any) 25467635Smckusick do_offset("struct vnode **"); 25567635Smckusick # cred (if any) 25667635Smckusick do_offset("struct ucred *"); 25767635Smckusick # proc (if any) 25867635Smckusick do_offset("struct proc *"); 25967635Smckusick # componentname 26067635Smckusick do_offset("struct componentname *"); 26167635Smckusick # transport layer information 26267635Smckusick printf ("\tNULL,\n};\n"); 26367635Smckusick} 26467635SmckusickEND { 26567635Smckusick printf("\n/* Special cases: */\n"); 26667635Smckusick argc=1; 26767635Smckusick argdir[0]="IN"; 26867635Smckusick argtype[0]="struct buf *"; 26967635Smckusick argname[0]="bp"; 27067635Smckusick willrele[0]=0; 27167635Smckusick name="vop_strategy"; 27267635Smckusick doit(); 27367635Smckusick name="vop_bwrite"; 27467635Smckusick doit(); 27567635Smckusick} 27667793Smckusick'"$awk_parser" | sed -e "$space_elim" 27755323Sheideman 27867635Smckusick# End stuff 27967635Smckusickecho ' 28067635Smckusick/* End of special cases. */' 28155323Sheideman 28267635Smckusick# Add the vfs_op_descs array to the C file. 28367635Smckusick# Begin stuff 28467635Smckusickecho ' 28567635Smckusickstruct vnodeop_desc *vfs_op_descs[] = { 28667635Smckusick &vop_default_desc, /* MUST BE FIRST */ 28767635Smckusick &vop_strategy_desc, /* XXX: SPECIAL CASE */ 28867635Smckusick &vop_bwrite_desc, /* XXX: SPECIAL CASE */ 28967635Smckusick' 29054725Sbostic 29167635Smckusick# Body stuff 29267635Smckusicksed -e "$sed_prep" $src | $awk ' 29367635Smckusickfunction doit() { 29467635Smckusick printf("\t&%s_desc,\n", name); 29554646Smckusick} 29667635Smckusick'"$awk_parser" 29754646Smckusick 29867635Smckusick# End stuff 29967635Smckusickecho ' NULL 30054646Smckusick}; 30167635Smckusick' 30254646Smckusick 30367635Smckusickexit 0 30454725Sbostic 30567635Smckusick# Local Variables: 30667635Smckusick# tab-width: 4 30767635Smckusick# End: 308