1#!/bin/ksh -p
2#
3# CDDL HEADER START
4#
5# The contents of this file are subject to the terms of the
6# Common Development and Distribution License (the "License").
7# You may not use this file except in compliance with the License.
8#
9# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10# or http://www.opensolaris.org/os/licensing.
11# See the License for the specific language governing permissions
12# and limitations under the License.
13#
14# When distributing Covered Code, include this CDDL HEADER in each
15# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16# If applicable, add the following below this CDDL HEADER, with the
17# fields enclosed by brackets "[]" replaced with your own identifying
18# information: Portions Copyright [yyyy] [name of copyright owner]
19#
20# CDDL HEADER END
21#
22
23#
24# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
25# Use is subject to license terms.
26#
27# Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
28#
29
30# This is a wrapper script around the ndrgen compiler (ndrgen1).
31
32NDRPROG="${0}1"
33
34# Note: most *.ndl files require an ANSI-compatible cpp,
35# so we can NOT use /usr/lib/cpp or /usr/ccs/lib/cpp
36# Wish there was an easier way to get an ANSI cpp.
37CPP="${CC} -E"
38CPPFLAGS="-DNDRGEN"
39V_FLAG=
40
41PROGNAME=`basename $0`
42
43ndrgen_usage()
44{
45	if [[ $1 != "" ]] ; then
46		print "$PROGNAME: ERROR: $1"
47	fi
48
49	echo "usage: $PROGNAME [options] file.ndl [file.ndl]..."
50	echo "	options: -Y cc-path -Ddefine -Iinclude"
51	exit 1
52}
53
54# Process the input ndl file ($1) generating C code on stdout.
55process()
56{
57
58	# Put the standard top matter
59	#
60	# Want the include directive to have just
61	# include "file.ndl" (no path) so...
62	inc_ndl=`basename $1`
63	cat - << EOF
64/*
65 * Please do not edit this file.
66 * It was generated using ndrgen.
67 */
68
69#include <strings.h>
70#include <libmlrpc/ndr.h>
71#include "$inc_ndl"
72EOF
73
74	# Put optional custom top matter
75	nawk 'BEGIN { copy=0; }
76	/^\/\* NDRGEN_HEADER_BEGIN \*\// { copy=1; next; }
77	/^\/\* NDRGEN_HEADER_END \*\// { copy=0; next; }
78	/./ { if (copy==1) print; }' $1
79
80	# now the real ndrgen output
81	[ -n "$V_FLAG" ] &&
82	  echo "$CPP $CPPFLAGS $1 | $NDRPROG" >&2
83	$CPP $CPPFLAGS $1 | $NDRPROG
84}
85
86
87while getopts "D:I:Y:V" FLAG
88do
89	case $FLAG in
90	D|I)	CPPFLAGS="$CPPFLAGS -${FLAG}${OPTARG}";;
91	Y)	CPP="$OPTARG";;
92	V)	V_FLAG="V";;
93	*)	ndrgen_usage;;
94	esac
95done
96shift $(($OPTIND - 1))
97
98if [[ $# -lt 1 ]] ; then
99	ndrgen_usage
100fi
101
102if [ ! -x $CPP ] ; then
103	ndrgen_usage "cannot run $CPP"
104fi
105
106for i
107do
108	if [[ ! -r $i ]] ; then
109		print "$PROGNAME: ERROR: cannot read $i"
110		exit 1
111	fi
112
113	base=`basename $i .ndl`
114	process $i > ${base}_ndr.c || {
115	  echo "ndrgen error";
116	  rm ${base}_ndr.c;
117	}
118done
119