Print this page
1575 untangle libmlrpc ... (libmlrpc)
@@ -17,120 +17,102 @@
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
+
#
# Copyright 2009 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
+# Copyright 2013 Nexenta Systems, Inc. All rights reserved.
+#
# This is a wrapper script around the ndrgen compiler (ndrgen1).
-# CC must be defined in the environment or on the command line.
-NDRPROG="${0%/*}/ndrgen1"
-INCDIR=${ROOT}/usr/include/smbsrv
+NDRPROG="${0}1"
+# Note: most *.ndl files require an ANSI-compatible cpp,
+# so we can NOT use /usr/lib/cpp or /usr/ccs/lib/cpp
+# Wish there was an easier way to get an ANSI cpp.
+CPP="${CC} -E"
+CPPFLAGS="-DNDRGEN"
+V_FLAG=
+
PROGNAME=`basename $0`
ndrgen_usage()
{
if [[ $1 != "" ]] ; then
print "$PROGNAME: ERROR: $1"
fi
- echo "usage: $PROGNAME [-Y cpp-path] file [file]..."
+ echo "usage: $PROGNAME [options] file.ndl [file.ndl]..."
+ echo " options: -Y cc-path -Ddefine -Iinclude"
exit 1
}
-# Copy header text from the input ndl file to the generated ndr C file.
-ndrgen_copy_header()
+# Process the input ndl file ($1) generating C code on stdout.
+process()
{
- ndl_file=$1
- ndr_file=$2
+ # Put the standard top matter
+ #
+ # Want the include directive to have just
+ # include "file.ndl" (no path) so...
+ inc_ndl=`basename $1`
+ cat - << EOF
+/*
+ * Please do not edit this file.
+ * It was generated using ndrgen.
+ */
+
+#include <strings.h>
+#include <libmlrpc/ndr.h>
+#include "$inc_ndl"
+EOF
+
+ # Put optional custom top matter
nawk 'BEGIN { copy=0; }
/^\/\* NDRGEN_HEADER_BEGIN \*\// { copy=1; next; }
/^\/\* NDRGEN_HEADER_END \*\// { copy=0; next; }
- /./ { if (copy==1) print; }' < $ndl_file > $ndr_file
+ /./ { if (copy==1) print; }' $1
+
+ # now the real ndrgen output
+ [ -n "$V_FLAG" ] &&
+ echo "$CPP $CPPFLAGS $1 | $NDRPROG" >&2
+ $CPP $CPPFLAGS $1 | $NDRPROG
}
-if [[ $# -lt 1 ]] ; then
- ndrgen_usage
-fi
-while getopts "Y" FLAG $*; do
+while getopts "D:I:Y:V" FLAG
+do
case $FLAG in
- Y)
- CC_FLAG="y"
- ;;
- *)
- ndrgen_usage
- ;;
+ D|I) CPPFLAGS="$CPPFLAGS -${FLAG}${OPTARG}";;
+ Y) CPP="$OPTARG";;
+ V) V_FLAG="V";;
+ *) ndrgen_usage;;
esac
done
+shift $(($OPTIND - 1))
-if [[ $CC_FLAG = "y" ]] ; then
- shift $(($OPTIND - 1))
-
- if [[ $# -lt 1 ]] ; then
- ndrgen_usage "C pre-processor path is missing"
- else
- CC=$1
- shift $(($OPTIND - 1))
-
- # Check for cw being invoked with -_cc or -_gcc
- if [[ $1 = "-_cc" || $1 = "-_gcc" ]] ; then
- CC_ARG=$1
- shift $(($OPTIND - 1))
- fi
- fi
+if [[ $# -lt 1 ]] ; then
+ ndrgen_usage
fi
-if [[ $CC = "" ]] ; then
- ndrgen_usage "C pre-processor is not defined"
+if [ ! -x $CPP ] ; then
+ ndrgen_usage "cannot run $CPP"
fi
-if [ ! -f $CC ] || [ ! -x $CC ] ; then
- ndrgen_usage "cannot run $CC"
-fi
-
for i
do
if [[ ! -r $i ]] ; then
print "$PROGNAME: ERROR: cannot read $i"
exit 1
fi
- BASENAME=`basename $i .ndl`
- TMP_NAME=$BASENAME.ndl.c
-
- cp $i $TMP_NAME
-
- if $CC $CC_ARG -E -D__a64 -D__EXTENSIONS__ -D_FILE_OFFSET_BITS=64 \
- -I. -I${INCDIR} -I${INCDIR}/ndl -DNDRGEN $TMP_NAME | \
- $NDRPROG > $BASENAME.raw
- then
- touch ${BASENAME}_ndr.c
- ndrgen_copy_header $i ${BASENAME}_ndr.c
-
- cat - << EOF >> ${BASENAME}_ndr.c
-/*
- * Please do not edit this file.
- * It was generated using ndrgen.
- */
-
-#include <strings.h>
-#include <smbsrv/ndr.h>
-#include <smbsrv/ndl/$BASENAME.ndl>
-EOF
-
- cat $BASENAME.raw >> ${BASENAME}_ndr.c
-
- rm -f $BASENAME.raw
- rm -f $TMP_NAME
- else
- rm -f $BASENAME.raw
- rm -f $TMP_NAME
- exit 1
- fi
+ base=`basename $i .ndl`
+ process $i > ${base}_ndr.c || {
+ echo "ndrgen error";
+ rm ${base}_ndr.c;
+ }
done