xref: /csrg-svn/sys/kern/vnode_if.sh (revision 68305)
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