xref: /illumos-gate/usr/src/tools/ndrgen/ndrgen.sh (revision 4f364e7c95ee7fd9d5bbeddc1940e92405bb0e72)
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# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24# Use is subject to license terms.
25#
26
27# This is a wrapper script around the ndrgen compiler (ndrgen1).
28# CC must be defined in the environment or on the command line.
29
30NDRPROG="${0%/*}/ndrgen1"
31INCDIR=${ROOT}/usr/include/smbsrv
32
33PROGNAME=`basename $0`
34
35ndrgen_usage()
36{
37	if [[ $1 != "" ]] ; then
38		print "$PROGNAME: ERROR: $1"
39	fi
40
41	echo "usage: $PROGNAME [-Y cpp-path] file [file]..."
42	exit 1
43}
44
45# Copy header text from the input ndl file to the generated ndr C file.
46ndrgen_copy_header()
47{
48	ndl_file=$1
49	ndr_file=$2
50
51	nawk 'BEGIN { copy=0; }
52	/^\/\* NDRGEN_HEADER_BEGIN \*\// { copy=1; next; }
53	/^\/\* NDRGEN_HEADER_END \*\// { copy=0; next; }
54	/./ { if (copy==1) print; }' < $ndl_file > $ndr_file
55}
56
57if [[ $# -lt 1 ]] ; then
58	ndrgen_usage
59fi
60
61while getopts "Y" FLAG $*; do
62	case $FLAG in
63	Y)
64		CC_FLAG="y"
65		;;
66	*)
67		ndrgen_usage
68		;;
69	esac
70done
71
72if [[ $CC_FLAG = "y" ]] ; then
73	shift $(($OPTIND - 1))
74
75	if [[ $# -lt 1 ]] ; then
76		ndrgen_usage "C pre-processor path is missing"
77	else
78		CC=$1
79		shift $(($OPTIND - 1))
80
81		# Check for cw being invoked with -_cc or -_gcc
82		if [[ $1 = "-_cc" || $1 = "-_gcc" ]] ; then
83			CC_ARG=$1
84			shift $(($OPTIND - 1))
85		fi
86	fi
87fi
88
89if [[ $CC = "" ]] ; then
90	ndrgen_usage "C pre-processor is not defined"
91fi
92
93if [ ! -f $CC ] || [ ! -x $CC ] ; then
94	ndrgen_usage "cannot run $CC"
95fi
96
97for i
98do
99	if [[ ! -r $i ]] ; then
100		print "$PROGNAME: ERROR: cannot read $i"
101		exit 1
102	fi
103
104	BASENAME=`basename $i .ndl`
105	TMP_NAME=$BASENAME.ndl.c
106
107	cp $i $TMP_NAME
108
109	if $CC $CC_ARG -E  -D__a64 -D__EXTENSIONS__ -D_FILE_OFFSET_BITS=64 \
110		-I. -I${INCDIR} -I${INCDIR}/ndl -DNDRGEN $TMP_NAME | \
111		$NDRPROG > $BASENAME.raw
112	then
113		touch ${BASENAME}_ndr.c
114		ndrgen_copy_header $i ${BASENAME}_ndr.c
115
116		cat - << EOF >> ${BASENAME}_ndr.c
117/*
118 * Please do not edit this file.
119 * It was generated using ndrgen.
120 */
121
122#include <strings.h>
123#include <smbsrv/ndr.h>
124#include <smbsrv/ndl/$BASENAME.ndl>
125EOF
126
127		cat $BASENAME.raw >> ${BASENAME}_ndr.c
128
129		rm -f $BASENAME.raw
130		rm -f $TMP_NAME
131	else
132		rm -f $BASENAME.raw
133		rm -f $TMP_NAME
134		exit 1
135	fi
136done
137