#!/bin/sh 
#
# Configure -- configure lsof
#
# See the LSOF_HLP here document for usage.
#
# See the lsof distribution file 00XCONFIG for information on setting
# environment variables for cross-configuring lsof -- e.g., for configuring
# for Linux 2.3 on a machine running 2.4.  Marty Leisner suggested this
# support and provided the Linux Configure stanza modifications.
#
# When configuring for a particular dialect, <target-dialect>, this script
# requires that the subdirectory ./dialects/<target-dialect> contain a
# shell script, named $LSOF_MK, that places its source modules in this
# directory.
#
# $Id: Configure,v 1.160 2011/09/27 17:27:20 abe Exp $

# LSOF_CFLAGS_OVERRIDE=1 may be introduced through the environment to cause
#	the library Makefile's CFLAGS definition to override any in the
#	environment.

# LSOF_DISTRIBKVM may be introduced through the environment to specify the
#	Sun4 kernel virtual memory type of distrib.cf

LSOF_F="ddev.c dfile.c dlsof.h dmnt.c dnode*.c dproc.c dproto.h dsock.c dstore.c dzfs.h kernelbase.h machine.h machine.h.old new_machine.h __lseek.s"
LSOF_HLP_BASE=./cfghlp.
LSOF_HLP=${LSOF_HLP_BASE}$$

# LSOF_LOCALSUFFIX may be introduced through the environment to select a local
#	version of a Makefile.  It is used as a suffix to $LSOF_MKF.

# LSOF_MAKE may be introduced through the environment to specify a path to the
#	make command.   It defaults to `which make`, if that is non-NULL;
#	otherwise to the string "make".

if test "X$LSOF_MAKE" = "X"	# {
then
  LSOF_MAKE=`which make`
  if test "X$LSOF_MAKE" = "X"	# {
  then
    LSOF_MAKE=make
  fi	# }
fi	# }

LSOF_MK=Mksrc

# LSOF_MKC is the dialect's Mksrc create command -- default "ln -s".

# LSOF_MKFC may be introduced though the environment to change the name
# used for the created make file.

if test "X$LSOF_MKFC" = "X"	# {
then
  LSOF_MKFC=Makefile
fi	# }

LSOF_LIB=lib
LSOF_MKF=Makefile
LSOF_LIBMKF=Makefile
LSOF_LIBMKFSKEL=Makefile.skel

LSOF_VF=version

# Make sure no other variable important to Makefile construction is
# already set in the environment.
#
#	$AFS_VICE	    locatiion of AFS VICE directory
#				(default = /usr/vice)
#	$LSOF_AFS	    AFS temporary
#	$LSOF_AFS_NQ	    AFS-not-qualified flag
#	$LSOF_AFSV	    AFS version
#	$LSOF_AR	    archive command and its arguments for making the
#			    lsof library
#	$LSOF_ARCH	    Unix dialect architecture as a string (may be
#			    supplied externally)
#	$LSOF_CC	    C compiler name (may be supplied externally)
#	$LSOF_CCV	    C compiler version (may be supplied externally)
#	$LSOF_CDIR	    configuration directory
#	$LSOF_CFGD	    depend options
#	$LSOF_CFGDN	    depend file name
#	$LSOF_CFGF	    C flags -- e.g., -D's
#	$LSOF_CFGL	    last lsof library loader flags -- e.g., -l's
#	$LSOF_CINFO	    Configure information for LSOF_CINFO in version.h
#	$LSOF_CTFH	    Solaris 10 and above libctf.h status
#	$LSOF_CTFL	    Solaris 10 and above -lctf status
#	$LSOF_DEBUG	    Makefile's DEBUG string
#	$LSOF_DINC	    include flags -- -I's
#	$LSOF_DINC_ADD	    include flags status
#	$LSOF_DOC	    special document (man page) directory path
#	$LSOF_ERR	    internal error flag
#	$LSOF_FCFGL	    first lsof library loader flags -- e.g., -l's
#			    that must precede $LSOF_LIB
#	$LSOF_FBSD_ZFS      FreeBSD $LSOF_FBSD_ZFS_MKF status
#	$LSOF_FBSD_ZFS_CFGF FreeBSD ZFS configure flags
#	$LSOF_FBSD_ZFS_MKF  FreeBSD ZFS Makefile name
#	$LSOF_FBSD_ZFS_SYS  FreeBSD ZFS system sources location
#	$LSOF_HOST	    host name (e.g., from uname -n)
#	$LSOF_INCLUDE	    directory where header files are found
#			    (default = /usr/include)
#	$LSOF_LD	    loader name if not $LSOF_CC
#	$LSOF_LIB_NO	    if "N" don't configure the lsof library
#	$LSOF_LOCALSUFFIX   local suffix for Makefile
#	$LSOF_NBSD_BUFQH    NetBSD <sys/bufq.h> copy status
#	$LSOF_NBSD_PTYFS    NetBSD ${NETBSD_SYS}/sys/fs/ptyfs/ copy status
#	$LSOF_N_UNIXV	    *BSD system's kernel file
#	$LSOF_PL	    patch level
#	$LSOF_RANLIB	    randomizing command for the lsof library
#	$LSOF_RANLIB_SUP    if non-NULL $LSOF_RANLIB was supplied
#	$LSOF_SCRIPT_CALL   Customize and Inventory scripts call status
#	$LSOF_SPMKF	    Special Makefile name
#	$LSOF_TGT	    canonical target abbreviation (shortest)
#	$LSOF_TMP	    internal temporary
#	$LSOF_TMP1	    internal temporary
#	$LSOF_TMP2	    internal temporary
#	$LSOF_TMP3	    internal temporary
#	$LSOF_TMP4	    internal temporary
#	$LSOF_TMP5	    internal temporary
#	$LSOF_TMP6	    internal temporary
#	$LSOF_TMPC_BASE	    base name for $LSOF_TMPC
#	$LSOF_TMPC	    temporary C source file base name
#	$LSOF_TSTBIGF	    big file capability (for $LSOF_TSTCFLG)
#	$LSOF_TSTCC	    tests CC file
#	$LSOF_TSTCFLG	    tests CFLAGS file
#	$LSOF_TSTDFLG	    dialect-specific values for $LSOF_TSTCFLG
#	$LSOF_TSTK64	    status of 64 bit kernel (for $LSOF_TSTCFLG)
#	$LSOF_TSTKMEM	    /dev/kmem usage status (for $LSOF_TSTCFLG)
#	$LSOF_TSTLFF	    tests LDFLAGS file
#	$LSOF_TSTLFLG	    tests LDFLAGS values
#	$LSOF_TSTSUBD	    test subdirectory
#	$LSOF_TSTVPATH	    test v_path state (for $LSOF_TSTCFLG)
#	$LSOF_TSTXO	    test extra objects (for $LSOF_TSTXOC)
#	$LSOF_TSTXOC	    test extra objects file
#	$LSOF_UNSUP	    Lsof is unsupported on this dialect
#	$LSOF_VERS	    Unix dialect version as a decimal number (may
#			    be supplied externally)
#	$LSOF_VSTR	    Unix dialect version as a string -- may be supplied
#			    externally

if test "X$AFS_VICE" = "X"	# {
then
  AFS_VICE="/usr/vice"
fi	# }
LSOF_AFS=""
LSOF_AFS_NQ=""
LSOF_AFSV=""
if test "X$LSOF_ARCH" = "X"	# {
then
  LSOF_ARCH=""
fi	# }
LSOF_CDIR=""
LSOF_CFGD=""
LSOF_CFGDN=""
LSOF_CINFO=""
LSOF_CTFH=0
LSOF_CTFL=0
LSOF_DEBUG=""
LSOF_DOC=""
LSOF_ERR=""
LSOF_FCFGL=""
LSOF_FBSD_ZFS=0
LSOF_FBSD_ZFS_CFGF=""
LSOF_FBSD_ZFS_MKF="Makefile.zfs"
LSOF_FBSD_ZFS_SYS=""
LSOF_HOST=""
if test "X$LSOF_INCLUDE" = "X"	# {
then
  LSOF_DINC=""
  LSOF_INCLUDE="/usr/include"
else
  LSOF_DINC="-I$LSOF_INCLUDE"
fi	# }
LSOF_LD=""
LSOF_LIB_NO=""
LSOF_PL=""
if test "X$LSOF_RANLIB" = "X"	# {
then
  LSOF_RANLIB="ranlib"
  LSOF_RANLIB_SUP=""
else
  LSOF_RANLIB_SUP="Y"
fi	# }
LSOF_SCRIPT_CALL="yes"
LSOF_SPMKF=""
LSOF_TMP1=""
LSOF_TMP2=""
LSOF_TMPC_BASE=./lsof_Configure_tmp_
LSOF_TMPC=${LSOF_TMPC_BASE}$$
LSOF_TSTBIGF=""
LSOF_TSTSUBD="./tests"
LSOF_TSTCC="${LSOF_TSTSUBD}/config.cc"
LSOF_TSTCFLG="${LSOF_TSTSUBD}/config.cflags"
LSOF_TSTDFLG=""
LSOF_TSTK64=0
LSOF_TSTKMEM=1
LSOF_TSTLFF="${LSOF_TSTSUBD}/config.ldflags"
LSOF_TSTLFLG=""
LSOF_TSTVPATH=0
LSOF_TSTXO=""
LSOF_TSTXOC="${LSOF_TSTSUBD}/config.xobj"
LSOF_UNSUP="WARNING: unsupported dialect or version"
if test "X$LSOF_VERS" = "X"	# {
then
  LSOF_VERS=""
fi	# }
if test "X$LSOF_VSTR" = "X"	# {
then
  LSOF_VSTR=""
fi	# }

# Establish echo type -- Berkeley or SYSV.

j=`echo -n ""`
if test "X$j" = "X-n "
then
  EC="\c"
  EO=""
else
  EC=""
  EO="-n"
fi

# Make sure temporary files are removed before an abnormal exit.

trap 'rm -f ${LSOF_HLP_BASE}* ${LSOF_TMPC_BASE}*; exit 1' 1 2 3 15

rm -f $LSOF_HLP
cat > $LSOF_HLP << LSOF_HLP
Usage: Configure <options> <target-dialect>
  <options>:  -clean        : clean up previous configuration
              -d|-dialects  : display a list of supported dialect versions
              -h|-help      : display help information
              -n            : avoid AFS, customization, and inventory checks
  <target-dialect> (****USE -d TO GET TESTED DIALECT VERSION NUMBERS****):
    aix|aixgcc              : IBM AIX xlc (aix) or gcc (aixgcc)
    darwin                  : Apple Darwin
    decosf                  : DEC OSF/1
    digital_unix|du         : Digital UNIX
    freebsd                 : FreeBSD
    hpux|hpuxgcc            : HP-UX cc (hpux) or gcc (hpuxgcc)
    linux                   : Linux
    netbsd                  : NetBSD
    nextstep|next|ns|nxt    : NEXTSTEP
    openbsd                 : OpenBSD
    openstep|os             : OPENSTEP
    osr|sco                 : SCO OpenServer < 6.0.0, SCO devloper's compiler
    osrgcc|scogcc           : SCO OpenServer < 6.0.0, gcc compiler
    osr6                    : SCO OpenServer 6.0.0, SCO compiler
    solaris|solariscc       : Solaris gcc (solaris) or cc (solariscc)
    tru64		    : Tru64 UNIX
    unixware|uw             : SCO|Caldera UnixWare
LSOF_HLP

LSOF_TGT="no-target"

args=$#
while test $args -gt 0	# {
do
  case $1 in	# {
    -clean)
      if test -r $LSOF_MKFC	# {
      then
	echo "$LSOF_MAKE -f $LSOF_MKFC clean"
	$LSOF_MAKE -f $LSOF_MKFC clean
      else
	if test -r ${LSOF_LIB}/${LSOF_LIBMKF}	# {
	then
	  echo "(cd ${LSOF_LIB}; $LSOF_MAKE -f ${LSOF_LIBMKF} clean)"
	  (cd ${LSOF_LIB}; $LSOF_MAKE -f ${LSOF_LIBMKF} clean)
	else
	  if test -r ${LSOF_LIB}/${LSOF_LIBMKF}.skel	# {
	  then
	    echo "(cd ${LSOF_LIB}; $LSOF_MAKE -f ${LSOF_LIBMKF}.skel clean)"
	    (cd ${LSOF_LIB}; $LSOF_MAKE -f ${LSOF_LIBMKF}.skel clean)
	  fi	# }
	fi	# }
      fi	# }
      if test -r ${LSOF_TSTSUBD}/Makefile	# {
      then
	echo "(cd ${LSOF_TSTSUBD}; $LSOF_MAKE spotless)"
	(cd ${LSOF_TSTSUBD}; $LSOF_MAKE spotless)
      else
	echo '(cd ${LSOF_TSTSUBD}; rm *.o config.*)'
	(cd ${LSOF_TSTSUBD}; rm *.o config.*)
      fi	# }
      rm -f $LSOF_F $LSOF_MKFC $LSOF_FBSD_ZFS_MKF ${LSOF_TMPC_BASE}*
      echo rm -f $LSOF_F $LSOF_MKFC $LSOF_FBSD_ZFS_MKF ${LSOF_TMPC_BASE}*
      rm -rf AFSHeaders AFSVersion solaris11 version.h vnode_if.h
      echo "rm -rf AFSHeaders AFSVersion solaris11 version.h vnode_if.h"
      rm -f ${LSOF_HLP_BASE}* cd9660_node.h lockf_owner.h fbsd_minor.h
      echo "rm -f ${LSOF_HLP_BASE}* cd9660_node.h lockf_owner.h fbsd_minor.h"
      rm -f dialects/aix/aix5/j2/j2_snapshot.h
      echo "rm -f dialects/aix/aix5/j2/j2_snapshot.h"
      rm -f dialects/sun/solaris10	# DEBUG -- for s10_44
      echo "rm -f dialects/sun/solaris10"	# DEBUG -- for s10_44
      rm -f dialects/du/du5_sys_malloc.h
      echo "rm -f dialects/du/du5_sys_malloc.h"
      rm -f dialects/hpux/kmem/hpux_mount.h
      echo "rm -f dialects/hpux/kmem/hpux_mount.h"
      rm -rf dialects/n+obsd/include
      echo "rm -rf dialects/n+obsd/include"
      rm -f dialects/uw/uw7/vm/swap.h
      echo "rm -f dialects/uw/uw7/vm/swap.h"
      rm -f ${LSOF_LIB}/${LSOF_LIBMKF}
      echo "rm -f ${LSOF_LIB}/${LSOF_LIBMKF}"
      exit 0
      ;;
 
    -d|-dialects)
      if test -r ./00DIALECTS -a -r ./version	# {
      then
	V=`sed '/VN/s/.ds VN \(.*\)/\1/' version`
	echo "lsof $V has been *tested* on these UNIX dialect versions:"
	cat 00DIALECTS
	echo Although "$V hasn't been tested on other versions of these dialects,"
	echo "it may work.  Try \`Configure <dialect>\` and \`make\` to see."
	rm -f $LSOF_HLP
	exit 0
      else
	echo "Can't display UNIX dialect version information:"
	if test ! -r ./00DIALECTS	# {
	then
	  echo "	./00DIALECTS is inaccessible."
	fi	# }
	if test ! -r ./version	# {
	then
	  echo "	./version is inaccessible."
	fi	# }
	rm -f $LSOF_HLP
	exit 1
      fi	# }
      ;;

    -h|-help) cat $LSOF_HLP
      rm -f $LSOF_HLP
      exit 0
      ;;

    -n*)
      LSOF_SCRIPT_CALL="no"
      ;;

    *)
      if test "X$LSOF_TGT" != "Xno-target"	# {
      then
	echo "Only one dialect may be configured at a time."
	echo 'Both "$LSOF_TGT" and "$1" were specified.'
	cat $LSOF_HLP
	rm -f $LSOF_HLP
	exit 1
      else
	LSOF_TGT=$1
      fi	# }
      ;;
  esac	# }
  shift
  args=`expr $args - 1`
done	# }

case $LSOF_TGT in	# {
 no-target)
   echo "No target dialect was specified."
   cat $LSOF_HLP
   rm -f $LSOF_HLP
   exit 1
   ;;

# Configure for AIX xlc and AIX gcc.

  aix|aixgcc)

  # AIXA stands for AIX architecture.  It is assigned these values in this
  # stanza:
  #
  #    0	The AIX version is < 5.0, or the AIX 5.0 architecture is
  #		Power and the kernel bit size is 32.
  #
  #    1	The AIX version is >= 5.0, the AIX architecture is Power,
  #		and the kernel bit size is 64.
  #
  #    2	The AIX version is >= 5.0 and the architecture is IA64.

    if test "X$LSOF_RANLIB_SUP" = "X"	# {
    then
      LSOF_RANLIB="@echo \\\\\\\\c"    # AIX make doesn't like a null ${RANLIB}.
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then

      # If the AIX version isn't pre-defined, determine it.

      LSOF_TMP1=`uname -v`
      if test "X$LSOF_TMP1" = "X5"	# {
      then

	# If the AIX version is 5, build the version string with `uname -rv`
	# output.

	  LSOF_VSTR=`uname -r | awk '{printf "5.%d.0.0\n",\$1}'`
	  echo "Uname reports the version is $LSOF_VSTR."
      else

	# See if oslevel can determine the version.

	LSOF_TMP1=/usr/bin/oslevel
	if test -x $LSOF_TMP1	# {
	then
	  echo "Determining AIX version with $LSOF_TMP1."
	  echo "This may take a while, depending on your maintenance level."
	  LSOF_VSTR=`$LSOF_TMP1 | sed 's/[^0-9]*\([0-9\.]*\).*/\1/'`
	  echo "$LSOF_TMP1 reports the version is $LSOF_VSTR."
	else

	  # If oslevel can't be used, build the version string with
	  # `uname -rv` and issue a warning.

	  LSOF_VSTR=`uname -rv | awk '{printf "%d.%d.0.0\n",\$2,\$1}'`
	  echo "WARNING: can't execute $LSOF_TMP1; uname -rv reports"
	  echo "         the version is $LSOF_VSTR; edit CFGF in Makefile and"
	  echo "         lib/Makefile to refine AIXV and LSOF_VSTR."
	fi	# }
      fi	# }
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then
      LSOF_VERS=`echo $LSOF_VSTR | sed 's/\.//g'`
    fi	# }
    if test $LSOF_VERS -ge 4320	# {
    then
      LSOF_TSTBIGF=" "
    fi	# }
    if test "X$LSOF_CC" = "X"	# {
    then
      if test "X$LSOF_TGT" = "Xaixgcc"	# {
      then
	LSOF_CC=gcc
	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
      else
	LSOF_CC=cc
      fi	# }
    fi	# }
    LSOF_TGT="aix"
    echo $LSOF_CC | grep gcc > /dev/null
    if test $? -eq 0	# {
    then

    # Prevent use of gcc for AIX below 4.1.

      if test $LSOF_VERS -lt 4100	# {
      then
	echo "********************************************************"
	echo "* Sorry, but gcc can't be used to compile lsof for AIX *"
	echo "* versions less than 4.1, because of possible kernel   *"
	echo "* structure alignment differences between it and xlc.  *"
	echo "********************************************************"
	rm -f $LSOF_HLP
	exit 1
      fi	# }
    fi	# }

    # Test for AFS.

    if test "X$AIX_HAS_AFS" != "X"	# {
    then
      LSOF_AFS=$AIX_HAS_AFS
    fi	# }
    if test "X$LSOF_AFS" != "Xno"	# {
    then
      if test "X$LSOF_AFS" = "Xyes" -o -r ${AFS_VICE}/etc/ThisCell	# {
      then
	if test "X$LSOF_AFS" != "Xyes"	# {
	then
	  if test "X$LSOF_SCRIPT_CALL" = "Xno"	# {
	  then
	    if test -r ./AFSHeaders -a -r ./AFSVersion	# {
	    then
	      LSOF_AFS="yes"
	    fi	# }
	  else
	    if test ! -x ./AFSConfig	# {
	    then
	      echo "Can't find or execute the AFSConfig script"
	      rm -f $LSOF_HLP
	      exit 1
	    fi	# }
	    ./AFSConfig
	    if test $? -eq 0 -a -r ./AFSHeaders -a -r ./AFSVersion	# {
	    then
	      LSOF_AFS="yes"
	    fi	# }
	  fi	# }
	fi	# }
	if test "X$LSOF_AFS" = "Xyes"	# {
	then
	  if test "X$LSOF_AFSV" = "X"	# {
	  then
	    if test -r ./AFSVersion	# {
	    then
	      LSOF_AFSV=`cat ./AFSVersion | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1 \2/' | awk '{printf "%d%02d\n",\$1,\$2}'`
	    else
	      echo "!!!FATAL: no ./AFSVersion file.  It should have been"
	      echo "          created by a previous AFS configuration run."
	      rm -f $LSOF_HLP
	      exit 1
	    fi	# }
	  fi	# }
	  if test $LSOF_VERS -gt 4330 -o LSOF_AFSV -gt 305	# {
	  then
	    echo "!!!FATAL: Lsof does not support AFS on this combination of"
	    echo "          AIX ($LSOF_VERS) and AFS ($LSOF_AFSV) versions."
	    echo "          To disable AFS, set the value of the AIX_HAS_AFS"
	    echo "          environment variable to \"no\"."
	    rm -f $LSOF_HLP
	    exit 1
	  else
	    LSOF_CFGF="$LSOF_CFGF -DHAS_AFS=$LSOF_AFSV"
	    LSOF_DINC="$LSOF_DINC -I`cat ./AFSHeaders`"
	    if test -r ${LSOF_INCLUDE}/sys/inttypes.h  # {
	    then
	      grep "^typedef.*int16;" ${LSOF_INCLUDE}/sys/inttypes.h > /dev/null
	      if test $? -eq 0      # {
	      then
		LSOF_CFGF="$LSOF_CFGF -DHASINT16TYPE"
	      fi    # }
	      grep "^typedef.*u_int32;" ${LSOF_INCLUDE}/sys/inttypes.h > /dev/null
	      if test $? -eq 0      # {
	      then
		LSOF_CFGF="$LSOF_CFGF -DHASUINT16TYPE"
	      fi    # }
	      grep "^typedef.*int32;" ${LSOF_INCLUDE}/sys/inttypes.h > /dev/null
	      if test $? -eq 0      # {
	      then
		LSOF_CFGF="$LSOF_CFGF -DHASINT32TYPE"
	      fi    # }
	    fi	# }
	  fi      # }
	fi	# }
      fi	# }
    fi	# }

    # Miscellaneous AIX tests

    if test -d ${LSOF_INCLUDE}/nfs	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHAS_NFS"
    fi	# }
    echo $LSOF_CC | grep cc | grep -v gcc > /dev/null
    if test $? -eq 0 -a $LSOF_VERS -ge 4140 -a $LSOF_VERS -lt 5000	# {
    then
      LSOF_CFGL="$LSOF_CFGL -bnolibpath"
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/socket.h	# {
    then
      grep AF_INET6 ${LSOF_INCLUDE}/sys/socket.h > /dev/null
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/stat.h	# {
    then
      grep stat64 ${LSOF_INCLUDE}/sys/stat.h > /dev/null
      if test $? -eq 0 # {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASSTAT64"
      fi	# }
    fi	# }
#DEBUG SANFS    if test -r ${LSOF_INCLUDE}/sys/sanfs/sanfsnode.h???	# {
#DEBUG SANFS    then
#DEBUG SANFS      LSOF_CFGF="$LSOF_CFGF -DHAS_SANFS"
#DEBUG SANFS    fi	# }
    if test $LSOF_VERS -ge 5000	# {
    then

    # This is AIX 5 or greater.

      if test -d ${LSOF_INCLUDE}/j2	# {
      then

      # The AIX > 5.0 system has jfs2 support.  Make the necesssary definitions
      # and adjustments.

	rm -f dialects/aix/aix5/j2/j2_snapshot.h
	(cd dialects/aix/aix5/j2; ln -s private_j2_snapshot.h j2_snapshot.h)
	LSOF_CFGF="$LSOF_CFGF -DHAS_JFS2"
	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/aix/aix5"
	if test $LSOF_VERS -ge 5200	# {
	then
	  if test -r ${LSOF_INCLUDE}/j2/j2_snapshot.h	# {
	  then

	  # The system has its own j2_snapshot.h, so make sure the
	  # private lsof copy is discarded.

	    rm -f dialects/aix/aix5/j2/j2_snapshot.h
	  fi	# }
	  echo $LSOF_CC | grep gcc > /dev/null
	  if test $? -eq 0	# {
	  then

	  # Test gcc version for AIX 5.2.

	    LSOF_TMP1=`echo $LSOF_CCV | awk -F . '{printf "%d%02d",$1,$2}'`
	    if test $LSOF_TMP1 -ge 303	# {
	    then

	    # Add gcc >= 3.3 option to handle use of i_dev from the wInode
	    # anonymous structure reference in the JFS2 inode structure of
	    # <j2/j2_inode.h>.

	      LSOF_CFGF="$LSOF_CFGF -fms-extensions"
	    fi	# }
	  fi	#}
	fi	# }
      fi	# }

      # Determine the AIX architecture type and set AIXA accordingly.

      if test "X$AIX_ARCH" = "X"	# {
      then
	uname -a | grep -i ia64 > /dev/null
	if test $? -eq 0	# {
	then
	  AIX_ARCH="ia64"
	else
	  AIX_ARCH=""
	fi	# }
      fi	# }
      if test "X$AIX_ARCH" = "Xia64"	# {
      then

      # This is AIX >= 5 on ia64.

	LSOF_TSTK64=1
	echo $LSOF_CC | grep gcc > /dev/null
	if test $? -eq 0	# {
	then

	# Quit if gcc was specified as the compiler, since the gcc options to
	# do an ia64 lsof compilation are unknown.

	  echo "*************************************************************"
	  echo "*                                                           *"
	  echo "* !!!!!!!!!!!!!!!!!!!!! FATAL ERROR !!!!!!!!!!!!!!!!!!!!!!! *"
	  echo "*                                                           *"
	  echo "* Gcc can't be used to compile lsof for AIX 5 and above on  *"
	  echo "* the ia64 architecture.  Consult lsof's FAQ (in the file   *"
	  echo "* 00FAQ) for more information.                              *"
	  echo "*                                                           *"
	  echo "*************************************************************"
	  rm -f $LSOF_HLP
	  exit 1
	fi	# }
	LSOF_TMP1=2
	if test "X$LSOF_AR" = "X"	# {
	then
	  LSOF_AR="/usr/bin/ar cr"
	fi	# }
	LSOF_CFGF="$LSOF_CFGF -q64"
	LSOF_CFGL="$LSOF_CFGL -lelf"
      else

      # This is AIX >= 5 on Power architecture.

	echo $LSOF_CC | grep cc | grep -v gcc > /dev/null
	if test $? -eq 0	# {
	then
	  LSOF_CFGL="$LSOF_CFGL -bnolibpath"
	fi	# }
	if test "X$AIX_KERNBITS" = "X"	# {
	then

	# The kernel bit size wasn't predefined.  Determine it by compiling
	# and executing a test program.

	  rm -f ${LSOF_TMPC}.*
	  echo "#include <sys/systemcfg.h>" > ${LSOF_TMPC}.c
	  echo 'main(){ if (__KERNEL_32()) printf("32\\n");' >> ${LSOF_TMPC}.c
	  echo 'else if (__KERNEL_64()) printf("64\\n");' >> ${LSOF_TMPC}.c
	  echo 'else printf("0\\n");' >> ${LSOF_TMPC}.c
	  echo "return(0); }" >> ${LSOF_TMPC}.c
	  echo "Testing kernel bit size with $LSOF_CC"
	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x
	  if test ! -x ${LSOF_TMPC}.x	# {
	  then
	    echo "!!!FATAL: can't compile test program, ${LSOF_TMPC}.c."
	    rm -f $LSOF_HLP rm -f ${LSOF_TMPC}.*
	    exit 1
	  fi	# }
	  AIX_KERNBITS=`./${LSOF_TMPC}.x`
	  rm -f ${LSOF_TMPC}.*
	fi	# }

      # Use the kernel bit size specification to select archiver and compiler
      # options, and to update AIXA.

	case $AIX_KERNBITS in	# {
	32)
	  if test "X$LSOF_AR" = "X"	# {
	  then
	    LSOF_AR="/usr/bin/ar cr"
	  fi	# }
	  LSOF_TMP1=0
	  ;;
	64)
	  if test "X$LSOF_AR" = "X"	# {
	  then
	    LSOF_AR="/usr/bin/ar -X 64 -v -q"
	  fi	# }
	  LSOF_TSTK64=1
	  LSOF_TMP1=1
	  echo $LSOF_CC | grep gcc > /dev/null
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -maix64"
	  else
	    LSOF_CFGF="$LSOF_CFGF -q64"
	  fi	# }
	  ;;
	*)
	  echo "!!!FATAL: unrecognized kernel bit size: $AIX_KERNBITS"
	  rm -f $LSOF_HLP
	  exit 1
	esac	# }

      # Put kernel bit size information in $LSOF_CINFO and $LSOF_CFGF.

	echo "Kernel bit size: $AIX_KERNBITS"
	LSOF_TMP2="${AIX_KERNBITS} bit kernel"
	if test "X$LSOF_CINFO" != "X"	# {
	then
	  LSOF_CINFO="${LSOF_CINFO}  ${LSOF_TMP2}"
	else
	  LSOF_CINFO="${LSOF_TMP2}"
	fi	# }
	LSOF_CFGF="$LSOF_CFGF -DAIX_KERNBITS=${AIX_KERNBITS}"
      fi	# }
      LSOF_CFGF="$LSOF_CFGF -DAIXA=$LSOF_TMP1"
      if test "X$LSOF_TSTDFLG" = "X"	# {
      then
	LSOF_TSTDFLG="-DLT_AIXA=$LSOF_TMP1"
      else
	LSOF_TSTDFLG="$LSOF_TSTDFLG -DLT_AIXA=$LSOF_TMP1"
      fi	# }
    else

    # AIX is < 5, so set AIXA accordingly.

      LSOF_CFGF="$LSOF_CFGF -DAIXA=0"
      if test "X$LSOF_TSTDFLG" = "X"	# {
      then
	LSOF_TSTDFLG="-DLT_AIXA=0"
      else
	LSOF_TSTDFLG="$LSOF_TSTDFLG -DLT_AIXA=0"
      fi	# }
    fi	#}
    LSOF_CFGF="$LSOF_CFGF -DAIXV=$LSOF_VERS"
    LSOF_DIALECT_DIR=aix
    echo $LSOF_CC | grep gcc > /dev/null
    if test $? -eq 0 	# {
    then

    # Do gcc tests.

      if test $LSOF_VERS -ge 4100 -a $LSOF_VERS -lt 4200	# {
      then
	if test "X$AIX_USHACK" = "X"	# {
	then

	  # Compile and run a gcc test program to evaluate the user structure.

	  rm -f ${LSOF_TMPC}.*
	  echo "#include <stddef.h>" > ${LSOF_TMPC}.c
	  echo "#include <sys/user.h>" >> ${LSOF_TMPC}.c
	  echo "main(){exit((offsetof(struct user, U_irss) & 0x7) ? 1 : 0);}" >>${LSOF_TMPC}.c
	  echo "Testing user.h with $LSOF_CC"
	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x
	  if ! ${LSOF_TMPC}.x	# {
	  then
	    LSOF_TMP1=1
	  else
	    LSOF_TMP1=0
	  fi	# }
	  rm -f ${LSOF_TMPC}.*
	else
	  if test "$AIX_USHACK" = "Y" -o "$AIX_USHACK" = "y"	# {
	  then
	    LSOF_TMP1=1
	  else
	    LSOF_TMP1=0
	  fi	# }
	fi	# }
	if test ${LSOF_TMP1} -eq 1	# {
	then
	  echo "Applying gcc AIX 4.1+ user struct alignment hack"
	  rm -rf ./dialects/aix/aix$LSOF_VERS
	  mkdir ./dialects/aix/aix$LSOF_VERS
	  mkdir ./dialects/aix/aix${LSOF_VERS}/sys
	    sed 's/U_irss\[/dummy_for_alignment, U_irss\[/' < ${LSOF_INCLUDE}/sys/user.h > ./dialects/aix/aix${LSOF_VERS}/sys/user.h
	    LSOF_CFGF="$LSOF_CFGF -U_LONG_LONG -I`pwd`/dialects/aix/aix$LSOF_VERS"
	fi	# }
      fi	# }
    else

      # Get xlc version number

      rm -f ${LSOF_TMPC}.*
      echo "main(){}" > ${LSOF_TMPC}.c
      echo "Getting version number of ${LSOF_CC}."
      $LSOF_CC -c ${LSOF_TMPC}.c -I${LSOF_INCLUDE} -o ${LSOF_TMPC}.o -qlist > /dev/null 2>&1
      LSOF_CCV=`head -1 ${LSOF_TMPC}.lst | sed 's/\(.*\) ---.*/\1/'`
      rm ${LSOF_TMPC}.*
      echo "The version is \"${LSOF_CCV}\"."
      echo $LSOF_CCV | grep "Version [0-9]" > /dev/null
      if test $? -eq 0	# {
      then
	LSOF_TMP=`echo $LSOF_CCV | sed 's/.*Version \([0-9]*\).*/\1/'`
	if test "X$LSOF_TMP" != "X" -a $LSOF_TMP -ge 4    # {
	then
	  if test $LSOF_TMP -ge 6	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -qmaxmem=-1"
	  else
	    LSOF_CFGF="$LSOF_CFGF -qmaxmem=16384"
	  fi	# }
	fi	# }
      fi	# }
    fi	# }
    if test $LSOF_VERS -ge 5300	# {
    then
      LSOF_UNSUP=""
    fi	# }
    ;;

# Configure for Apple Darwin.

  darwin)
    if test "X$LSOF_CC" = "X"	# {
    then
      LSOF_CC=cc
      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -r`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

    # If the Darwin / Mac OS X version isn't pre-defined, determine it.

      case $LSOF_VSTR in	# {
      1.2*)
	LSOF_VERS=120
	;;
      1.3*)
	LSOF_VERS=130
	;;
      1.4*)
	LSOF_VERS=140
	;;
      5.[012]*)
	LSOF_VERS=500
	;;
      5.[3-9]*)
	LSOF_VERS=530
	;;
      6.*)
	LSOF_VERS=600
	;;
      7.*)			# Mac OS X 10.3 (Panther)
	LSOF_VERS=700
	;;
      8.*)			# Mac OS X 10.4 (Tiger)
	LSOF_VERS=800
	;;
      9.*)			# Mac OS X 10.5 (Leopard)
	LSOF_VERS=900
 	;;
      10.*)			# Mac OS X 10.6 (SnowLeopard)
 	LSOF_VERS=1000
 	;;
      *)
	echo Unknown Darwin release: `uname -r`
	echo Assuming Darwin 10.0
	LSOF_VERS=1000
	;;
      esac	# }
    fi	# }

    # Do Darwin version-specific stuff.

    case $LSOF_VERS in	# {
    120|130)
      LSOF_TMP1="hfs/hfs.h hfs/hfs_macos_defs.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h"
      ;;
    140|500)
      LSOF_TMP1="hfs/hfs.h hfs/hfs_macos_defs.h hfs/rangelist.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h"
      ;;
    530)
      LSOF_TMP1="hfs/hfs.h hfs/hfs_macos_defs.h hfs/rangelist.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h net/ndrv.h net/ndrv_var.h"
      ;;
    600)
      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
      LSOF_TMP1="hfs/hfs.h hfs/hfs_catalog.h hfs/hfs_cnode.h hfs/hfs_macos_defs.h hfs/rangelist.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h net/ndrv_var.h net/raw_cb.h netinet/ip_var.h netinet/tcp_var.h"
      ;;
    700)
      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
      LSOF_TMP1="hfs/hfs.h hfs/hfs_catalog.h hfs/hfs_cnode.h hfs/hfs_macos_defs.h hfs/rangelist.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h net/ndrv_var.h net/raw_cb.h netinet/ip_var.h netinet/tcp_var.h sys/eventvar.h"
      ;;
    800)
      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
      LSOF_TMP1="net/ndrv_var.h net/raw_cb.h netinet/ip_var.h netinet/tcp_var.h sys/eventvar.h sys/file_internal.h sys/mount_internal.h sys/proc_internal.h sys/vnode_internal.h"
      ;;
    900|1000)
      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
      LSOF_TMP1=""
      LSOF_UNSUP=""
      LSOF_TSTBIGF=" "			# enable LTbigf test
      ;;
    *)
      echo "Unsupported Darwin version: $LSOF_VERS"
      rm -f $LSOF_HLP
      exit 1
      ;;
    esac	# }
    LSOF_TMP2=""
    LSOF_TMP3=""
    LSOF_TMP4=""
    LSOF_CFGF="$LSOF_CFGF -mdynamic-no-pic"
    LSOF_CFGL="$LSOF_CFGL -lcurses"

    if test "X$DARWIN_XNUDIR" != "X"	# {
    then
      LSOF_TMP2="${DARWIN_XNUDIR}/bsd"
      LSOF_TMP3="${DARWIN_XNUDIR}/osfmk"
      LSOF_TMP4=""
    else
      LSOF_TMP2="${DARWIN_XNU_HEADERS}/System/Library/Frameworks/Kernel.framework/Versions/A/PrivateHeaders"
      LSOF_TMP3="${DARWIN_XNU_HEADERS}/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders"
      LSOF_TMP4=""
      if test "X$DARWIN_XNU_HEADERS" != "X"	# {
      then
	LSOF_TMP4="${DARWIN_XNU_HEADERS}/usr/include"
      fi	# }
    fi	# }

    # Test Darwin base.

    if test "X$DARWIN_BASE" = "X" -o "X$DARWIN_BASE" = "Xlibproc"	# {
    then
      LSOF_TMP5=""
      if test $LSOF_VERS -ge 800 -o "X$DARWIN_BASE" = "Xlibproc"	# {
      then
	if test -r ${LSOF_INCLUDE}/libproc.h	# {
	then
	    DARWIN_BASE="libproc"
	else
	  if test -r ${LSOF_INCLUDE}/../local/include/libproc.h	# {
	  then
	    DARWIN_BASE="libproc"
	    LSOF_TMP5="-I${LSOF_INCLUDE}/../local/include"
	  else
	    echo "FATAL: can't find libproc.h"
	    rm -f $LSOF_HLP
	    exit 1
	  fi	# }
	fi	# }
      else

      # The default Darwin base is /dev/kmem.

	DARWIN_BASE="/dev/kmem"
      fi	# }
    fi	# }
    if test "X$DARWIN_BASE" = "Xlibproc"	# {
    then

    # Configure for libproc-based Darwin lsof.

      echo "Configuring libproc-based Darwin lsof"
      LSOF_CINFO="libproc-based"
      LSOF_DIALECT_DIR=darwin/libproc
      if test $LSOF_VERS -lt 1000 	# {
      then
	LSOF_CFGL="$LSOF_CFGL -lproc"
      fi	# }
      LSOF_TSTKMEM=0
      LSOF_DINC="$LSOF_DINC $LSOF_TMP5"
      if test ! -r ${LSOF_INCLUDE}/sys/proc_info.h	# {
      then
	if test "X$LSOF_TMP5" = "X" -o ! -r ${LSOF_TMP5}/sys/proc_info.h # {
	then
	  echo "FATAL: can't find sys/proc_info.h"
	  rm -f $LSOF_HLP
	  exit 1
	fi	# }
      fi	# }

    # Add header file paths for libproc-based Darwin lsof.

      for i in $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE	# {
      do
	if test -d $i -a "X$i" != "X/usr/include"	# {
	then
	  LSOF_DINC="$LSOF_DINC -I${i}"
	fi	# }
      done	# }

    # Do other libproc-based Darwin lsof setups.
      
      if test -r ${LSOF_INCLUDE}/utmpx.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASUTMPX"
      fi	# }
    else
      if test "X$DARWIN_BASE" != "X/dev/kmem"	# {
      then
	echo "Darwin base unrecognized: $DARWIN_BASE"
	rm -f $LSOF_HLP
	exit 1
      fi	# }
    
    # Configure for /dev/kmem-based Darwin lsof.

      echo "Configuring /dev/kmem-based Darwin lsof"
      LSOF_CINFO="/dev/kmem-based"
      LSOF_DIALECT_DIR=darwin/kmem

    # Make sure needed /dev/kmem-base XNU Darwin kernel header files are
    # present.

      LSOF_TMP5=""
      for i in $LSOF_TMP1	# {
      do
	LSOF_TMP6=0
	for j in $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE	# {
	do
	  if test "X${j}" != "X" -a -r ${j}/${i}  # {
	  then
	    LSOF_TMP6=1
	    break
	  fi	# }
	done	# }
	if test $LSOF_TMP6 -ne 1	# {
	then
	  if test "X$LSOF_TMP5" = "X"	# {
	  then
	    LSOF_TMP5=$i
	  else
	    LSOF_TMP5="$LSOF_TMP5 $i"
	  fi	# }
	fi			# }
      done	# }
      if test "X$LSOF_TMP5" != "X"	# {
      then

      # If any Darwin XNU kernel header files are missing, call the
      # get-hdr-loc.sh script to find the path.

	LSOF_TMP6=`pwd`/dialects/darwin/get-hdr-loc.sh
	if test ! -x $LSOF_TMP6	# {
	then
	  echo "FATAL: can't execute: $LSOF_TMP6"
	  rm -f $LSOF_HLP
	  exit 1
	fi	# }
	DARWIN_XNUDIR=`$LSOF_TMP6 $LSOF_TMP5`
	if test $? -ne 0	# {
	then
	  echo "FATAL: $LSOF_TMP6 returns: $DARWIN_XNUDIR"
	  rm -f $LSOF_HLP
	  exit 1
	fi	# }
	LSOF_TMP2="${DARWIN_XNUDIR}/bsd"
	LSOF_TMP3="${DARWIN_XNUDIR}/osfmk"
	LSOF_TMP4=""
      fi	# }

    # Add header file paths for /dev/kmem-based Darwin lsof.

      for i in $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE	# {
      do
	if test -d $i -a "X$i" != "X/usr/include"	# {
	then
	  LSOF_DINC="$LSOF_DINC -I${i}"
	fi	# }
      done	# }

    # Make conditional feature definitions for /dev/kmem-based Darwin lsof.

      for i in $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE      # {
      do
	if test "X${i}" != "X" -a -r ${i}/sys/namei.h	# {
	then
	  grep -q nc_vpid ${i}/sys/namei.h
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
	  fi	# }
	  break
	fi	# }
      done	# }
      for i in $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE	# {
      do
	if test "X${i}" != "X"	# {
	then
	  if test $LSOF_VERS -ge 800	# {
	  then
	    if test -r ${i}/sys/file_internal.h	# {
	    then
	      grep -q DTYPE_KQUEUE ${i}/sys/file_internal.h
	      if test $? -eq 0	# {
	      then
	        LSOF_CFGF="$LSOF_CFGF -DHASKQUEUE"
	      fi	# }
	      break
	    fi	# }
	  else
	    if test $LSOF_VERS -ge 700	# {
	    then
	      if test -r ${i}/sys/file.h	# {
	      then
	        grep -q DTYPE_KQUEUE ${i}/sys/file.h
	        if test $? -eq 0	# {
	        then
	          LSOF_CFGF="$LSOF_CFGF -DHASKQUEUE"
	        fi	# }
	      fi	# }
	      break
	    fi	# }
	  fi	# }
	fi	# }
      done	# }
      LSOF_CFGF="$LSOF_CFGF -DHAS9660FS"
    fi	# }
    LSOF_CFGF="$LSOF_CFGF -DDARWINV=$LSOF_VERS"
    LSOF_CFLAGS_OVERRIDE=1
    ;;

# Configure for DEC OSF/1, Digital UNIX, or Tru64 UNIX.

  digital_unix|du|decosf|tru64)
    LSOF_TGT="du"
    LSOF_TSTBIGF=" "
    LSOF_TSTK64=1
    if test "X$LSOF_DINC" = "X"	# {
    then
      LSOF_DINC="-I/usr/include"
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -r`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

      # If the DEC OSF/1, Digital UNIX, or Tru64 UNIX version isn't
      # predefined, determine it.

      case $LSOF_VSTR in	# {
      V2.0)
	LSOF_VERS=20000
	;;
      V3.0)
	LSOF_VERS=30000
	;;
      V3.2)
	LSOF_VERS=30200
	;;
      ?4.0)
	LSOF_TSTXO="../lib/snpf.o"
	LSOF_VERS=40000
	;;
      ?5.0)
	LSOF_VERS=50000
	;;
      ?5.1)
	LSOF_VERS=50100
	;;
      *)
	echo "WARNING: unknown version; assuming version is 2.0"
	LSOF_VERS=20000
	;;
      esac	# }
    fi	# }

    # Do DEC OSF/1, Digital UNIX, or Tru64 UNIX version specific stuff.

    case $LSOF_VERS in	# {
      20000)
	LSOF_CFGF="$LSOF_CFGF -Olimit 1024"
	LSOF_TMP1="/sys"
	;;
      30000)
	LSOF_CFGF="$LSOF_CFGF -Olimit 1024"
	LSOF_TMP1="/sys"
	LSOF_TMP2=-DUSELOCALREADDIR
	;;
      30200)
	LSOF_CFGF="$LSOF_CFGF -Olimit 1024"
	LSOF_TMP1="/sys"
	LSOF_TMP2=-DUSELOCALREADDIR
	;;
      40000)
	LSOF_TMP1="/usr/sys"
	;;
      50000|50100)
	LSOF_CFGF="$LSOF_CFGF -DUSE_STAT"
	LSOF_TMP1="/usr/sys"
	;;
      *)
	echo "WARNING: unknown version: $LSOF_VERS"
	rm -f $LSOF_HLP
	exit 1
	;;
    esac	# }
    if test "X$DU_SYSDIR" = "X"	# {
    then
      DU_SYSDIR=$LSOF_TMP1
    fi	# }
    LSOF_HOST=`uname -n`
    if test "X$DU_CDIR" = "X"	# {
    then
      LSOF_CDIR=`expr $LSOF_HOST : '\([^\.]*\)\..*$'`
      if test "X$LSOF_CDIR" = "X"	# {
      then
	LSOF_CDIR=$LSOF_HOST
      fi	# }
      LSOF_CDIR=`echo $LSOF_CDIR | tr a-z A-Z`
    else
      LSOF_CDIR=$DU_CDIR
    fi	# }
    LSOF_LOOP=1
    while test $LSOF_LOOP = 1	# {
    do
      if test -d ${DU_SYSDIR}/$LSOF_CDIR	# {
      then
	echo "Using header files in ${DU_SYSDIR}/$LSOF_CDIR"
	LSOF_LOOP=0
      else
	cat << .CAT_MARK

Please enter the name of the subdirectory in $DU_SYSDIR that contains the
configuration files for this host.  Usually its name would be $LSOF_CDIR, but
that subdirectory doesn't seem to exist.  The lsof compilation needs header
files specific to this machine's configuration found in that directory.

If you can't specify the appropriate configuration subdirectory, quit this
Configure step now and generate a proper configuration subdirectory with the
kernel generation process.

.CAT_MARK

	echo "$DU_SYSDIR contains:"
	echo ""
	ls -CF $DU_SYSDIR
	echo ""
	echo -n "Configuration subdirectory name? "
	read LSOF_CDIR LSOF_EXCESS
	if test "X$LSOF_CDIR" = "X" -o ! -d ${DU_SYSDIR}/$LSOF_CDIR	# {
	then
	  echo ""
	  echo Cannot access directory ${DU_SYSDIR}/$LSOF_CDIR.
	fi	# }
      fi	# }
    done	# }

    # Determine the ADVFS file system version.

    if test "X$DU_ADVFSV" = "X"	# {
    then
      echo "Determining the ADVFS version -- this will take a while."
      LSOF_ADVFSV=`/usr/sbin/setld -i | grep "^OSFADVFSBIN[0-9]" | sed 's/\([^ ]*\).*/\1/' | sort -u | tail -1 | sed 's/OSFADVFSBIN//'`
    else
      LSOF_ADVFSV=$DU_ADVFSV
    fi	# }
    case $LSOF_ADVFSV in	# {
    1*)
      LSOF_ADVFSV=100
      echo "The ADVFS version is 1."
      ;;
    2*)
      LSOF_ADVFSV=200
      echo "The ADVFS version is 2."
      ;;
    3*)
      LSOF_ADVFSV=300
      echo "The ADVFS version is 3."
      ;;
    4*)
      LSOF_ADVFSV=400
      echo "The ADVFS version is 4."
      ;;
    5*)
      LSOF_ADVFSV=500
      echo "The ADVFS version is 5."
      ;;
    *)
      echo "The ADVFS version is unknown; it will be assumed to be 1."
      LSOF_ADVFSV=100
      ;;
    esac	# }
    LSOF_CFGF="$LSOF_CFGF -DDUV=$LSOF_VERS -DADVFSV=$LSOF_ADVFSV $LSOF_TMP2"
    if test "X$DU_SYSINC" = "X"	# {
    then
      DU_SYSINC="/usr/sys/include"
    fi	# }
    LSOF_DINC="$LSOF_DINC -I${DU_SYSDIR}/$LSOF_CDIR -I$DU_SYSINC"
    LSOF_CFGL="$LSOF_CFGL -lmld"
    if test "X${DU_SHLIB}" = "X"	# {
    then
      DU_SHLIB=/usr/shlib
    fi	# }
    if test -r ${DU_SHLIB}/libmsfs.so	# {
    then
      nm ${DU_SHLIB}/libmsfs.so | grep tag_to_path > /dev/null 2>&1
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASTAGTOPATH"
	LSOF_CFGL="$LSOF_CFGL -lmsfs"
      fi	# }
    fi	# }
    grep "^struct spec_node {" ${DU_SYSDIR}/include/sys/specdev.h > /dev/null 2>&1
    if test $? -eq 0	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASSPECNODE"
    fi	# }
    if test $LSOF_VERS -ge 50000	# {
    then

    # Make du5_sys_malloc.h for DU 5.0 and above.  Enable strict ANSI checking
    # on 5.0 and 5.1A, but not 5.1B.  Enable IPv6 handling.

      LSOF_TMP1="-std1"
      if test $LSOF_VERS -ge 50100	# {
      then
	LSOF_TMP1="-std"
	if test -x /usr/sbin/sizer	# {
	then
	  /usr/sbin/sizer -v | grep -q 5.1A
	  if test $? -eq 0	# {
	  then
	    LSOF_TMP1="-std1"
	  fi	# }
	fi	# }
      fi	# }
      LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
      LSOF_TMP1=${LSOF_INCLUDE}/sys/malloc.h
      if test -r $LSOF_TMP1	# {
      then
	LSOF_TMP2=dialects/du/du5_sys_malloc.h
	rm -f $LSOF_TMP2
	echo "#if !defined(MANUFACTURED_DU5_SYS_MALLOC_H)" > $LSOF_TMP2
	echo "/* By lsof Configure:" `date` " */" >> $LSOF_TMP2
	echo "#define MANUFACTURED_DU5_SYS_MALLOC_H" >> $LSOF_TMP2
	grep "^#define[ 	]MALLOC_NUM_BUCKETS" $LSOF_TMP1 >> $LSOF_TMP2
	echo "struct percpukmembuckets {" >> $LSOF_TMP2
	sed '1,/^struct percpukmembuckets/d' $LSOF_TMP1 | sed -n '1,/^};/p' >> $LSOF_TMP2
	echo "#endif" >> $LSOF_TMP2
	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/du"
      fi	# }

    # Enable IPv6 for Tru64 UNIX 5.0 and above.

      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/namei.h
    then
      grep -q nc_vpid ${LSOF_INCLUDE}/sys/namei.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
      fi	# }
    fi	# }
    LSOF_DIALECT_DIR=du
    ;;

# Configure for FreeBSD.

  freebsd)
    LSOF_FBSD_ZFS=0
    if test "X$LSOF_CC" = "X"	# {
    then
      LSOF_CC=cc
      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -r`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

    # If the FreeBSD version isn't pre-defined, determine it.

      case $LSOF_VSTR in	# {
      1.*)
	LSOF_VERS=1000
	;;
      2.0-*)
	LSOF_VERS=2000
	;;
      2.0.5-*)
	LSOF_VERS=2005
	;;
      2.1*)
	LSOF_VERS=2010
	;;
      2.2*)
	LSOF_VERS=2020
	;;
      3.0*)
	LSOF_VERS=3000
	;;
      3.1*)
	LSOF_VERS=3010
	;;
      3.2*)
	LSOF_VERS=3020
	;;
      3.3*)
	LSOF_VERS=3030
	;;
      3.4*)
	LSOF_VERS=3040
	;;
      3.5*)
	LSOF_VERS=3050
	;;
      3*)
	LSOF_VERS=3050
	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for FreeBSD 3.5"
	;;
      4.0*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4000
	;;
      4.1-*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4010
	;;
      4.2*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4020
	;;
      4.3*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4030
	;;
      4.4*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4040
	;;
      4.5*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4050
	;;
      4.6*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4060
	;;
      4.7*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4070
	;;
      4.8*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4080
	;;
      4.9*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4090
	;;
      4.10*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4100
	;;
      4.11*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=4110
	;;
      4*)
	LSOF_VERS=4100
	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for FreeBSD 4.10"
	;;
      5.0*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=5000
	;;
      5.1*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=5010
	;;
      5.2*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=5020
	;;
      5.3*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=5030
	;;
      5.4*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=5040
	;;
      5.5*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=5050
	;;
      5*)
	LSOF_VERS=5050
	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for FreeBSD 5.5"
	;;
      6.0*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=6000
	;;
      6.1*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=6010
	;;
      6.2*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=6020
	;;
      6.3*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=6030
	;;
      6.4*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=6040
	;;
      6*)
	LSOF_VERS=6000
	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for FreeBSD 6.0"
	;;
      7.0*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=7000
	;;
      7.1*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=7010
	;;
      7.2*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=7020
	;;
      7.3*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=7030
	;;
      7.4*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=7040
	;;
      7*)
	LSOF_VERS=7000
	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for FreeBSD 7.0"
	;;
      8.0*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=8000
	;;
      8.1*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=8010
	;;
      8.2*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=8020
	;;
      9*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=9000
	;;
      *)
	echo Unknown FreeBSD release: `uname -r`
	echo Assuming FreeBSD 2.x
	LSOF_CFGL="$LSOF_CFGL -lkvm"
	LSOF_VERS=2000
	LSOF_N_UNIXV=`/usr/sbin/sysctl -n kern.bootfile`
	if test "X$LSOF_N_UNIXV" = "X"	# {
	then
	  LSOF_N_UNIXV="/kernel"
	fi	# }
	;;
      esac	# }
    fi	# }

    # Clear LSOF_UNSUP message for supported versions of FreeBSD.
    
    case $LSOF_VERS in  # {
    4090|6040|8000|8020|9000)
      LSOF_UNSUP=""
      ;;
    esac	# }

    # Get system CFLAGS from FREEBSD_MAKE_CONF (default=/etc/make.conf).

    if test "X$FREEBSD_MAKE_CONF" = "X"	# {
    then
      FREEBSD_MAKE_CONF="/etc/make.conf"
    fi	# }
    if test -r $FREEBSD_MAKE_CONF	# {
    then
      LSOF_TMP1=`echo "all:\n.include <bsd.prog.mk>" | $LSOF_MAKE -f- -VCFLAGS`
      LSOF_TMP=1
      while test $LSOF_TMP -eq 1	# {
      do
	echo $LSOF_TMP1 | grep -q -e '-O'
	if test $? -eq 0	# {
	then
	  if test "X$LSOF_DEBUG" = "X"
	  then	# {
	    LSOF_DEBUG=`echo $LSOF_TMP1 | sed 's/.*\(-O[^ $]*\).*/\1/'`
	  fi	# }
	  LSOF_TMP1=`echo $LSOF_TMP1 | sed 's/\(.*\)-O[^ $]*\(.*\)/\1 \2/' | sed 's/^  *//g' | sed 's/  */ /g' | sed 's/  *$//'`
	else
	  LSOF_TMP=0
	fi	# }
	LSOF_FBSD_ZFS_CFGF="$LSOF_CFGF $LSOF_TMP1"
      done	# }
      LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
    fi	# }

    # Determine path to FreeBSD sources.

    LSOF_DINC_ADD=0
    if test "X$FREEBSD_SYS" = "X"	# {
    then
      if test -d /usr/src/sys	# {
      then
	FREEBSD_SYS=/usr/src/sys
      else
	if test -d /sys	# {
	then
	  FREEBSD_SYS="/sys"
	else
	  echo "!!!WARNING!!!  No kernel sources in /usr/src/sys or /sys"
	fi	# }
      fi	# }
    fi	# }

    # Do FreeBSD version-specific stuff.

    case $LSOF_VERS in	# {
    1000)
      LSOF_CFGF="$LSOF_CFGF -DHASPROCFS"
      LSOF_CFGL="$LSOF_CFGL -lutil"
      LSOF_DINC="$LSOF_DINC -I`pwd`/dialects/freebsd/include"
      if test "X$FREEBSD_KERNEL" = "X"	# {
      then
	LSOF_N_UNIXV="/386bsd"
      else
	LSOF_N_UNIXV=$FREEBSD_KERNEL
      fi	# }
      ;;
    2000|2005|2010)
      LSOF_CFGL="$LSOF_CFGL -lkvm"
      ;;
    2020)
      LSOF_CFGL="$LSOF_CFGL -lkvm"
      if test -r ${LSOF_INCLUDE}/vm/lock.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASVMLOCKH"
      fi	# }
      ;;
    3000|3010|3020|3030|3040|3050)
      LSOF_CFGL="$LSOF_CFGL -lkvm"
      if test -r ${LSOF_INCLUDE}/nfs/rpcv2.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASRPCV2H"
      fi	# }
      if test -r ${LSOF_INCLUDE}/vm/lock.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASVMLOCKH"
      fi	# }
      ;;
    4000|4010|4020|4030|4040|4050|4060|4070|4080|4090|4100|4110|5000|5010|5020|5030|5040|5050|6000|6010|6020|6030|6040|7000|7010|7020|7030|7040|8000|8010|8020|9000)
      if test -r ${LSOF_INCLUDE}/nfs/rpcv2.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASRPCV2H"
      fi	# }
      if test -r ${LSOF_INCLUDE}/sys/namei.h	# {
      then
	grep -q "^struct[ 	]*namecache[ 	]*{" ${LSOF_INCLUDE}/sys/namei.h
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASNAMECACHE"
	fi	# }
      fi	# }
      if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h	# {
      then
	grep -q i_effnlink ${LSOF_INCLUDE}/ufs/ufs/inode.h
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASEFFNLINK=i_effnlink"
	fi	# }
      fi	# }
      if test -r ${LSOF_INCLUDE}/sys/file.h	# {
      then
	grep -q f_vnode ${LSOF_INCLUDE}/sys/file.h
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASF_VNODE"
	fi	# }
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lkvm"
      if test $LSOF_VERS -ge 5000	# {
      then

      # Do FreeBSD 5 and higher version-specific stuff.

	if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
	then
	  grep VT_FDESC ${LSOF_INCLUDE}/sys/vnode.h > /dev/null 2>&1
	  if test $? -eq 0	# {
	  then
	    if test ! -r ${LSOF_INCLUDE}/fs/devfs/devfs.h	# {
	    then
	      if test -r ${FREEBSD_SYS}/fs/devfs/devfs.h	# {
	      then
		LSOF_DINC_ADD=1
	      else
		echo "!!!FATAL: lsof cannot locate the devfs.h header file"
		echo "          in ${LSOF_INCLUDE}/fs/devfs/devfs.h or"
		echo "          ${FREEBSD_SYS}/fs/devfs/devfs.h.  Consult"
		echo "          00FAQ for an explanation."
		exit 1
	      fi	# }
	    fi	# }
	  fi	# }
	fi	# }

      # Do FreeBSD 5.2 and higher version-specific stuff.

	if test $LSOF_VERS -ge 5020	# {
	then

	# Determine the status of the cpumask_t typedef.

	  rm -f ${LSOF_TMPC}.*
	  cat > ${LSOF_TMPC}.c << .LSOF_END_HERE_DOC3
#undef _KERNEL
#include <sys/types.h>
main() {
cpumask_t c;
}
.LSOF_END_HERE_DOC3
	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
	  LSOF_TMP1=$?
	  rm -f ${LSOF_TMPC}.*
	  if test $LSOF_TMP1 -ne 0	# {
	  then

	  # The cpumask_t typedef is unknown when _KERNEL is not defined.

	    if test -r ${LSOF_INCLUDE}/sys/types.h \
		    -a -r ${LSOF_INCLUDE}/machine/_types.h	# {
	    then
	      grep -q cpumask_t ${LSOF_INCLUDE}/sys/types.h
	      if test $? -eq 0	# {
	      then
	        grep -q __cpumask_t ${LSOF_INCLUDE}/machine/_types.h
	        if test $? -eq 0	# {
	        then
		  LSOF_CFGF="$LSOF_CFGF -DHASCPUMASK_T"
	        else
		  $LSOF_CC -E ${LSOF_INCLUDE}/machine/_types.h 2>/dev/null | grep -q __cpumask_t
		  if test $? -eq 0  # {
		  then
		    LSOF_CFGF="$LSOF_CFGF -DHASCPUMASK_T"
		  fi	# }
	        fi	# }
	      fi	# }
	    fi	# }
	  fi	# }
	  if test -r ${LSOF_INCLUDE}/sys/socketvar.h	# {
	  then
	    grep -q SBS_CANT ${LSOF_INCLUDE}/sys/socketvar.h
	    if test $? -eq 0	# {
	    then
		LSOF_CFGF="$LSOF_CFGF -DHASSBSTATE"
	    fi	# }
	  fi	# }
	fi	# }
	if test $LSOF_VERS -ge 5030	# {
	then

	# Do FreeBSD 5.3 and higher version-specific stuff.

	  if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
	  then
	    grep -q "defined(_KVM_VNODE)" ${LSOF_INCLUDE}/sys/vnode.h
	    if test $? -eq 0	# {
	    then
		LSOF_CFGF="$LSOF_CFGF -DHAS_KVM_VNODE"
	    fi	#}
	  fi	# }
	fi	# }
	if test $LSOF_VERS -ge 6000	# {
	then

	# Do FreeBSD 6.0 and higher version-specific stuff.

	  if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h	# {
	  then
	    grep -q i_din2 ${LSOF_INCLUDE}/ufs/ufs/inode.h
	    if test $? -eq 0	# {
	    then
	      LSOF_CFGF="$LSOF_CFGF -DHAS_UFS1_2"
	    fi	# }
	  fi	# }
	  if test -r ${LSOF_INCLUDE}/sys/conf.h	# {
	  then
	    grep -q vm_memattr_t ${LSOF_INCLUDE}/sys/conf.h
	    if test $? -eq 0	#{
	    then
	      LSOF_CFGF="$LSOF_CFGF -DHAS_VM_MEMATTR_T"
	    fi	# }
	    grep -q "^#define	minor(" ${LSOF_INCLUDE}/sys/conf.h
	    if test $? -eq 0	# {
	    then
	      LSOF_CFGF="$LSOF_CFGF -DHAS_CONF_MINOR"
	      rm -f fbsd_minor.h
	      if test -r ${LSOF_INCLUDE}/sys/types.h	# {
	      then
		LSOF_TMP1=`grep "^#define[ 	]minor(" ${LSOF_INCLUDE}/sys/types.h`
		if test "X$LSOF_TMP1" != "X"	# {
		then
		  echo "Creating fbsd_minor.h"
		  cat > fbsd_minor.h << FBSD_MINOR1
/*
 * fbsd_minor.h -- created by lsof Configure script on
FBSD_MINOR1
		  echo $EO " * $EC" >> ./fbsd_minor.h
		  date >> ./fbsd_minor.h
		  cat >> ./fbsd_minor.h << FBSD_MINOR2
 */

#if	!defined(FBSD_MINOR_H)
#define	FBSD_MINOR_H

FBSD_MINOR2
		  echo $EO "${LSOF_TMP1}${EC}" >> fbsd_minor.h
		  cat >> ./fbsd_minor.h << FBSD_MINOR3

#endif	/* defined(FBSD_MINOR_H) */
FBSD_MINOR3
		fi	# }
	      fi	# }
	    else
	      if test -r ${FREEBSD_SYS}/fs/devfs/devfs_int.h	# {
	      then
		grep -q cdev2priv ${FREEBSD_SYS}/fs/devfs/devfs_int.h
		if test $? -eq 0	# {
		then
		  LSOF_CFGF="$LSOF_CFGF -DHAS_CDEV2PRIV"
		fi	# }
	      fi	# }
	    fi	# }
	    grep -q "si_udev;" ${LSOF_INCLUDE}/sys/conf.h
	    if test $? -ne 0	# {
	    then
	      LSOF_CFGF="$LSOF_CFGF -DHAS_NO_SI_UDEV"
	    fi	# }
	    grep -q si_priv ${LSOF_INCLUDE}/sys/conf.h
	    if test $? -eq 0	# {
	    then
	      LSOF_CFGF="$LSOF_CFGF -DHAS_SI_PRIV"
	    fi	# }
	  fi	# }
	  if test -r ${LSOF_INCLUDE}/sys/sx.h	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_SYS_SX_H"
	  fi	# }

	# Do ZFS test.  Try for the newer OpenSolaris files first -- i.e.,
	# the ones in ${FREEBSD_SYS}/cddl/contrib/opensolaris.  If that fails,
	# try for the older ones in ${FREEBSD}/contrib/opensolaris.

	  LSOF_FBSD_ZFS_SYS=${FREEBSD_SYS}/cddl
	  if test ! -r ${LSOF_FBSD_ZFS_SYS}/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h	# {
	  then
	    LSOF_FBSD_ZFS_SYS=${FREEBSD_SYS}
	    if test ! -r ${LSOF_FBSD_ZFS_SYS}/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h	# {
	    then
	      LSOF_FBSD_ZFS_SYS=""
	    fi	# }
	  fi	# }
	  if test "X$LSOF_FBSD_ZFS_SYS" != "X"	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_ZFS"
	    LSOF_FBSD_ZFS=1
	    LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DFREEBSDV=$LSOF_VERS"
	    LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DHAS_ZFS"
	    grep -q z_phys ${LSOF_FBSD_ZFS_SYS}/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h
	    if test $? -eq 0	# {
	    then
	      LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DHAS_Z_PHYS"
	    fi	# }
	  fi	# }
	  if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
	  then

	  # See if the vnode contains the byte level lock pointer.

	    grep -q v_lockf ${LSOF_INCLUDE}/sys/vnode.h
	    if test $? -eq 0	# {
	    then
	      LSOF_CFGF="$LSOF_CFGF -DHAS_V_LOCKF"
	      if test $LSOF_FBSD_ZFS -eq 1	# {
	      then
	        LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DHAS_V_LOCKF"
	      fi	# }
	    fi	# }
	  fi	# }
	  if test -r ${LSOF_INCLUDE}/sys/lockf.h	# {
	  then

	  # Determine the type of locking structure to which the inode or
	  # vnode points.

	    grep -q "^struct lockf_entry" ${LSOF_INCLUDE}/sys/lockf.h
	    if test $? -eq 0	# {
	    then

	    # Build the ./lockf_owner.h header file.

	      LSOF_TMP1=""
	      LSOF_TMP2=0
	      echo "Creating ./lockf_owner.h from ${FREEBSD_SYS}/kern/kern_lockf.c"
	      rm -f ./lockf_owner.h
	      if test -r ${FREEBSD_SYS}/kern/kern_lockf.c	# {
	      then
		LSOF_TMP1=`grep -n "^struct lock_owner" ${FREEBSD_SYS}/kern/kern_lockf.c | sed 's/\([0-9]*\):.*$/\1/'`
		if test "X$LSOF_TMP1" != "X"	# {
		then
		  LSOF_TMP2=0
		  for i in `grep -n "};" ${FREEBSD_SYS}/kern/kern_lockf.c | sed 's/\([0-9]*\):.*$/\1/'` # {
		  do
		    if test $LSOF_TMP2 -eq 0 -a $i -gt $LSOF_TMP1	# {
		    then
		      LSOF_TMP2=$i
		    fi	# }
		  done	# }
		  if test $LSOF_TMP2 -eq 0	# {
		  then
		    LSOF_TMP1=""
		  else
		    cat > ./lockf_owner.h << LOCKF_OWNER1
/*
 * lockf_owner.h -- created by lsof Configure script on
LOCKF_OWNER1
		    echo $EO " * $EC" >> ./lockf_owner.h
		    date >> ./lockf_owner.h
		    cat >> ./lockf_owner.h << LOCKF_OWNER2
 */

#if	!defined(LOCKF_OWNER_H)
#define	LOCKF_OWNER_H

LOCKF_OWNER2
		    ed -s ${FREEBSD_SYS}/kern/kern_lockf.c >> ./lockf_owner.h << LOCKF_OWNER3
${LSOF_TMP1},${LSOF_TMP2}p
LOCKF_OWNER3
		    if test $? -ne 0	# {
		    then
		      LSOF_TMP1=""
		    else
		      cat >> ./lockf_owner.h << LOCKF_OWNER4

#endif	/* defined(LOCKF_OWNER_H) */
LOCKF_OWNER4
		    fi	# }
		  fi	# }
		fi	# }
	      else
		echo "FATAL ERROR: can't read ${FREEBSD_SYS}/kern/kern_lockf.c"
	      fi	# }
	      if test "X$LSOF_TMP1" != "X" -a "X$LSOF_TMP2" != "X0" # {
	      then
		echo "./lockf_owner.h creation succeeded."
	        LSOF_CFGF="$LSOF_CFGF -DHAS_LOCKF_ENTRY"
	      else
		echo "FATAL ERROR: ./lockf_owner.h creation failed (see 00FAQ)"
		rm -f $LSOF_HLP
		exit 1
	      fi	# }
	    fi	# }

	  # Test for in6p_.port in inpcb structure.

	    if test -r ${LSOF_INCLUDE}/netinet/in_pcb.h	# {
	    then
	      grep -q 'in6p_.port' ${LSOF_INCLUDE}/netinet/in_pcb.h
	      if test $? -ne 0	# {
	      then
		LSOF_CFGF="$LSOF_CFGF -DHAS_NO_6PORT"
	      fi	# }
	    fi	# }

	  # Test for in6p_ppcb in inpcb structure.

	    if test -r ${LSOF_INCLUDE}/netinet/in_pcb.h	# {
	    then
	      grep -q 'in6p_ppcb' ${LSOF_INCLUDE}/netinet/in_pcb.h
	      if test $? -ne 0	# {
	      then
		LSOF_CFGF="$LSOF_CFGF -DHAS_NO_6PPCB"
	      fi	# }
	    fi	# }
	    if test -r ${LSOF_INCLUDE}/sys/conf.h	# {
	    then
	      grep -q 'doadump(boolean_t)' ${LSOF_INCLUDE}/sys/conf.h
	      if test $? -eq 0	# {
	      then
		LSOF_CFGF="$LSOF_CFGF -DNEEDS_BOOLEAN_T"
	      fi	# }
	    fi	# |
	  fi	# }
	fi	# }
      fi	# }
      ;;
    *)
      echo "Unknown FreeBSD release: $LSOF_VERS"
      rm -f $LSOF_HLP
      exit 1
      ;;
    esac	# }
    LSOF_CFGF="$LSOF_CFGF -DFREEBSDV=$LSOF_VERS"
    if test $LSOF_VERS -lt 2000 -a "X$FREEBSD_KERNEL" = "X"	# {
    then
      if test ! -x $LSOF_N_UNIXV	# {
      then
	echo "Hmmm -- $LSOF_N_UNIXV doesn't appear to be your kernel file."
	echo "Please enter the name of the file in / that contains"
	echo "the kernel for this host.  It must be a regular file,"
	echo "not a directory, and must be executable."
	LSOF_LOOP=1
	while test $LSOF_LOOP = 1	# {
	do
	  echo ""
	  echo "/ contains:"
	  echo ""
	  ls -CF /
	  echo ""
	  echo -n "Kernel file name? "
	  read LSOF_N_UNIXV LSOF_EXCESS
	  LSOF_N_UNIXV="/$LSOF_N_UNIXV"
	  if test ! -d $LSOF_N_UNIXV -a -x $LSOF_N_UNIXV	# {
	  then
	    LSOF_LOOP=0
	  else
	    echo ""
	    echo $LSOF_N_UNIXV is not a regular executable file.
	  fi	# }
	done	# }
      fi	# }
      LSOF_N_UNIXV=`echo $LSOF_N_UNIXV | sed 's#^/*#/#'`
      LSOF_CFGF="$LSOF_CFGF -DN_UNIXV=$LSOF_N_UNIXV"
    fi	# }
    if test -r ${FREEBSD_SYS}/miscfs/fdesc/fdesc.h	# {
    then
      LSOF_TMP1=${FREEBSD_SYS}/miscfs/fdesc/fdesc.h
    else
      if test $LSOF_VERS -ge 5000 -a -r ${LSOF_INCLUDE}/fs/fdescfs/fdesc.h  # {
      then
	LSOF_TMP1=${LSOF_INCLUDE}/fs/fdescfs/fdesc.h
      else
	LSOF_TMP1=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP1" != "X"	# {
    then
      grep -q Fctty $LSOF_TMP1
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=1"
      else
	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=2"
      fi	# }
      grep -q fd_link $LSOF_TMP1
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASFDLINK"
      fi	# }
      LSOF_DINC_ADD=1
    fi	# }
    if test $LSOF_VERS -ge 5000	# {
    then
      LSOF_TMP1="fs"
    else
      LSOF_TMP1="miscfs"
    fi	# }
    if test $LSOF_VERS -lt 5000	# {
      then
      if test -d ${FREEBSD_SYS}/${LSOF_TMP1}/procfs	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASPROCFS"
	LSOF_DINC_ADD=1
      fi	# }
    else
      if test -d ${FREEBSD_SYS}/${LSOF_TMP1}/pseudofs	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASPSEUDOFS"
	LSOF_DINC_ADD=1
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/${LSOF_TMP1}/nullfs/null.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
    else
      if test -r ${FREEBSD_SYS}/${LSOF_TMP1}/nullfs/null.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
	LSOF_DINC_ADD=1
      fi	# }
    fi	# }
    if test -r ${FREEBSD_SYS}/isofs/cd9660/cd9660_node.h	# {
    then
      rm -f cd9660_node.h
      grep -q "^#ifdef [_]*KERNEL" ${FREEBSD_SYS}/isofs/cd9660/cd9660_node.h
      if test $? -eq 0	# {
      then
	ln -s ${FREEBSD_SYS}/isofs/cd9660/cd9660_node.h cd9660_node.h
      else
	sed -e '/^ \* Prototypes for ISOFS vnode operations/,$c\
	\ The ISOFS prototypes were removed by Configure. */' \
	< ${FREEBSD_SYS}/isofs/cd9660/cd9660_node.h > cd9660_node.h
	echo "" >> cd9660_node.h
      fi	# }
      LSOF_CFGF="$LSOF_CFGF -DHAS9660FS"
      if test $LSOF_VERS -ge 6000	# {
      then
	grep -q "i_dev;" cd9660_node.h
	if test $? -ne 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHAS_NO_ISO_DEV"
	fi	# }
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/namei.h
    then
      grep -q nc_vpid ${LSOF_INCLUDE}/sys/namei.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
      fi	# }
    fi	# }
    if test $LSOF_DINC_ADD -eq 1	# {
    then
      if test "X$LSOF_DINC" = "X"	# {
      then
	LSOF_DINC="-I${FREEBSD_SYS}"
      else
	LSOF_DINC="$LSOF_DINC -I${LSOF_INCLUDE} -I${FREEBSD_SYS}"
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/netinet/in.h	# {
    then
      grep IPV6_INRIA_VERSION ${LSOF_INCLUDE}/netinet/in.h > /dev/null
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASIPv6 -DHASINRIAIPv6"
      fi	# }
    fi	# }
    echo $CFGF | grep HASIPv6 > /dev/null
    if test $? -ne 0 -a -r ${LSOF_INCLUDE}/netinet6/in6.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
    fi	# }
    if test -r ${LSOF_INCLUDE}/utmpx.h # {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASUTMPX"
    fi	# }
    LSOF_DIALECT_DIR=freebsd
    ;;

# Configure for HP-UX and HP-UX gcc.

  hpux|hpuxgcc)
    if test "X$LSOF_RANLIB_SUP" = "X"	# {
    then
      LSOF_RANLIB=""
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -r`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

      # If the HP-UX version isn't pre-defined, determine it.

      LSOF_VERS=`echo $LSOF_VSTR | awk -F. '{printf "%d%02d",\$2,\$3}'`
    fi	# }
    if test $LSOF_VERS -ge 1020	# {
    then
      LSOF_TSTBIGF="-D_LARGEFILE64_SOURCE"
    fi	# }

    # Determine compiler.

    if test "X$LSOF_CC" = "X"	# {
    then
      if test "X$LSOF_TGT" = "Xhpuxgcc"	# {
      then
	LSOF_CC=gcc
      else
	if test "X$HPUX_CCDIR1" = "X"	# {
	then
	  HPUX_CCDIR1="/bin"
	fi	# }
	if test "X$HPUX_CCDIR2" = "X"	# {
	then
	  HPUX_CCDIR2="/usr/ccs/bin"
	fi	# }
	if test -x ${HPUX_CCDIR1}/cc	# {
	then
	  LSOF_CC=${HPUX_CCDIR1}/cc
	else
	  if test -x ${HPUX_CCDIR2}/cc	# {
	  then
	    LSOF_CC=${HPUX_CCDIR2}/cc
	  else
	    echo "No executable cc in $HPUX_CCDIR1 or $HPUX_CCDIR2"
	    rm -f $LSOF_HLP
	    exit 1
	  fi	# }
	fi	# }
	$LSOF_CC -O < /dev/null 2>&1 | grep -q Bundled
	if test $? -eq 0	# {
	then
	  LSOF_DEBUG="No-O"			# to disable -O
	  if test "X$HPUX_LIBC1" = "X"	# {
	  then
	    HPUX_LIBC1="/usr/lib"
	  fi	# }
	  if test -r ${HPUX_LIBC1}/libc.sl	# {
	  then
	    LSOF_FCFGL="-L$HPUX_LIBC -lc"
	  else
	    if test "X$HPUX_LIBC2" = "X"	# {
	    then
	      HPUX_LIBC2="/usr/lib"
	    fi	# }
	    if test -r ${HPUX_LIBC2}/libc.sl	# {
	    then
	      LSOF_FCFGL="-L$HPUX_LIBC2 -lc"
	    fi	# }
	  fi	# }
	fi	# }
      fi	# }
    fi	# }
    echo $LSOF_CC | grep gcc > /dev/null
    if test $? -eq 0	# {
    then
      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
    else
      $LSOF_CC -O < /dev/null 2>&1 | grep -q Bundled
      if test $? -eq 0	# {
      then
	LSOF_DEBUG="No-O"			# to disable -O
      fi	# }
    fi	# }
    LSOF_TGT=hpux

    # Test for "const void" support.

    rm -f ${LSOF_TMPC}.*
    echo "main() { const void *x; return(0); }" >> $LSOF_TMPC.c
    $LSOF_CC $LSOF_TMPC.c -o $LSOF_TMPC.x > /dev/null 2>&1
    if test $? -eq 0	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHAS_CONST"
    fi	# }
    rm -f ${LSOF_TMPC}.*

    # Test HP-UX base.

    if test "X$HPUX_BASE" = "X"	# {
    then
      if test -d $LSOF_INCLUDE/sys/pstat -a $LSOF_VERS -ge 1111 	# {
      then
	HPUX_BASE="pstat"
      else
	HPUX_BASE="/dev/kmem"
      fi	# }
    fi	# }
    if test "X$HPUX_BASE" = "Xpstat"	# {
    then

      # Configure for pstat-based HP-UX lsof.

      LSOF_CINFO="PSTAT-based"
      echo "Configuring PSTAT-based HP-UX lsof"
      LSOF_DIALECT_DIR=hpux/pstat
      LSOF_CFGF="$LSOF_CFGF -DHPUXV=$LSOF_VERS -D_PSTAT64"
      LSOF_CFGL="$LSOF_CFGL -lnsl"
      LSOF_TSTKMEM=0
      LSOF_TSTK64=1
      ls -l $LSOF_CC | grep -q ansic
      LSOF_TMP1=$?
      ls -l $LSOF_CC | grep -q aCC
      if test $? -eq 0 -o $LSOF_TMP1 -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -Ae +DD32"
      else
	echo $LSOF_CC | grep -q gcc
	if test $? -ne 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF +DD32"
	fi	# }
      fi	# }
      if test -r ${LSOF_INCLUDE}/netinet/in6.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
      fi	# }
      if test -r ${LSOF_INCLUDE}/sys/pstat/stream_pstat_body.h	# {
      then
	grep -q PS_STR_XPORT_DATA ${LSOF_INCLUDE}/sys/pstat/stream_pstat_body.h
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -D_PSTAT_STREAM_GET_XPORT"
	fi	# }
      fi	# }
      if test $LSOF_VERS -ge 1123	# {
      then
	LSOF_CFGF="$LSOF_CFGF -D_LARGEFILE64_SOURCE"
      fi	# }
    else
      if test "X$HPUX_BASE" = "X/dev/kmem"	# {
      then
    
	# Configure for /dev/kmem-based HP-UX lsof.

	if test "X$HPUX_BOOTFILE" = "X"	# {
	then
	  HPUX_BOOTFILE="/stand/vmunix"
	fi	# }
	if test $LSOF_VERS -gt 1100	# {
	then
	  echo ""
	  echo "************************************************"
	  echo "*                                              *"
	  echo "* !!!!!!!!!!!!!!! FATAL ERROR !!!!!!!!!!!!!!!! *"
	  echo "*                                              *"
	  echo "* LSOF DOES NOT SUPPORT THIS VERSION OF HP-UX. *"
	  echo "*                                              *"
	  echo "************************************************"
	  echo ""
	  rm -f $LSOF_HLP
	  exit 1
	fi	# }
	LSOF_CFGF="$LSOF_CFGF -DHPUXV=$LSOF_VERS"
	LSOF_CINFO="/dev/kmem-based"
	LSOF_DIALECT_DIR=hpux/kmem
	echo "Configuring /dev/kmem-based HP-UX lsof"
	if test $LSOF_VERS -lt 1000	# {
	then
	  if test "X$HPUX_X25DIR" = "X"	# {
	  then
	    HPUX_X25DIR="/etc/conf"
	  else
	    HPUX_X25DIR=$HPUX_X25DIR
	  fi	# }
	  if test -r ${HPUX_X25DIR}/x25/x25addrstr.h	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHPUX_CCITT"
	    LSOF_DINC="$LSOF_DINC -I$HPUX_X25DIR"
	  fi	# }
	fi	# }
	if test -r ${LSOF_INCLUDE}/sys/fs/vx_inode.h -a -r ${LSOF_INCLUDE}/sys/fs/vx_hpux.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS"
	fi	# }
	if test $LSOF_VERS -ge 1030	# {
	then
	  if test "X$HPUX_KERNBITS" = "X"	# {
	  then
	    HPUX_KERNBITS=`getconf _SC_KERNEL_BITS`
	  fi	# }
	  LSOF_CFGF="$LSOF_CFGF -DHPUXKERNBITS=${HPUX_KERNBITS} -I`pwd`/dialects/hpux/kmem/hpux11"
	  if test $HPUX_KERNBITS -eq 64	# {
	  then
	    LSOF_TSTK64=1
	    echo ""
	    echo "*****************************************"
	    echo "*                                       *"
	    echo "* NOTICE!  Configuring for 64 bit HP-UX *"
	    echo "*                                       *"
	    echo "*****************************************"
	    echo $LSOF_CC | grep gcc > /dev/null
	    if test $? -eq 0	# {
	    then

	    # Test gcc for 64 bit support, trying gcc with no options, then
	    # with -mlp64, testing the result with file.

	      echo ""
	      echo "Testing $LSOF_CC for 64 bit support"
	      rm -f ${LSOF_TMPC}.*
	      echo "main(){}" > ${LSOF_TMPC}.c
	      LSOF_TMP1=""
	      $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
	      if test $? -eq 0	# {
	      then
		/bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null
		if test $? -eq 0	# {
		then
		    LSOF_TMP1=" "
		fi	# }
	      fi	# }
	      if test "X$LSOF_TMP1" = "X"	# {
	      then
		rm -f ${LSOF_TMPC}.x
		$LSOF_CC ${LSOF_TMPC}.c -mlp64 -o ${LSOF_TMPC}.x > /dev/null 2>&1
		if test $? -eq 0	# {
		then
		  /bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null
		  if test $? -eq 0	# {
		  then
		      LSOF_TMP1="-mlp64"
		  fi	# }
		fi	# }
	      fi	# }
	      rm -f ${LSOF_TMPC}.*
	      if test "X$LSOF_TMP1" = "X"	# {
	      then
		echo ""
		echo "***************************************************"
		echo "*                                                 *"
		echo "* !!!!!!!!!!!!!!!!! FATAL ERROR !!!!!!!!!!!!!!!!! *"
		echo "*                                                 *"
		echo "* APPARENTLY GCC CANNOT BUILD 64 BIT EXECUTABLES. *"
		echo "* A COMPILER MUST BE USED THAT CAN.  SEE 00FAQ    *"
		echo "* FOR MORE INFORMATION.                           *"
		echo "*                                                 *"
		echo "***************************************************"
		echo ""
		rm -f $LSOF_HLP
		exit 1
	      else
		if test "X$LSOF_TMP1" != "X "	# {
		then
		  LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
		fi	# }
		LSOF_CFGL="$LSOF_CFGL -lelf"
		LSOF_CINFO="${LSOF_CINFO}, 64 bit HP-UX"
	      fi	# }
	    else

	    # Set options for the HP-UX compiler.

	      LSOF_CFGF="$LSOF_CFGF +DD64"
	      LSOF_CFGL="$LSOF_CFGL -lelf"
	      LSOF_CINFO="${LSOF_CINFO}, 64 bit HP-UX"
	    fi	# }
	  else
	    LSOF_CFGF="$LSOF_CFGF -D_FILE_OFFSET_BITS=64"
	    LSOF_CINFO="${LSOF_CINFO}, 32 bit HP-UX"
	    echo $LSOF_CC | grep gcc > /dev/null
	    if test $? -ne 0	# {
	    then
	      LSOF_CFGF="$LSOF_CFGF +DAportable"
	    fi	# }
	  fi	# }
	  LSOF_CFGL="$LSOF_CFGL -lnsl"
	else

	# When HP-UX is less than 10.30, but greater than or equal to 10,
	# check NFS3 rnode status.

	  if test $LSOF_VERS -ge 1000	# {
	  then
	    LSOF_TMP1=0
	    if test "X$HPUX_RNODE3" = "X"	# {
	    then
	      nm -x $HPUX_BOOTFILE | grep -q nfs_vnodeops3
	      if test $? -eq 0	# {
	      then
		if test -r ${LSOF_INCLUDE}/nfs/rnode.h	# {
		then
		  grep -q r_fh3 ${LSOF_INCLUDE}/nfs/rnode.h
		  if test $? -ne 0	# {
		  then
		    LSOF_TMP1=1
		  fi	# }
		fi	# }
	      fi	# }
	    else
	      if test "X$HPUX_RNODE3" = "X1"	# {
	      then
		LSOF_TMP1=1
	      fi	# }
	    fi	# }
	    if test $LSOF_TMP1 -eq 1	# {
	    then
	      LSOF_CFGF="$LSOF_CFGF -DHASRNODE3"
	    fi	# }
	  fi # }
	fi	# }
	if test $LSOF_VERS -eq 1100	# {
	then

	# Test for the ipis_s structure.  If it is present, set HAS_IPC_S_PATCH.

	  if test "X$HPUX_IPC_S_PATCH" = "X"	# {
	  then
	    if test -x /usr/contrib/Q4/bin/q4exe	# {
	    then
	      LSOF_TMP=/usr/contrib/Q4/bin/q4exe
	    else
	      LSOF_TMP=/usr/contrib/bin/q4
	    fi	# }
	    if test -x $LSOF_TMP	# {
	    then
	      rm -f ${LSOF_TMPC}.out
	      echo ""
	      echo $EO "Looking in $HPUX_BOOTFILE for ipis_s with $LSOF_TMP ... $EC"
	      echo "yes\\nfields -c struct ipis_s" | $LSOF_TMP $HPUX_BOOTFILE > ${LSOF_TMPC}.out 2>&1
	      if test $? -ne 0	# {
	      then
		echo ""
		echo ""
		echo "!!!ERROR!!! $LSOF_TMP failed and produced the following output."
		echo ""
		cat ${LSOF_TMPC}.out
		HPUX_IPC_S_PATCH=fail
	      else
		grep ipis_s ${LSOF_TMPC}.out > /dev/null 2>&1
		if test $? -eq 0	# {
		then
		  echo "ipis_s exists."

		# See if ipis_msgsqueued is present.

		  grep ipis_msgsqueued ${LSOF_TMPC}.out > /dev/null 2>&1
		  if test $? -eq 0	# {
		  then
		    HPUX_IPC_S_PATCH=2
		  else
		    HPUX_IPC_S_PATCH=1
		  fi	# }
		else
		  echo "ipis_s doesn't exist."
		  HPUX_IPC_S_PATCH=N
		fi	# }
	      fi	# }
	      rm -f ${LSOF_TMPC}.out
	    else
	      echo "Can't locate or execute $LSOF_TMP"
	      echo $EO "ls says: $EC"
	      ls -ld $LSOF_TMP
	      HPUX_IPC_S_PATCH=fail
	    fi	# }
	  fi	# }
	  if test "X$HPUX_IPC_S_PATCH" = "Xfail"	# {
	  then
	    echo ""
	    echo "!!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!"
	    echo "Configure can't use $LSOF_TMP to examine the ipis_s"
	    echo "structure.  You must do that yourself, report the result in"
	    echo "the HPUX_IPC_S_PATCH environment variable, then repeat the"
	    echo "Configure step.  Consult the Configure script's use of"
	    echo "$LSOF_TMP and the 00XCONFIG file for information"
	    echo "on ipis_s testing and the setting of HPUX_IPC_S_PATCH."
	    echo "!!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!"
	    echo ""
	    rm -f $LSOF_HLP
	    exit 1
	  fi	# }
	  if test "X$HPUX_IPC_S_PATCH" = "X1" -o "X$HPUX_IPC_S_PATCH" = "X2" # {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_IPC_S_PATCH=$HPUX_IPC_S_PATCH"
	  else
	    if test "X$HPUX_IPC_S_PATCH" != "Xn" -a "X$HPUX_IPC_S_PATCH" != "XN" # {
	    then
	      echo "Illegal value for HPUX_IPC_S_PATCH: $HPUX_IPC_S_PATCH"
	      rm -f $LSOF_HLP
	      exit 1
	    fi	# }
	  fi	# }
	fi	#}

	# Manufacture an hpux_mount.h header file with a mount struct in it, as
	# required.

	if test -r ${LSOF_INCLUDE}/sys/mount.h	# {
	then
	  LSOF_TMP1="dialects/${LSOF_DIALECT_DIR}/hpux_mount.h"
	  rm -f $LSOF_TMP1
	  echo "#if !defined(MANUFACTURED_HPUX_SYS_MOUNT_H)" > $LSOF_TMP1
	  echo "#define MANUFACTURED_HPUX_SYS_MOUNT_H" >> $LSOF_TMP1
	  echo "/* By lsof Configure:" `date` " */" >> $LSOF_TMP1
	  echo "struct mount" >> $LSOF_TMP1
	  sed '1,/struct mount/d' ${LSOF_INCLUDE}/sys/mount.h | sed -n '1,/m_dev/p' >> $LSOF_TMP1
	  echo "};" >> $LSOF_TMP1
	  echo "#endif" >> $LSOF_TMP1
	  LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/${LSOF_DIALECT_DIR}"
	fi	# }

	# Test for OnlineJFS.

	if test $LSOF_VERS -ge 1100	# {
	then
	  if test "X$HPUX_HASONLINEJFS" = "X" -a -x /sbin/fs/vxfs/subtype  # {
	  then
	    LSOF_TMP1=`/sbin/fs/vxfs/subtype`
	    if test "X$LSOF_TMP1" = "Xvxfs3.3"
	    then
	      HPUX_HASONLINEJFS="Y"
	    fi	# }
	  fi	# }
	  if test "X$HPUX_HASONLINEJFS" = "XY" -o "X$HPUX_HASONLINEJFS" = "Xy"
	  # {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHASONLINEJFS"
	  fi	# }
	fi	# }

	# Test for AFS.

	if test -r ${AFS_VICE}/etc/ThisCell	# {
	then
	  if test "X$LSOF_SCRIPT_CALL" = "Xno"	# {
	  then
	    if test -r ./AFSHeaders -a -r ./AFSVersion	# {
	    then
	      LSOF_AFS="yes"
	    fi	# }
	  else
	    if test ! -x ./AFSConfig	# {
	    then
	      echo "Can't find or execute the AFSConfig script"
	      rm -f $LSOF_HLP
	      exit 1
	    fi	# }
	    ./AFSConfig
	    if test $? -eq 0 -a -r ./AFSHeaders -a -r ./AFSVersion	# {
	    then
	      LSOF_AFS="yes"
	    fi	# }
	  fi	# }
	  if test "X$LSOF_AFS" = "Xyes"	# {
	  then
	    LSOF_AFSV=`cat ./AFSVersion | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1 \2/' | awk '{printf "%d%02d\n",\$1,\$2}'`
	    LSOF_CFGF="$LSOF_CFGF -DHAS_AFS=$LSOF_AFSV"
	    LSOF_DINC="$LSOF_DINC -I`cat ./AFSHeaders`"
	  fi	# }
	fi	# }
      else
	echo "HP-UX base unrecognized: $HPUX_BASE"
	rm -f $LSOF_HLP
	exit 1
      fi	# }
    fi	# }
    ;;

# Configure for Linux.

  linux)
    LSOF_TSTBIGF="-D_FILE_OFFSET_BITS=64"
    LSOF_TSTKMEM=0
    if test "X$LSOF_CC" = "X"	# {
    then
      LSOF_CC=cc
      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
    fi	# }
    if test "X$LINUX_CONF_CC" = "X"	# {
    then
      LINUX_CONF_CC=$LSOF_CC
    fi	#}
    LSOF_DIALECT_DIR=""
    if test "X$LINUX_INCL" = "X" # {
    then
      LINUX_INCL=/usr/include
    else
      LSOF_DINC="$LSOF_DINC -I${LINUX_INCL}"
    fi	# }
    if test "X$LINUX_VERSION_CODE" = "X" # {
    then
      if test -r "$LINUX_INCL/linux/version.h" # {
      then
        LINUX_VERSION_CODE=`cat $LINUX_INCL/linux/version.h | sed -n 's/.\+LINUX_VERSION_CODE \([[:digit:]]\+\)$/\1/p'`
      fi # }
    fi # }
    LSOF_VSTR=`echo $LINUX_VERSION_CODE | perl -e '$version=<STDIN>; chomp($version); printf("%d.%d.%d\n", ($version >> 16) & 0xFF, ($version >> 8) & 0xFF, $version & 0xFF);'`
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -r`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

      # If the Linux version isn't predefined, determine it.

      LSOF_VERS=`echo $LSOF_VSTR | sed 's/\./ /g' | awk '{printf "%d%d%03d",\$1,\$2,\$3}'`
    fi	# }
    LSOF_CFGF="$LSOF_CFGF -DLINUXV=$LSOF_VERS"
    if test $LSOF_VERS -lt 21072	# {
    then
      echo ""
	echo "!!!WARNING!!!==!!!WARNING!!!==!!!WARNING!!!==!!!WARNING!!!"
	echo "!                                                        !"
	echo "! THE /PROC-BASED LSOF SOURCES HAVE NOT BEEN TESTED ON   !"
	echo "! LINUX KERNELS BELOW 2.1.72, AND MAY NOT WORK ON THIS   !"
	echo "! KERNEL.  IT SHOULD USE A /DEV/KMEM-BASED LSOF.         !"
	echo "!                                                        !"
	echo "!!!WARNING!!!==!!!WARNING!!!==!!!WARNING!!!==!!!WARNING!!!"
	echo ""
    else
      LSOF_UNSUP=""
    fi	# }

    # If the Linux C library type isn't predefined, determine it.

    if test "X$LINUX_CLIB" = "X"	# {
    then
      echo -n "Testing C library type with $LINUX_CONF_CC ... "
      rm -f ${LSOF_TMPC}.*
      cat > $LSOF_TMPC.c << .LSOF_END_HERE_DOC1
#include <features.h>
main() {
#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
printf("-DGLIBCV=%d\n",__GLIBC__*100+__GLIBC_MINOR__);
#elif defined(__GLIBC__)
printf("-DGLIBCV=%d00\n",__GLIBC__);
#else
printf("\n");
#endif
return(0); }
.LSOF_END_HERE_DOC1
      $LINUX_CONF_CC ${LSOF_TMPC}.c -I$LSOF_INCLUDE -o ${LSOF_TMPC}.x > /dev/null 2>&1
      if test -x ${LSOF_TMPC}.x	# {
      then
	LINUX_CLIB=`${LSOF_TMPC}.x`
	LSOF_TMP=$?
      else
	LINUX_CLIB=""
	LSOF_TMP=1
      fi	# }
      rm -f ${LSOF_TMPC}.*
      echo "done"
      if test $LSOF_TMP -ne 0	# {
      then
	echo "Cannot determine C library type; assuming it is not glibc."
	LINUX_CLIB=""
      else
	if test "X$LINUX_CLIB" = "X"	# {
	then
	  echo "The C library type is not glibc."
	else
	  echo "The C library type is glibc, version \"$LINUX_CLIB\"."
	fi	# }
      fi	# }
    fi	# }
    if test "X$LINUX_CLIB" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF $LINUX_CLIB"
    fi	# }

    # Test for IPv6 support.

    if test -r ${LSOF_INCLUDE}/netinet/ip6.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
    fi	# }

    # Test for <rpc/rpc.h>.

    if ! test -r ${LSOF_INCLUDE}/rpc/rpc.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASNORPC_H"
    fi	# }

    # Test for SELinux support.

    LSOF_TMP1=0
    if test "X$LINUX_HASSELINUX" = "X"	# {
    then
      if test -r ${LSOF_INCLUDE}/selinux/selinux.h	# {
      then
	LSOF_TMP1=1
      fi	# }
    else
      if test "X$LINUX_HASSELINUX" = "XY" -o "X$LINUX_HASSELINUX" = "Xy" # {
      then
	LSOF_TMP1=1
      fi	# }
    fi	# }
    if test $LSOF_TMP1 -eq 1	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASSELINUX"
      LSOF_CFGL="$LSOF_CFGL -lselinux"
    fi	# }
    LSOF_DIALECT_DIR="linux"
    LSOF_CFGF="$LSOF_CFGF -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE"
    ;;

# Configure for NetBSD.

  netbsd)
    if test "X$LSOF_CC" = "X"	# {
    then
      LSOF_CC=cc
      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -r`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then
      
      # Validate the NetBSD version.

      case $LSOF_VSTR in	# {
      1.2*)
	LSOF_VERS="1002000"
	;;
      1.3*)
	LSOF_VERS="1003000"
	;;
      1.4*)
	LSOF_VERS="1004000"
	;;
      1.5*)
	LSOF_TSTBIGF=" "
	LSOF_VERS="1005000"
	;;
      1.6*)
	LSOF_TSTBIGF=" "
	LSOF_VERS="1006000"
	;;
      1*)
	LSOF_VERS="1006000"
	echo "!!!WARNING!!!  Unsupported NetBSD version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for NetBSD 1.6"
	;;
      2.0*)
	LSOF_TSTBIGF=" "
	LSOF_VERS="2000000"
	;;
      2.99.9)
	LSOF_TSTBIGF=" "
	LSOF_VERS="2099009"
	;;
      2.99.10)
	LSOF_TSTBIGF=" "
	LSOF_VERS="2099010"
	;;
      2.99.*)
	LSOF_TSTBIGF=" "
	LSOF_VERS="2099010"
	;;
      2*)
	LSOF_VERS="2000000"
	echo "!!!WARNING!!!  Unsupported NetBSD version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for NetBSD 2.0"
	;;
      3.0*)
	LSOF_TSTBIGF=" "
	LSOF_VERS="3000000"
	;;
      3.99.*)
	LSOF_TSTBIGF=" "
	LSOF_VERS="3099000"
	;;
      3*)
	LSOF_VERS="3000000"
	echo "!!!WARNING!!!  Unsupported NetBSD version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for NetBSD 3.0"
	;;
      *)
	echo "Unknown NetBSD release: $LSOF_VSTR"
	echo Assuming NetBSD 1.6
	LSOF_VERS="1006000"
	;;
      esac	# }
    fi	# }

    # Test for legal NetBSD version.

    case $LSOF_VERS in	# {
    1002000|1003000|1004000|1005000|1006000)
      ;;
    2000000|2099009|2099010)
      ;;
    3000000|3099000)
      ;;
    *)
      echo "Unknown NetBSD version: $LSOF_VERS"
      rm -f $LSOF_HLP
      exit 1
      ;;
    esac	# }
    LSOF_CFGF="$LSOF_CFGF -DNETBSDV=$LSOF_VERS"
    LSOF_TMP1="-DN_UNIXV=/netbsd"
    if test -r ${LSOF_INCLUDE}/util.h	# {
    then
      grep -q getbootfile ${LSOF_INCLUDE}/util.h
      if test $? -eq 0	# {
      then
	LSOF_CFGL="$LSOF_CFGL -lutil"
	LSOF_TMP1="-DHASGETBOOTFILE"
      fi	# }
    fi	# }
    LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
    if test -r ${LSOF_INCLUDE}/kvm.h	# {
    then
      grep -q kvm_getproc2 ${LSOF_INCLUDE}/kvm.h
      if test $? -eq 0	# {
      then
	  LSOF_CFGF="$LSOF_CFGF -DHASKVMGETPROC2"
      fi	# }
    fi	# }

  # Here begin the dual tests on header files that may be in $LSOF_INCLUDE
  # or $NETBSD_SYS.
  #
  # Note that $LSOF_TMP1 holds an indicator of the need for -I$NETBSD_SYS.
  # LSOF_TMP4 contains a temporary indicator of the use of $NETBSD_SYS.

    LSOF_TMP1=0
    if test "X$NETBSD_SYS" = "X"	# {
    then
      if test -d /usr/src	# {
      then
	NETBSD_SYS="/usr/src/sys"
      else
	NETBSD_SYS=$LSOF_INCLUDE
      fi	# }
    fi	# }
    LSOF_TMP2="nfs/nfsproto.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASNFSPROTO"
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
    fi	# }
    LSOF_TMP2="netinet/ip6.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
    else
      LSOF_TMP2="netinet/in.h"
      if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
	LSOF_TMP4=0
      else
	if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
	then
	  LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	  LSOF_TMP4=1
	else
	  LSOF_TMP3=""
	fi	# }
      fi	# }
      if test "X$LSOF_TMP3" != "X"	# {
      then
	grep -q IPV6_INRIA_VERSION $LSOF_TMP3
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASIPv6 -DHASINRIAIPv6"
	  if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	  then
	    LSOF_TMP1=1
	  fi	# }
	fi	# }
      fi # }
    fi	# }
    LSOF_TMP2="miscfs/fdesc/fdesc.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      grep -q Fctty $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=1"
      else
	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=2"
      fi	# }
      grep -q fd_link $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASFDLINK"
      fi	# }
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
    fi	# }
    LSOF_TMP2="miscfs/nullfs/null.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
    fi	# }
    LSOF_TMP2="miscfs/procfs"
    if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASPROCFS"
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
      if test -r ${LSOF_TMP3}/procfs.h	# {
      then
	grep -q PFSroot ${LSOF_TMP3}/procfs.h
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASPROCFS_PFSROOT"
	fi #	}
      fi	# }
    fi	# }
    LSOF_TMP2="sys/bufq.h"
    LSOF_NBSD_BUFQH=0
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASBUFQ_H"
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	if test $NETBSD_SYS != $LSOF_INCLUDE	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASBUFQ_H"
	  LSOF_NBSD_BUFQH=1
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="isofs/cd9660"
    if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHAS9660FS=1"
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
    else
      LSOF_TMP2="fs/cd9660"
      if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
	LSOF_TMP4=0
      else
	if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
	then
	  LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	  LSOF_TMP4=1
	else
	  LSOF_TMP3=""
	fi	# }
      fi	# }
      if test "X$LSOF_TMP3" != "X"	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS9660FS=1"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="msdosfs"
    if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASMSDOSFS=1"
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
    else
      LSOF_TMP2="fs/msdosfs"
      if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
	LSOF_TMP4=0
      else
	if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
	then
	  LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	  LSOF_TMP4=1
	else
	  LSOF_TMP3=""
	fi	# }
      fi	# }
      if test "X$LSOF_TMP3" != "X"	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASMSDOSFS=2"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="miscfs/kernfs/kernfs.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      grep -q "kt_name;" $LSOF_TMP3
      if test $? -eq 0	# {
	then
 	  LSOF_CFGF="$LSOF_CFGF -DHASKERNFS"
	  if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	  then
	    LSOF_TMP1=1
	  fi	# }
	  grep -q "*kfs_kt;" $LSOF_TMP3
	  if test $? -eq 0      # {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHASKERNFS_KFS_KT"
	  fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="sys/namei.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      grep -q nc_vpid $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="ufs/ufs/inode.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      grep -q i_ffs_size $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASI_FFS"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      else
	grep -q i_ffs1_size $LSOF_TMP3
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASI_FFS1"
	  if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	  then
	    LSOF_TMP1=1
	  fi	# }
	fi	# }
      fi	# }
      grep -q i_ffs_effnlink $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASEFFNLINK=i_ffs_effnlink"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="sys/vnode.h"
    LSOF_NBSD_PTYFS=0
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "XLSOF_TMP3" != "X"	# {
    then
      grep -q VT_EXT2FS $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASEXT2FS"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
	LSOF_TMP2="ufs/ufs/inode.h"
	if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
	then
	  LSOF_TMP5="${LSOF_INCLUDE}/$LSOF_TMP2"
	  LSOF_TMP6=0
	else
	  if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
	  then
	    LSOF_TMP5="${NETBSD_SYS}/$LSOF_TMP2"
	    LSOF_TMP6=1
	  else
	    LSOF_TMP5=""
	  fi	# }
	fi	# }
	if test "X$LSOF_TMP5" != "X"	# {
	then
	  grep -q "*e2fs_din" $LSOF_TMP5
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHASI_E2FS_PTR"
	    if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	    then
	      LSOF_TMP1=$LSOF_TMP6
	    fi	# }
	  fi	# }
	fi	# }
      fi	# }
      grep -q VT_LFS $LSOF_TMP3
      if test $? -eq 0   # {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASLFS"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
      grep -q VT_PTYFS $LSOF_TMP3
      if test $? -eq 0   # {
      then
	LSOF_TMP2="fs/ptyfs/ptyfs.h"
	if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASPTYFS"
	else
	  if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
	  then
	    if test $NETBSD_SYS != $LSOF_INCLUDE	# {
	    then
	      LSOF_CFGF="$LSOF_CFGF -DHASPTYFS"
	      LSOF_NBSD_PTYFS=1
	    fi	# }
	  fi	# }
	fi	# }
      fi	# }
      if test "X$NETBSD_UVM" = "X"	# {
      then
	grep -q UVM $LSOF_TMP3
	if test $? -ne 0	# {
	then
	  egrep -q "v_uvm;|v_uobj;" $LSOF_TMP3
	  if test $? -eq 0	# {
	  then
	    NETBSD_UVM="Y"
	  fi	# }
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="nfs/nfsnode.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      grep -q "*n_vattr" $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASNFSVATTRP"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="sys/lockf.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      grep -q vop_advlock_args $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_ADVLOCK_ARGS"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
      grep -q lf_lwp $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_LF_LWP"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="sys/lwp.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHAS_LWP_H"
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
    fi	# }
    LSOF_TMP2="sys/filedesc.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      grep -q "^struct cwdinfo {" $LSOF_TMP3
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASCWDINFO"
	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
	then
	  LSOF_TMP1=1
	fi	# }
      fi	# }
    fi	# }
    LSOF_TMP2="sys/pipe.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
      LSOF_TMP4=0
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
	LSOF_TMP4=1
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHAS_SYS_PIPEH"
      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
      then
	LSOF_TMP1=1
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/statvfs.h 	# {
    then
      grep -q '^struct statvfs {' ${LSOF_INCLUDE}/sys/statvfs.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASSTATVFS"
      fi	# }
    fi	# }

  # Here end the dual NetBSD tests for header files in $LSOF_INCLUDE or
  # NETBSD_SYS.
  #
  # After this LSOF_TMP1 may be reused.

    if test $LSOF_TMP1 -eq 1	# {
    then
      LSOF_DINC="-I$LSOF_INCLUDE -I$NETBSD_SYS"
    fi	# }

  # Build special header files, as required.

    rm -rf dialects/n+obsd/include
    if test "X$NETBSD_UVM" = "XY" -o "X$NETBSD_UVM" = "Xy"	# {
    then
      mkdir dialects/n+obsd/include
      touch dialects/n+obsd/include/opt_uvmhist.h
      touch dialects/n+obsd/include/opt_lockdebug.h
      LSOF_CFGF="$LSOF_CFGF -DUVM -I`pwd`/dialects/n+obsd/include"
      if test -d ${LSOF_INCLUDE}/uvm	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_UVM_INCL"
      fi	# }
    fi	# }
    LSOF_TMP2="sys/mount.h"
    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
    then
      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
    else
      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
      then
	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
      else
	LSOF_TMP3=""
      fi	# }
    fi	# }
    if test "X$LSOF_TMP3" != "X"	# {
    then

      # Build a local NetBSD netexport.h header file for possible use by
      # <msdosfs/msdosfsmount.h>.  Make sure CFGL contains a -I for it.

      LSOF_TMP1=${LSOF_TMPC}.edscr
      LSOF_TMP2=${LSOF_TMPC}.netcred
      LSOF_TMP3=${LSOF_TMPC}.netexport
      LSOF_TMP4=dialects/n+obsd/include/netexport.h
      if test ! -d dialects/n+obsd/include	# {
      then
	mkdir dialects/n+obsd/include
      fi	# }
      rm -f $LSOF_TMP1 $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 
      echo "/^struct netcred" > $LSOF_TMP1
      echo "1,.-1d" >> $LSOF_TMP1
      echo "/^};" >> $LSOF_TMP1
      echo "1,.w $LSOF_TMP2" >> $LSOF_TMP1
      ed ${LSOF_INCLUDE}/sys/mount.h < $LSOF_TMP1 > /dev/null 2>&1
      rm -f $LSOF_TMP1
      echo "/^struct netexport" > $LSOF_TMP1
      echo "1,.-1d" >> $LSOF_TMP1
      echo "/^};" >> $LSOF_TMP1
      echo "1,.w $LSOF_TMP3" >> $LSOF_TMP1
      ed ${LSOF_INCLUDE}/sys/mount.h < $LSOF_TMP1 > /dev/null 2>&1
      echo "/*" > $LSOF_TMP4
      echo " * netexport.h" >> $LSOF_TMP4
      echo -n " * Created by Configure: " >> $LSOF_TMP4
      echo `date` >> $LSOF_TMP4
      echo " */" >> $LSOF_TMP4
      echo "" >> $LSOF_TMP4
      echo "#if	!defined(NETEXPORT_H)" >> $LSOF_TMP4
      echo "#define	NETEXPORT_H" >> $LSOF_TMP4
      echo "" >> $LSOF_TMP4
      echo "#include <net/radix.h>" >> $LSOF_TMP4
      echo "" >> $LSOF_TMP4
      if test -r $LSOF_TMP2	# {
      then
	cat $LSOF_TMP2 >> $LSOF_TMP4
	echo "" >> $LSOF_TMP4
      fi	# }
      if test -r $LSOF_TMP3	# {
      then
	cat $LSOF_TMP3 >> $LSOF_TMP4
      fi	# }
      echo "#endif	/* !defined(NETEXPORT_H) */" >> $LSOF_TMP4
      rm -f $LSOF_TMP1 $LSOF_TMP2 $LSOF_TMP3
      echo $LSOF_CFGF | grep /dialects/n+obsd/include > /dev/null 2>&1
      if test $? -ne 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/n+obsd/include"
      fi	# }
    fi	# }
    if test $LSOF_NBSD_BUFQH -eq 1	# {
    then

    # Make a local copy of $NETBSD_SYS/sys/bufq.h.

      if test ! -d dialects/n+obsd/include	# {
      then
	mkdir dialects/n+obsd/include
      fi	# }
      if test ! -d dialects/n+obsd/include/sys	# {
      then
	mkdir dialects/n+obsd/include/sys
      fi	# }
      cp $NETBSD_SYS/sys/bufq.h dialects/n+obsd/include/sys
      echo $LSOF_CFGF | grep /dialects/n+obsd/include > /dev/null 2>&1
      if test $? -ne 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/n+obsd/include"
      fi	# }
    fi	# }
    if test $LSOF_NBSD_PTYFS -eq 1	# {
    then

    # Make a local copy of $NETBSD_SYS/sys/fs/ptyfs/.

      if test ! -d dialects/n+obsd/include	# {
      then
	mkdir dialects/n+obsd/include
      fi	# }
      if test ! -d dialects/n+obsd/include/fs	# {
      then
	mkdir dialects/n+obsd/include/fs
      fi	# }
      rm -rf dialects/n+obsd/include/fs/ptyfs
      mkdir dialects/n+obsd/include/fs/ptyfs
      cp $NETBSD_SYS/fs/ptyfs/*.h dialects/n+obsd/include/fs/ptyfs
      echo $LSOF_CFGF | grep /dialects/n+obsd/include > /dev/null 2>&1
      if test $? -ne 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/n+obsd/include"
      fi	# }
    fi	# }
    LSOF_CFGL="$LSOF_CFGL -lkvm"
    LSOF_DIALECT_DIR=n+obsd
    ;;

# Configure for NeXTSTEP or OPENSTEP.

  nextstep|next|ns|nxt|openstep|os)
    LSOF_TGT="ns"
    LSOF_TSTXO="../lib/snpf.o"
    if test "X$LSOF_AR" = "X"	# {
    then
      LSOF_AR="rm -f \${LIB}; ar cr"
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

      # If the NeXSTEP version isn't predefined, determine it.

      LSOF_VERS=`echo $LSOF_VSTR | sed -n 's/\([0-9]*\)\.\([0-9]*\)/\1\2/p'`
    fi	# }
    if test "X$LSOF_CC" = "X"	# {
    then
      if test -x /usr/local/bin/gcc	# {
      then
	LSOF_CC=/usr/local/bin/gcc
	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
      else
	LSOF_CC=cc
	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
      fi	# }
    fi	# }
    echo $LSOF_CC | grep gcc > /dev/null
    if test $? -eq 0	# {
    then
      LSOF_CFGL="$LSOF_CFGL -w"
      LSOF_DEBUG="-pedantic -O"
    fi	# }
    LSOF_CFGF="$LSOF_CFGF -DSTEPV=$LSOF_VERS"
    LSOF_DIALECT_DIR=n+os

    # Test for AFS.

    if test -r ${AFS_VICE}/etc/ThisCell	# {
    then
      if test "X$LSOF_SCRIPT_CALL" = "Xno"	# {
      then
	if test -r ./AFSHeaders -a -r ./AFSVersion	# {
	then
	  LSOF_AFS="yes"
	fi	# }
      else
	if test ! -x ./AFSConfig	# {
	then
	  echo "Can't find or execute the AFSConfig script"
	  rm -f $LSOF_HLP
	  exit 1
	fi	# }
	./AFSConfig
	if test $? -eq 0 -a -r ./AFSHeaders -a -r ./AFSVersion	# {
	then
	    LSOF_AFS="yes"
	fi	# }
      fi	# }
      if test "X$LSOF_AFS" = "Xyes"	# {
      then
	LSOF_AFSV=`cat ./AFSVersion | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1 \2/' | awk '{printf "%d%02d\n",\$1,\$2}'`
	LSOF_CFGF="$LSOF_CFGF -DHAS_AFS=$LSOF_AFSV"
	LSOF_DINC="$LSOF_DINC -I`cat ./AFSHeaders`"
      fi	# }
    fi	# }
    ;;

# Configure for OpenBSD.  (OpenBSD uses NetBSD dialect sources and version
# numbering.

  openbsd)
    if test "X$LSOF_CC" = "X"	# {
    then
      LSOF_CC=cc
      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -r`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

      # If the OpenBSD version isn't pre-defined, determine it.

      case $LSOF_VSTR in	# {
      1*)
	LSOF_VERS=1020
	echo "!!!WARNING!!!  Unsupported OpenBSD 1.x version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for OpenBSD 1.2"
	;;
      2.5*)
	LSOF_VERS=2050
	;;
      2.6*)
	LSOF_VERS=2060
	;;
      2.7*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=2070
	;;
      2.8*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=2080
	;;
      2.9*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=2090
	;;
      2*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=2090
	echo "!!!WARNING!!!  Unsupported OpenBSD 2.x version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for OpenBSD 2.9"
	;;
      3.0*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3000
	;;
      3.1*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3010
	;;
      3.2*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3020
	;;
      3.3*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3030
	;;
      3.4*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3040
	;;
      3.5*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3050
	;;
      3.6*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3060
	;;
      3.7*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3070
	;;
      3.8*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3080
	;;
      3.9*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3090
	;;
      3*)
	LSOF_TSTBIGF=" "
	LSOF_VERS=3090
	echo "!!!WARNING!!!  Unsupported OpenBSD 3.x version: $LSOF_VSTR"
	echo "!!!WARNING!!!  Configuring for OpenBSD 3.9"
	;;
      *)
	echo "Unknown OpenBSD release: $LSOF_VSTR"
	echo Assuming OpenBSD 3.9
	LSOF_VERS=3090
	;;
      esac	# }
    fi	# }

    # Test for legal OpenBSD version.

    case $LSOF_VERS in	# {
    1020|2050|2060|2070|2080|2090|3000|3010|3020|3030|3040|3050|3060|3070|3080|3090)
      ;;
    *)
      echo "Unknown OpenBSD version: $LSOF_VERS"
      rm -f $LSOF_HLP
      exit 1
      ;;
    esac	# }
    LSOF_CFGF="$LSOF_CFGF -DOPENBSDV=$LSOF_VERS"
    if test -r /dev/ksyms	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DN_UNIXV=/dev/ksyms"
    else
      LSOF_CFGF="$LSOF_CFGF -DN_UNIXV=/bsd"
    fi
    if test -r ${LSOF_INCLUDE}/nfs/nfsproto.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASNFSPROTO"
    fi	# }
    if test -r ${LSOF_INCLUDE}/netinet6/in6.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
    fi	# }
    LSOF_TMP1=0
    if test "X$OPENBSD_SYS" = "X"	# {
    then
      OPENBSD_SYS="/sys"
    fi	# }
    if test -r ${OPENBSD_SYS}/miscfs/fdesc/fdesc.h	# {
    then
      grep -q Fctty ${OPENBSD_SYS}/miscfs/fdesc/fdesc.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=1"
      else
	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=2"
      fi	# }
      grep -q fd_link ${OPENBSD_SYS}/miscfs/fdesc/fdesc.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASFDLINK"
      fi	# }
      LSOF_TMP1=1
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
    then
      grep -q VT_LFS ${LSOF_INCLUDE}/sys/vnode.h
      if test $? -eq 0   # {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASLFS"
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/miscfs/nullfs/null.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
    else
      if test -r ${OPENBSD_SYS}/miscfs/nullfs/null.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
	LSOF_TMP1=1
      fi	# }
    fi	# }
    if test -d ${OPENBSD_SYS}/miscfs/procfs	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASPROCFS"
      LSOF_TMP1=1
    fi	# }
    if test -d ${OPENBSD_SYS}/isofs/cd9660	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHAS9660FS=1"
      LSOF_TMP1=1
    else
      if test -d ${OPENBSD_SYS}/fs/cd9660	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS9660FS=2"
	LSOF_TMP1=1
      fi	# }
    fi	# }
    if test -d ${OPENBSD_SYS}/msdosfs	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASMSDOSFS=1"
      LSOF_TMP1=1
    else
      if test -d ${OPENBSD_SYS}/fs/msdosfs	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASMSDOSFS=2"
	LSOF_TMP1=1
      fi	# }
    fi	# }
    if test -r ${OPENBSD_SYS}/miscfs/kernfs/kernfs.h	# {
    then
      grep -q "kt_name;" ${OPENBSD_SYS}/miscfs/kernfs/kernfs.h
      if test $? -eq 0	# {
	then
 	  LSOF_CFGF="$LSOF_CFGF -DHASKERNFS"
	  LSOF_TMP1=1
      fi	# }
    fi	# }
    if test $LSOF_TMP1 -eq 1 -a "X$LSOF_INCLUDE" != "X$OPENBSD_SYS"	# {
    then
      LSOF_DINC="-I$LSOF_INCLUDE -I$OPENBSD_SYS"
    fi	# }
    grep -q VT_EXT2FS ${LSOF_INCLUDE}/sys/vnode.h
    if test $? -eq 0	# {
    then
      LSOF_TMP1=1
      if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h	# {
      then
	grep -q "*e2fs_din" ${LSOF_INCLUDE}/ufs/ufs/inode.h
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASI_E2FS_PTR"
	fi	# }
	grep -q "^#define[ 	]i_e2din" ${LSOF_INCLUDE}/ufs/ufs/inode.h
	if test $? -eq 0	# {
	then
	  LSOF_TMP1=2
	fi	# }
      fi	# }
      LSOF_CFGF="$LSOF_CFGF -DHASEXT2FS=$LSOF_TMP1"
    fi	# }
    if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h	# {
    then
      grep -q i_effnlink ${LSOF_INCLUDE}/ufs/ufs/inode.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASEFFNLINK=i_effnlink"
      fi	# }
      grep -q dinode_u ${LSOF_INCLUDE}/ufs/ufs/inode.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_DINODE_U"
      fi	# }
      grep -q i_ffs1_size ${LSOF_INCLUDE}/ufs/ufs/inode.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASI_FFS1"
      fi	# }
      grep -q UM_UFS ${LSOF_INCLUDE}/ufs/ufs/inode.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_UM_UFS"
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/namei.h
    then
      grep -q nc_vpid ${LSOF_INCLUDE}/sys/namei.h
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
      fi	# }
    fi	# }
    if test "X$OPENBSD_UVM" = "X"	# {
    then
      if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
      then
	grep -q UVM ${LSOF_INCLUDE}/sys/vnode.h
	if test $? -ne 0	# {
	then
	  egrep -q "v_uvm;|v_uobj;" ${LSOF_INCLUDE}/sys/vnode.h
	  if test $? -eq 0	# {
	  then
	    OPENBSD_UVM="Y"
	  fi	# }
	fi	# }
      fi	# }
    fi	# }
    if test "X$OPENBSD_UVM" = "XY" -o "X$OPENBSD_UVM" = "Xy"	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DUVM"
      if test -d ${LSOF_INCLUDE}/uvm	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_UVM_INCL"
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/mount.h -a $LSOF_VERS -lt 3030	# {
    then

      # Build a local OpenBSD netexport.h header file for possible use by
      # <msdosfs/msdosfsmount.h>.  Make sure CFGL contains a -I for it.

      LSOF_TMP1=${LSOF_TMPC}.edscr
      LSOF_TMP2=${LSOF_TMPC}.netcred
      LSOF_TMP3=${LSOF_TMPC}.netexport
      LSOF_TMP4=dialects/n+obsd/include/netexport.h
      if test ! -d dialects/n+obsd/include	# {
      then
	mkdir dialects/n+obsd/include
      fi	# }
      rm -f $LSOF_TMP1 $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 
      echo "/^struct netcred" > $LSOF_TMP1
      echo "1,.-1d" >> $LSOF_TMP1
      echo "/^};" >> $LSOF_TMP1
      echo "1,.w $LSOF_TMP2" >> $LSOF_TMP1
      ed ${LSOF_INCLUDE}/sys/mount.h < $LSOF_TMP1 > /dev/null 2>&1
      rm -f $LSOF_TMP1
      echo "/^struct netexport" > $LSOF_TMP1
      echo "1,.-1d" >> $LSOF_TMP1
      echo "/^};" >> $LSOF_TMP1
      echo "1,.w $LSOF_TMP3" >> $LSOF_TMP1
      ed ${LSOF_INCLUDE}/sys/mount.h < $LSOF_TMP1 > /dev/null 2>&1
      echo "/*" > $LSOF_TMP4
      echo " * netexport.h" >> $LSOF_TMP4
      echo -n " * Created by Configure: " >> $LSOF_TMP4
      echo `date` >> $LSOF_TMP4
      echo " */" >> $LSOF_TMP4
      echo "" >> $LSOF_TMP4
      echo "#if	!defined(NETEXPORT_H)" >> $LSOF_TMP4
      echo "#define	NETEXPORT_H" >> $LSOF_TMP4
      echo "" >> $LSOF_TMP4
      echo "#include <net/radix.h>" >> $LSOF_TMP4
      echo "" >> $LSOF_TMP4
      if test -r $LSOF_TMP2	# {
      then
	cat $LSOF_TMP2 >> $LSOF_TMP4
	echo "" >> $LSOF_TMP4
      fi	# }
      if test -r $LSOF_TMP3	# {
      then
	cat $LSOF_TMP3 >> $LSOF_TMP4
      fi	# }
      echo "#endif	/* !defined(NETEXPORT_H) */" >> $LSOF_TMP4
      rm -f $LSOF_TMP1 $LSOF_TMP2 $LSOF_TMP3
      echo $LSOF_CFGF | grep /dialects/n+obsd/include > /dev/null 2>&1
      if test $? -ne 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/n+obsd/include"
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/lockf.h	# {
    then
      grep vop_advlock_args ${LSOF_INCLUDE}/sys/lockf.h > /dev/null
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_ADVLOCK_ARGS"
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/pipe.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHAS_SYS_PIPEH"
    fi	# }
    LSOF_CFGL="$LSOF_CFGL -lkvm"
    LSOF_DIALECT_DIR=n+obsd
    ;;

# Configure for SCO OpenServer.

  osr|osrgcc|sco|scogcc)
    if test "X$LSOF_RANLIB_SUP" = "X"	# {
    then
      LSOF_RANLIB=""
    fi	# }
    if test "X$OSR_CFGF" != "X"	# {
    then

    # Adopt LSOF_CFGF from OSR_CFGF in environment.

      LSOF_CFGF=$OSR_CFGF
    fi	# }
    if test "X$OSR_CFGL" != "X"	# {
    then

    # Adopt LSOF_CFGL from OSR_CFGL in environment.

      LSOF_CFGL=$OSR_CFGL
    fi	# }

  # Evaluate compiler specification.

    if test "X$LSOF_CC" = "X"	# {
    then
      if test "X$LSOF_TGT" = "Xosr" -o "X$LSOF_TGT" = "Xsco"	# {
      then
	LSOF_CC=cc
	LSOF_TMP1=1
      else
	LSOF_CC=gcc
	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
	LSOF_TMP1=2
      fi	# }
    else
	LSOF_TMP1=0
    fi	# }
    LSOF_TGT="osr"

  # Determine version.

    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR="`LANG=C_C.C /bin/uname -X 2>/dev/null | grep Release | sed 's/Release = \(.*\)/\1/'`"
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

      # If the SCO OpenServer release version isn't predefined, determine it.

      case $LSOF_VSTR in	# {
      3.2v2.0)
	LSOF_VERS="20"
	;;
      3.2v2.1)
	LSOF_VERS="21"
	;;
      3.2v4.0)
	LSOF_VERS="40"
	;;
      3.2v4.1)
	LSOF_VERS="41"
	;;
      3.2v4.2)
	LSOF_VERS="42"
	;;
      3.2v5.*)
	LSOF_TSTLFLG="-lsocket"
	LSOF_VERS="`echo $LSOF_VSTR | sed 's/3\.2v//; s/\.//g'`"
	;;
      *)
	echo Unknown SCO OpenServer release: $LSOF_VSTR
	echo Assuming 3.2.0 or 3.2.1
	LSOF_VERS="0"
	;;
      esac	# }
    fi	# }

    # Do SCO OpenServer specific stuff.

    case $LSOF_VERS in	# {
    0)
      if test $LSOF_TMP1 -eq 1	# {
      then
	LSOF_CFGF="$LSOF_CFGF -nointl"
	LSOF_DEBUG="-Ox"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
      LSOF_MKC="cp"
      ;;
    20)
      if test $LSOF_TMP1 -eq 1	# {
      then
	LSOF_DEBUG="-Ox"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
      LSOF_MKC="cp"
      ;;
    21)
      if test $LSOF_TMP1 -eq 1	# {
      then
	LSOF_CFGF="$LSOF_CFGF -nointl"
	LSOF_DEBUG="-Ox"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
      LSOF_MKC="cp"
      ;;
    40)
      if test $LSOF_TMP1 -eq 1	# {
      then
	LSOF_CFGF="$LSOF_CFGF -nointl"
	LSOF_DEBUG="-Ox"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
      ;;
    41)
      if test $LSOF_TMP1 -eq 1	# {
      then
	LSOF_CFGF="$LSOF_CFGF -nointl"
	LSOF_DEBUG="-Ox"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
      ;;
    42)
      if test $LSOF_TMP1 -eq 1	# {
      then
	LSOF_CFGF="$LSOF_CFGF -nointl"
	LSOF_DEBUG="-Ox"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
      ;;
    5*)
      if test $LSOF_TMP1 -eq 1	# {
      then
	LSOF_CFGF="$LSOF_CFGF -belf"
	LSOF_DEBUG="-O3 -Kspace"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lsocket"
      ;;
    *)
      echo "Unsupported SCO OpenServer release: $LSOF_VERS"
      rm -f $LSOF_HLP
      exit 1
      ;;
    esac	# }
    LSOF_CFGF="$LSOF_CFGF -DOSRV=$LSOF_VERS"
    if test "X$OSR_STATLSTAT" = "X"	# {
    then
      echo "Testing libc.a for statlstat"
      /bin/nm /lib/libc.a | grep statlstat > /dev/null 2>&1
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_STATLSTAT"
      fi	# }
    else
      if test "X$OSR_STATLSTAT" = "XY" -o "X$OSR_STATLSTAT" = "Xy"	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_STATLSTAT"
      fi	# }
    fi	# }
    if test -r ${LSOF_INCLUDE}/sys/fs/nfs/rnode.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHAS_NFS"
    fi	# }
    if test ! -r ${LSOF_INCLUDE}/netdb.h	# {
    then
      LSOF_DINC="$LSOF_DINC -I`pwd`/dialects/osr/include"
    fi	# }
    LSOF_DIALECT_DIR=osr
    ;;

# Configure for Sun Solaris, SunPro C and gcc.

  solaris|solariscc)
    if test "X$LSOF_RANLIB_SUP" = "X"	# {
    then
      LSOF_RANLIB=""
    fi	# }
    if test "X$LSOF_CC" = "X"	# {
    then
      if test "X$LSOF_TGT" = "Xsolariscc"	# {
      then
	if test "X$SOLARIS_CCDIR" = "X"	# {
	then
	  SOLARIS_CCDIR="/opt/SUNWspro/bin"
	fi	# }
	if test -x ${SOLARIS_CCDIR}/cc	# {
	then
	  LSOF_CC=${SOLARIS_CCDIR}/cc
	else
	  if test -x /opt/SunStudioExpress/bin/cc	# {
	  then
	    LSOF_CC=/opt/SunStudioExpress/bin/cc
	  else
	    echo "WARNING: no cc in ${SOLARIS_CCDIR}; using cc without path."
	    LSOF_CC=cc
	  fi	# }
	fi	# }
	LSOF_CCV=`$LSOF_CC -V 2>&1 | sed -n 's/^cc: \(.*\)/\1/p'`
      else
	LSOF_CC=gcc
	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
      fi	# }
    fi	# }
    LSOF_TGT="solaris"
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -r`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

      # If the Solaris version isn't predefined, determine it.

      case $LSOF_VSTR in	# {
      5.[0-2])
	LSOF_VERS="20300"
	;;
      5.3)
	LSOF_VERS="20300"
	;;
      5.4)
	LSOF_VERS="20400"
	;;
      5.5)
	LSOF_VERS="20500"
	;;
      5.5.1)
	LSOF_VERS="20501"
	;;
      5.6*)
	LSOF_TSTLFLG="-lsocket -lnsl"
	LSOF_VERS="20600"
	;;
      5.7*)
	LSOF_TSTBIGF=" "
	LSOF_TSTLFLG="-lsocket -lnsl"
	LSOF_VERS="70000"
	;;
      5.8*)
	LSOF_TSTBIGF=" "
	LSOF_TSTLFLG="-lsocket -lnsl"
	LSOF_VERS="80000"
	;;
      5.9*)
	LSOF_TSTBIGF=" "
	LSOF_TSTLFLG="-lsocket -lnsl"
	LSOF_VERS="90000"
	;;
      5.10*)
	LSOF_TSTBIGF=" "
	LSOF_TSTLFLG="-lsocket -lnsl"
	LSOF_VERS="100000"
	;;
      5.11*)
	LSOF_TSTBIGF=" "
	LSOF_TSTLFLG="-lsocket -lnsl"
	LSOF_VERS="110000"
	;;
      *)
	echo Unknown Solaris version: $LSOF_VSTR
	rm -f $LSOF_HLP
	exit 1
      esac	# }
    fi	# }

    # Clear LSOF_UNSUP message for selected Solaris versions.

    case $LSOF_VERS in	# {
    90000|100000|110000)
      LSOF_UNSUP=""
      ;;
    esac	# }

    # Do Solaris version-specific stuff.

    case $LSOF_VERS in	# {
    20300)

      # Solaris patch 101318-32 creates a longer kernel tcp_s structure,
      # and 101318-45 changes the way the vnode's v_filocks member is
      # handled.  The following code creates a symbol definition for
      # patch 101318 whose value is the patch level.  No symbol is defined
      # if the patch level is not greater than zero.

      if test "X$SOLARIS_23P101318" = "X"	# {
      then
	LSOF_PL=`grep -h SUNW_PATCHID=101318 /var/sadm/pkg/SUNWcar*/pkginfo | sed 's/.*-//' | sort -u | tail -1`
	if test "X$LSOF_PL" = "X"	# {
	then
	  LSOF_PL=0
	fi	# }
      else
	LSOF_PL=$SOLARIS_23P101318
      fi	# }
      if test $LSOF_PL -gt 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DP101318=$LSOF_PL"
      fi	# }
      ;;
    20400)
      if test "X$SOLARIS_24P101945" = "X"	# {
      then
	LSOF_PL=`grep -h SUNW_PATCHID=101945 /var/sadm/pkg/SUNWcar*/pkginfo | sed 's/.*-//' | sort -u | tail -1`
	if test "X$LSOF_PL" = "X"	# {
	then
	  LSOF_PL=0
	fi	# }
      else
	LSOF_PL=$SOLARIS_24P101945
      fi	# }
      if test $LSOF_PL -ge 32	# {
      then
	if test "X$SOLARIS_24P102303" = "X"	# {
	then
	  LSOF_PL=`grep -h SUNW_PATCHID=102303 /var/sadm/pkg/SUNWhea*/pkginfo | sed 's/.*-//' | sort -u | tail -1`
	  if test "X$LSOF_PL" = "X"	# {
	  then
	    LSOF_PL=0
	  fi	# }
	else
	  LSOF_PL=$SOLARIS_24P102303
	fi	# }
	if test $LSOF_PL -ge 2	# {
	then
	  echo "WARNING: your Solaris 2.4 system appears to have patches 101945-32 and 102303-2"
	  echo "         installed.  This probably means the NUM_*_VECTORS definitions in"
	  echo "         <sys/auxv.h> don't match the ones used to build your kernel.  Consult"
	  echo "         the Sun Problems section of the 00FAQ file of the lsof distribution"
	  echo "         for more information on how to work around the problem."
	fi	# }
      fi	# }
      ;;
    20500|20501)
      ;;
    20600|70000|80000|90000|100000|110000)
      if test "X$SOLARIS_26PR_GWINDOWS" = "X"	# {
      then
	rm -f ${LSOF_TMPC}.*
	echo "#define _KMEMUSER" > ${LSOF_TMPC}.c
	echo "#include <sys/proc/prdata.h>" >> ${LSOF_TMPC}.c
	echo "main(){" >> ${LSOF_TMPC}.c
	echo "enum prnodetype p=PR_GWINDOWS;}" >> ${LSOF_TMPC}.c
	echo "Testing prdata.h for PR_GWINDOWS, using $LSOF_CC"
	echo $LSOF_CC | grep gcc > /dev/null
	if test $? -eq 0	# {
	then
	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x  > /dev/null 2>&1
	else
	  $LSOF_CC ${LSOF_TMPC}.c -I$LSOF_INCLUDE -o ${LSOF_TMPC}.x  > /dev/null 2>&1
	fi	# }
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASPR_GWINDOWS"
	fi	# }
      else
	if test "X$SOLARIS_26PR_GWINDOWS" = "XY" -o "X$SOLARIS_26PR_GWINDOWS" = "Xy"	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASPR_GWINDOWS"
	fi	# }
      fi	# }
      if test "X$SOLARIS_26PR_LDT" = "X"	# {
      then
	rm -f ${LSOF_TMPC}.*
	echo "#define _KMEMUSER" > ${LSOF_TMPC}.c
	echo "#include <sys/proc/prdata.h>" >> ${LSOF_TMPC}.c
	echo "main(){" >> ${LSOF_TMPC}.c
	echo "enum prnodetype p=PR_LDT;}" >> ${LSOF_TMPC}.c
	echo "Testing prdata.h for PR_LDT, using $LSOF_CC"
	echo $LSOF_CC | grep gcc > /dev/null
	if test $? -eq 0	# {
	then
	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
	else
	  $LSOF_CC ${LSOF_TMPC}.c -I$LSOF_INCLUDE -o ${LSOF_TMPC}.x > /dev/null 2>&1
	fi	# }
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASPR_LDT"
	fi	# }
	rm -f ${LSOF_TMPC}.*
      else
	if test "X$SOLARIS_26PR_LDT" = "XY" -o "X$SOLARIS_26PR_LDT" = "Xy"	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASPR_LDT"
	fi	# }
      fi	# }
      if test $LSOF_VERS -ge 70000	# {
      then

      # Do tests for Solaris 7 and above.

	if test "X$SOLARIS_KERNBITS" = "X"	# {
	then
	  SOLARIS_KERNBITS=`/bin/isainfo -kv`
	fi	# }
	if test "X$SOLARIS_INSTR" = "X"	# {
	then
	  SOLARIS_INSTR=`/bin/isainfo -k`
	fi	#}
	echo $SOLARIS_KERNBITS | grep 64 > /dev/null
	if test $? -eq 0	# {
	then
	  echo $LSOF_CC | grep gcc > /dev/null
	  if test $? -eq 0	# {
	  then

	# Test gcc for 64 bit support.

	    echo "Testing $LSOF_CC for 64 bit support"
	    rm -f ${LSOF_TMPC}.*
	    echo "main(){}" > ${LSOF_TMPC}.c
	    LSOF_TMP1=""

	# First try gcc's -m64 option -- it's the most current possibility.

	    $LSOF_CC ${LSOF_TMPC}.c -m64 -o ${LSOF_TMPC}.x > /dev/null 2>&1
	    if test $? -eq 0	# {
	    then
	      /bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null 
	      if test $? -eq 0	# {
	      then
		LSOF_TMP1="-m64"
	      fi	# }
	    fi	# }
	    rm -f ${LSOF_TMPC}.*
	    if test "X$LSOF_TMP1" = "X"	# {
	    then

	    # Try using the older -mcpu=v9 option with gcc instead of -m64.

	      echo "main(){}" > ${LSOF_TMPC}.c
	      $LSOF_CC ${LSOF_TMPC}.c -mcpu=v9 -o ${LSOF_TMPC}.x > /dev/null 2>&1
	      if test $? -eq 0	# {
	      then
		/bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null 
		if test $? -eq 0	# {
		then
		  LSOF_TMP1="-mcpu=v9"
		fi	# }
	      fi	# }
	      rm -f ${LSOF_TMPC}.*
	    fi	# }
	    if test "X$LSOF_TMP1" = "X"	# {
	    then
	      echo ""
	      echo "!!!WARNING!!!=========!!!WARNING!!!=========!!!WARNING!!!"
	      echo "!                                                       !"
	      echo "! LSOF NEEDS TO BE CONFIGURED FOR A 64 BIT KERNEL, BUT  !"
	      echo "! THIS GCC DOESN'T SUPPORT THE BUILDING OF 64 BIT       !"
	      echo "! SOLARIS EXECUTABLES.  LSOF WILL BE CONFIGURED FOR A   !"
	      echo "! 32 BIT KERNEL.                                        !"
	      echo "!                                                       !"
	      echo "!!!WARNING!!!=========!!!WARNING!!!=========!!!WARNING!!!"
	      echo ""
	    else
	      echo ""
	      echo "*********************************"
	      echo "* Configuring for 64 bit kernel *"
	      echo "*********************************"
	      echo ""
	      LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
	      LSOF_CINFO="64 bit kernel"
	      LSOF_TSTK64=1
	    fi	# }
	  else

	  # Test Sun compiler for 64 bit support.

	    case $SOLARIS_INSTR in	# {
	    amd64*)
	      LSOF_TMP1="amd64"
	      LSOF_TMP2="amd64"
	      ;;
	    sparc*)
	      LSOF_TMP1="v9"
	      LSOF_TMP2="sparcv9"
	      ;;
	    *)
	      LSOF_TMP1=""
	      ;;
	    esac	# }
	    if test "X$LSOF_TMP1" != "X"	# {
	    then
	      echo "Testing $LSOF_CC for 64 bit $LSOF_TMP2 support"
	      rm -f ${LSOF_TMPC}.*
	      LSOF_TMP3="-xarch=$LSOF_TMP1"
	      echo "main(){}" > ${LSOF_TMPC}.c
	      LSOF_TMP4=`$LSOF_CC ${LSOF_TMPC}.c $LSOF_TMP3 -o ${LSOF_TMPC}.x 2>&1`
	      if test $? -eq 0	# {
	      then
		/bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null 
		if test $? -ne 0	# {
		then
		  LSOF_TMP3=""
		else
		  echo "X$LSOF_TMP4" | grep "use -m64" > /dev/null 2>&1
		  if test $? -eq 0	# {
		  then
		    LSOF_TMP3=-m64
		  fi	# }
		fi	# }
	      fi	# }
	      rm -f ${LSOF_TMPC}.*
	    else
	      LSOF_TMP3=""
	    fi	# }
	    if test "X$LSOF_TMP3" != "X"	# {
	    then
	      echo ""
	      echo "*********************************"
	      echo "* Configuring for 64 bit kernel *"
	      echo "*********************************"
	      echo ""
	      LSOF_CFGF="$LSOF_CFGF $LSOF_TMP3"
	      LSOF_CINFO="64 bit kernel"
	      LSOF_TSTK64=1
	    else
	      echo ""
	      echo "!!!WARNING!!!==========!!!WARNING!!!==========!!!WARNING!!!"
	      echo "!"
	      echo "! LSOF NEEDS TO BE CONFIGURED FOR A 64 BIT KERNEL, BUT"
	      echo "! THE VERSION OF SUN C AVAILABLE DOESN'T SUPPORT THE"
	      echo "! \"$LSOF_TMP2\" INSTRUCTION SET."
	      echo "!"
	      echo "! LSOF WILL BE CONFIGURED FOR A 32 BIT KERNEL."
	      echo "!"
	      echo "!!!WARNING!!!==========!!!WARNING!!!==========!!!WARNING!!!"
	      echo ""
	    fi	# }
	  fi	# }
	else
	  echo ""
	  echo "*********************************"
	  echo "* Configuring for 32 bit kernel *"
	  echo "*********************************"
	  echo ""
	  LSOF_CINFO="32 bit kernel"
	fi	# }
      fi	# }

      # Do tests specific to Solaris 8 and above.

      if test $LSOF_VERS -ge 80000	# {
      then
	if test -r ${LSOF_INCLUDE}/netinet/ip6.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
	fi	# }
      fi	# }

      # Do tests specific to Solaris 9 and above.

      if test $LSOF_VERS -ge 90000	# {
      then
	if test -r ${LSOF_INCLUDE}/sys/socketvar.h	# {
	then
	  grep soua_vp ${LSOF_INCLUDE}/sys/socketvar.h > /dev/null 2>&1
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHASSOUXSOUA"
	  fi	# }
	fi	# }
	if test $LSOF_VERS -lt 110000	# {
	then

	# Do tests specific to Solaris 9 and 10.

	  if test -r ${LSOF_INCLUDE}/sys/lgrp_user.h      # {
	  then
	    if test -r ${LSOF_INCLUDE}/sys/lgrp.h      # {
	    then
	      grep lgrp_root ${LSOF_INCLUDE}/sys/lgrp_user.h > /dev/null 2>&1
	      if test $? -eq 0	# {
	      then
		grep lgrp_root ${LSOF_INCLUDE}/sys/lgrp.h > /dev/null 2>&1
		if test $? -eq 0
		then
		  LSOF_CFGF="$LSOF_CFGF -DHAS_LGRP_ROOT_CONFLICT"
		fi	# }
	      fi	# }
	    fi	# }
	  fi	# }
	fi	# }
      fi	# }

      # Do tests specific to Solaris 10 and above.

      if test $LSOF_VERS -eq 100000	# {
      then
	if test -r ${LSOF_INCLUDE}/sys/socket_proto.h	# {
	then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_SOCKET_PROTO_H"
	fi	# }
      fi	# }
      if test $LSOF_VERS -ge 100000	# {
      then
	if test -r ${LSOF_INCLUDE}/inet/ipclassifier.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHAS_IPCLASSIFIER_H"
	  grep conn_ixa ${LSOF_INCLUDE}/inet/ipclassifier.h > /dev/null 2>&1
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_CONN_NEW"
	  fi	#}
	fi	# }
	if test -r ${LSOF_INCLUDE}/sys/cred_impl.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHAS_CRED_IMPL_H"

	  # DEBUG -- Begin temporary hack for Solaris 10, build s10_44.

	  grep "c2/audit.h" ${LSOF_INCLUDE}/sys/cred_impl.h > /dev/null
	  if test $? -eq 0	# {
	  then
	    rm -rf `pwd`/dialects/sun/solaris10
	    mkdir `pwd`/dialects/sun/solaris10
	    mkdir `pwd`/dialects/sun/solaris10/c2
	    touch `pwd`/dialects/sun/solaris10/c2/audit.h
	    LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/sun/solaris10"
	  fi	# }

	  # DEBUG -- End temporary hack for Solaris 10, build s10_44.

	fi	# }
	if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
	then
	  grep v_path ${LSOF_INCLUDE}/sys/vnode.h > /dev/null 2>&1
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_V_PATH"
	    LSOF_TSTVPATH=1
	  fi	# }
	fi	# }
	if test -r ${LSOF_INCLUDE}/sys/fs/pc_fs.h	# {
	then
	  grep pc_direntpersec ${LSOF_INCLUDE}/sys/fs/pc_fs.h > /dev/null 2>&1
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_PC_DIRENTPERSEC"
	  fi	# }
	fi	# }
      fi	# }
      if test -r ${LSOF_INCLUDE}/sys/zone.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASZONES"
      fi	# }

      # Check for Solaris 10 or higher CTF library and things that depend
      # on it.

      if test -r ${LSOF_INCLUDE}/libctf.h	# {
      then
	LSOF_CTFH=1
      fi	# }
      if test -r ${LSOF_INCLUDE}/sys/fs/zfs.h	# {
      then
	if test $LSOF_CTFH -eq 1	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHAS_ZFS"
	  LSOF_CTFL=1
	else
	  echo "WARNING: ZFS support not enabled; libctf.h missing."
	fi	# }
      fi	# }
      if test $LSOF_VERS -ge 110000	# {
      then

      # Do things specific to Solaris 11 and above.

	if test $LSOF_CTFH -eq 1	# {
	then
	  LSOF_CTFL=1
	else
	  echo "WARNING: socket support not enabled; libctf.h missing."
	fi	# }
	rm -rf ./solaris11
	mkdir ./solaris11
	mkdir ./solaris11/sys
	touch ./solaris11/sys/extdirent.h
	echo "./solaris11/sys/extdirent.h created"
	LSOF_CFGF="$LSOF_CFGF -I`pwd`/solaris11"
	if test -r ${LSOF_INCLUDE}/sys/mutex.h	# {
	then

	# Check <sys/mutex.h> 'for pad_mutex_t;'.

	  grep 'pad_mutex_t;' ${LSOF_INCLUDE}/sys/mutex.h > /dev/null 2>&1
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_PAD_MUTEX"
	  fi	# }
	fi	# )
      fi	# }

      # If -lctf was added to LSOF_CFGL, define HAS_LIBCTF.

      if test $LSOF_CTFL -eq 1	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_LIBCTF"
	LSOF_CFGL="$LSOF_CFGL -lctf"
      fi	# }
      ;;
    *)
      echo "Unsupported Solaris version: $LSOF_VERS"
      rm -f $LSOF_HLP
      exit 1
      ;;
    esac	# }
    LSOF_CFGF="$LSOF_CFGF -Dsolaris=$LSOF_VERS"

    # Test for <utmpx.h>
    if test -r ${LSOF_INCLUDE}/utmpx.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASUTMPX"
    fi	# }

    # Test for VSOCK.

    if test "X$SOLARIS_VSOCK" = "X"	# {
    then
      rm -f ${LSOF_TMPC}.*
      echo "#include <sys/vnode.h>" > ${LSOF_TMPC}.c
      echo "main(){" >> ${LSOF_TMPC}.c
      echo "enum vtype p=VSOCK;}" >> ${LSOF_TMPC}.c
      echo "Testing vnode.h for VSOCK, using $LSOF_CC"
      echo $LSOF_CC | grep gcc > /dev/null
      if test $? -eq 0	# {
      then
	$LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
      else
	$LSOF_CC ${LSOF_TMPC}.c -I$LSOF_INCLUDE -o ${LSOF_TMPC}.x > /dev/null 2>&1
      fi	# }
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_VSOCK"
      fi	# }
      rm -f ${LSOF_TMPC}.*
    else
      if test "X$SOLARIS_VSOCK" = "XY" -o "X$SOLARIS_VSOCK" = "Xy"	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHAS_VSOCK"
      fi	# }
    fi	# }

    # Test for AFS.

    if test -r ${AFS_VICE}/etc/ThisCell	# {
    then
      if test "X$LSOF_SCRIPT_CALL" = "Xno"	# {
      then
	if test -r ./AFSHeaders -a -r ./AFSVersion	# {
	then
	  LSOF_AFS="yes"
	fi	# }
      else
	if test ! -x ./AFSConfig	# {
	then
	  echo "Can't find or execute the AFSConfig script"
	  rm -f $LSOF_HLP
	  exit 1
	fi	# }
	./AFSConfig
	if test $? -eq 0 -a -r ./AFSHeaders -a -r ./AFSVersion	# {
	then
	    LSOF_AFS="yes"
	fi	# }
      fi	# }
      if test "X$LSOF_AFS" = "Xyes"	# {
      then
	if test "X$SUN_AFSAPATHDEF" = "X"	# {
	then
	  ls /usr/vice/etc/modload/libafs > /dev/null 2>&1
	  if test $? -ne 0	# {
	  then
	    LSOF_TMP1=`ls /usr/vice/etc/modload/libafs* 2>/dev/null | wc -l`
	    if test $LSOF_TMP1 -ne 0	# {
	    then
	      SUN_AFSAPATHDEF=`ls -t /usr/vice/etc/modload/libafs* | head -1`
	    fi	# }
	  fi	# }
	fi	# }
	if test "X$SUN_AFSAPATHDEF" != "X"	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DAFSAPATHDEF=\\\"$SUN_AFSAPATHDEF\\\""
	fi	# }
	LSOF_AFSV=`cat ./AFSVersion | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1 \2/' | awk '{printf "%d%02d\n",\$1,\$2}'`
	LSOF_CFGF="$LSOF_CFGF -DHAS_AFS=$LSOF_AFSV"
	LSOF_DINC="$LSOF_DINC -I`cat ./AFSHeaders`"
      fi	# }
    fi	# }

    # Test for VxFS.
    #
    # If the location of the VxFS header files hasn't been defined in the
    # environment, establish their likely locations.

    LSOF_TMP2=$SOLARIS_VXFSINCL
    if test -d /opt/VRTS/include	# {
    then
      LSOF_TMP2="$LSOF_TMP2 /opt/VRTS/include"
    fi	# }
    if test -d /opt/VRTSvxfs/include	# {
    then
      LSOF_TMP2="$LSOF_TMP2 /opt/VRTSvxfs/include"
    fi	# }
    LSOF_TMP1=0
    for i in $LSOF_TMP2	# {
    do
      if test -r ${i}/vxfsutil.h	# {
      then
	LSOF_TMP1=1
	SOLARIS_VXFSINCL=$i
	break
      fi	# }
    done	# }
    if test $LSOF_TMP1 -eq 1	# {
    then

    # The VxFS header files are for VxFS version 3.4 or above.  Enable VxFS
    # for those versions.

      LSOF_CFGF="$LSOF_CFGF -DHASVXFS -DHASVXFSUTIL -I$SOLARIS_VXFSINCL"

    # Determine which libvxfsutil.a is required -- 32 or 64 bit.

      LSOF_TMP2=""			# assume 32 bit
      echo "X$LSOF_CINFO" | grep "^X64" > /dev/null 2>&1
      if test $? -eq 0-a "X$SOLARIS_INSTR" != "X"	# {
      then
	case $SOLARIS_INSTR in	# {
	amd64*)
	  LSOF_TMP2="/amd64"
	  ;;
	sparcv9*)
	  LSOF_TMP2="/sparcv9"
	  ;;
	esac	# }
      fi	# }

    # See if the correct library has been specified and exists.

      if test "X$SOLARIS_VXFSLIB" = "X"	# {
      then
	SOLARIS_VXFSLIB=`dirname $SOLARIS_VXFSINCL`/lib
      fi	# }
      LSOF_TMP3="${SOLARIS_VXFSLIB}${LSOF_TMP2}/libvxfsutil.a"
      if test ! -r $LSOF_TMP3	# {
      then
	echo "!!!FATAL: no VxFS $LSOF_TMP3"
	exit 1
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -L$SOLARIS_VXFSLIB${LSOF_TMP2} -lvxfsutil -ldl"

    # See if the library has the Reverse Name Lookup (RNL) function.

      nm $LSOF_TMP3 | grep vxfs_inotopath > /dev/null 2>&1
      if test $? -eq 0	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASVXFSRNL -DHASVXFSDNLC"
      fi	# }
    else

    # See if there are VxFS header files for VxFS versions below 3.4.

      if test -r ${LSOF_INCLUDE}/sys/fs/vx_inode.h	# {
      then

      # Define VxFS for VxFS versions below 3.4.  Make additional header
      # file tests.

	LSOF_CFGF="$LSOF_CFGF -DHASVXFS"
	if test -r ${LSOF_INCLUDE}/sys/fs/vx_fs.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_FS_H"
	fi	# }
	if test -r ${LSOF_INCLUDE}/sys/fs/vx_sol.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_SOL_H"
	fi	# }
	if test -r ${LSOF_INCLUDE}/sys/fs/vx_machdep.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_MACHDEP_H"
	fi	# }
	if test -r ${LSOF_INCLUDE}/sys/fs/vx_solaris.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_SOLARIS_H"
	  grep "off32_t;" ${LSOF_INCLUDE}/sys/fs/vx_machdep.h > /dev/null
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHASVXFS_OFF32_T"
	  fi	# }
	  grep "off64_t;" ${LSOF_INCLUDE}/sys/fs/vx_solaris.h > /dev/null
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHASVXFS_OFF64_T"
	  fi	# }
	  grep "vx_u64_t;" ${LSOF_INCLUDE}/sys/fs/vx_solaris.h > /dev/null
	  if test $? -eq 0	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHASVXFS_U64_T"
	  fi	# }
	fi	# }
	egrep "struct[ 	]vx_inode[ 	]\{" ${LSOF_INCLUDE}/sys/fs/vx_inode.h > /dev/null
	# } (dummy '}' to match '{' in above egrep)
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_VX_INODE"
	fi	# }
      fi	# }
    fi	# }

    # Set libraries and dialect subdirectory.

    LSOF_CFGL="$LSOF_CFGL -lkvm -lelf -lsocket -lnsl"
    LSOF_DIALECT_DIR=sun

    # Set local-specific stuff.

    if test "X$LSOF_LOCALSUFFIX" = "XLOCAL"	# {
    then
      LSOF_DOC="\${DESTDIR}/usr/local/man"
    fi	# }
    ;;

# Configure for SCO|Caldera OpenServer Release 6.0.0 and UnixWare.

  osr6|unixware|uw)
    LSOF_TMP1=$LSOF_TGT
    LSOF_TGT="uw"
    if test "X$LSOF_RANLIB_SUP" = "X"	# {
    then
      LSOF_RANLIB=""
    fi	# }
    if test "X$LSOF_VSTR" = "X"	# {
    then
      LSOF_VSTR=`uname -v`
    fi	# }
    if test "X$LSOF_VERS" = "X"	# {
    then

      # If the Openserver Release 6.0.0 or UnixWare version isn't pre-defined,
      # determine it.

      LSOF_VERS=`echo $LSOF_VSTR | sed 's/\([0-9\.]*\).*/\1/; s/\./ /g' | awk '{printf "%d%02d%02d\n", $1, $2, $3;}'`
    fi	# }
    if test $LSOF_TMP1 = "osr6"	# {
    then
      LSOF_CINFO="OSR6 support via UnixWare sources"

    # Convert the OpenServer Release 6.0.0 version number to a UnixWare one.

      case $LSOF_VERS in	# {
      60000)
	LSOF_VERS=70104
	;;
      *)
	echo "Unknown OpenServer Release version: $LSOF_VERS"
	rm -f $LSOF_HLP
	exit 1
      esac	# }
    fi	# }
    LSOF_CFGF="$LSOF_CFGF -DUNIXWAREV=$LSOF_VERS"

    # Do OpenServer Release 6.0.0 and UnixWare version-specific stuff.

    case $LSOF_VERS in	# {
    20100|20101|20102|20103)
      if test -r ${LSOF_INCLUDE}/sys/fs/vx_inode.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASVXFS"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lsocket -lnsl -lelf -lgen"
      ;;
    70000|70001|70100|70101|70103|70104)
      LSOF_TSTBIGF=" "
      LSOF_TSTLFLG="-lsocket -lnsl"
      if test $LSOF_VERS -lt 70103	# {
      then
	LSOF_DINC="$LSOF_DINC -I`pwd`/dialects/uw/uw7"
      else	# $LSOF_VERS -ge 70103

      # Process 7.1.3 and above.

	if test -r ${LSOF_INCLUDE}/netinet/in6.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
	fi	# }
	if test $LSOF_VERS -ge 70104	# {
	then

	# Process 7.1.4 and above.

	  LSOF_TMP1=0
	  if test -r ${LSOF_INCLUDE}/netinet/in_pcb.h	# {
	  then
	    grep INKERNEL ${LSOF_INCLUDE}/netinet/in_pcb.h > /dev/null 2>&1
	    if test $? -eq 0	# {
	    then
	      LSOF_TMP1=1
	    fi	# }
	  fi	# }
	  if test $LSOF_TMP1 -eq 0 -a -r ${LSOF_INCLUDE}/netinet/tcp_var.h   # {
	  then
	    grep INKERNEL ${LSOF_INCLUDE}/netinet/tcp_var.h > /dev/null 2>&1
	    if test $? -eq 0	# {
	    then
	      LSOF_TMP1=1
	    fi	# }
	  fi	# }
	  if test $LSOF_TMP1 -eq 1	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DHAS_INKERNEL"
	  fi	# }
	fi	# }
      fi	# }
      if test ! -r ${LSOF_INCLUDE}/vm/swap.h -a -r ${LSOF_INCLUDE}/sys/swap.h	# {
      then
	(cd ./dialects/uw/uw7/vm; rm -f swap.h; ln -s ${LSOF_INCLUDE}/sys/swap.h swap.h)
      fi	# }
      if test -r ${LSOF_INCLUDE}/sys/fs/vx_gemini.h	# {
      then
	LSOF_CFGF="$LSOF_CFGF -DHASVXFS"
      fi	# }
      LSOF_CFGL="$LSOF_CFGL -lsocket -lnsl -lelf -lgen"
      /bin/pkginfo 2> /dev/null | grep -i patch | grep -i ptf7038 > /dev/null
      if test -r ${LSOF_INCLUDE}/sys/file.h	# {
      then
	grep f_open ${LSOF_INCLUDE}/sys/file.h > /dev/null
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHAS_F_OPEN"
	fi	# }
      fi	# }
      if test -r ${LSOF_INCLUDE}/sys/fs/cdfs_fs.h	# {
      then
	grep "cdfs_LogSecShift;" ${LSOF_INCLUDE}/sys/fs/cdfs_fs.h > /dev/null 2>&1
	if test $? -eq 0	# {
	then
	  LSOF_TMP=`grep "cdfs_LogSecShift;" ${LSOF_INCLUDE}/sys/fs/cdfs_fs.h | sed 's/^[ 	]*\([^ 	]*\).*/\1/'`
	  if test "X$LSOF_TMP" != "X"	# {
	  then
	    LSOF_CFGF="$LSOF_CFGF -DTYPELOGSECSHIFT=$LSOF_TMP"
	  fi	# }
	fi	# }
      fi	# }
      if test -r ${LSOF_INCLUDE}/sys/proc.h	# {
      then
	grep p_pgid ${LSOF_INCLUDE}/sys/proc.h > /dev/null
	if test $? -eq 0	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHAS_P_PGID"
	fi	# }
      fi	# }
      if test $LSOF_VERS -ge 70101	# {
      then

	# Do OpenServer Release 6.0.0 and UnixWare 7.1.1 and above tests, as
	# required.

	if test "X$UW_HAS_NSC" = "X"	# {
	then
	  UW_HAS_NSC=N
	  if test -x /bin/node_self	# {
	  then
	    /bin/node_self > /dev/null 2>&1
	    if test $? -eq 0	# {
	    then
	      UW_HAS_NSC=Y
	    fi	# }
	  fi	# }
	fi	# }
	if test "X$UW_HAS_NSC" = "XY" -o "X$UW_HAS_NSC" = "Xy" 	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHAS_UW_NSC"
	  LSOF_CFGL="$LSOF_CFGL -lcluster"
	fi	# }
	if test -r ${LSOF_INCLUDE}/sys/nsc_synch.h	# {
	then
	  LSOF_CFGF="$LSOF_CFGF -DHAS_UW_CFS"
	fi	# }
      fi	# }
      ;;
    *)
      echo Unsupported UnixWare version: `uname -v`
      rm -f $LSOF_HLP
      exit 1
      ;;
    esac	# }
    if test -r ${LSOF_INCLUDE}/sys/fs/xnamnode.h	# {
    then
      LSOF_CFGF="$LSOF_CFGF -DHASXNAMNODE"
    fi	# }
    LSOF_DIALECT_DIR=uw
    ;;

# Handle unknown abbreviation.

  *) 
    echo "Can't configure for $LSOF_TGT."
    cat $LSOF_HLP
    rm -f $LSOF_HLP
    exit 1
    ;;

# End of LSOF_TGT cases

esac	# }

# Do an inventory of the distribution, as required.

if test "X$LSOF_SCRIPT_CALL" = "Xyes" -a ! -r ./.neverInv	# {
then
  if test ! -f ./Inventory	# Want -x, but Ultrix doesn't grok it.	# {
  then
    echo "Can't find Inventory script."
    rm -f $LSOF_HLP
    exit 1
  fi	# }
  ./Inventory
fi	# }

# Make sure target directory exists.

if test ! -d ./dialects/$LSOF_DIALECT_DIR	# {
then
  echo "Can't configure for $LSOF_TGT -- ./dialects/$LSOF_DIALECT_DIR doesn't exist."
  rm -f $LSOF_HLP
  exit 1
fi	# }

# Make sure $LSOF_MK exists in the target directory.

if test ! -r ./dialects/$LSOF_DIALECT_DIR/$LSOF_MK	# {
then
  echo "Can't configure for $LSOF_TGT -- ./dialects/$LSOF_DIALECT_DIR/$LSOF_MK doesn't exist."
  rm -f $LSOF_HLP
  exit 1
fi	# }

# Make sure $LSOF_MKF, $LSOF_SPMKF, or $LSOF_MKF.$LSOF_LOCALSUFFIX) exists
# in the target directory.

if test "X$LSOF_SPMKF" != "X"	# {
then
  LSOF_TMP1=$LSOF_SPMKF
else
  LSOF_TMP1=$LSOF_MKF
fi	# }
if test "X$LSOF_LOCALSUFFIX" != "X"	# {
then
  LSOF_REST=$LSOF_TMP1.$LSOF_LOCALSUFFIX
else
  LSOF_REST=$LSOF_TMP1
fi	# }
if test ! -r ./dialects/$LSOF_DIALECT_DIR/$LSOF_REST	# {
then
  echo "Can't configure for $LSOF_TGT -- ./dialects/$LSOF_DIALECT_DIR/$LSOF_REST doesn't exist."
  rm -f $LSOF_HLP
  exit 1
fi	# }

# If this is FreeBSD, make sure $LSOF_FBSD_ZFS_MKF exists.

if test $LSOF_FBSD_ZFS -eq 1	# {
then
  if test ! ./dialects/$LSOF_DIALECT_DIR/$LSOF_FBSD_ZFS_MKF	# {
  then
    echo "Can't configure for $LSOF_TGT -- ./dialects/$LSOF_DIALECT_DIR/$LSOF_FBSD_ZFS_MKF doesn't exist."
    rm -f $LSOF_HLP
    exit 1
  fi	# }
fi	# }}

# Make sure $LSOF_VF exists.  Extract the version number from it.

if test ! -r $LSOF_VF	# {
then
  echo "Version number file, ./$LSOF_VF, doesn't exist."
  rm -f $LSOF_HLP
  exit 1
else
  LSOF_VN=`sed "s/.ds VN \(.*\)/\1/" < $LSOF_VF`
fi	# }

# Clean up in advance.

rm -f $LSOF_F $LSOF_MKFC $LSOF_FBSD_ZFS_MKF $LSOF_TSTCFLG $LSOF_TSTCC
rm -f $LSOF_TSTXOC $LSOF_TSTLFF
echo "rm -f $LSOF_F $LSOF_MKFC $LSOF_FBSD_ZFS_MKF $LSOF_TSTCFLG"
echo "rm -f $LSOF_TSTCC $LSOF_TSTXOC $LSOF_TSTLFF"

# Make sure there's a C compiler name.

if test "X$LSOF_CC" = "X"	# {
then
  LSOF_CC=cc
fi	# }

# Do common feature analyses.

# Check for localtime(3) and strftime(3).

rm -f ${LSOF_TMPC}.*
cat > $LSOF_TMPC.c << .LSOF_END_HERE_DOC2
#include <time.h>
main(){
  time_t cl;
  struct tm *ts;
  char bf[32];
  if ((cl = time(NULL)) == (time_t)-1)
    return(1);
  ts = localtime(&cl);
  if (strftime(bf, sizeof(bf), "%D", ts) != 8)
    return(1);
  if ((bf[2] != '/') || (bf[5] != '/'))
    return (1);
  return(0);
}
.LSOF_END_HERE_DOC2
echo $EO "Testing C library for localtime() and strftime(), using $LSOF_CC ... $EC"
$LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
if test -x ${LSOF_TMPC}.x	# {
then
  ./${LSOF_TMPC}.x > /dev/null 2>&1
  if test $? -eq 0 || test "X$LINUX_CLIB" != "X"	# }
  then
    LSOF_CFGF="$LSOF_CFGF -DHAS_STRFTIME"
    echo "present"
  else
    echo "unusable"
  fi	# }
else
  echo "missing"
fi	# }
rm -f ${LSOF_TMPC}.[cox]

# Make the dialect sources.

if test "X$LSOF_MKC" = "X"	# {
then
  LSOF_MKC="ln -s"
fi	# }
LSOF_MKC=$LSOF_MKC ./dialects/$LSOF_DIALECT_DIR/$LSOF_MK $LSOF_TGT $LSOF_VERS

# Make $LSOF_MKFC and ${LSOF_LIB}/$LSOF_LIBMKF.

echo "# $LSOF_TGT Makefile for lsof revision $LSOF_VN" > $LSOF_MKFC
echo "" >> $LSOF_MKFC
echo "CC=	$LSOF_CC" >> $LSOF_MKFC
if test "X$LSOF_CCV" != "X"	# {
then
  echo "" >> $LSOF_MKFC
  echo "CCV=	$LSOF_CCV" >> $LSOF_MKFC
fi	# }
if test "X$LSOF_LIB_NO" = "X"	# {
then
  echo "" >> $LSOF_MKFC
  echo "LIB=	${LSOF_LIB}/liblsof.a" >> $LSOF_MKFC
fi	# }
if test "X$LSOF_LD" != "X"	# {
then
  echo "" >> $LSOF_MKFC
  echo "LD=	$LSOF_LD" >> $LSOF_MKFC
fi	# }
if test "X$LSOF_CINFO" != "X"	# {
then
  echo "" >> $LSOF_MKFC
  echo "CINFO=	$LSOF_CINFO" >> $LSOF_MKFC
fi	# }
if test "X$LSOF_CFGD" != "X"	# {
then
  echo "CFGD=	$LSOF_CFGD" >> $LSOF_MKFC
fi	# }
if test "X$LSOF_CFGDN" != "X"	# {
then
  echo "CFGDN=	$LSOF_CFGDN" >> $LSOF_MKFC
fi	# }
if test "X$LSOF_ARCH" != "X"	# {
then
  LSOF_CFGF="$LSOF_CFGF -DLSOF_ARCH=\\\"$LSOF_ARCH\\\""
fi	# }
if test "X$LSOF_VSTR" != "X"	# {
then
  LSOF_TMP=`echo $LSOF_VSTR | sed 's/(/\\\\(/g' | sed 's/)/\\\\)/g'`
  LSOF_CFGF="$LSOF_CFGF -DLSOF_VSTR=\\\"$LSOF_TMP\\\""
fi	# }
echo "" >> $LSOF_MKFC
echo "CFGF=	$LSOF_CFGF" >> $LSOF_MKFC
if test "X$LSOF_LIB_NO" = "X"	# {
then
  echo "" >> $LSOF_MKFC
  echo "CFGL=	$LSOF_FCFGL -L./$LSOF_LIB -llsof $LSOF_CFGL" >> $LSOF_MKFC
fi	# }
echo "" >> $LSOF_MKFC
if test "X$LSOF_DEBUG" = "X"	# {
then
  LSOF_DEBUG="-O"
else
  if test "X$LSOF_DEBUG" = "XNo-O"	# {
  then
    LSOF_DEBUG=""
  fi	# }
fi	# }
echo "DEBUG=	$LSOF_DEBUG" >> $LSOF_MKFC
if test "X$LSOF_DINC" != "X"	# {
then
  echo "" >> $LSOF_MKFC
  echo "DINC=	$LSOF_DINC" >> $LSOF_MKFC
fi	# }
if test "X$LSOF_DOC" != "X"	# {
then
  echo "" >> $LSOF_MKFC
  echo "DOC=$LSOF_DOC" >> $LSOF_MKFC
fi	# }
if test "X$LSOF_DISTRIBKVM" != "X" -a "X$LSOF_DISTRIBKVM" != "XKVM"	# {
then
  echo "" >> $LSOF_MKFC
  echo "KVM=	$LSOF_DISTRIBKVM" >> $LSOF_MKFC
fi	# }
rm -f ${LSOF_LIB}/$LSOF_LIBMKF
if test "X$LSOF_LIB_NO" = "X"	# {
then
  cp $LSOF_MKFC ${LSOF_LIB}/$LSOF_LIBMKF
fi	# }
cat ./dialects/$LSOF_DIALECT_DIR/$LSOF_REST >> $LSOF_MKFC
if test "X$LSOF_LIB_NO" = "X"	# {
then

  # Put archiving and optional randomizing strings in ${LSOF_LIB}/$LSOF_LIBMKF.
  #
  # Process optional CFLAGS override.
  #
  # Add the library Makefile skeleton section.

  echo "" >> ${LSOF_LIB}/$LSOF_LIBMKF
  if test "X$LSOF_AR" = "X"	# {
  then
    echo "AR=	ar cr \${LIB} \${OBJ}" >> ${LSOF_LIB}/$LSOF_LIBMKF
  else
    echo "AR=	$LSOF_AR \${LIB} \${OBJ}" >> ${LSOF_LIB}/$LSOF_LIBMKF
  fi	# }
  if test "X$LSOF_RANLIB" != "X"	# {
  then
    echo "" >> ${LSOF_LIB}/$LSOF_LIBMKF
    echo "RANLIB=	$LSOF_RANLIB \${LIB}" >> ${LSOF_LIB}/$LSOF_LIBMKF
  fi	# }
  echo "" >> ${LSOF_LIB}/$LSOF_LIBMKF
  if test "X$LSOF_CFLAGS_OVERRIDE" = "X"	# {
  then
    echo "CFLAGS=	\${CDEFS} \${INCL} \${DEBUG}" >> ${LSOF_LIB}/$LSOF_LIBMKF
  else
    echo "override CFLAGS=\${CDEFS} \${INCL} \${DEBUG}" >> ${LSOF_LIB}/$LSOF_LIBMKF
  fi	# }
  echo "" >> ${LSOF_LIB}/$LSOF_LIBMKF
  cat ${LSOF_LIB}/$LSOF_LIBMKFSKEL >> ${LSOF_LIB}/$LSOF_LIBMKF
  echo $LSOF_MKFC and ${LSOF_LIB}/$LSOF_LIBMKF created.
else
  echo $LSOF_MKFC created.
fi	# }

# If this is FreeBSD, create $LSOF_FBSD_ZFS_MKF.

if test $LSOF_FBSD_ZFS -eq 1	# {
then
  rm -f $LSOF_FBSD_ZFS_MKF
  echo "# $LSOF_TGT ZFS Makefile for lsof revision $LSOF_VN" > $LSOF_FBSD_ZFS_MKF
  echo "" >> $LSOF_FBSD_ZFS_MKF
  echo "CC=		$LSOF_CC" >> $LSOF_FBSD_ZFS_MKF
  echo "" >> $LSOF_FBSD_ZFS_MKF
  echo "CFLAGS=	$LSOF_FBSD_ZFS_CFGF" >> $LSOF_FBSD_ZFS_MKF
  echo "" >> $LSOF_FBSD_ZFS_MKF
  if test "X$LSOF_DEBUG" = "X"	# {
  then
    LSOF_DEBUG="-O"
  else
    if test "X$LSOF_DEBUG" = "XNo-O"	# {
    then
      LSOF_DEBUG=""
    fi	# }
  fi	# }
  echo "DEBUG=	$LSOF_DEBUG" >> $LSOF_FBSD_ZFS_MKF
  echo "" >> $LSOF_FBSD_ZFS_MKF
  echo "OPENSOLARIS=	$LSOF_FBSD_ZFS_SYS" >> $LSOF_FBSD_ZFS_MKF
  echo "" >> $LSOF_FBSD_ZFS_MKF
  cat ./dialects/$LSOF_DIALECT_DIR/$LSOF_FBSD_ZFS_MKF >> $LSOF_FBSD_ZFS_MKF
  echo $LSOF_FBSD_ZFS_MKF created.
fi	# }

# Create test cc file.

echo "$LSOF_CC" > $LSOF_TSTCC
echo "$LSOF_TSTCC created"

# Create test cflags file.

echo "-DLT_DIAL_$LSOF_TGT" > $LSOF_TSTCFLG
if test "X$LSOF_TSTBIGF" != "X"	# {
then
  echo "-DLT_BIGF" >> $LSOF_TSTCFLG
  if test "X$LSOF_TSTBIGF" != "X "	# {
  then
    for i in $LSOF_TSTBIGF	# {
    do
      echo "$i" >> $LSOF_TSTCFLG
    done	# }
  fi	# }
fi	# }
if test "X$LSOF_TSTDFLG" != "X"	# {
then
  for i in $LSOF_TSTDFLG	# {
  do
    echo "$i" >> $LSOF_TSTCFLG
  done	# }
fi	# }
echo $LSOF_CC | grep gcc > /dev/null 2>&1
if test $? -eq 0	# {
then
  echo "-DLT_GCC" >> $LSOF_TSTCFLG
else
  echo "-DLT_CC" >> $LSOF_TSTCFLG
fi	# r}
if test $LSOF_TSTKMEM -eq 1	# {
then
  echo "-DLT_KMEM" >> $LSOF_TSTCFLG
fi	# }
if test $LSOF_TSTK64 -eq 1	# {
then
  echo "-DLT_K64" >> $LSOF_TSTCFLG
fi	# }
echo "-DLT_VERS=$LSOF_VERS" >> $LSOF_TSTCFLG
if test $LSOF_TSTVPATH -eq 1	# {
then
  echo "-DLT_VPATH" >> $LSOF_TSTCFLG
fi	# }
echo "$LSOF_TSTCFLG created"

# Create tests loader flags file.

echo $LSOF_TSTLFLG > $LSOF_TSTLFF
echo "$LSOF_TSTLFF created"

# Create test extra objects file.

echo "$LSOF_TSTXO" > $LSOF_TSTXOC
echo "$LSOF_TSTXOC created"

rm -f $LSOF_HLP

# Call Customize, as required.

if test "X$LSOF_SCRIPT_CALL" = "Xyes" -a ! -r ./.neverCust	# {
then
  if test ! -f ./Customize	# {  Want -x, but Ultrix doesn't grok it.
  then
    echo "Can't find Customize script."
    exit 1
  fi	# }
  ./Customize $LSOF_DIALECT_DIR
fi	# }

# Issue unsupported warning, as appropriate.

if test "X$LSOF_UNSUP" != "X"	# {
then
  echo "$LSOF_UNSUP"
fi	#}
exit 0
