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