]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE12-resync-stable-with-head-20011013
authorDerrick Brashear <shadow@dementia.org>
Sat, 13 Oct 2001 05:36:14 +0000 (05:36 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 13 Oct 2001 05:36:14 +0000 (05:36 +0000)
cheat and pull everything as one delta

215 files changed:
Makefile.in
NEWS
README
acconfig.h
acinclude.m4 [new file with mode: 0644]
config.sub
configure-libafs.in
configure.in
src/Makefile.djgpp
src/NTMake9x
src/NTMakefile
src/WINNT/afsd/Makefile.djgpp
src/WINNT/afsd/NTMakefile
src/WINNT/afsd/afsd.h
src/WINNT/afsd/afsd95.c
src/WINNT/afsd/afsd_init.c
src/WINNT/afsd/afsd_init95.c
src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/cm_cell.h
src/WINNT/afsd/cm_config.c
src/WINNT/afsd/cm_config.h
src/WINNT/afsd/cm_dcache.c
src/WINNT/afsd/cm_dns.c [new file with mode: 0644]
src/WINNT/afsd/cm_dns.h [new file with mode: 0644]
src/WINNT/afsd/cm_dns_private.h [new file with mode: 0644]
src/WINNT/afsd/cm_freelance.c [new file with mode: 0644]
src/WINNT/afsd/cm_freelance.h [new file with mode: 0644]
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_ioctl.h
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_vnodeops.c
src/WINNT/afsd/libafsconf.def
src/WINNT/client_osi/osisleep.h
src/afs/LINUX/osi_module.c
src/afs/LINUX/osi_vfs.h [deleted file]
src/afs/LINUX/osi_vfs.hin [new file with mode: 0644]
src/afs/LINUX/osi_vfsops.c
src/afs/LINUX/osi_vm.c
src/afs/SOLARIS/osi_file.c
src/afs/SOLARIS/osi_vfsops.c
src/afs/SOLARIS/osi_vnodeops.c
src/afs/VNOPS/afs_vnop_flock.c
src/afs/VNOPS/afs_vnop_lookup.c
src/afs/VNOPS/afs_vnop_remove.c
src/afs/VNOPS/afs_vnop_strategy.c
src/afs/VNOPS/afs_vnop_write.c
src/afs/afs.h
src/afs/afs_buffer.c
src/afs/afs_call.c
src/afs/afs_callback.c
src/afs/afs_cell.c
src/afs/afs_daemons.c
src/afs/afs_dcache.c
src/afs/afs_dynroot.c [new file with mode: 0644]
src/afs/afs_nfsdisp.c [new file with mode: 0644]
src/afs/afs_pioctl.c
src/afs/afs_server.c
src/afs/afs_util.c
src/afs/afs_vcache.c
src/afs/afs_volume.c
src/afs/lock.h
src/afsd/Makefile.in
src/afsd/afs.conf.linux
src/afsd/afs.ppc_darwin.plist [new file with mode: 0644]
src/afsd/afs.rc.linux
src/afsd/afs.rc.solaris.2.9 [new file with mode: 0644]
src/afsd/afsd.c
src/afsd/vsys.c
src/audit/audit.h
src/auth/NTMakefile
src/auth/cellconfig.c
src/auth/ktc.c
src/auth/writeconfig.c
src/bozo/bnode.c
src/bozo/bos.c
src/cf/linux-test2.m4
src/cf/linux-test4.m4
src/comerr/compile_et.c
src/config/.cvsignore
src/config/Makefile.alpha_linux_24.in [new file with mode: 0644]
src/config/Makefile.i386_djgpp
src/config/Makefile.parisc_linux24.in [new file with mode: 0644]
src/config/Makefile.rs_aix42.in
src/config/Makefile.sun4x_56.in
src/config/Makefile.sun4x_57.in
src/config/Makefile.sun4x_58.in
src/config/Makefile.sun4x_59.in [new file with mode: 0644]
src/config/NTMakefile.i386_nt40
src/config/NTMakefile.i386_win95
src/config/afs_args.h
src/config/afs_sysnames.h
src/config/afsconfig-windows.h
src/config/make_vnode.pl [new file with mode: 0644]
src/config/mkvers.c
src/config/param.alpha_linux_24.h [new file with mode: 0644]
src/config/param.alpha_linux_24_usr.h [new file with mode: 0644]
src/config/param.i386_obsd29.h
src/config/param.parisc_linux24.h [new file with mode: 0644]
src/config/param.parisc_linux24_usr.h [new file with mode: 0644]
src/config/param.sgi_62.h
src/config/param.sgi_63.h
src/config/param.sgi_64.h
src/config/param.sgi_65.h
src/config/param.sun4x_59.h [new file with mode: 0644]
src/config/param.sun4x_59_usr.h [new file with mode: 0644]
src/des/andrew-conf.h
src/des/conf-parisc-linux.h [new file with mode: 0644]
src/des/main.c
src/des/make_ip.c
src/dir/dir.h
src/fsint/afsint.xg
src/kauth/NTMakefile
src/kauth/admin_tools.c
src/kauth/authclient.c
src/kauth/client.c
src/kauth/kaauxdb.c
src/kauth/kadatabase.c
src/kauth/kalocalcell.c
src/kauth/kalog.c
src/kauth/kas.c
src/kauth/kaserver.c
src/kauth/kautils.c
src/kauth/klog.c
src/kauth/kpasswd.c
src/kauth/kpwvalid.c
src/kauth/krb_tf.c
src/kauth/krb_udp.c
src/kauth/rebuild.c
src/kauth/token.c
src/kauth/user.c
src/kauth/user_nt.c
src/libafs/.cvsignore
src/libafs/Makefile.common
src/libafs/MakefileProto.FBSD.in
src/libafs/MakefileProto.LINUX.in
src/libafs/MakefileProto.SOLARIS.in
src/libafsauthent/NTMakefile
src/libuafs/Makefile.common
src/login/Makefile.in
src/ntp/.cvsignore
src/pam/afs_util.c
src/pinstall/install.c
src/ptserver/.cvsignore
src/ptserver/NTMakefile
src/ptserver/db_verify.c
src/ptserver/ptclient.c
src/ptserver/ptprocs.c
src/ptserver/pts.c
src/ptserver/ptserver.c
src/ptserver/ptuser.c
src/ptserver/ptutils.c
src/ptserver/readgroup.c
src/ptserver/readpwd.c
src/ptserver/testpt.c
src/ptserver/utils.c
src/rx/IRIX/rx_knet.c
src/rx/SOLARIS/rx_knet.c
src/rx/rx.c
src/rx/rx.h
src/rx/rx_clock.c
src/rx/rx_getaddr.c
src/rx/rx_kcommon.c
src/rx/rx_kcommon.h
src/rx/rx_misc.h
src/rx/rx_packet.c
src/rx/rx_trace.c
src/rxdebug/rxdebug.c
src/rxkad/rxkad_client.c
src/rxkad/rxkad_common.c
src/rxkad/rxkad_server.c
src/rxkad/ticket.c
src/sys/rmtsysnet.c
src/tbutc/Makefile.in
src/ubik/beacon.c
src/ubik/disk.c
src/ubik/phys.c
src/ubik/recovery.c
src/ubik/remote.c
src/ubik/ubik.c
src/ubik/ubikcmd.c
src/ubik/utst_client.c
src/ubik/utst_server.c
src/ubik/vote.c
src/update/client.c
src/util/Makefile.in
src/util/assert.c
src/util/casestrcpy.c
src/util/fileutil.c
src/util/kreltime.c
src/util/ktime.c
src/util/uuid.c
src/venus/.cvsignore
src/venus/Makefile.in
src/venus/kdump.sh.linux [new file with mode: 0644]
src/venus/livesys.c [new file with mode: 0644]
src/vfsck/.cvsignore
src/viced/afsfileprocs.c
src/viced/callback.c
src/viced/host.c
src/viced/viced.c
src/vlserver/vldbint.xg
src/vlserver/vlserver.p.h
src/vol/.cvsignore
src/vol/Makefile.in
src/vol/ihandle.c
src/vol/ihandle.h
src/vol/namei_ops.c
src/vol/partition.c
src/vol/partition.h
src/volser/volprocs.c
src/volser/volser.p.h
src/volser/vos.c
src/volser/vsprocs.c
src/volser/vsutils.c

index 37ddfb1bc3124569489f394cf836c13365371a22..3297bdb43da48b125026efafe911610a13580b00 100644 (file)
@@ -308,7 +308,9 @@ login: project kauth rxkad
        alpha_dux* ) \
                ${COMPILE_PART1} sia ${COMPILE_PART2} ;; \
        sun4x_55 ) \
-                ${COMPILE_PART1} login ${COMPILE_PART2} ;; \
+               ${COMPILE_PART1} login ${COMPILE_PART2} ;; \
+       parisc_linux24) \
+               echo Skipping pam/login for parisc_linux24 ;; \
        sun4x_* | hp_ux11* | *linux* | *fbsd* ) \
                ${COMPILE_PART1} pam ${COMPILE_PART2} ;; \
        ppc_darwin* | *_obsd* ) \
@@ -368,6 +370,11 @@ libafs_tree: libafs_setup ${KERNELDIR}
        ${INSTALL} -c src/config/Makefile.${SYS_NAME}.in libafs_tree/config
        ${INSTALL} -c src/config/afsconfig.h.in libafs_tree/config
        ${INSTALL} -c -f -ns configure-libafs libafs_tree/configure
+       case ${SYS_NAME} in \
+       *linux*) \
+               ${INSTALL} -c src/config/make_vnode.pl libafs_tree/config ; \
+               ${INSTALL} -c src/afs/LINUX/osi_vfs.hin libafs_tree/afs ;; \
+       esac
 
 libuafs: libuafs_setup ${UKERNELDIR}
        set -x; \
diff --git a/NEWS b/NEWS
index da8a0eea7e5af00df20283cff3ded4a0f16f5057..bc0af8ffedaa6b540d92268efdbfddf597b4c191 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,27 @@
-Openafs News -- history of user Visible changes. September 17, 2001
+OpenAFS News -- history of user-visible changes. October 9, 2001
+
+* Changes incorporated in OpenAFS 1.2.2
+
+** If afsd is started with the -dynroot flag, /afs will be locally
+   generated from the CellServDB.  AFSDB cells will be mounted
+   automatically upon access.
+
+** The namei fileserver allows vice "partitions" to be directories instead
+   of partitions and will attach and display accordingly. Creating the file
+   "AlwaysAttach" in the /vicepX directory is used as the trigger to attach it.
+
+** TSM support for butc no longer requires editing a Makefile, simply
+   specify the --enable-tivoli-tsm configure option.
+
+** Linux builds no longer require source changes every time the kernel
+   inode structure changes; the OpenAFS sources will now configure
+   itself to the actual inode structure as defined in the kernel
+   sources.
+
+* Changes incorporated in OpenAFS 1.2.1
+
+** vfsck on Digital UNIX and Solaris will now refuse to fsck mounted
+   mounted partitions.
 
 * Changes incorporated in OpenAFS 1.2.0
 
@@ -8,7 +31,6 @@ Openafs News -- history of user Visible changes. September 17, 2001
    and /usr/vice/etc) use the --enable-transarc-paths option to
    configure.  More details on the new directory layout are found in README.
 
-
 * Changes incorporated in OpenAFS 1.1.1a
  
 ** Windows 95/98/ME/NT/2000 - Consistent versioning
diff --git a/README b/README
index 9d20c5a0d4b821f53180a0cfcbf4142b7059f8b5..44ed3d5e918f9d5494122bf467e03f6514e1482f 100644 (file)
--- a/README
+++ b/README
@@ -39,6 +39,7 @@ A. Creating the proper directory structure.
       sun4x_56
       sun4x_57
       sun4x_58
+      sun4x_59
       ppc_darwin_13
       ppc_linux22
       ppc_linux24
index 12ef98bd80e34c4c79493aae143a674ef1ad4861..e02e143df1671fbf04492a35fb6d02ddf724f8c8 100644 (file)
@@ -29,12 +29,6 @@ static /**/const char *const rcsid[] = { (char *)rcsid, "\100(#)" msg }
 #undef FULL_LISTVOL_SWITCH
 
 #undef INODE_SETATTR_NOT_VOID
-#undef STRUCT_INODE_HAS_I_BYTES
-#undef STRUCT_INODE_HAS_I_CDEV
-#undef STRUCT_INODE_HAS_I_TRUNCATE_SEM
-#undef STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS
-#undef STRUCT_INODE_HAS_I_MAPPING_OVERLOAD
-#undef STRUCT_INODE_HAS_I_MMAP_SHARED
 #undef STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK
 
 /* glue for RedHat kernel bug */
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644 (file)
index 0000000..5051481
--- /dev/null
@@ -0,0 +1,482 @@
+dnl This file contains the common configuration code which would
+dnl otherwise be duplicated between configure and configure-libafs.
+dnl
+dnl NB: Because this code is a macro, references to positional shell
+dnl parameters must be done like $[]1 instead of $1
+
+AC_DEFUN(OPENAFS_CONFIGURE_COMMON,[
+
+AC_CANONICAL_HOST
+SRCDIR_PARENT=`pwd`
+
+#BOZO_SAVE_CORES BOS_RESTRICTED_MODE BOS_NEW_CONFIG pam sia
+AC_ARG_WITH(afs-sysname,
+[  --with-afs-sysname=sys    use sys for the afs sysname]
+)
+AC_ARG_ENABLE( obsolete,
+[  --enable-obsolete                   enable obsolete portions of AFS (mpp, ntp and package)],, enable_obsolete="no")
+AC_ARG_ENABLE( insecure,
+[  --enable-insecure                   enable insecure portions of AFS (ftpd, inetd, rcp, rlogind and rsh)],, enable_insecure="no")
+AC_ARG_ENABLE( afsdb,
+[  --disable-afsdb                     disable AFSDB RR support],, enable_afsdb="yes")
+AC_ARG_ENABLE( bos-restricted-mode,
+[  --enable-bos-restricted-mode        enable bosserver restricted mode which disables certain bosserver functionality],, enable_bos_restricted_mode="no")
+AC_ARG_ENABLE( namei-fileserver,
+[  --enable-namei-fileserver           force compilation of namei fileserver in preference to inode fileserver],, enable_namei_fileserver="no")
+AC_ARG_ENABLE( fast-restart,
+[  --enable-fast-restart               enable fast startup of file server without salvaging],, enable_fast_restart="no")
+AC_ARG_ENABLE( bitmap-later,
+[  --enable-bitmap-later               enable fast startup of file server by not reading bitmap till needed],, enable_bitmap_later="no")
+AC_ARG_ENABLE( full-vos-listvol-switch,
+[  --enable-full-vos-listvol-switch     enable vos full listvol switch for formatted output],, enable_full_vos_listvol_switch="no")
+AC_ARG_WITH(dux-kernel-headers,
+[  --with-dux-kernel-headers=path      use the kernel headers found at path(optional, defaults to first match in /usr/sys)]
+)
+AC_ARG_WITH(linux-kernel-headers,
+[  --with-linux-kernel-headers=path            use the kernel headers found at path(optional, defaults to /usr/src/linux)]
+)
+AC_ARG_ENABLE(kernel-module,
+[  --disable-kernel-module                     disable compilation of the kernel module (defaults to enabled)],, enable_kernel_module="yes"
+)
+AC_ARG_ENABLE(redhat-buildsys,
+[  --enable-redhat-buildsys            enable compilation of the redhat build system kernel (defaults to disabled)],, enable_redhat_buildsys="no"
+)
+AC_ARG_ENABLE(transarc-paths,
+[  --enable-transarc-paths                     Use Transarc style paths like /usr/afs and /usr/vice],, enable_transarc_paths="no"
+)
+AC_ARG_ENABLE(tivoli-tsm,
+[  --enable-tivoli-tsm                 Enable use of the Tivoli TSM API libraries for butc support],, enable_tivoli_tsm="no"
+)
+
+AC_PROG_CC
+
+dnl weird ass systems
+AC_AIX
+AC_ISC_POSIX
+AC_MINIX
+
+dnl Various compiler setup.
+AC_C_INLINE
+AC_C_CONST
+AC_TYPE_PID_T
+AC_TYPE_SIZE_T
+AC_TYPE_SIGNAL
+
+dnl Checks for programs.
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_RANLIB
+AC_PROG_YACC
+AM_PROG_LEX
+
+OPENAFS_CHECK_BIGENDIAN
+
+AC_MSG_CHECKING(your OS)
+system=$host
+case $system in
+        *-linux*)
+               MKAFS_OSTYPE=LINUX
+               if test "x$enable_redhat_buildsys" = "xyes"; then
+                AC_DEFINE(ENABLE_REDHAT_BUILDSYS)
+               fi
+               if test "x$enable_kernel_module" = "xyes"; then
+                if test "x$with_linux_kernel_headers" != "x"; then
+                  LINUX_KERNEL_PATH="$with_linux_kernel_headers"
+                else
+                  LINUX_KERNEL_PATH="/usr/src/linux"
+                fi
+                if test -f "$LINUX_KERNEL_PATH/include/linux/version.h"; then
+                 linux_kvers=`fgrep UTS_RELEASE $LINUX_KERNEL_PATH/include/linux/version.h |awk 'BEGIN { FS="\"" } { print $[]2 }'|tail -1`
+                 if test "x$linux_kvers" = "x"; then
+                   if test -f "$LINUX_KERNEL_PATH/include/linux/version-up.h"; then
+                     linux_kvers=`fgrep UTS_RELEASE $LINUX_KERNEL_PATH/include/linux/version-up.h |awk 'BEGIN { FS="\"" } { print $[]2 }'|tail -1`
+                     if test "x$linux_kvers" = "x"; then
+
+                       AC_MSG_ERROR(Linux headers lack version definition [2])
+                       exit 1
+                     else
+                       LINUX_VERSION="$linux_kvers"
+                      fi
+                    else
+                      AC_MSG_ERROR(Linux headers lack version definition)
+                     exit 1
+                   fi
+                 else
+                   LINUX_VERSION="$linux_kvers"
+                 fi
+                else
+                    enable_kernel_module="no"
+                 fi
+                if test ! -f "$LINUX_KERNEL_PATH/include/linux/autoconf.h"; then
+                    enable_kernel_module="no"
+                fi
+                if test "x$enable_kernel_module" = "xno"; then
+                 if test "x$with_linux_kernel_headers" != "x"; then
+                  AC_MSG_ERROR(No usable linux headers found at $LINUX_KERNEL_PATH)
+                  exit 1
+                 else
+                  AC_MSG_WARN(No usable linux headers found at $LINUX_KERNEL_PATH so disabling kernel module)
+                 fi
+                fi
+               fi
+               AC_MSG_RESULT(linux)
+               if test "x$enable_kernel_module" = "xyes"; then
+                ifdef([OPENAFS_CONFIGURE_LIBAFS],
+                  [LINUX_BUILD_VNODE_FROM_INODE(config,afs)],
+                  [LINUX_BUILD_VNODE_FROM_INODE(src/config,src/afs/LINUX)]
+                )
+                LINUX_FS_STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK
+                LINUX_INODE_SETATTR_RETURN_TYPE
+                LINUX_NEED_RHCONFIG
+                LINUX_WHICH_MODULES
+                if test "x$ac_cv_linux_func_inode_setattr_returns_int" = "xyes" ; then
+                 AC_DEFINE(INODE_SETATTR_NOT_VOID)
+                fi
+                if test "x$ac_cv_linux_fs_struct_address_space_has_page_lock" = "xyes"; then 
+                 AC_DEFINE(STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK)
+                fi
+                :
+               fi
+                ;;
+        *-solaris*)
+               MKAFS_OSTYPE=SOLARIS
+                AC_MSG_RESULT(sun4)
+               SOLARIS_UFSVFS_HAS_DQRWLOCK
+                ;;
+        *-hpux*)
+               MKAFS_OSTYPE=HPUX
+                AC_MSG_RESULT(hp_ux)
+                ;;
+        *-irix*)
+               MKAFS_OSTYPE=IRIX
+                AC_MSG_RESULT(sgi)
+                ;;
+        *-aix*)
+               MKAFS_OSTYPE=AIX
+                AC_MSG_RESULT(rs_aix)
+                ;;
+        *-osf*)
+               MKAFS_OSTYPE=DUX
+                AC_MSG_RESULT(alpha_dux)
+               if test "x$enable_kernel_module" = "xyes"; then
+                if test "x$with_dux_kernel_headers" != "x"; then
+                  HEADER_RT=`ls ${with_dux_kernel_headers}/rt_preempt.h | head -1 | sed 's,/rt_preempt.h,,;s,/usr/sys/,,'`
+                else
+                  HEADER_RT=`ls /usr/sys/*/rt_preempt.h | head -1 | sed 's,/rt_preempt.h,,;s,/usr/sys/,,'`
+                fi
+               fi
+               if test "$HEADER_RT" = "*" ; then
+                       AC_MSG_ERROR([Need a configured kernel directory])
+               fi
+               AC_SUBST([HEADER_RT])
+                ;;
+        *-darwin*)
+               MKAFS_OSTYPE=DARWIN
+                AC_MSG_RESULT(ppc_darwin)
+                ;;
+       *-freebsd*)
+               MKAFS_OSTYPE=FBSD
+               AC_MSG_RESULT(i386_fbsd)
+               ;;
+       *-openbsd*)
+               MKAFS_OSTYPE=OBSD
+               AC_MSG_RESULT(i386_obsd)
+               ;;
+        *)
+                AC_MSG_RESULT($system)
+                ;;
+esac
+
+if test "x$with_afs_sysname" != "x"; then
+        AFS_SYSNAME="$with_afs_sysname"
+else
+       AC_MSG_CHECKING(your AFS sysname)
+       case $host in
+               i?86-*-freebsd4.2*)
+                       AFS_SYSNAME="i386_fbsd_42"
+                       ;;
+               hppa*-hp-hpux11*)
+                       AFS_SYSNAME="hp_ux110"
+                       ;;
+               hppa*-hp-hpux10*)
+                       AFS_SYSNAME="hp_ux102"
+                       ;;
+               powerpc-apple-darwin1.2*)
+                       AFS_SYSNAME="ppc_darwin_12"
+                       DARWIN_PLIST=src/libafs/afs.${AFS_SYSNAME}.plist
+                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
+                       ;;
+               powerpc-apple-darwin1.3*)
+                       AFS_SYSNAME="ppc_darwin_13"
+                       DARWIN_PLIST=src/libafs/afs.${AFS_SYSNAME}.plist
+                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
+                       ;;
+               powerpc-apple-darwin1.4*)
+                       AFS_SYSNAME="ppc_darwin_14"
+                       DARWIN_PLIST=src/libafs/afs.${AFS_SYSNAME}.plist
+                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
+                       ;;
+               sparc-sun-solaris2.5*)
+                       AFS_SYSNAME="sun4x_55"
+                       ;;
+               sparc-sun-solaris2.6)
+                       AFS_SYSNAME="sun4x_56"
+                       ;;
+               sparc-sun-solaris2.7)
+                       AFS_SYSNAME="sun4x_57"
+                       ;;
+               sparc-sun-solaris2.8)
+                       AFS_SYSNAME="sun4x_58"
+                       ;;
+               sparc-sun-solaris2.9)
+                       AFS_SYSNAME="sun4x_59"
+                       ;;
+               alpha*-dec-osf4.0*)
+                       AFS_SYSNAME="alpha_dux40"
+                       ;;
+               alpha*-dec-osf5.0*)
+                       AFS_SYSNAME="alpha_dux50"
+                       ;;
+               mips-sgi-irix6.5)
+                       AFS_SYSNAME="sgi_65"
+                       ;;
+               ia64-*-linux*)
+                       AFS_SYSNAME="ia64_linuxXX"
+                       ;;
+               powerpc-*-linux*)
+                       AFS_SYSNAME="ppc_linuxXX"
+                       ;;
+               alpha*-linux*)
+                       AFS_SYSNAME="alpha_linux_XX"
+                       ;;
+               s390-*-linux*)
+                       AFS_SYSNAME="s390_linuxXX"
+                       ;;
+               sparc-*-linux*)
+                       AFS_SYSNAME="sparc_linuxXX"
+                       ;;
+               sparc64-*-linux*)
+                       AFS_SYSNAME="sparc64_linuxXX"
+                       ;;
+               i?86-*-linux*)
+                       AFS_SYSNAME="i386_linuxXX"
+                       ;;
+               parisc-*-linux-gnu)
+                       AFS_SYSNAME="parisc_linuxXX"
+                       ;;
+               power*-ibm-aix4.2*)
+                       AFS_SYSNAME="rs_aix42"
+                       ;;
+               power*-ibm-aix4.3*)
+                       AFS_SYSNAME="rs_aix42"
+                       ;;
+               *)
+                       AC_MSG_ERROR(An AFS sysname is required)
+                       exit 1
+                       ;;
+       esac
+       case $AFS_SYSNAME in
+               *_linux*)
+                       AFS_SYSKVERS=`echo $LINUX_VERSION | awk -F\. '{print $[]1 $[]2}'`
+                       if test "x${AFS_SYSKVERS}" = "x"; then
+                        AC_MSG_ERROR(Couldn't guess your Linux version. Please use the --with-afs-sysname option to configure an AFS sysname.)
+                       fi
+                       _AFS_SYSNAME=`echo $AFS_SYSNAME|sed s/XX\$/$AFS_SYSKVERS/`
+                       AFS_SYSNAME="$_AFS_SYSNAME"
+                       ;;
+       esac
+        AC_MSG_RESULT($AFS_SYSNAME)
+fi
+
+
+if test "x${MKAFS_OSTYPE}" = "xIRIX"; then
+        echo Skipping library tests because they confuse Irix.
+else
+  AC_CHECK_FUNCS(socket)
+
+  if test "$ac_cv_func_socket" = no; then
+    for lib in socket inet; do
+        if test "$HAVE_SOCKET" != 1; then
+                AC_CHECK_LIB(${lib}, socket,LIBS="$LIBS -l$lib";HAVE_SOCKET=1;AC_DEFINE(HAVE_SOCKET))
+        fi
+    done
+  fi
+  
+  AC_CHECK_FUNCS(connect)       
+
+  if test "$ac_cv_func_connect" = no; then
+    for lib in nsl; do
+        if test "$HAVE_CONNECT" != 1; then
+                AC_CHECK_LIB(${lib}, connect,LIBS="$LIBS -l$lib";HAVE_CONNECT=1;AC_DEFINE(HAVE_CONNECT))
+        fi
+    done
+  fi
+
+  AC_CHECK_FUNCS(gethostbyname)
+  if test "$ac_cv_func_gethostbyname" = no; then
+        for lib in dns nsl resolv; do
+          if test "$HAVE_GETHOSTBYNAME" != 1; then
+            AC_CHECK_LIB(${lib}, gethostbyname, LIBS="$LIBS -l$lib";HAVE_GETHOSTBYNAME=1;AC_DEFINE(HAVE_GETHOSTBYNAME))
+          fi
+        done    
+  fi    
+
+  AC_CHECK_FUNCS(res_search)
+  if test "$ac_cv_func_res_search" = no; then
+        for lib in dns nsl resolv; do
+          if test "$HAVE_RES_SEARCH" != 1; then
+            AC_CHECK_LIB(${lib}, res_search, LIBS="$LIBS -l$lib";HAVE_RES_SEARCH=1;AC_DEFINE(HAVE_RES_SEARCH))
+          fi
+        done    
+       if test "$HAVE_RES_SEARCH" = 1; then
+         LIB_res_search="-l$lib"       
+       fi
+  fi    
+fi
+
+PTHREAD_LIBS=error
+AC_CHECK_LIB(pthread, pthread_attr_init,
+             PTHREAD_LIBS="-lpthread")
+if test "x$PTHREAD_LIBS" = xerror; then
+        AC_CHECK_LIB(pthreads, pthread_attr_init,
+                PTHREAD_LIBS="-lpthreads")
+fi
+if test "x$PTHREAD_LIBS" = xerror; then
+        AC_CHECK_LIB(c_r, pthread_attr_init,
+                PTHREAD_LIBS="-lc_r")
+fi
+if test "x$PTHREAD_LIBS" = xerror; then
+        AC_CHECK_FUNC(pthread_attr_init, PTHREAD_LIBS="")
+fi
+if test "x$PTHREAD_LIBS" = xerror; then
+        AC_MSG_WARN(*** Unable to locate working posix thread library ***)
+fi
+AC_SUBST(PTHREAD_LIBS)
+
+WITH_OBSOLETE=NO
+if test "$enable_obsolete" = "yes"; then
+       WITH_OBSOLETE=YES
+fi
+
+WITH_INSECURE=NO
+if test "$enable_insecure" = "yes"; then
+       WITH_INSECURE=YES
+fi
+
+# Fast restart
+if test "$enable_fast_restart" = "yes"; then
+       AC_DEFINE(FAST_RESTART)
+fi
+
+if test "$enable_bitmap_later" = "yes"; then
+       AC_DEFINE(BITMAP_LATER)
+fi
+
+if test "$enable_full_vos_listvol_switch" = "yes"; then
+       AC_DEFINE(FULL_LISTVOL_SWITCH)
+fi
+
+if test "$enable_bos_restricted_mode" = "yes"; then
+       AC_DEFINE(BOS_RESTRICTED_MODE)
+fi
+
+if test "$enable_namei_fileserver" = "yes"; then
+       AC_DEFINE(AFS_NAMEI_ENV)
+fi
+
+if test "$enable_afsdb" = "yes"; then
+       LIB_AFSDB="$LIB_res_search"
+       AC_DEFINE(AFS_AFSDB_ENV)
+fi
+
+dnl check for tivoli
+AC_MSG_CHECKING(for tivoli tsm butc support)
+XBSA_CFLAGS=""
+if test "$enable_tivoli_tsm" = "yes"; then
+       XBSADIR1=/usr/tivoli/tsm/client/api/bin/xopen
+       XBSADIR2=/opt/tivoli/tsm/client/api/bin/xopen
+
+       if test -e "$XBSADIR1/xbsa.h"; then
+               XBSA_CFLAGS="-Dxbsa -I$XBSADIR1"
+               AC_MSG_RESULT([yes, $XBSA_CFLAGS])
+       elif test -e "$XBSADIR2/xbsa.h"; then
+               XBSA_CFLAGS="-Dxbsa -I$XBSADIR2"
+               AC_MSG_RESULT([yes, $XBSA_CFLAGS])
+       else
+               AC_MSG_RESULT([no, missing xbsa.h header file])
+       fi
+else
+       AC_MSG_RESULT([no])
+fi
+AC_SUBST(XBSA_CFLAGS)
+
+dnl checks for header files.
+AC_HEADER_STDC
+AC_HEADER_SYS_WAIT
+AC_HEADER_DIRENT
+AC_CHECK_HEADERS(stdlib.h string.h unistd.h fcntl.h sys/time.h sys/file.h)
+AC_CHECK_HEADERS(netinet/in.h netdb.h sys/fcntl.h sys/mnttab.h sys/mntent.h)
+AC_CHECK_HEADERS(mntent.h sys/vfs.h sys/param.h sys/fs_types.h)
+AC_CHECK_HEADERS(sys/mount.h strings.h termios.h signal.h)
+AC_CHECK_HEADERS(windows.h malloc.h winsock2.h direct.h io.h)
+AC_CHECK_HEADERS(security/pam_modules.h siad.h usersec.h)
+
+AC_CHECK_FUNCS(utimes random srandom getdtablesize snprintf re_comp re_exec)
+
+dnl Directory PATH handling
+if test "x$enable_transarc_paths" = "xyes"  ; then 
+    afsconfdir=${afsconfdir=/usr/afs/etc}
+    viceetcdir=${viceetcdir=/usr/vice/etc}
+    afskerneldir=${afskerneldir=${viceetcdir}}
+    afssrvbindir=${afssrvbindir=/usr/afs/bin}
+    afssrvsbindir=${afssrvsbindir=/usr/afs/bin}
+    afssrvlibexecdir=${afssrvlibexecdir=/usr/afs/bin}
+    afsdbdir=${afsdbdir=/usr/afs/db}
+    afslogsdir=${afslogsdir=/usr/afs/logs}
+    afslocaldir=${afslocaldir=/usr/afs/local}
+    afsbackupdir=${afsbackupdir=/usr/afs/backup}
+    afsbosconfigdir=${afsbosconfigdir=/usr/afs/local}
+else 
+    afsconfdir=${afsconfdir='${sysconfdir}/openafs/server'}
+    viceetcdir=${viceetcdir='${sysconfdir}/openafs'}
+    afskerneldir=${afskerneldir='${libdir}/openafs'}
+    afssrvbindir=${afssrvbindir='${bindir}'}
+    afssrvsbindir=${afssrvsbindir='${sbindir}'}
+    afssrvlibexecdir=${afssrvlibexecdir='${libexecdir}/openafs'}
+    afsdbdir=${afsdbdir='${localstatedir}/openafs/db'}
+    afslogsdir=${afslogsdir='${localstatedir}/openafs/logs'}
+    afslocaldir=${afslocaldir='${localstatedir}/openafs'}
+    afsbackupdir=${afsbackupdir='${localstatedir}/openafs/backup'}
+    afsbosconfigdir=${afsbosconfigdir='${sysconfdir}/openafs'}
+fi
+AC_SUBST(afsconfdir)
+AC_SUBST(viceetcdir)
+AC_SUBST(afskerneldir)
+AC_SUBST(afssrvbindir)
+AC_SUBST(afssrvsbindir)
+AC_SUBST(afssrvlibexecdir)
+AC_SUBST(afsdbdir)
+AC_SUBST(afslogsdir)
+AC_SUBST(afslocaldir)
+AC_SUBST(afsbackupdir)
+AC_SUBST(afsbosconfigdir)
+
+if test "x$enable_kernel_module" = "xyes"; then
+ENABLE_KERNEL_MODULE=libafs
+fi
+
+AC_SUBST(AFS_SYSNAME)
+AC_SUBST(ENABLE_KERNEL_MODULE)
+AC_SUBST(LIB_AFSDB)
+AC_SUBST(LINUX_KERNEL_PATH)
+AC_SUBST(LINUX_VERSION)
+AC_SUBST(MKAFS_OSTYPE)
+AC_SUBST(TOP_SRCDIR)
+AC_SUBST(TOP_INCDIR)
+AC_SUBST(TOP_LIBDIR)
+AC_SUBST(DEST)
+AC_SUBST(WITH_OBSOLETE)
+AC_SUBST(WITH_INSECURE)
+AC_SUBST(DARWIN_INFOFILE)
+
+])
index 42fc991d08ac5f6487c41b74d07c4071f062ae17..791bcded7c3bf807b4ecb7521fcd2ef9ad175b2c 100644 (file)
@@ -1,9 +1,9 @@
 #! /bin/sh
-# Configuration validation subroutine script, version 1.1.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
 #   Free Software Foundation, Inc.
 
-version='2000-09-11'
+timestamp='2001-10-05'
 
 # This file is (in principle) common to ALL GNU software.
 # The presence of a machine in this file suggests that SOME GNU software
@@ -29,7 +29,8 @@ version='2000-09-11'
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
-# Please send patches to <config-patches@gnu.org>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -60,16 +61,30 @@ Usage: $0 [OPTION] CPU-MFR-OPSYS
 Canonicalize a configuration name.
 
 Operation modes:
-  -h, --help               print this help, then exit
-  -V, --version            print version number, then exit"
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
 
 help="
 Try \`$me --help' for more information."
 
 # Parse command line
 while test $# -gt 0 ; do
-  case "$1" in
-    --version | --vers* | -V )
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
        echo "$version" ; exit 0 ;;
     --help | --h* | -h )
        echo "$usage"; exit 0 ;;
@@ -78,9 +93,7 @@ while test $# -gt 0 ; do
     - )        # Use stdin as input.
        break ;;
     -* )
-       exec >&2
-       echo "$me: invalid option $1"
-       echo "$help"
+       echo "$me: invalid option $1$help"
        exit 1 ;;
 
     *local*)
@@ -105,7 +118,7 @@ esac
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu*)
+  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
@@ -145,6 +158,14 @@ case $os in
                os=-vxworks
                basic_machine=$1
                ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
        -hiux*)
                os=-hiuxwe2
                ;;
@@ -203,22 +224,36 @@ esac
 case $basic_machine in
        # Recognize the basic CPU types without company name.
        # Some are omitted here because they have special meanings below.
-       tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
-               | arme[lb] | armv[2345] | armv[345][lb] | pyramid | mn10200 | mn10300 | tron | a29k \
-               | 580 | i960 | h8300 \
-               | x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \
-               | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
-               | hppa64 \
-               | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
-               | alphaev6[78] \
-               | we32k | ns16k | clipper | i370 | sh | sh[34] \
-               | powerpc | powerpcle \
-               | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
-               | mips64orion | mips64orionel | mipstx39 | mipstx39el \
-               | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
-               | mips64vr5000 | miprs64vr5000el | mcore \
-               | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
-               | thumb | d10v | d30v | fr30 | avr)
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+       | c4x | clipper \
+       | d10v | d30v | dsp16xx \
+       | fr30 \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | m32r | m68000 | m68k | m88k | mcore \
+       | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
+       | mips64vr4100 | mips64vr4100el | mips64vr4300 \
+       | mips64vr4300el | mips64vr5000 | mips64vr5000el \
+       | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
+       | mipsisa32 \
+       | mn10200 | mn10300 \
+       | ns16k | ns32k \
+       | openrisc \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | pyramid \
+       | s390 | s390x \
+       | sh | sh[34] | sh[34]eb | shbe | shle \
+       | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
+       | stormy16 | strongarm \
+       | tahoe | thumb | tic80 | tron \
+       | v850 \
+       | we32k \
+       | x86 | xscale \
+       | z8k)
                basic_machine=$basic_machine-unknown
                ;;
        m6811 | m68hc11 | m6812 | m68hc12)
@@ -226,13 +261,13 @@ case $basic_machine in
                basic_machine=$basic_machine-unknown
                os=-none
                ;;
-       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
                ;;
 
        # We use `pc' rather than `unknown'
        # because (1) that's what they normally are, and
        # (2) the word "unknown" tends to confuse beginning users.
-       i[234567]86 | x86_64)
+       i*86 | x86_64)
          basic_machine=$basic_machine-pc
          ;;
        # Object if more than one company name word.
@@ -241,28 +276,44 @@ case $basic_machine in
                exit 1
                ;;
        # Recognize the basic CPU types with company name.
-       # FIXME: clean up the formatting here.
-       vax-* | tahoe-* | i[234567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
-             | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
-             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
-             | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
-             | xmp-* | ymp-* \
-             | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \
-             | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
-             | hppa2.0n-* | hppa64-* \
-             | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
-             | alphaev6[78]-* \
-             | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
-             | clipper-* | orion-* \
-             | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
-             | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
-             | mips64el-* | mips64orion-* | mips64orionel-* \
-             | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
-             | mipstx39-* | mipstx39el-* | mcore-* \
-             | f301-* | armv*-* | s390-* | sv1-* | t3e-* \
-             | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
-             | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \
-             | bs2000-* | tic54x-* | c54x-* | x86_64-*)
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alphapca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armv*-* \
+       | avr-* \
+       | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c54x-* \
+       | clipper-* | cray2-* | cydra-* \
+       | d10v-* | d30v-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fr30-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | m32r-* \
+       | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | mcore-* \
+       | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
+       | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
+       | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
+       | none-* | np1-* | ns16k-* | ns32k-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | pyramid-* \
+       | romp-* | rs6000-* \
+       | s390-* | s390x-* \
+       | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
+       | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
+       | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \
+       | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
+       | v850-* | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
+       | ymp-* \
+       | z8k-*)
                ;;
        # Recognize the various machine names and aliases which stand
        # for a CPU type and a company and sometimes even an OS.
@@ -353,8 +404,8 @@ case $basic_machine in
                basic_machine=cray2-cray
                os=-unicos
                ;;
-       [ctj]90-cray)
-               basic_machine=c90-cray
+       [cjt]90)
+               basic_machine=${basic_machine}-cray
                os=-unicos
                ;;
        crds | unos)
@@ -410,6 +461,10 @@ case $basic_machine in
                basic_machine=tron-gmicro
                os=-sysv
                ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
        h3050r* | hiux*)
                basic_machine=hppa1.1-hitachi
                os=-hiuxwe2
@@ -485,19 +540,19 @@ case $basic_machine in
                basic_machine=i370-ibm
                ;;
 # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-       i[34567]86v32)
+       i*86v32)
                basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
                os=-sysv32
                ;;
-       i[34567]86v4*)
+       i*86v4*)
                basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
                os=-sysv4
                ;;
-       i[34567]86v)
+       i*86v)
                basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
                os=-sysv
                ;;
-       i[34567]86sol2)
+       i*86sol2)
                basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
                os=-solaris2
                ;;
@@ -509,18 +564,6 @@ case $basic_machine in
                basic_machine=i386-unknown
                os=-vsta
                ;;
-       i386-go32 | go32)
-               basic_machine=i386-unknown
-               os=-go32
-               ;;
-       i386-mingw32 | mingw32)
-               basic_machine=i386-unknown
-               os=-mingw32
-               ;;
-       i[34567]86-pw32 | pw32)
-               basic_machine=i586-unknown
-               os=-pw32
-               ;;
        iris | iris4d)
                basic_machine=mips-sgi
                case $os in
@@ -546,6 +589,10 @@ case $basic_machine in
                basic_machine=ns32k-utek
                os=-sysv
                ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
        miniframe)
                basic_machine=m68000-convergent
                ;;
@@ -576,7 +623,7 @@ case $basic_machine in
                os=-coff
                ;;
        msdos)
-               basic_machine=i386-unknown
+               basic_machine=i386-pc
                os=-msdos
                ;;
        mvs)
@@ -640,6 +687,10 @@ case $basic_machine in
                basic_machine=i960-intel
                os=-mon960
                ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
        np1)
                basic_machine=np1-gould
                ;;
@@ -675,28 +726,28 @@ case $basic_machine in
         pc532 | pc532-*)
                basic_machine=ns32k-pc532
                ;;
-       pentium | p5 | k5 | k6 | nexen)
+       pentium | p5 | k5 | k6 | nexgen | viac3)
                basic_machine=i586-pc
                ;;
        pentiumpro | p6 | 6x86 | athlon)
                basic_machine=i686-pc
                ;;
        pentiumii | pentium2)
-               basic_machine=i786-pc
+               basic_machine=i686-pc
                ;;
-       pentium-* | p5-* | k5-* | k6-* | nexen-*)
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
                basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
        pentiumpro-* | p6-* | 6x86-* | athlon-*)
                basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
        pentiumii-* | pentium2-*)
-               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
        pn)
                basic_machine=pn-gould
                ;;
-       power)  basic_machine=rs6000-ibm
+       power)  basic_machine=power-ibm
                ;;
        ppc)    basic_machine=powerpc-unknown
                ;;
@@ -708,9 +759,23 @@ case $basic_machine in
        ppcle-* | powerpclittle-*)
                basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
                ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
        ps2)
                basic_machine=i386-ibm
                ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
        rom68k)
                basic_machine=m68k-rom68k
                os=-coff
@@ -732,7 +797,7 @@ case $basic_machine in
                basic_machine=sh-hitachi
                os=-hms
                ;;
-       sparclite-wrs)
+       sparclite-wrs | simso-wrs)
                basic_machine=sparclite-wrs
                os=-vxworks
                ;;
@@ -858,6 +923,10 @@ case $basic_machine in
                basic_machine=hppa1.1-winbond
                os=-proelf
                ;;
+       windows32)
+               basic_machine=i386-pc
+               os=-windows32-msvcrt
+               ;;
        xmp)
                basic_machine=xmp-cray
                os=-unicos
@@ -901,16 +970,20 @@ case $basic_machine in
        vax)
                basic_machine=vax-dec
                ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
        pdp11)
                basic_machine=pdp11-dec
                ;;
        we32k)
                basic_machine=we32k-att
                ;;
-       sh3 | sh4)
-               base_machine=sh-unknown
+       sh3 | sh4 | sh3eb | sh4eb)
+               basic_machine=sh-unknown
                ;;
-       sparc | sparcv9)
+       sparc | sparcv9 | sparcv9b)
                basic_machine=sparc-sun
                ;;
         cydra)
@@ -932,6 +1005,9 @@ case $basic_machine in
                basic_machine=c4x-none
                os=-coff
                ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
        *)
                echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
                exit 1
@@ -988,15 +1064,18 @@ case $os in
              | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
              | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
              | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* \
              | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
              | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
              | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
-             | -openstep* | -oskit* | -conix* | -pw32*)
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos*)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
        -qnx*)
                case $basic_machine in
-                   x86-* | i[34567]86-*)
+                   x86-* | i*86-*)
                        ;;
                    *)
                        os=-nto$os
@@ -1089,7 +1168,7 @@ case $os in
        -xenix)
                os=-xenix
                ;;
-        -*mint | -*MiNT)
+        -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
                os=-mint
                ;;
        -none)
@@ -1123,6 +1202,9 @@ case $basic_machine in
        arm*-semi)
                os=-aout
                ;;
+       pdp10-*)
+               os=-tops20
+               ;;
         pdp11-*)
                os=-none
                ;;
@@ -1231,7 +1313,7 @@ case $basic_machine in
        *-masscomp)
                os=-rtu
                ;;
-       f301-fujitsu)
+       f30[01]-fujitsu | f700-fujitsu)
                os=-uxpv
                ;;
        *-rom68k)
@@ -1309,9 +1391,12 @@ case $basic_machine in
                        -mpw* | -macos*)
                                vendor=apple
                                ;;
-                       -*mint | -*MiNT)
+                       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
                                vendor=atari
                                ;;
+                       -vos*)
+                               vendor=stratus
+                               ;;
                esac
                basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
                ;;
@@ -1322,7 +1407,7 @@ exit 0
 
 # Local variables:
 # eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "version='"
+# time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
 # End:
index af5bb9d3a77bedb9e2f09d6543eb395e2a0e8c3c..8aee6cf17e643c250f4138bb3ef4f3f6cf130092 100644 (file)
 AC_INIT(Makefile.common)
-AM_INIT_AUTOMAKE(openafs-libafs,1.2.1)
-AC_CANONICAL_HOST
+AM_INIT_AUTOMAKE(openafs-libafs,1.2.2)
 AC_CONFIG_HEADER(config/afsconfig.h)
+define(OPENAFS_CONFIGURE_LIBAFS)
 
-#BOZO_SAVE_CORES BOS_RESTRICTED_MODE BOS_NEW_CONFIG pam sia
-AC_ARG_WITH(afs-sysname,
-[  --with-afs-sysname=sys    use sys for the afs sysname]
-)
-AC_ARG_ENABLE( obsolete,
-[  --enable-obsolete                   enable obsolete portions of AFS (mpp, ntp and package)],, enable_obsolete="no")
-AC_ARG_ENABLE( insecure,
-[  --enable-insecure                   enable insecure portions of AFS (ftpd, inetd, rcp, rlogind and rsh)],, enable_insecure="no")
-AC_ARG_ENABLE( afsdb,
-[  --disable-afsdb                     disable AFSDB RR support],, enable_afsdb="yes")
-AC_ARG_ENABLE( bos-restricted-mode,
-[  --enable-bos-restricted-mode        enable bosserver restricted mode which disables certain bosserver functionality],, enable_bos_restricted_mode="no")
-AC_ARG_ENABLE( namei-fileserver,
-[  --enable-namei-fileserver           force compilation of namei fileserver in preference to inode fileserver],, enable_namei_fileserver="no")
-AC_ARG_ENABLE( fast-restart,
-[  --enable-fast-restart               enable fast startup of file server without salvaging],, enable_fast_restart="no")
-AC_ARG_ENABLE( bitmap-later,
-[  --enable-bitmap-later               enable fast startup of file server by not reading bitmap till needed],, enable_bitmap_later="no")
-AC_ARG_ENABLE( full-vos-listvol-switch,
-[  --enable-full-vos-listvol-switch     enable vos full listvol switch for formatted output],, enable_full_vos_listvol_switch="no")
-AC_ARG_WITH(dux-kernel-headers,
-[  --with-dux-kernel-headers=path      use the kernel headers found at path(optional, defaults to first match in /usr/sys)]
-)
-AC_ARG_WITH(linux-kernel-headers,
-[  --with-linux-kernel-headers=path            use the kernel headers found at path(optional, defaults to /usr/src/linux)]
-)
-AC_ARG_ENABLE(kernel-module,
-[  --disable-kernel-module                     disable compilation of the kernel module (defaults to enabled)],, enable_kernel_module="yes"
-)
-AC_ARG_ENABLE(redhat-buildsys,
-[  --enable-redhat-buildsys            enable compilation of the redhat build system kernel (defaults to disabled)],, enable_redhat_buildsys="no"
-)
-AC_ARG_ENABLE(transarc-paths,
-[  --enable-transarc-paths                     Use Transarc style paths like /usr/afs and /usr/vice],, enable_transarc_paths="no"
-)
-
-AC_PROG_CC
-
-dnl weird ass systems
-AC_AIX
-AC_ISC_POSIX
-AC_MINIX
-
-dnl Various compiler setup.
-AC_C_INLINE
-AC_C_CONST
-AC_TYPE_PID_T
-AC_TYPE_SIZE_T
-AC_TYPE_SIGNAL
-
-dnl Checks for programs.
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_RANLIB
-AC_PROG_YACC
-AM_PROG_LEX
-
-OPENAFS_CHECK_BIGENDIAN
-
-AC_MSG_CHECKING(your OS)
-system=$host
-case $system in
-        *-linux*)
-               MKAFS_OSTYPE=LINUX
-               if test "x$enable_redhat_buildsys" = "xyes"; then
-                AC_DEFINE(ENABLE_REDHAT_BUILDSYS)
-               fi
-               if test "x$enable_kernel_module" = "xyes"; then
-                if test "x$with_linux_kernel_headers" != "x"; then
-                  LINUX_KERNEL_PATH="$with_linux_kernel_headers"
-                else
-                  LINUX_KERNEL_PATH="/usr/src/linux"
-                fi
-                if test -f "$LINUX_KERNEL_PATH/include/linux/version.h"; then
-                 linux_kvers=`fgrep UTS_RELEASE $LINUX_KERNEL_PATH/include/linux/version.h |awk 'BEGIN { FS="\"" } { print $2 }'|tail -1`
-                 if test "x$linux_kvers" = "x"; then
-                   if test -f "$LINUX_KERNEL_PATH/include/linux/version-up.h"; then
-                     linux_kvers=`fgrep UTS_RELEASE $LINUX_KERNEL_PATH/include/linux/version-up.h |awk 'BEGIN { FS="\"" } { print $2 }'|tail -1`
-                     if test "x$linux_kvers" = "x"; then
-
-                       AC_MSG_ERROR(Linux headers lack version definition [2])
-                       exit 1
-                     else
-                       LINUX_VERSION="$linux_kvers"
-                      fi
-                    else
-                      AC_MSG_ERROR(Linux headers lack version definition)
-                     exit 1
-                   fi
-                 else
-                   LINUX_VERSION="$linux_kvers"
-                 fi
-                else
-                    enable_kernel_module="no"
-                 fi
-                if test ! -f "$LINUX_KERNEL_PATH/include/linux/autoconf.h"; then
-                    enable_kernel_module="no"
-                fi
-                if test "x$enable_kernel_module" = "xno"; then
-                 if test "x$with_linux_kernel_headers" != "x"; then
-                  AC_MSG_ERROR(No usable linux headers found at $LINUX_KERNEL_PATH)
-                  exit 1
-                 else
-                  AC_MSG_WARN(No usable linux headers found at $LINUX_KERNEL_PATH so disabling kernel module)
-                 fi
-                fi
-               fi
-               AC_MSG_RESULT(linux)
-               if test "x$enable_kernel_module" = "xyes"; then
-                LINUX_FS_STRUCT_INODE_HAS_I_BYTES
-                LINUX_FS_STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK
-                LINUX_FS_STRUCT_INODE_HAS_I_CDEV
-                LINUX_FS_STRUCT_INODE_HAS_I_TRUNCATE_SEM
-                LINUX_FS_STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS
-                LINUX_FS_STRUCT_INODE_HAS_I_MAPPING_OVERLOAD
-                LINUX_FS_STRUCT_INODE_HAS_I_MMAP_SHARED
-                LINUX_INODE_SETATTR_RETURN_TYPE
-                LINUX_NEED_RHCONFIG
-                LINUX_WHICH_MODULES
-                if test "x$ac_cv_linux_func_inode_setattr_returns_int" = "xyes" ; then
-                 AC_DEFINE(INODE_SETATTR_NOT_VOID)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_dirty_data_buffers" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_mmap_shared" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_MMAP_SHARED)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_mapping_overload" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_MAPPING_OVERLOAD)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_cdev" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_CDEV)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_truncate_sem" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_TRUNCATE_SEM)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_bytes" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_BYTES)
-                fi
-                if test "x$ac_cv_linux_fs_struct_address_space_has_page_lock" = "xyes"; then 
-                 AC_DEFINE(STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK)
-                fi
-                :
-               fi
-                ;;
-        *-solaris*)
-               MKAFS_OSTYPE=SOLARIS
-                AC_MSG_RESULT(sun4)
-               SOLARIS_UFSVFS_HAS_DQRWLOCK
-                ;;
-        *-hpux*)
-               MKAFS_OSTYPE=HPUX
-                AC_MSG_RESULT(hp_ux)
-                ;;
-        *-irix*)
-               MKAFS_OSTYPE=IRIX
-                AC_MSG_RESULT(sgi)
-                ;;
-        *-aix*)
-               MKAFS_OSTYPE=AIX
-                AC_MSG_RESULT(rs_aix)
-                ;;
-        *-osf*)
-               MKAFS_OSTYPE=DUX
-                AC_MSG_RESULT(alpha_dux)
-               if test "x$enable_kernel_module" = "xyes"; then
-                if test "x$with_dux_kernel_headers" != "x"; then
-                  HEADER_RT=`ls ${with_dux_kernel_headers}/rt_preempt.h | head -1 | sed 's,/rt_preempt.h,,;s,/usr/sys/,,'`
-                else
-                  HEADER_RT=`ls /usr/sys/*/rt_preempt.h | head -1 | sed 's,/rt_preempt.h,,;s,/usr/sys/,,'`
-                fi
-               fi
-               if test "$HEADER_RT" = "*" ; then
-                       AC_MSG_ERROR([Need a configured kernel directory])
-               fi
-               AC_SUBST([HEADER_RT])
-                ;;
-        *-darwin*)
-               MKAFS_OSTYPE=DARWIN
-                AC_MSG_RESULT(ppc_darwin)
-                ;;
-       *-freebsd*)
-               MKAFS_OSTYPE=FBSD
-               AC_MSG_RESULT(i386_fbsd)
-               ;;
-       *-openbsd*)
-               MKAFS_OSTYPE=OBSD
-               AC_MSG_RESULT(i386_obsd)
-               ;;
-        *)
-                AC_MSG_RESULT($system)
-                ;;
-esac
-
-if test "x$with_afs_sysname" != "x"; then
-        AFS_SYSNAME="$with_afs_sysname"
-else
-       AC_MSG_CHECKING(your AFS sysname)
-       case $host in
-               i?86-*-freebsd4.2*)
-                       AFS_SYSNAME="i386_fbsd_42"
-                       ;;
-               hppa*-hp-hpux11*)
-                       AFS_SYSNAME="hp_ux110"
-                       ;;
-               hppa*-hp-hpux10*)
-                       AFS_SYSNAME="hp_ux102"
-                       ;;
-               powerpc-apple-darwin1.2*)
-                       AFS_SYSNAME="ppc_darwin_12"
-                       DARWIN_PLIST=afs.${AFS_SYSNAME}.plist
-                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
-                       ;;
-               powerpc-apple-darwin1.3*)
-                       AFS_SYSNAME="ppc_darwin_13"
-                       DARWIN_PLIST=afs.${AFS_SYSNAME}.plist
-                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
-                       ;;
-               powerpc-apple-darwin1.4*)
-                       AFS_SYSNAME="ppc_darwin_14"
-                       DARWIN_PLIST=afs.${AFS_SYSNAME}.plist
-                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
-                       ;;
-               sparc-sun-solaris2.5*)
-                       AFS_SYSNAME="sun4x_55"
-                       ;;
-               sparc-sun-solaris2.6)
-                       AFS_SYSNAME="sun4x_56"
-                       ;;
-               sparc-sun-solaris2.7)
-                       AFS_SYSNAME="sun4x_57"
-                       ;;
-               sparc-sun-solaris2.8)
-                       AFS_SYSNAME="sun4x_58"
-                       ;;
-               alpha*-dec-osf4.0*)
-                       AFS_SYSNAME="alpha_dux40"
-                       ;;
-               alpha*-dec-osf5.0*)
-                       AFS_SYSNAME="alpha_dux50"
-                       ;;
-               mips-sgi-irix6.5)
-                       AFS_SYSNAME="sgi_65"
-                       ;;
-               ia64-*-linux*)
-                       AFS_SYSNAME="ia64_linuxXX"
-                       ;;
-               powerpc-*-linux*)
-                       AFS_SYSNAME="ppc_linuxXX"
-                       ;;
-               alpha*-linux*)
-                       AFS_SYSNAME="alpha_linux_XX"
-                       ;;
-               s390-*-linux*)
-                       AFS_SYSNAME="s390_linuxXX"
-                       ;;
-               sparc-*-linux*)
-                       AFS_SYSNAME="sparc_linuxXX"
-                       ;;
-               sparc64-*-linux*)
-                       AFS_SYSNAME="sparc64_linuxXX"
-                       ;;
-               i?86-*-linux*)
-                       AFS_SYSNAME="i386_linuxXX"
-                       ;;
-               power*-ibm-aix4.2*)
-                       AFS_SYSNAME="rs_aix42"
-                       ;;
-               power*-ibm-aix4.3*)
-                       AFS_SYSNAME="rs_aix42"
-                       ;;
-               *)
-                       AC_MSG_ERROR(An AFS sysname is required)
-                       exit 1
-                       ;;
-       esac
-       case $AFS_SYSNAME in
-               *_linux*)
-                       AFS_SYSKVERS=`echo $LINUX_VERSION | awk -F\. '{print $1 $2}'`
-                       if test "x${AFS_SYSKVERS}" = "x"; then
-                        AC_MSG_ERROR(Couldn't guess your Linux version. Please use the --with-afs-sysname option to configure an AFS sysname.)
-                       fi
-                       _AFS_SYSNAME=`echo $AFS_SYSNAME|sed s/XX\$/$AFS_SYSKVERS/`
-                       AFS_SYSNAME="$_AFS_SYSNAME"
-                       ;;
-       esac
-        AC_MSG_RESULT($AFS_SYSNAME)
-fi
-
-
-if test "x${MKAFS_OSTYPE}" = "xIRIX"; then
-        echo Skipping library tests because they confuse Irix.
-else
-  AC_CHECK_FUNCS(socket)
-
-  if test "$ac_cv_func_socket" = no; then
-    for lib in socket inet; do
-        if test "$HAVE_SOCKET" != 1; then
-                AC_CHECK_LIB(${lib}, socket,LIBS="$LIBS -l$lib";HAVE_SOCKET=1;AC_DEFINE(HAVE_SOCKET))
-        fi
-    done
-  fi
-  
-  AC_CHECK_FUNCS(connect)       
-
-  if test "$ac_cv_func_connect" = no; then
-    for lib in nsl; do
-        if test "$HAVE_CONNECT" != 1; then
-                AC_CHECK_LIB(${lib}, connect,LIBS="$LIBS -l$lib";HAVE_CONNECT=1;AC_DEFINE(HAVE_CONNECT))
-        fi
-    done
-  fi
-
-  AC_CHECK_FUNCS(gethostbyname)
-  if test "$ac_cv_func_gethostbyname" = no; then
-        for lib in dns nsl resolv; do
-          if test "$HAVE_GETHOSTBYNAME" != 1; then
-            AC_CHECK_LIB(${lib}, gethostbyname, LIBS="$LIBS -l$lib";HAVE_GETHOSTBYNAME=1;AC_DEFINE(HAVE_GETHOSTBYNAME))
-          fi
-        done    
-  fi    
-
-  AC_CHECK_FUNCS(res_search)
-  if test "$ac_cv_func_res_search" = no; then
-        for lib in dns nsl resolv; do
-          if test "$HAVE_RES_SEARCH" != 1; then
-            AC_CHECK_LIB(${lib}, res_search, LIBS="$LIBS -l$lib";HAVE_RES_SEARCH=1;AC_DEFINE(HAVE_RES_SEARCH))
-          fi
-        done    
-       if test "$HAVE_RES_SEARCH" = 1; then
-         LIB_res_search="-l$lib"       
-       fi
-  fi    
-fi
-
-PTHREAD_LIBS=error
-AC_CHECK_LIB(pthread, pthread_attr_init,
-             PTHREAD_LIBS="-lpthread")
-if test "x$PTHREAD_LIBS" = xerror; then
-        AC_CHECK_LIB(pthreads, pthread_attr_init,
-                PTHREAD_LIBS="-lpthreads")
-fi
-if test "x$PTHREAD_LIBS" = xerror; then
-        AC_CHECK_LIB(c_r, pthread_attr_init,
-                PTHREAD_LIBS="-lc_r")
-fi
-if test "x$PTHREAD_LIBS" = xerror; then
-        AC_CHECK_FUNC(pthread_attr_init, PTHREAD_LIBS="")
-fi
-if test "x$PTHREAD_LIBS" = xerror; then
-        AC_MSG_WARN(*** Unable to locate working posix thread library ***)
-fi
-AC_SUBST(PTHREAD_LIBS)
-
-WITH_OBSOLETE=NO
-if test "$enable_obsolete" = "yes"; then
-       WITH_OBSOLETE=YES
-fi
-
-WITH_INSECURE=NO
-if test "$enable_insecure" = "yes"; then
-       WITH_INSECURE=YES
-fi
-
-# Fast restart
-if test "$enable_fast_restart" = "yes"; then
-       AC_DEFINE(FAST_RESTART)
-fi
-
-if test "$enable_bitmap_later" = "yes"; then
-       AC_DEFINE(BITMAP_LATER)
-fi
-
-if test "$enable_full_vos_listvol_switch" = "yes"; then
-       AC_DEFINE(FULL_LISTVOL_SWITCH)
-fi
-
-if test "$enable_bos_restricted_mode" = "yes"; then
-       AC_DEFINE(BOS_RESTRICTED_MODE)
-fi
-
-if test "$enable_namei_fileserver" = "yes"; then
-       AC_DEFINE(AFS_NAMEI_ENV)
-fi
-
-if test "$enable_afsdb" = "yes"; then
-       LIB_AFSDB="$LIB_res_search"
-       AC_DEFINE(AFS_AFSDB_ENV)
-fi
+OPENAFS_CONFIGURE_COMMON
 
-SRCDIR_PARENT=`pwd`
 TOP_SRCDIR="${SRCDIR_PARENT}"
-DESTDIR="${SRCDIR_PARENT}/${AFS_SYSNAME}/dest/"
 TOP_INCDIR="${SRCDIR_PARENT}/include"
 TOP_LIBDIR="${SRCDIR_PARENT}/lib"
-
-dnl checks for header files.
-AC_HEADER_STDC
-AC_HEADER_SYS_WAIT
-AC_HEADER_DIRENT
-AC_CHECK_HEADERS(stdlib.h string.h unistd.h fcntl.h sys/time.h sys/file.h)
-AC_CHECK_HEADERS(netinet/in.h netdb.h sys/fcntl.h sys/mnttab.h sys/mntent.h)
-AC_CHECK_HEADERS(mntent.h sys/vfs.h sys/param.h sys/fs_types.h)
-AC_CHECK_HEADERS(sys/mount.h strings.h termios.h signal.h)
-AC_CHECK_HEADERS(windows.h malloc.h winsock2.h direct.h io.h)
-AC_CHECK_HEADERS(security/pam_modules.h siad.h usersec.h)
-
-AC_CHECK_FUNCS(utimes random srandom getdtablesize snprintf re_comp re_exec)
-
-dnl Directory PATH handling
-if test "x$enable_transarc_paths" = "xyes"  ; then 
-    afsconfdir=${afsconfdir=/usr/afs/etc}
-    viceetcdir=${viceetcdir=/usr/vice/etc}
-    afskerneldir=${afskerneldir=${viceetcdir}}
-    afssrvbindir=${afssrvbindir=/usr/afs/bin}
-    afssrvsbindir=${afssrvsbindir=/usr/afs/bin}
-    afssrvlibexecdir=${afssrvlibexecdir=/usr/afs/bin}
-    afsdbdir=${afsdbdir=/usr/afs/db}
-    afslogsdir=${afslogsdir=/usr/afs/logs}
-    afslocaldir=${afslocaldir=/usr/afs/local}
-    afsbackupdir=${afsbackupdir=/usr/afs/backup}
-    afsbosconfigdir=${afsbosconfigdir=/usr/afs/local}
-    else 
-    afsconfdir=${afsconfdir=$sysconfdir/openafs/server}
-    viceetcdir=${viceetcdir=$sysconfdir/openafs}
-    afskerneldir=${afskerneldir=$libdir/openafs}
-    afssrvbindir=${afssrvbindir=$bindir}
-    afssrvsbindir=${afssrvsbindir=$sbindir}
-    afssrvlibexecdir=${afssrvlibexecdir=$libexecdir/openafs}
-    afsdbdir=${afsdbdir=$localstatedir/openafs/db}
-    afslogsdir=${afslogsdir=$localstatedir/openafs/logs}
-    afslocaldir=${afslocaldir=$localstatedir/openafs}
-    afsbackupdir=${afsbackupdir=$localstatedir/openafs/backup}
-    afsbosconfigdir=${afsbosconfigdir=$sysconfdir/openafs}
-
+if test "${DEST}x" = "x"; then
+       DEST="${SRCDIR_PARENT}/${AFS_SYSNAME}/dest"
 fi
-AC_SUBST(afsconfdir)
-AC_SUBST(viceetcdir)
-AC_SUBST(afskerneldir)
-AC_SUBST(afssrvbindir)
-AC_SUBST(afssrvsbindir)
-AC_SUBST(afssrvlibexecdir)
-AC_SUBST(afsdbdir)
-AC_SUBST(afslogsdir)
-AC_SUBST(afslocaldir)
-AC_SUBST(afsbackupdir)
-AC_SUBST(afsbosconfigdir)
 
-if test "x$enable_kernel_module" = "xyes"; then
-ENABLE_KERNEL_MODULE=libafs
+# Check for files involved in porting.  Report errors, don't make the
+# user hunt through the configure log after the build fails!
+if test ! -r config/Makefile.${AFS_SYSNAME}.in ; then
+  AC_MSG_ERROR(no source file config/Makefile.${AFS_SYSNAME}.in)
 fi
 
-AC_SUBST(AFS_SYSNAME)
-AC_SUBST(ENABLE_KERNEL_MODULE)
-AC_SUBST(LIB_AFSDB)
-AC_SUBST(LINUX_KERNEL_PATH)
-AC_SUBST(LINUX_VERSION)
-AC_SUBST(MKAFS_OSTYPE)
-AC_SUBST(TOP_SRCDIR)
-AC_SUBST(TOP_INCDIR)
-AC_SUBST(TOP_LIBDIR)
-AC_SUBST(DEST)
-AC_SUBST(WITH_OBSOLETE)
-AC_SUBST(WITH_INSECURE)
-AC_SUBST(DARWIN_INFOFILE)
-
 AC_OUTPUT(             \
 Makefile               \
 config/Makefile.${AFS_SYSNAME} \
index bfe164be197b3a89786e95801ee60e67bf345874..919ac5c7795812a4494f547a315b9836a2558ead 100644 (file)
 AC_INIT(src/config/stds.h)
-AM_INIT_AUTOMAKE(openafs,1.2.1)
-AC_CANONICAL_HOST
+AM_INIT_AUTOMAKE(openafs,1.2.2)
 AC_CONFIG_HEADER(src/config/afsconfig.h)
 
-#BOZO_SAVE_CORES BOS_RESTRICTED_MODE BOS_NEW_CONFIG pam sia
-AC_ARG_WITH(afs-sysname,
-[  --with-afs-sysname=sys    use sys for the afs sysname]
-)
-AC_ARG_ENABLE( obsolete,
-[  --enable-obsolete                   enable obsolete portions of AFS (mpp, ntp and package)],, enable_obsolete="no")
-AC_ARG_ENABLE( insecure,
-[  --enable-insecure                   enable insecure portions of AFS (ftpd, inetd, rcp, rlogind and rsh)],, enable_insecure="no")
-AC_ARG_ENABLE( afsdb,
-[  --disable-afsdb                     disable AFSDB RR support],, enable_afsdb="yes")
-AC_ARG_ENABLE( bos-restricted-mode,
-[  --enable-bos-restricted-mode        enable bosserver restricted mode which disables certain bosserver functionality],, enable_bos_restricted_mode="no")
-AC_ARG_ENABLE( namei-fileserver,
-[  --enable-namei-fileserver           force compilation of namei fileserver in preference to inode fileserver],, enable_namei_fileserver="no")
-AC_ARG_ENABLE( fast-restart,
-[  --enable-fast-restart               enable fast startup of file server without salvaging],, enable_fast_restart="no")
-AC_ARG_ENABLE( bitmap-later,
-[  --enable-bitmap-later               enable fast startup of file server by not reading bitmap till needed],, enable_bitmap_later="no")
-AC_ARG_ENABLE( full-vos-listvol-switch,
-[  --enable-full-vos-listvol-switch     enable vos full listvol switch for formatted output],, enable_full_vos_listvol_switch="no")
-AC_ARG_WITH(dux-kernel-headers,
-[  --with-dux-kernel-headers=path      use the kernel headers found at path(optional, defaults to first match in /usr/sys)]
-)
-AC_ARG_WITH(linux-kernel-headers,
-[  --with-linux-kernel-headers=path            use the kernel headers found at path(optional, defaults to /usr/src/linux)]
-)
-AC_ARG_ENABLE(kernel-module,
-[  --disable-kernel-module                     disable compilation of the kernel module (defaults to enabled)],, enable_kernel_module="yes"
-)
-AC_ARG_ENABLE(redhat-buildsys,
-[  --enable-redhat-buildsys            enable compilation of the redhat build system kernel (defaults to disabled)],, enable_redhat_buildsys="no"
-)
-AC_ARG_ENABLE(transarc-paths,
-[  --enable-transarc-paths                     Use Transarc style paths like /usr/afs and /usr/vice],, enable_transarc_paths="no"
-)
-
-AC_PROG_CC
-
-dnl weird ass systems
-AC_AIX
-AC_ISC_POSIX
-AC_MINIX
-
-dnl Various compiler setup.
-AC_C_INLINE
-AC_C_CONST
-AC_TYPE_PID_T
-AC_TYPE_SIZE_T
-AC_TYPE_SIGNAL
-
-dnl Checks for programs.
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_RANLIB
-AC_PROG_YACC
-AM_PROG_LEX
-
-OPENAFS_CHECK_BIGENDIAN
-
-AC_MSG_CHECKING(your OS)
-system=$host
-case $system in
-        *-linux*)
-               MKAFS_OSTYPE=LINUX
-               if test "x$enable_redhat_buildsys" = "xyes"; then
-                AC_DEFINE(ENABLE_REDHAT_BUILDSYS)
-               fi
-               if test "x$enable_kernel_module" = "xyes"; then
-                if test "x$with_linux_kernel_headers" != "x"; then
-                  LINUX_KERNEL_PATH="$with_linux_kernel_headers"
-                else
-                  LINUX_KERNEL_PATH="/usr/src/linux"
-                fi
-                if test -f "$LINUX_KERNEL_PATH/include/linux/version.h"; then
-                 linux_kvers=`fgrep UTS_RELEASE $LINUX_KERNEL_PATH/include/linux/version.h |awk 'BEGIN { FS="\"" } { print $2 }'|tail -1`
-                 if test "x$linux_kvers" = "x"; then
-                   if test -f "$LINUX_KERNEL_PATH/include/linux/version-up.h"; then
-                     linux_kvers=`fgrep UTS_RELEASE $LINUX_KERNEL_PATH/include/linux/version-up.h |awk 'BEGIN { FS="\"" } { print $2 }'|tail -1`
-                     if test "x$linux_kvers" = "x"; then
-
-                       AC_MSG_ERROR(Linux headers lack version definition [2])
-                       exit 1
-                     else
-                       LINUX_VERSION="$linux_kvers"
-                      fi
-                    else
-                      AC_MSG_ERROR(Linux headers lack version definition)
-                     exit 1
-                   fi
-                 else
-                   LINUX_VERSION="$linux_kvers"
-                 fi
-                else
-                    enable_kernel_module="no"
-                 fi
-                if test ! -f "$LINUX_KERNEL_PATH/include/linux/autoconf.h"; then
-                    enable_kernel_module="no"
-                fi
-                if test "x$enable_kernel_module" = "xno"; then
-                 if test "x$with_linux_kernel_headers" != "x"; then
-                  AC_MSG_ERROR(No usable linux headers found at $LINUX_KERNEL_PATH)
-                  exit 1
-                 else
-                  AC_MSG_WARN(No usable linux headers found at $LINUX_KERNEL_PATH so disabling kernel module)
-                 fi
-                fi
-               fi
-               AC_MSG_RESULT(linux)
-               if test "x$enable_kernel_module" = "xyes"; then
-                LINUX_FS_STRUCT_INODE_HAS_I_BYTES
-                LINUX_FS_STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK
-                LINUX_FS_STRUCT_INODE_HAS_I_CDEV
-                LINUX_FS_STRUCT_INODE_HAS_I_TRUNCATE_SEM
-                LINUX_FS_STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS
-                LINUX_FS_STRUCT_INODE_HAS_I_MAPPING_OVERLOAD
-                LINUX_FS_STRUCT_INODE_HAS_I_MMAP_SHARED
-                LINUX_INODE_SETATTR_RETURN_TYPE
-                LINUX_NEED_RHCONFIG
-                LINUX_WHICH_MODULES
-                if test "x$ac_cv_linux_func_inode_setattr_returns_int" = "xyes" ; then
-                 AC_DEFINE(INODE_SETATTR_NOT_VOID)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_dirty_data_buffers" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_mmap_shared" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_MMAP_SHARED)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_mapping_overload" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_MAPPING_OVERLOAD)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_cdev" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_CDEV)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_truncate_sem" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_TRUNCATE_SEM)
-                fi
-                if test "x$ac_cv_linux_fs_struct_inode_has_i_bytes" = "xyes"; then 
-                 AC_DEFINE(STRUCT_INODE_HAS_I_BYTES)
-                fi
-                if test "x$ac_cv_linux_fs_struct_address_space_has_page_lock" = "xyes"; then 
-                 AC_DEFINE(STRUCT_ADDRESS_SPACE_HAS_PAGE_LOCK)
-                fi
-                :
-               fi
-                ;;
-        *-solaris*)
-               MKAFS_OSTYPE=SOLARIS
-                AC_MSG_RESULT(sun4)
-               SOLARIS_UFSVFS_HAS_DQRWLOCK
-                ;;
-        *-hpux*)
-               MKAFS_OSTYPE=HPUX
-                AC_MSG_RESULT(hp_ux)
-                ;;
-        *-irix*)
-               MKAFS_OSTYPE=IRIX
-                AC_MSG_RESULT(sgi)
-                ;;
-        *-aix*)
-               MKAFS_OSTYPE=AIX
-                AC_MSG_RESULT(rs_aix)
-                ;;
-        *-osf*)
-               MKAFS_OSTYPE=DUX
-                AC_MSG_RESULT(alpha_dux)
-               if test "x$enable_kernel_module" = "xyes"; then
-                if test "x$with_dux_kernel_headers" != "x"; then
-                  HEADER_RT=`ls ${with_dux_kernel_headers}/rt_preempt.h | head -1 | sed 's,/rt_preempt.h,,;s,/usr/sys/,,'`
-                else
-                  HEADER_RT=`ls /usr/sys/*/rt_preempt.h | head -1 | sed 's,/rt_preempt.h,,;s,/usr/sys/,,'`
-                fi
-               fi
-               if test "$HEADER_RT" = "*" ; then
-                       AC_MSG_ERROR([Need a configured kernel directory])
-               fi
-               AC_SUBST([HEADER_RT])
-                ;;
-        *-darwin*)
-               MKAFS_OSTYPE=DARWIN
-                AC_MSG_RESULT(ppc_darwin)
-                ;;
-       *-freebsd*)
-               MKAFS_OSTYPE=FBSD
-               AC_MSG_RESULT(i386_fbsd)
-               ;;
-       *-openbsd*)
-               MKAFS_OSTYPE=OBSD
-               AC_MSG_RESULT(i386_obsd)
-               ;;
-        *)
-                AC_MSG_RESULT($system)
-                ;;
-esac
-
-if test "x$with_afs_sysname" != "x"; then
-        AFS_SYSNAME="$with_afs_sysname"
-else
-       AC_MSG_CHECKING(your AFS sysname)
-       case $host in
-               i?86-*-freebsd4.2*)
-                       AFS_SYSNAME="i386_fbsd_42"
-                       ;;
-               hppa*-hp-hpux11*)
-                       AFS_SYSNAME="hp_ux110"
-                       ;;
-               hppa*-hp-hpux10*)
-                       AFS_SYSNAME="hp_ux102"
-                       ;;
-               powerpc-apple-darwin1.2*)
-                       AFS_SYSNAME="ppc_darwin_12"
-                       DARWIN_PLIST=src/libafs/afs.${AFS_SYSNAME}.plist
-                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
-                       ;;
-               powerpc-apple-darwin1.3*)
-                       AFS_SYSNAME="ppc_darwin_13"
-                       DARWIN_PLIST=src/libafs/afs.${AFS_SYSNAME}.plist
-                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
-                       ;;
-               powerpc-apple-darwin1.4*)
-                       AFS_SYSNAME="ppc_darwin_14"
-                       DARWIN_PLIST=src/libafs/afs.${AFS_SYSNAME}.plist
-                       DARWIN_INFOFILE=afs.${AFS_SYSNAME}.plist
-                       ;;
-               sparc-sun-solaris2.5*)
-                       AFS_SYSNAME="sun4x_55"
-                       ;;
-               sparc-sun-solaris2.6)
-                       AFS_SYSNAME="sun4x_56"
-                       ;;
-               sparc-sun-solaris2.7)
-                       AFS_SYSNAME="sun4x_57"
-                       ;;
-               sparc-sun-solaris2.8)
-                       AFS_SYSNAME="sun4x_58"
-                       ;;
-               alpha*-dec-osf4.0*)
-                       AFS_SYSNAME="alpha_dux40"
-                       ;;
-               alpha*-dec-osf5.0*)
-                       AFS_SYSNAME="alpha_dux50"
-                       ;;
-               mips-sgi-irix6.5)
-                       AFS_SYSNAME="sgi_65"
-                       ;;
-               ia64-*-linux*)
-                       AFS_SYSNAME="ia64_linuxXX"
-                       ;;
-               powerpc-*-linux*)
-                       AFS_SYSNAME="ppc_linuxXX"
-                       ;;
-               alpha*-linux*)
-                       AFS_SYSNAME="alpha_linux_XX"
-                       ;;
-               s390-*-linux*)
-                       AFS_SYSNAME="s390_linuxXX"
-                       ;;
-               sparc-*-linux*)
-                       AFS_SYSNAME="sparc_linuxXX"
-                       ;;
-               sparc64-*-linux*)
-                       AFS_SYSNAME="sparc64_linuxXX"
-                       ;;
-               i?86-*-linux*)
-                       AFS_SYSNAME="i386_linuxXX"
-                       ;;
-               power*-ibm-aix4.2*)
-                       AFS_SYSNAME="rs_aix42"
-                       ;;
-               power*-ibm-aix4.3*)
-                       AFS_SYSNAME="rs_aix42"
-                       ;;
-               *)
-                       AC_MSG_ERROR(An AFS sysname is required)
-                       exit 1
-                       ;;
-       esac
-       case $AFS_SYSNAME in
-               *_linux*)
-                       AFS_SYSKVERS=`echo $LINUX_VERSION | awk -F\. '{print $1 $2}'`
-                       if test "x${AFS_SYSKVERS}" = "x"; then
-                        AC_MSG_ERROR(Couldn't guess your Linux version. Please use the --with-afs-sysname option to configure an AFS sysname.)
-                       fi
-                       _AFS_SYSNAME=`echo $AFS_SYSNAME|sed s/XX\$/$AFS_SYSKVERS/`
-                       AFS_SYSNAME="$_AFS_SYSNAME"
-                       ;;
-       esac
-        AC_MSG_RESULT($AFS_SYSNAME)
-fi
-
-
-if test "x${MKAFS_OSTYPE}" = "xIRIX"; then
-        echo Skipping library tests because they confuse Irix.
-else
-  AC_CHECK_FUNCS(socket)
-
-  if test "$ac_cv_func_socket" = no; then
-    for lib in socket inet; do
-        if test "$HAVE_SOCKET" != 1; then
-                AC_CHECK_LIB(${lib}, socket,LIBS="$LIBS -l$lib";HAVE_SOCKET=1;AC_DEFINE(HAVE_SOCKET))
-        fi
-    done
-  fi
-  
-  AC_CHECK_FUNCS(connect)       
-
-  if test "$ac_cv_func_connect" = no; then
-    for lib in nsl; do
-        if test "$HAVE_CONNECT" != 1; then
-                AC_CHECK_LIB(${lib}, connect,LIBS="$LIBS -l$lib";HAVE_CONNECT=1;AC_DEFINE(HAVE_CONNECT))
-        fi
-    done
-  fi
-
-  AC_CHECK_FUNCS(gethostbyname)
-  if test "$ac_cv_func_gethostbyname" = no; then
-        for lib in dns nsl resolv; do
-          if test "$HAVE_GETHOSTBYNAME" != 1; then
-            AC_CHECK_LIB(${lib}, gethostbyname, LIBS="$LIBS -l$lib";HAVE_GETHOSTBYNAME=1;AC_DEFINE(HAVE_GETHOSTBYNAME))
-          fi
-        done    
-  fi    
-
-  AC_CHECK_FUNCS(res_search)
-  if test "$ac_cv_func_res_search" = no; then
-        for lib in dns nsl resolv; do
-          if test "$HAVE_RES_SEARCH" != 1; then
-            AC_CHECK_LIB(${lib}, res_search, LIBS="$LIBS -l$lib";HAVE_RES_SEARCH=1;AC_DEFINE(HAVE_RES_SEARCH))
-          fi
-        done    
-       if test "$HAVE_RES_SEARCH" = 1; then
-         LIB_res_search="-l$lib"       
-       fi
-  fi    
-fi
-
-PTHREAD_LIBS=error
-AC_CHECK_LIB(pthread, pthread_attr_init,
-             PTHREAD_LIBS="-lpthread")
-if test "x$PTHREAD_LIBS" = xerror; then
-        AC_CHECK_LIB(pthreads, pthread_attr_init,
-                PTHREAD_LIBS="-lpthreads")
-fi
-if test "x$PTHREAD_LIBS" = xerror; then
-        AC_CHECK_LIB(c_r, pthread_attr_init,
-                PTHREAD_LIBS="-lc_r")
-fi
-if test "x$PTHREAD_LIBS" = xerror; then
-        AC_CHECK_FUNC(pthread_attr_init, PTHREAD_LIBS="")
-fi
-if test "x$PTHREAD_LIBS" = xerror; then
-        AC_MSG_WARN(*** Unable to locate working posix thread library ***)
-fi
-AC_SUBST(PTHREAD_LIBS)
-
-WITH_OBSOLETE=NO
-if test "$enable_obsolete" = "yes"; then
-       WITH_OBSOLETE=YES
-fi
-
-WITH_INSECURE=NO
-if test "$enable_insecure" = "yes"; then
-       WITH_INSECURE=YES
-fi
-
-# Fast restart
-if test "$enable_fast_restart" = "yes"; then
-       AC_DEFINE(FAST_RESTART)
-fi
-
-if test "$enable_bitmap_later" = "yes"; then
-       AC_DEFINE(BITMAP_LATER)
-fi
-
-if test "$enable_full_vos_listvol_switch" = "yes"; then
-       AC_DEFINE(FULL_LISTVOL_SWITCH)
-fi
-
-if test "$enable_bos_restricted_mode" = "yes"; then
-       AC_DEFINE(BOS_RESTRICTED_MODE)
-fi
-
-if test "$enable_namei_fileserver" = "yes"; then
-       AC_DEFINE(AFS_NAMEI_ENV)
-fi
-
-if test "$enable_afsdb" = "yes"; then
-       LIB_AFSDB="$LIB_res_search"
-       AC_DEFINE(AFS_AFSDB_ENV)
-fi
+OPENAFS_CONFIGURE_COMMON
 
-SRCDIR_PARENT=`pwd`
 TOP_SRCDIR="${SRCDIR_PARENT}/src"
 TOP_INCDIR="${SRCDIR_PARENT}/include"
 TOP_LIBDIR="${SRCDIR_PARENT}/lib"
-DEST="${SRCDIR_PARENT}/${AFS_SYSNAME}/dest"
-
-dnl checks for header files.
-AC_HEADER_STDC
-AC_HEADER_SYS_WAIT
-AC_HEADER_DIRENT
-AC_CHECK_HEADERS(stdlib.h string.h unistd.h fcntl.h sys/time.h sys/file.h)
-AC_CHECK_HEADERS(netinet/in.h netdb.h sys/fcntl.h sys/mnttab.h sys/mntent.h)
-AC_CHECK_HEADERS(mntent.h sys/vfs.h sys/param.h sys/fs_types.h)
-AC_CHECK_HEADERS(sys/mount.h strings.h termios.h signal.h)
-AC_CHECK_HEADERS(windows.h malloc.h winsock2.h direct.h io.h)
-AC_CHECK_HEADERS(security/pam_modules.h siad.h usersec.h)
-
-AC_CHECK_FUNCS(utimes random srandom getdtablesize snprintf re_comp re_exec)
-
-dnl Directory PATH handling
-if test "x$enable_transarc_paths" = "xyes"  ; then 
-    afsconfdir=${afsconfdir=/usr/afs/etc}
-    viceetcdir=${viceetcdir=/usr/vice/etc}
-    afskerneldir=${afskerneldir=${viceetcdir}}
-    afssrvbindir=${afssrvbindir=/usr/afs/bin}
-    afssrvsbindir=${afssrvsbindir=/usr/afs/bin}
-    afssrvlibexecdir=${afssrvlibexecdir=/usr/afs/bin}
-    afsdbdir=${afsdbdir=/usr/afs/db}
-    afslogsdir=${afslogsdir=/usr/afs/logs}
-    afslocaldir=${afslocaldir=/usr/afs/local}
-    afsbackupdir=${afsbackupdir=/usr/afs/backup}
-    afsbosconfigdir=${afsbosconfigdir=/usr/afs/local}
-    else 
-    afsconfdir=${afsconfdir=$sysconfdir/openafs/server}
-    viceetcdir=${viceetcdir=$sysconfdir/openafs}
-    afskerneldir=${afskerneldir=$libdir/openafs}
-    afssrvbindir=${afssrvbindir=$bindir}
-    afssrvsbindir=${afssrvsbindir=$sbindir}
-    afssrvlibexecdir=${afssrvlibexecdir=$libexecdir/openafs}
-    afsdbdir=${afsdbdir=$localstatedir/openafs/db}
-    afslogsdir=${afslogsdir=$localstatedir/openafs/logs}
-    afslocaldir=${afslocaldir=$localstatedir/openafs}
-    afsbackupdir=${afsbackupdir=$localstatedir/openafs/backup}
-    afsbosconfigdir=${afsbosconfigdir=$sysconfdir/openafs}
-
+if test "${DEST}x" = "x"; then
+       DEST="${SRCDIR_PARENT}/${AFS_SYSNAME}/dest"
 fi
-AC_SUBST(afsconfdir)
-AC_SUBST(viceetcdir)
-AC_SUBST(afskerneldir)
-AC_SUBST(afssrvbindir)
-AC_SUBST(afssrvsbindir)
-AC_SUBST(afssrvlibexecdir)
-AC_SUBST(afsdbdir)
-AC_SUBST(afslogsdir)
-AC_SUBST(afslocaldir)
-AC_SUBST(afsbackupdir)
-AC_SUBST(afsbosconfigdir)
 
-if test "x$enable_kernel_module" = "xyes"; then
-ENABLE_KERNEL_MODULE=libafs
+# Check for files involved in porting.  Report errors, don't make the
+# user hunt through the configure log after the build fails!
+if test ! -r src/config/Makefile.${AFS_SYSNAME}.in ; then
+  AC_MSG_ERROR(no source file src/config/Makefile.${AFS_SYSNAME}.in)
 fi
 
-AC_SUBST(AFS_SYSNAME)
-AC_SUBST(ENABLE_KERNEL_MODULE)
-AC_SUBST(LIB_AFSDB)
-AC_SUBST(LINUX_KERNEL_PATH)
-AC_SUBST(LINUX_VERSION)
-AC_SUBST(MKAFS_OSTYPE)
-AC_SUBST(TOP_SRCDIR)
-AC_SUBST(TOP_INCDIR)
-AC_SUBST(TOP_LIBDIR)
-AC_SUBST(DEST)
-AC_SUBST(WITH_OBSOLETE)
-AC_SUBST(WITH_INSECURE)
-AC_SUBST(DARWIN_INFOFILE)
-
 AC_OUTPUT(             \
 Makefile               \
 src/afs/Makefile \
index e0316f8d4841f77be61987447a9ca394ec7f9078..23f2dceb1bbe216d02c4cdbda72329ca6d4d6274 100644 (file)
@@ -4,7 +4,10 @@
 
 OBJ = $(SYS_NAME)/obj
 DEST = $(SYS_NAME)/dest
+DESTDIR = DEST/
+SRCDIR = ${DESTDIR}
 #LINUX_SYS = i386_linux22
+TOP_SRCDIR = `pwd`/src
 
 all: afsd
 
index 2e766745d5e146dbbf7d0bb0811c91fcae9f275e..8fb98427d89c5f1c75f0054669669bf39789f122 100644 (file)
@@ -179,7 +179,13 @@ sys: cm_headers
        $(NTMAKE)
        $(CD) ..\..
 
-auth: sys
+afsdobjs: sys
+     echo ***** $@
+     $(CD) $(OBJ)\WINNT\afsd
+     $(NTMAKE_OBJS)
+     $(CD) ..\..\..
+
+auth: afsdobjs
      echo ***** $@
        $(CD) $(OBJ)\$@
        $(NTMAKE)
index 268119af63623f2753fa379c31ed657d216649ea..07cc29a8fceedd15a7cc3b035b64f03de84a1a78 100644 (file)
@@ -21,6 +21,7 @@ CD = cd
 NTMAKE = nmake /nologo /f ntmakefile install
 NTMAKELANG = nmake /nologo /f ntmakefile en_US
 NTMAKE_HEADERS = nmake /nologo /f ntmakefile install_headers
+NTMAKE_OBJS = nmake /nologo /f ntmakefile install_objs
 MKDIR = mkdir
 OBJ = src
 
@@ -178,7 +179,13 @@ sys: cm_headers
        $(NTMAKE)
        $(CD) ..\..
 
-auth: sys
+afsdobjs: sys
+     echo ***** $@
+       $(CD) $(OBJ)\WINNT\afsd
+       $(NTMAKE_OBJS)
+       $(CD) ..\..\..
+
+auth: afsdobjs
      echo ***** $@
        $(CD) $(OBJ)\$@
        $(NTMAKE)
index 678857356660f8e9205947a21e149f7a268d49d5..88488749b03209bd9ae89e34b5fb7bd9ab1c0742 100644 (file)
@@ -9,7 +9,8 @@ SOURCES    = afsd95.c afsd_init95.c cm_access.c cm_aclent.c cm_buf.c \
                cm_dcache.c cm_dir.c cm_dnlc.c cm_ioctl.c cm_scache.c \
                cm_server.c cm_user.c cm_utils.c cm_vnodeops.c cm_volume.c \
                dosutils95.c largeint95.c netbios95.c smb.c smb_ioctl.c \
-               cm_diskcache95.c queue95.c afsmsg95.c smb3.c
+               cm_diskcache95.c queue95.c afsmsg95.c smb3.c cm_dns.c \
+               cm_freelance.c
 
 include ../../config/Makefile.djgpp.common
 
@@ -24,7 +25,7 @@ all : $(TARGETS)
 install : $(DESTBIN)/afsd.exe #$(DESTBIN)/klog.exe
 #CFLAGS += -I../vxd_lib
 #CFLAGS += -DAFS_VXD
-CFLAGS += -DDOS_PKT_WHOLE
+CFLAGS += -DDOS_PKT_WHOLE -DAFS_AFSDB_ENV -DAFS_FREELANCE_CLIENT
 
 INCFILES = \
         $(DESTINC)/netbios95.h \
index e8e33daaa360e19b1d173ad62eac083b2631a1d1..4e5af5afc7f36da16e0bebd6fa003ea141c39e95 100644 (file)
@@ -36,12 +36,15 @@ INCFILES =\
        $(INCFILEDIR)\smb_iocons.h \
        $(INCFILEDIR)\smb_ioctl.h \
        $(INCFILEDIR)\afsmsg95.h \
-       $(INCFILEDIR)\afsrpc.h
+       $(INCFILEDIR)\afsrpc.h \
+       $(INCFILEDIR)\cm_dns.h \
+       $(INCFILEDIR)\cm_dns_private.h
 
 IDLFILES =\
        afsrpc.h afsrpc_c.obj
 
-CONFOBJS=cm_config.obj
+CONFOBJS=cm_config.obj \
+         cm_dns.obj
 
 AFSDOBJS=\
        afsd_init.obj \
@@ -66,7 +69,8 @@ AFSDOBJS=\
        cm_aclent.obj \
        cm_dnlc.obj \
        cm_rpc.obj \
-       afsrpc_s.obj
+       afsrpc_s.obj \
+     cm_freelance.obj
 
 cm_conn.obj: cm_conn.c
        $(C2OBJ) -DAFS_PTHREAD_ENV $**
@@ -153,6 +157,10 @@ $(LOG95_DLLFILE): $(LOG95_DLLOBJS)
 ############################################################################
 # Install target; primary makefile target
 
+install_objs: cm_dns.obj cm_config.obj
+     $(COPY) cm_dns.obj $(DESTDIR)\lib
+     $(COPY) cm_config.obj $(DESTDIR)\lib
+
 install_headers: $(IDLFILES) $(INCFILES)
 
 install: install_headers $(CONF_DLLFILE) \
index 0c6f59fde3684bc55c50f5e3f753d620fd649497..6456c713999e23c47b1ca36f9a075445a3d5f6df 100644 (file)
@@ -35,7 +35,7 @@ BOOL APIENTRY About(HWND, unsigned int, unsigned int, long);
 
 #include "krb.h"
 #include "krb_prot.h"
-#include <crypt.h>
+/*#include <crypt.h>*/
 #include <afs/prs_fs.h>
 
 #include <osi.h>
@@ -60,6 +60,7 @@ BOOL APIENTRY About(HWND, unsigned int, unsigned int, long);
 #include "cm_ioctl.h"
 #include "cm_dnlc.h"
 #include "cm_buf.h"
+#include "cm_freelance.h"
 #ifdef DJGPP
 #include "afs/afsmsg95.h"
 #endif
@@ -96,4 +97,30 @@ extern BOOL isGateway;
 
 extern BOOL reportSessionStartups;
 
+#ifdef AFS_FREELANCE_CLIENT
+
+// yj: Variables used by Freelance Client
+extern char *cm_FakeRootDir;                                           // the fake root.afs directory
+
+extern int cm_noLocalMountPoints;                                      // no. of fake mountpoints
+
+extern cm_localMountPoint_t* cm_localMountPoints;      // array of fake mountpoints
+
+extern int cm_fakeDirSize;                                                     // size (in bytes) of fake root.afs directory
+
+extern int cm_fakeDirCallback;                                         // state of the fake root.afs directory. indicates
+                                                                                                       // if it needs to be refreshed
+
+extern int cm_fakeGettingCallback;                                     // 1 if currently updating the fake root.afs directory,
+                                                                                                       // 0 otherwise
+
+extern int cm_fakeDirVersion;                                          // the version number of the root.afs directory. used 
+                                                                                                       // invalidate all the buffers containing root.afs data
+                                                                                                       // after reinitialization
+// ------------------------------------------
+#endif /* AFS_FREELANCE_CLIENT */
+
+extern int cm_dnsEnabled;
+extern int cm_freelanceEnabled;
+
 #endif /* AFSD_H_ENV */
index 3aa6bc7d0c0a9563cd6dbe374568ac246ffe577a..75cd53ae1f414f27d6f41d2dbdc426b5851f9a4f 100644 (file)
@@ -95,6 +95,8 @@ int main(int argc, char *argv[])
     cmd_AddParm(ts, "-tracebuf", CMD_SINGLE, CMD_OPTIONAL, "trace buffer size");
     cmd_AddParm(ts, "-startup", CMD_FLAG, CMD_OPTIONAL, "start AFS client");
     cmd_AddParm(ts, "-diskcache", CMD_SINGLE, CMD_OPTIONAL, "diskcache size");
+    cmd_AddParm(ts, "-afsdb", CMD_FLAG, CMD_OPTIONAL, "use DNS for cell server resolution");
+    cmd_AddParm(ts, "-freelance", CMD_FLAG, CMD_OPTIONAL, "virtual AFS root");
 
     return (cmd_Dispatch(argc, argv));
 }
index 48cecb4afee62df8d93ded48d2f12e5c1f62ba51..a09e4c14476ceea011bf13b0780b58aadd0b6d71 100644 (file)
@@ -48,6 +48,9 @@ char cm_mountRoot[1024];
 DWORD cm_mountRootLen;
 int cm_logChunkSize;
 int cm_chunkSize;
+#ifdef AFS_FREELANCE_CLIENT
+char *cm_FakeRootDir;
+#endif /* freelance */
 
 int smb_UseV3;
 
@@ -82,6 +85,16 @@ cm_initparams_v1 cm_initParams;
 
 HANDLE afsi_file;
 
+#ifdef AFS_AFSDB_ENV
+int cm_dnsEnabled = 1;
+#endif
+
+/*#ifdef AFS_FREELANCE_CLIENT
+extern int cm_freelanceEnabled;
+#endif*/
+
+void cm_InitFakeRootDir();
+
 void
 afsi_start()
 {
@@ -167,6 +180,7 @@ int afsd_InitCM(char **reasonP)
        HKEY parmKey;
        DWORD dummyLen;
        long code;
+       /*int freelanceEnabled;*/
        WSADATA WSAjunk;
 
        WSAStartup(0x0101, &WSAjunk);
@@ -392,6 +406,32 @@ int afsd_InitCM(char **reasonP)
                afsi_log("Default SecurityLevel is clear");
        }
 
+#ifdef AFS_AFSDB_ENV
+       dummyLen = sizeof(cm_dnsEnabled);
+       code = RegQueryValueEx(parmKey, "UseDNS", NULL, NULL,
+                               (BYTE *) &cm_dnsEnabled, &dummyLen);
+       if (code == ERROR_SUCCESS) {
+               afsi_log("DNS %s be used to find AFS cell servers",
+                        cm_dnsEnabled ? "will" : "will not");
+       }
+       else {
+         cm_dnsEnabled = 1;   /* default on */
+       }
+#endif /* AFS_AFSDB_ENV */
+
+#ifdef AFS_FREELANCE_CLIENT
+       dummyLen = sizeof(cm_freelanceEnabled);
+       code = RegQueryValueEx(parmKey, "FreelanceClient", NULL, NULL,
+                               (BYTE *) &cm_freelanceEnabled, &dummyLen);
+       if (code == ERROR_SUCCESS) {
+               afsi_log("Freelance client feature %s activated",
+                        cm_freelanceEnabled ? "is" : "is not");
+       }
+       else {
+         cm_freelanceEnabled = 0;  /* default off */
+       }
+#endif /* AFS_FREELANCE_CLIENT */
+
        RegCloseKey (parmKey);
 
        /* setup early variables */
@@ -497,20 +537,35 @@ int afsd_InitCM(char **reasonP)
                return -1;
        }
 
+#ifdef AFS_AFSDB_ENV
+       if (cm_InitDNS(cm_dnsEnabled) == -1)
+         cm_dnsEnabled = 0;  /* init failed, so deactivate */
+       afsi_log("cm_InitDNS %d", cm_dnsEnabled);
+#endif
+
        code = cm_GetRootCellName(rootCellName);
        afsi_log("cm_GetRootCellName code %d rcn %s", code,
                 (code ? "<none>" : rootCellName));
-       if (code != 0) {
-               *reasonP = "can't find root cell name in afsd.ini";
-               return -1;
+       if (code != 0 && !cm_freelanceEnabled) {
+           *reasonP = "can't find root cell name in afsd.ini";
+           return -1;
+        }
+        else if (cm_freelanceEnabled)
+          cm_rootCellp = NULL;
+
+        if (code == 0 && !cm_freelanceEnabled) {
+         cm_rootCellp = cm_GetCell(rootCellName, CM_FLAG_CREATE);
+          afsi_log("cm_GetCell addr %x", cm_rootCellp);
+         if (cm_rootCellp == NULL) {
+           *reasonP = "can't find root cell in afsdcell.ini";
+           return -1;
+         }
        }
 
-       cm_rootCellp = cm_GetCell(rootCellName, CM_FLAG_CREATE);
-       afsi_log("cm_GetCell addr %x", cm_rootCellp);
-       if (cm_rootCellp == NULL) {
-               *reasonP = "can't find root cell in afsdcell.ini";
-               return -1;
-       }
+#ifdef AFS_FREELANCE_CLIENT
+       if (cm_freelanceEnabled)
+         cm_InitFreelance();
+#endif
 
        return 0;
 }
@@ -524,19 +579,26 @@ int afsd_InitDaemons(char **reasonP)
 
        /* this should really be in an init daemon from here on down */
 
-       code = cm_GetVolumeByName(cm_rootCellp, cm_rootVolumeName, cm_rootUserp,                &req, CM_FLAG_CREATE, &cm_rootVolumep);
-       afsi_log("cm_GetVolumeByName code %x root vol %x", code,
-                (code ? 0xffffffff : cm_rootVolumep));
-       if (code != 0) {
-               *reasonP = "can't find root volume in root cell";
-               return -1;
+        if (!cm_freelanceEnabled) {
+          code = cm_GetVolumeByName(cm_rootCellp, cm_rootVolumeName, cm_rootUserp,
+                                    &req, CM_FLAG_CREATE, &cm_rootVolumep);
+          afsi_log("cm_GetVolumeByName code %x root vol %x", code,
+                   (code ? 0xffffffff : cm_rootVolumep));
+          if (code != 0) {
+            *reasonP = "can't find root volume in root cell";
+            return -1;
+          }
         }
 
-        /* compute the root fid */
-       cm_rootFid.cell = cm_rootCellp->cellID;
-        cm_rootFid.volume = cm_GetROVolumeID(cm_rootVolumep);
-        cm_rootFid.vnode = 1;
-        cm_rootFid.unique = 1;
+       /* compute the root fid */
+       if (!cm_freelanceEnabled) {
+         cm_rootFid.cell = cm_rootCellp->cellID;
+         cm_rootFid.volume = cm_GetROVolumeID(cm_rootVolumep);
+         cm_rootFid.vnode = 1;
+         cm_rootFid.unique = 1;
+       }
+       else
+         cm_FakeRootFid(&cm_rootFid);
         
         code = cm_GetSCache(&cm_rootFid, &cm_rootSCachep, cm_rootUserp, &req);
        afsi_log("cm_GetSCache code %x scache %x", code,
@@ -575,3 +637,4 @@ int afsd_InitSMB(char **reasonP, void *aMBfunc)
 
        return 0;
 }
+
index 602255fa6e497cb3d89fa07cc23171da7e354c69..cdd9ffeb51b98fa41f2a3d6d361cd066586cd617 100644 (file)
@@ -47,6 +47,14 @@ int cm_chunkSize;
 int afs_diskCacheChunks;
 char cm_cachePath[128];
 int cm_diskCacheEnabled = 0;
+#ifdef AFS_AFSDB_ENV
+extern int cm_dnsEnabled;
+#endif
+
+#ifdef AFS_FREELANCE_CLIENT
+extern int cm_freelanceEnabled;
+char *cm_FakeRootDir;
+#endif /* freelance */
 
 int smb_UseV3;
 
@@ -84,6 +92,7 @@ BOOL reportSessionStartups = FALSE;
 int afsd_debug;
 cm_initparams_v1 cm_initParams;
 
+
 /*
  * AFSD Initialization Log
  *
@@ -555,6 +564,16 @@ int afsd_InitCM(char **reasonP, struct cmd_syndesc *as, char *arock)
           afsi_log("Default disk cache size %d", diskCacheSize);
         }
 
+        if (as->parms[22].items) {
+           /* -noafsdb */
+           cm_dnsEnabled = 0;
+        }
+
+        if (as->parms[23].items) {
+           /* -freelance */
+           cm_freelanceEnabled = 1;
+        }
+
         if (ParseCacheInfoFile()) {
           exit(1);
         }
@@ -638,6 +657,13 @@ int afsd_InitCM(char **reasonP, struct cmd_syndesc *as, char *arock)
         rx_StartServer(0);
        afsi_log("rx_StartServer");
 
+#ifdef AFS_AFSDB_ENV
+       /* initialize dns lookup */
+       if (cm_InitDNS(cm_dnsEnabled) == -1)
+         cm_dnsEnabled = 0;  /* init failed, so deactivate */
+       afsi_log("cm_InitDNS %d", cm_dnsEnabled);
+#endif
+
        /* init user daemon, and other packages */
        cm_InitUser();
 
@@ -670,18 +696,27 @@ int afsd_InitCM(char **reasonP, struct cmd_syndesc *as, char *arock)
        code = cm_GetRootCellName(rootCellName);
        afsi_log("cm_GetRootCellName code %d rcn %s", code,
                 (code ? "<none>" : rootCellName));
-       if (code != 0) {
+       if (code != 0 && !cm_freelanceEnabled) {
                *reasonP = "can't find root cell name in ThisCell";
                return -1;
        }
-
-       cm_rootCellp = cm_GetCell(rootCellName, CM_FLAG_CREATE);
-       afsi_log("cm_GetCell addr %x", cm_rootCellp);
-       if (cm_rootCellp == NULL) {
-               *reasonP = "can't find root cell in CellServDB";
-               return -1;
+       else if (cm_freelanceEnabled)
+         cm_rootCellp = NULL;
+       
+       if (code == 0 && !cm_freelanceEnabled) {
+         cm_rootCellp = cm_GetCell(rootCellName, CM_FLAG_CREATE);
+         afsi_log("cm_GetCell addr %x", cm_rootCellp);
+         if (cm_rootCellp == NULL) {
+           *reasonP = "can't find root cell in CellServDB";
+           return -1;
+         }
        }
 
+#ifdef AFS_FREELANCE_CLIENT
+       if (cm_freelanceEnabled)
+         cm_InitFreelance();
+#endif
+
        return 0;
 }
 
@@ -694,19 +729,25 @@ int afsd_InitDaemons(char **reasonP)
 
        /* this should really be in an init daemon from here on down */
 
-       code = cm_GetVolumeByName(cm_rootCellp, cm_rootVolumeName, cm_rootUserp,                &req, CM_FLAG_CREATE, &cm_rootVolumep);
-       afsi_log("cm_GetVolumeByName code %x root vol %x", code,
-                (code ? 0xffffffff : cm_rootVolumep));
-       if (code != 0) {
-               *reasonP = "can't find root volume in root cell";
-               return -1;
-        }
+       if (!cm_freelanceEnabled) { 
+         code = cm_GetVolumeByName(cm_rootCellp, cm_rootVolumeName, cm_rootUserp,              &req, CM_FLAG_CREATE, &cm_rootVolumep);
+         afsi_log("cm_GetVolumeByName code %x root vol %x", code,
+                  (code ? 0xffffffff : cm_rootVolumep));
+         if (code != 0) {
+           *reasonP = "can't find root volume in root cell";
+           return -1;
+         }
+       }
 
         /* compute the root fid */
-       cm_rootFid.cell = cm_rootCellp->cellID;
-        cm_rootFid.volume = cm_GetROVolumeID(cm_rootVolumep);
-        cm_rootFid.vnode = 1;
-        cm_rootFid.unique = 1;
+       if (!cm_freelanceEnabled) {
+         cm_rootFid.cell = cm_rootCellp->cellID;
+         cm_rootFid.volume = cm_GetROVolumeID(cm_rootVolumep);
+         cm_rootFid.vnode = 1;
+         cm_rootFid.unique = 1;
+       }
+       else
+         cm_FakeRootFid(&cm_rootFid);
         
         code = cm_GetSCache(&cm_rootFid, &cm_rootSCachep, cm_rootUserp, &req);
        afsi_log("cm_GetSCache code %x scache %x", code,
@@ -744,3 +785,4 @@ int afsd_InitSMB(char **reasonP)
 
        return 0;
 }
+
index f00938a4b19e112d275e40e4ce828e0b524fdec2..959b35ade5530ed68679c1367073e4ed6b4322a7 100644 (file)
 /* read/write lock for all global storage in this module */
 osi_rwlock_t cm_callbackLock;
 
+/*
+#ifdef AFS_FREELANCE_CLIENT
+extern int cm_fakeDirCallback;
+extern int cm_fakeGettingCallback;
+#endif
+*/
+#ifdef AFS_FREELANCE_CLIENT
+extern osi_mutex_t cm_Freelance_Lock;
+#endif
+
 /* count of # of callback breaking messages received by this CM so far.  We use
  * this count in determining whether there have been any callback breaks that
  * apply to a call that returned a new callback.  If the counter doesn't
@@ -568,9 +578,50 @@ void cm_InitCallback(void)
  */
 int cm_HaveCallback(cm_scache_t *scp)
 {
-       if (scp->cbServerp != NULL)
-               return 1;
-       else return 0;
+#ifdef AFS_FREELANCE_CLIENT
+    // yj: we handle callbacks specially for callbacks on the root directory
+    // Since it's local, we almost always say that we have callback on it
+    // The only time we send back a 0 is if we're need to initialize or
+    // reinitialize the fake directory
+
+    // There are 2 state variables cm_fakeGettingCallback and cm_fakeDirCallback
+    // cm_fakeGettingCallback is 1 if we're in the process of initialization and
+    // hence should return false. it's 0 otherwise
+    // cm_fakeDirCallback is 0 if we haven't loaded the fake directory, it's 1
+    // if the fake directory is loaded and this is the first time cm_HaveCallback
+    // is called since then. We return false in this case to allow cm_GetCallback
+    // to be called because cm_GetCallback has some initialization work to do.
+    // If cm_fakeDirCallback is 2, then it means that the fake directory is in
+    // good shape and we simply return true, provided no change is detected.
+  int fdc, fgc;
+
+    if (cm_freelanceEnabled && scp->fid.cell==0x1 && scp->fid.volume==0x20000001) {    // if it's something on /afs
+       if (!(scp->fid.vnode==0x1 && scp->fid.unique==0x1))     // if it's not root.afs
+           return 1;
+       else {
+           lock_ObtainMutex(&cm_Freelance_Lock);
+           fdc = cm_fakeDirCallback;
+           fgc = cm_fakeGettingCallback;
+           lock_ReleaseMutex(&cm_Freelance_Lock);
+           
+           if (fdc==1) {       // first call since init
+               return 0;
+           } else if (fdc==2 && !fgc) {        // we're in good shape
+               if (cm_getLocalMountPointChange()) {    // check for changes
+                   cm_clearLocalMountPointChange(); // clear the changefile
+                   cm_reInitLocalMountPoints();        // start reinit
+                   return 0;
+               }
+               return 1;                       // no change
+           }
+           return 0;
+       }
+    }
+#endif
+
+    if (scp->cbServerp != NULL)
+       return 1;
+    else return 0;
 }
 
 /* need to detect a broken callback that races with our obtaining a callback.
@@ -694,6 +745,43 @@ long cm_GetCallback(cm_scache_t *scp, struct cm_user *userp,
         int mustCall;
         long sflags;
 
+#ifdef AFS_FREELANCE_CLIENT
+       // yj
+       // The case where a callback is needed on /afs is handled
+       // specially. We need to fetch the status by calling
+       // cm_MergeStatus and mark that cm_fakeDirCallback is 2
+       if (cm_freelanceEnabled &&
+          scp->fid.cell==0x1 &&
+               scp->fid.volume==0x20000001 &&
+               scp->fid.unique==0x1 &&
+               scp->fid.vnode==0x1) {
+               // Start by indicating that we're in the process
+               // of fetching the callback
+
+               lock_ObtainMutex(&cm_Freelance_Lock);
+               cm_fakeGettingCallback = 1;
+               lock_ReleaseMutex(&cm_Freelance_Lock);
+
+               // Fetch the status info 
+               cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0);
+
+               // Indicate that the callback is not done
+               lock_ObtainMutex(&cm_Freelance_Lock);
+               cm_fakeDirCallback = 2;
+               // Indicate that we're no longer fetching the callback
+               cm_fakeGettingCallback = 0;
+               lock_ReleaseMutex(&cm_Freelance_Lock);
+
+               return 0;
+       }
+
+       /*if (scp->fid.cell==0x1 && scp->fid.volume==0x20000001) {
+               afsi_log("cm_getcallback should NEVER EVER get here... ");
+       }*/
+       // yj: end of getcallback modifications  ---------------
+               
+#endif /* AFS_FREELANCE_CLIENT */
+       
        mustCall = (flags & 1);
        cm_AFSFidFromFid(&tfid, &scp->fid);
        while (1) {
index b8317ebed9b5ad3914f4236e5a993cb5adedbf93..5ef16bc9a6328dd896884a59ff696892e2fce3f4 100644 (file)
@@ -60,20 +60,38 @@ cm_cell_t *cm_GetCell(char *namep, long flags)
        cm_cell_t *cp;
         long code;
         static cellCounter = 1;                /* locked by cm_cellLock */
+       int ttl;
 
        lock_ObtainWrite(&cm_cellLock);
        for(cp = cm_allCellsp; cp; cp=cp->nextp) {
                if (strcmp(namep, cp->namep) == 0) break;
         }
-       if (!cp && (flags & CM_FLAG_CREATE)) {
-               cp = malloc(sizeof(*cp));
+
+       if ((!cp && (flags & CM_FLAG_CREATE))
+#ifdef AFS_AFSDB_ENV
+           /* if it's from DNS, see if it has expired */
+           || (cp && (cp->flags & CM_CELLFLAG_DNS) && (time(0) > cp->timeout))
+#endif
+         ) {
+               if (!cp) cp = malloc(sizeof(*cp));
                 memset(cp, 0, sizeof(*cp));
                 code = cm_SearchCellFile(namep, NULL, cm_AddCellProc, cp);
-                if (code) {
-                       free(cp);
-                        cp = NULL;
-                        goto done;
-                }
+#ifdef AFS_AFSDB_ENV
+                if (code && cm_dnsEnabled) {
+                  code = cm_SearchCellByDNS(namep, NULL, &ttl, cm_AddCellProc, cp);
+#endif
+                 if (code) {
+                   free(cp);
+                   cp = NULL;
+                   goto done;
+                 }
+#ifdef AFS_AFSDB_ENV
+                 else {   /* got cell from DNS */
+                   cp->flags |= CM_CELLFLAG_DNS;
+                   cp->timeout = time(0) + ttl;
+                 }
+               }
+#endif
 
                /* randomise among those vlservers having the same rank*/ 
                cm_RandomizeServer(&cp->vlServersp);
@@ -100,11 +118,30 @@ done:
 cm_cell_t *cm_FindCellByID(long cellID)
 {
        cm_cell_t *cp;
+       int ttl;
+     int code;
 
        lock_ObtainWrite(&cm_cellLock);
        for(cp = cm_allCellsp; cp; cp=cp->nextp) {
                if (cellID == cp->cellID) break;
         }
+
+#ifdef AFS_AFSDB_ENV
+       /* if it's from DNS, see if it has expired */
+       if (cp && cm_dnsEnabled && (cp->flags & CM_CELLFLAG_DNS) && (time(0) > cp->timeout)) {
+         code = cm_SearchCellByDNS(cp->namep, NULL, &ttl, cm_AddCellProc, cp);
+         if (code == 0) {   /* got cell from DNS */
+           cp->flags |= CM_CELLFLAG_DNS;
+#ifdef DEBUG
+           fprintf(stderr, "cell %s: ttl=%d\n", cp->namep, ttl);
+#endif
+           cp->timeout = time(0) + ttl;
+         }
+         /* if we fail to find it this time, we'll just do nothing and leave the
+            current entry alone */
+       }
+#endif /* AFS_AFSDB_ENV */
+
        lock_ReleaseWrite(&cm_cellLock);        
        
         return cp;
index ca0ae38f4403b5adf178507eaf75392e6a1dd060..a642d04d2a179332a757722e5d10050a23651990 100644 (file)
@@ -20,9 +20,11 @@ typedef struct cm_cell {
         struct cm_serverRef *vlServersp;       /* locked by cm_serverLock */
         osi_mutex_t mx;                        /* mutex locking fields (flags) */
         long flags;                    /* locked by mx */
+        long timeout;                   /* if dns, time at which the server addrs expire */
 } cm_cell_t;
 
 #define CM_CELLFLAG_SUID       1       /* setuid flag; not yet used */
+#define CM_CELLFLAG_DNS         2       /* cell servers are from DNS */
 
 extern void cm_InitCell(void);
 
index a3ef82f3fef74d865bbbd5c10458cd36b9d80f14..10a0d44f6213e43f4fc3a4c4482a11f53cf46698 100644 (file)
 #include <string.h>
 
 #include "cm_config.h"
+#ifdef AFS_AFSDB_ENV
+#include "cm_dns.h"
+#include <afs/afsint.h>
+#endif
 
 char AFSConfigKeyName[] =
        "SYSTEM\\CurrentControlSet\\Services\\TransarcAFSDaemon\\Parameters";
@@ -276,6 +280,35 @@ long cm_SearchCellFile(char *cellNamep, char *newCellNamep,
         }              /* while loop processing all lines */
 }
 
+long cm_SearchCellByDNS(char *cellNamep, char *newCellNamep, int *ttl,
+               cm_configProc_t *procp, void *rockp)
+{
+#ifdef AFS_AFSDB_ENV
+     int rc;
+     int cellHosts[AFSMAXCELLHOSTS];
+     int numServers;
+     int i;
+     struct sockaddr_in vlSockAddr;
+
+     rc = getAFSServer(cellNamep, cellHosts, &numServers, ttl);
+     if (rc == 0 && numServers > 0) {     /* found the cell */
+       for (i = 0; i < numServers; i++) {
+           memcpy(&vlSockAddr.sin_addr.s_addr, &cellHosts[i],
+               sizeof(long));
+           vlSockAddr.sin_family = AF_INET;
+           /* sin_port supplied by connection code */
+           if (procp)
+          (*procp)(rockp, &vlSockAddr, NULL);
+           if(newCellNamep)
+          strcpy(newCellNamep,cellNamep);
+       }
+       return 0;   /* found cell */
+     }
+     else
+#endif /* AFS_AFSDB_ENV */
+       return -1;  /* not found */
+}
+
 #if !defined(DJGPP) && !defined(AFS_WIN95_ENV)
 /* look up the root cell's name in the Registry */
 long cm_GetRootCellName(char *cellNamep)
@@ -553,3 +586,32 @@ extern long cm_CloseCellFile(cm_configFile_t *filep)
         
         return code;
 }
+
+void cm_GetConfigDir(char *dir)
+{
+       char wdir[256];
+     char *afsconf_path;
+     int code;
+     int tlen;
+
+#if !defined(DJGPP) && !defined(AFS_WIN95_ENV)
+       code = GetWindowsDirectory(wdir, sizeof(wdir));
+      if (code == 0 || code > sizeof(wdir)) wdir[0] = 0;
+        
+       /* add trailing backslash, if required */
+        tlen = strlen(wdir);
+        if (wdir[tlen-1] != '\\') strcat(wdir, "\\");
+#else
+#ifdef DJGPP
+        strcpy(wdir,cm_confDir);
+#else
+        afsconf_path = getenv("AFSCONF");
+        if (!afsconf_path)
+          strcpy(wdir, AFSDIR_CLIENT_ETC_DIRPATH);
+        else
+          strcpy(wdir, afsconf_path);
+#endif /* !DJGPP */
+        strcat(wdir,"\\");
+#endif /* DJGPP || WIN95 */
+        strcpy(dir, wdir);
+}
index 19ab23660b241fe1d4ad71a48e2233a718b99061..11996e55c676b4b891663a44ae39c303688a876d 100644 (file)
@@ -36,6 +36,9 @@ extern long cm_GetRootCellName(char *namep);
 extern long cm_SearchCellFile(char *cellNamep, char *newCellNamep,
        cm_configProc_t *procp, void *rockp);
 
+extern long cm_SearchCellByDNS(char *cellNamep, char *newCellNamep, int *ttl,
+               cm_configProc_t *procp, void *rockp);
+
 extern long cm_WriteConfigString(char *labelp, char *valuep);
 
 extern long cm_WriteConfigInt(char *labelp, long value);
index 69a08cdf77a06ab8121fd18d246f99706b2e855b..6a7a3ac96901c5c462c231f5a82a2e58050c894c 100644 (file)
@@ -23,6 +23,9 @@
 #include "afsd.h"
 
 osi_mutex_t cm_bufGetMutex;
+#ifdef AFS_FREELANCE_CLIENT
+extern osi_mutex_t cm_Freelance_Lock;
+#endif
 
 /* functions called back from the buffer package when reading or writing data,
  * or when holding or releasing a vnode pointer.
@@ -1075,11 +1078,23 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
         struct rx_call *callp;
         cm_bulkIO_t biod;              /* bulk IO descriptor */
         cm_conn_t *connp;
+       int getroot;
+       long t1, t2;
 
         /* now, the buffer may or may not be filled with good data (buf_GetNew
          * drops lots of locks, and may indeed return a properly initialized
          * buffer, although more likely it will just return a new, empty, buffer.
          */
+
+#ifdef AFS_FREELANCE_CLIENT
+
+       // yj: if they're trying to get the /afs directory, we need to
+       // handle it differently, since it's local rather than on any
+       // server
+
+       getroot = (scp==cm_rootSCachep) ;
+#endif
+
        cm_AFSFidFromFid(&tfid, &scp->fid);
 
        code = cm_SetupFetchBIOD(scp, &bufp->offset, &biod, up, reqp);
@@ -1120,6 +1135,73 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
                 scp->dataVersion, bufp->dataVersion, scp, bufp, bufp->dcp);
 #endif /* DISKCACHE95 */
 
+#ifdef AFS_FREELANCE_CLIENT
+
+       // yj code
+       // if getroot then we don't need to make any calls
+       // just return fake data
+       
+        if (cm_freelanceEnabled && getroot) {
+               // setup the fake status                        
+               afsStatus.InterfaceVersion = 0x1;
+               afsStatus.FileType = 0x2;
+               afsStatus.LinkCount = scp->linkCount;
+               afsStatus.Length = cm_fakeDirSize;
+               afsStatus.DataVersion = cm_fakeDirVersion;
+               afsStatus.Author = 0x1;
+               afsStatus.Owner = 0x0;
+               afsStatus.CallerAccess = 0x9;
+               afsStatus.AnonymousAccess = 0x9;
+               afsStatus.UnixModeBits = 0x1ff;
+               afsStatus.ParentVnode = 0x1;
+               afsStatus.ParentUnique = 0x1;
+               afsStatus.SegSize = 0;
+               afsStatus.ClientModTime = 0x3b49f6e2;
+               afsStatus.ServerModTime = 0x3b49f6e2;
+               afsStatus.Group = 0;
+               afsStatus.SyncCounter = 0;
+               afsStatus.dataVersionHigh = 0;
+       
+               // once we're done setting up the status info,
+               // we just fill the buffer pages with fakedata
+               // from cm_FakeRootDir. Extra pages are set to
+               // 0. 
+               
+               lock_ObtainMutex(&cm_Freelance_Lock);
+#ifdef DEBUG
+               afsi_log("bufp->offset is %d", bufp->offset);
+#endif
+               t1 = bufp->offset.LowPart;
+               qdp = biod.bufListEndp;
+               while (qdp) {
+                       tbufp = osi_GetQData(qdp);
+                       bufferp=tbufp->datap;
+                       memset(bufferp, 0, buf_bufferSize);
+                       t2 = cm_fakeDirSize - t1;
+                       if (t2>buf_bufferSize) t2=buf_bufferSize;
+#ifdef DEBUG
+                       afsi_log("t1:%d, t2:%d", t1, t2);
+#endif
+                       if (t2 > 0) {
+                               memcpy(bufferp, cm_FakeRootDir+t1, t2);
+                       } else {
+                               t2 = 0;
+                       }
+                       t1+=t2;
+                       qdp = (osi_queueData_t *) osi_QPrev(&qdp->q);
+                       
+               }
+               lock_ReleaseMutex(&cm_Freelance_Lock);
+       
+               // once we're done, we skip over the part of the
+               // code that does the ACTUAL fetching of data for
+               // real files
+
+               goto fetchingcompleted;
+       }
+
+#endif /* AFS_FREELANCE_CLIENT */
+
        /* now make the call */
         do {
                code = cm_Conn(&scp->fid, up, reqp, &connp);
@@ -1230,6 +1312,8 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
                 osi_Log0(afsd_logp, "CALL FetchData DONE");
                 
        } while (cm_Analyze(connp, up, reqp, &scp->fid, &volSync, NULL, code));
+
+  fetchingcompleted:
         code = cm_MapRPCError(code, reqp);
 
         lock_ObtainMutex(&scp->mx);
diff --git a/src/WINNT/afsd/cm_dns.c b/src/WINNT/afsd/cm_dns.c
new file mode 100644 (file)
index 0000000..b0e1da0
--- /dev/null
@@ -0,0 +1,687 @@
+/* Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ *
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
+#ifdef AFS_AFSDB_ENV
+
+#include <afs/param.h>
+#include <afs/stds.h>
+#ifndef DJGPP
+#include <windows.h>
+#include <winsock2.h>
+#endif
+#include "cm_dns_private.h"
+#include "cm_dns.h"
+#include <lwp.h>
+#include <afs/afsint.h>
+
+extern int errno;
+static char dns_addr[30];
+#ifdef DJGPP
+extern char cm_confDir[];
+#endif
+int cm_dnsEnabled = -1;
+
+void DNSlowerCase(char *str)
+{
+  int i;
+
+  for (i=0; i<strlen(str); i++)
+    /*str[i] = tolower(str[i]);*/
+    if (str[i] >= 'A' && str[i] <= 'Z')
+      str[i] += 'a' - 'A';
+}
+
+int cm_InitDNS(int enabled)
+{
+  char configpath[100];
+  int len;
+  int code;
+  char *path;
+  char *addr;
+  
+  if (!enabled) { fprintf(stderr, "DNS support disabled\n"); cm_dnsEnabled = 0; return 0; }
+
+  /* First try AFS_NS environment var. */
+  addr = getenv("AFS_NS");
+  if (addr && inet_addr(addr) != -1) {
+    strcpy(dns_addr, addr);
+  } else {
+    /* Now check for the AFSDNS.INI file */
+#ifdef DJGPP
+    strcpy(configpath, cm_confDir);
+#elif defined(AFS_WIN95_ENV)
+    path = getenv("AFSCONF");
+    if (path) strcpy(configpath, path);
+    else strcpy(configpath, "c:\\afscli");
+#else  /* nt */
+    code = GetWindowsDirectory(configpath, sizeof(configpath));
+    if (code == 0 || code > sizeof(configpath)) return -1;
+#endif
+    strcat(configpath, "\\afsdns.ini");
+
+    /* Currently we only get (and query) the first nameserver.  Getting
+       list of mult. nameservers should be easy to do. */
+    len = GetPrivateProfileString("AFS Domain Name Servers", "ns1", NULL,
+                           dns_addr, sizeof(dns_addr),
+                           configpath);
+  
+    if (len == 0 || inet_addr(dns_addr) == -1) {
+      fprintf(stderr, "No valid name server addresses found, DNS lookup is "
+                      "disabled\n");
+      cm_dnsEnabled = 0;  /* failed */
+      return -1;     /* No name servers defined */
+    }
+    else fprintf(stderr, "Found DNS server %s\n", dns_addr);
+  }
+
+  cm_dnsEnabled = 1;
+  return 0;
+}
+
+SOCKADDR_IN setSockAddr(char *server, int port)
+{
+  SOCKADDR_IN sockAddr;                     
+  int         addrLen = sizeof(SOCKADDR_IN);
+
+#ifndef WIN32_LEAN_AND_MEAN
+  bzero(&sockAddr,addrLen);
+#endif /*WIN32_LEAN_AND_MEAN*/
+  sockAddr.sin_family   = AF_INET;
+  sockAddr.sin_port     = htons( port );
+  sockAddr.sin_addr.s_addr = inet_addr( server );
+  /*inet_aton(server, &sockAddr.sin_addr.s_addr);*/
+
+  return (sockAddr);
+}
+
+int getRRCount(PDNS_HDR ptr)
+{
+  return(ntohs(ptr->rr_count));
+}
+
+
+int send_DNS_Addr_Query(char* query, 
+                        SOCKET commSock, SOCKADDR_IN sockAddr, char *buffer)
+{
+  PDNS_HDR    pDNShdr;
+  PDNS_QTAIL  pDNS_qtail;
+
+  int     queryLen = 0;
+  int     res;
+
+#ifndef WIN32_LEAN_AND_MEAN
+  bzero(buffer,BUFSIZE);
+#endif /*WIN32_LEAN_AND_MEAN*/
+
+  /*********************************
+   * Build DNS Query Message       *
+   *                               *
+   * hard-coded Adrress (A) query  *
+   *********************************/
+  
+  pDNShdr = (PDNS_HDR)&( buffer[ 0 ] );
+  pDNShdr->id         = htons( 0xDADE );
+  pDNShdr->flags      = htons( DNS_FLAG_RD ); /* do recurse */
+  pDNShdr->q_count    = htons( 1 );           /* one query */
+  pDNShdr->rr_count   = 0;                    /* none in query */
+  pDNShdr->auth_count = 0;                    /* none in query */
+  pDNShdr->add_count  = 0;                    /* none in query */
+  
+  queryLen = putQName( query, &(buffer[ DNS_HDR_LEN ] ) );
+  queryLen += DNS_HDR_LEN; /* query Length is just after the query name and header */
+#ifdef DEBUG
+  fprintf(stderr, "send_DNS_Addr: query=%s, queryLen=%d\n", query, queryLen);
+#endif
+  
+  
+  pDNS_qtail = (PDNS_QTAIL) &(buffer[ queryLen ]);
+  pDNS_qtail->qtype = htons(255);/*htons(DNS_RRTYPE_A); */
+  pDNS_qtail->qclass = htons(DNS_RRCLASS_IN); 
+  queryLen +=  DNS_QTAIL_LEN;
+  
+  /**************************
+   * Send DNS Query Message *
+   **************************/
+  
+
+  res = sendto( commSock,
+               buffer,
+               queryLen,
+               0,
+               (struct sockaddr *) &sockAddr,
+               sizeof( SOCKADDR_IN ) );
+  
+  /*dumpSbuffer(buffer,queryLen);*/
+
+  if ( res < 0 )
+    {
+#ifdef DEBUG
+      fprintf(stderr, "send_DNS_Addr_Query: error %d, errno %d\n", res, errno);
+      fprintf(stderr, "sendto() failed \n");
+#endif
+      return ( -1 );
+    }
+  else
+    {
+    /*printf( "sendto() succeeded\n");*/
+    ;
+    } /* end if */
+  
+  return(0);
+}
+
+
+int send_DNS_AFSDB_Query(char* query, 
+                        SOCKET commSock, SOCKADDR_IN sockAddr, char *buffer)
+{
+  /*static char buffer[BUFSIZE];*/
+
+  PDNS_HDR    pDNShdr;
+  PDNS_QTAIL  pDNS_qtail;
+
+  int     queryLen = 0;
+  int     res;
+
+#ifndef WIN32_LEAN_AND_MEAN
+  bzero(buffer,BUFSIZE);
+#endif /*WIN32_LEAN_AND_MEAN*/
+
+  /***************************
+   * Build DNS Query Message *
+   *                         *
+   * hard-coded AFSDB query  *
+   ***************************/
+  
+  pDNShdr = (PDNS_HDR)&( buffer[ 0 ] );
+  pDNShdr->id         = htons( 0xDEAD );
+  pDNShdr->flags      = htons( DNS_FLAG_RD ); /* do recurse */
+  pDNShdr->q_count    = htons( 1 );           /* one query */
+  pDNShdr->rr_count   = 0;                    /* none in query */
+  pDNShdr->auth_count = 0;                    /* none in query */
+  pDNShdr->add_count  = 0;                    /* none in query */
+  
+  queryLen = putQName( query, &(buffer[ DNS_HDR_LEN ] ) );
+  queryLen += DNS_HDR_LEN; /* query Length is just after the query name and header */
+  
+  
+  pDNS_qtail = (PDNS_QTAIL) &(buffer[ queryLen ]);
+  pDNS_qtail->qtype = htons(DNS_RRTYPE_AFSDB); 
+  pDNS_qtail->qclass = htons(DNS_RRCLASS_IN); 
+  queryLen +=  DNS_QTAIL_LEN;
+  
+  /**************************
+   * Send DNS Query Message *
+   **************************/
+  
+  res = sendto( commSock,
+               buffer,
+               queryLen,
+               0,
+               (struct sockaddr *) &sockAddr,
+               sizeof( SOCKADDR_IN ) );
+  
+  /*dumpSbuffer(buffer,queryLen);*/
+
+  if ( res < 0 )
+    {
+#ifdef DEBUG
+      fprintf(stderr, "send_DNS_AFSDB_Query: error %d, errno %d\n", res, errno);
+      fprintf(stderr,  "sendto() failed \n");
+#endif /* DEBUG */
+      return ( -1 );
+    }
+  else
+    {
+    /*printf( "sendto() succeeded\n");*/
+    ;
+    } /* end if */
+  
+  return(0);
+}
+
+
+PDNS_HDR get_DNS_Response(SOCKET commSock, SOCKADDR_IN sockAddr, char *buffer)
+{
+  /*static char buffer[BUFSIZE];*/
+
+  int         addrLen = sizeof(SOCKADDR_IN);
+  int         res;
+  int size;
+
+#ifndef WIN32_LEAN_AND_MEAN
+  bzero(buffer,BUFSIZE);
+#endif /*WIN32_LEAN_AND_MEAN*/
+
+  /*****************************
+   * Receive DNS Reply Message *
+   *****************************/
+  
+  /*printf( "calling recvfrom() on connected UDP socket\n" );*/
+  
+  size = recvfrom( commSock,
+                 buffer,
+                 BUFSIZE,
+                 0,
+                 (struct sockaddr *) &sockAddr,
+                 &addrLen );
+  if (size < 0) { fprintf(stderr, "recvfrom error %d\n", errno); return NULL; }
+
+  /*dumpRbuffer(buffer,res);*/
+
+#ifdef DEBUG
+  fprintf(stderr, "recvfrom returned %d bytes from %s: \n", 
+         size, inet_ntoa( sockAddr.sin_addr ) );
+#endif /* DEBUG */
+  
+  return((PDNS_HDR)&( buffer[ 0 ] ));
+
+}
+
+
+int putQName( char *pHostName, char *pQName )
+{
+  int     i;
+  char    c;
+  int     j = 0;
+  int     k = 0;
+  
+  DNSlowerCase(pHostName);
+  /*printf( "Hostname: [%s]\n", pHostName );*/
+  
+  for ( i = 0; *( pHostName + i ); i++ )
+    {
+      c = *( pHostName + i );   /* get next character */
+      
+      
+      if ( c == '.' )
+       {
+         /* dot encountered, fill in previous length */
+         if (k!=0){ /*don't process repeated dots*/
+          /*printf( "%c", c );*/
+           *( pQName + j ) = k;
+           j = j+k+1;  /* set index to next counter */
+           k = 0;      /* reset segment length */
+         }
+       }
+      else
+       {
+        /*printf( "%c", c );*/
+         *( pQName + j + k + 1 ) = c;  /* assign to QName */
+         k++;                /* inc count of seg chars */
+       } /* end if */
+    } /* end for loop */
+  
+  *(pQName + j )                  = k;   /* count for final segment */
+
+  *(pQName + j + k + 1 )      = 0;   /* count for trailing NULL segment is 0 */
+  
+  /*printf( "\n" ); */
+  
+  if (c == '.')
+    return ( j + k + 1 );        /* return total length of QName */
+  else
+    return ( j + k + 2 );
+} /* end putQName() */
+
+
+u_char * skipRRQName(u_char *pQName)
+{
+  u_char *ptr;
+  u_char c;
+
+  ptr = pQName;
+  c = *ptr;
+  while (c) {
+    if ( c >= 0xC0 ) {
+    /* skip the 'compression' pointer */
+      ptr = ptr+1;
+      c = '\0';
+    } else {
+      /* skip a normal qname segment */
+      ptr += *ptr;
+      ptr++;
+      c = *ptr;
+    };
+  };
+
+  /* ptr now pointing at terminating zero of query QName,
+     or the pointer for the previous occurrence 
+     (compression)
+   */
+  ptr++;
+
+  return (ptr);
+} /* end skipRRQName() */
+
+
+
+u_char * printRRQName( u_char *pQName, PDNS_HDR buffer )
+{
+  u_short i, k;
+  u_char *buffPtr = (u_char *) buffer;
+  u_char *namePtr;
+  u_char *retPtr;
+  u_char c;
+
+
+  namePtr = pQName;
+  retPtr = 0;
+
+  for ( i = 0; i < BUFSIZE; i++ )
+    {
+      c = *namePtr;
+      if ( c >= 0xC0 ) {
+       c = *(namePtr + 1);
+       retPtr = namePtr+2;
+       namePtr = buffPtr+c; 
+      } else {
+       if ( c == 0 )
+         break;
+       
+       for ( k = 1; k <= c; k++ )
+         {
+           fprintf(stderr, "%c", *( namePtr + k ) );
+         } /* end for loop */
+       fprintf(stderr,".");
+       namePtr += k;
+      }
+    } /* end for loop */
+  fprintf(stderr,"\n");
+  namePtr++; /* skip terminating zero */
+
+  if (retPtr)
+    return(retPtr);
+  else
+    return(namePtr);
+
+} /* end printRRQName() */
+
+
+u_char * sPrintRRQName( u_char *pQName, PDNS_HDR buffer, char *str )
+{
+  u_short i, k;
+  u_char *buffPtr = (u_char *) buffer;
+  u_char *namePtr;
+  u_char *retPtr;
+  u_char c;
+
+  char   section[64];
+
+  strcpy(str,"");
+  namePtr = pQName;
+  retPtr = 0;
+
+  for ( i = 0; i < BUFSIZE; i++ )
+    {
+      c = *namePtr;
+      if ( c >= 0xC0 ) {
+       c = *(namePtr + 1);
+       retPtr = namePtr+2;
+       namePtr = buffPtr+c; 
+      } else {
+       if ( c == 0 )
+         break;
+       
+       for ( k = 1; k <= c; k++ )
+         {
+           sprintf(section,"%c", *( namePtr + k ) );
+           strcat(str,section);
+         } /* end for loop */
+       strcat(str,".");
+       namePtr += k;
+      }
+    } /* end for loop */
+  namePtr++; /* skip terminating zero */
+
+  if (retPtr)
+    return(retPtr);
+  else
+    return(namePtr);
+
+} /* end sPrintRRQName() */
+
+
+void printReplyBuffer_AFSDB(PDNS_HDR replyBuff)
+{
+  u_char *ptr = (u_char *) replyBuff;
+  int    answerCount = ntohs((replyBuff)->rr_count);
+  u_char i;
+  PDNS_AFSDB_RR_HDR 
+         rrPtr;
+
+  ptr += DNS_HDR_LEN;
+
+  /* ptr now pointing at start of QName in query field */
+  ptr = skipRRQName(ptr);
+
+
+  /* skip the query type and class fields */
+  ptr+= DNS_QTAIL_LEN;
+
+  /* ptr should now be at the start of the answer RR sections */
+
+  fprintf(stderr,"---------------------------------\n");
+  for (i=0; i<answerCount ; i++){
+    ptr = skipRRQName(ptr);
+    rrPtr = (PDNS_AFSDB_RR_HDR) ptr;
+    ptr+= DNS_AFSDB_RR_HDR_LEN;
+    if ( ntohs(rrPtr->rr_afsdb_class) == 1) {
+      fprintf(stderr,"AFDB class %d ->  ",ntohs(rrPtr->rr_afsdb_class)); 
+      ptr = printRRQName(ptr,replyBuff); }
+    else
+      ptr = skipRRQName(ptr);
+  };
+  fprintf(stderr,"---------------------------------\n");
+
+
+};
+
+void processReplyBuffer_AFSDB(SOCKET commSock, PDNS_HDR replyBuff, int *cellHosts, int *numServers, int *ttl)
+  /*PAFS_SRV_LIST (srvList)*/
+{
+  u_char *ptr = (u_char *) replyBuff;
+  int    answerCount = ntohs((replyBuff)->rr_count);
+  u_char i;
+  PDNS_AFSDB_RR_HDR 
+         rrPtr;
+  int srvCount = 0;
+  char hostName[256];
+  struct in_addr addr;
+  int rc;
+
+  ptr += DNS_HDR_LEN;
+
+  /* ptr now pointing at start of QName in query field */
+  ptr = skipRRQName(ptr);
+
+
+  /* skip the query type and class fields */
+  ptr+= DNS_QTAIL_LEN;
+
+  /* ptr should now be at the start of the answer RR sections */
+
+  answerCount = MIN(answerCount, AFSMAXCELLHOSTS);
+#ifdef DEBUG
+  fprintf(stderr, "processRep_AFSDB: answerCount=%d\n", answerCount);
+#endif /* DEBUG */
+
+  for (i=0; i<answerCount ; i++){
+    ptr = skipRRQName(ptr);
+    rrPtr = (PDNS_AFSDB_RR_HDR) ptr;
+    ptr+= DNS_AFSDB_RR_HDR_LEN;
+    if ((ntohs(rrPtr->rr_afsdb_class) == 1) && 
+       (srvCount < MAX_AFS_SRVS)) {
+      /*ptr = sPrintRRQName(ptr,replyBuff,srvList->host[srvList->count]);*/
+      ptr = sPrintRRQName(ptr,replyBuff,hostName);
+      /*ptr = printRRQName(ptr,replyBuff);*/
+      *ttl = ntohl(rrPtr->rr_ttl);
+
+#ifdef DEBUG
+      fprintf(stderr, "resolving name %s\n", hostName);
+#endif
+      /* resolve name from DNS query */
+      rc = DNSgetAddr(commSock, hostName, &addr);
+      if (rc < 0)
+       continue;  /* skip this entry */
+#ifdef DEBUG
+      fprintf(stderr, "processRep_AFSDB: resolved name %s to addr %x\n", hostName, addr);
+#endif /* DEBUG */
+      memcpy(&cellHosts[srvCount], &addr.s_addr, sizeof(addr.s_addr));
+      srvCount++;
+    }
+    else {
+      ptr = skipRRQName(ptr);
+    }
+  }
+
+  *numServers = srvCount;
+
+}
+
+
+u_char * processReplyBuffer_Addr(PDNS_HDR replyBuff)
+{
+  u_char *ptr = (u_char *) replyBuff;
+  int    answerCount = ntohs((replyBuff)->rr_count);
+  u_char i;
+  PDNS_A_RR_HDR 
+         rrPtr;
+
+#ifdef DEBUG
+  fprintf(stderr, "processReplyBuffer_Addr: answerCount=%d\n", answerCount);
+#endif /* DEBUG */
+  if (answerCount == 0) return 0;
+  
+  ptr += DNS_HDR_LEN;
+
+  /* ptr now pointing at start of QName in query field */
+  ptr = skipRRQName(ptr);
+
+
+  /* skip the query type and class fields */
+  ptr+= DNS_QTAIL_LEN;
+
+  /* ptr should now be at the start of the answer RR sections */
+  ptr = skipRRQName(ptr);
+  rrPtr = (PDNS_A_RR_HDR) ptr;
+
+#ifdef DEBUG
+  fprintf(stderr, "type:%d, class:%d, ttl:%d, rdlength:%d\n",
+        ntohs(rrPtr->rr_type),ntohs(rrPtr->rr_class),
+        ntohl(rrPtr->rr_ttl),ntohs(rrPtr->rr_rdlength));
+  fprintf(stderr, "Count %d\tand Answer %8x\n",answerCount,rrPtr->rr_addr);
+#endif /* DEBUG */
+
+  ptr += DNS_A_RR_HDR_LEN;
+
+  return (ptr);
+
+};
+
+int getAFSServer(char *cellName, int *cellHosts, int *numServers, int *ttl)
+{
+  /*static AFS_SRV_LIST srvList;  
+    static int ans = 0;*/
+  SOCKET commSock;
+  SOCKADDR_IN sockAddr;
+  PDNS_HDR  pDNShdr;
+  char buffer[BUFSIZE];
+  int rc;
+
+#ifdef DEBUG
+  fprintf(stderr, "getAFSServer: cell %s, cm_dnsEnabled=%d\n", cellName, cm_dnsEnabled);
+#endif
+
+  if (cm_dnsEnabled == -1) { /* not yet initialized, eg when called by klog */
+    cm_InitDNS(1);    /* assume enabled */
+  }
+  if (cm_dnsEnabled == 0) {  /* possibly we failed in cm_InitDNS above */
+    fprintf(stderr, "DNS initialization failed, disabled\n");
+    *numServers = 0;
+    return -1;
+  }
+  
+  sockAddr = setSockAddr(dns_addr, DNS_PORT);
+  
+  commSock = socket( AF_INET, SOCK_DGRAM, 0 );
+  if ( commSock < 0 )
+    {
+      /*afsi_log("socket() failed\n");*/
+      fprintf(stderr, "getAFSServer: socket() failed, errno=%d\n", errno);
+      *numServers = 0;
+      return (-1);
+    } 
+  
+#ifdef DJGPP
+  /* the win95 sock.vxd will not allow sendto for unbound sockets, 
+   *   so just bind to nothing and it works */
+  
+  __djgpp_set_socket_blocking_mode(commSock, 0);
+  bind(commSock,0,sizeof( SOCKADDR_IN ) );
+#endif /* DJGPP */
+
+  rc = send_DNS_AFSDB_Query(cellName,commSock,sockAddr, buffer);
+  if (rc < 0) {
+    fprintf(stderr,"getAFSServer: send_DNS_AFSDB_Query failed\n");
+    *numServers = 0;
+    return -1;
+  }
+    
+  pDNShdr = get_DNS_Response(commSock,sockAddr, buffer);
+  
+  /*printReplyBuffer_AFSDB(pDNShdr);*/
+  if (pDNShdr)
+    processReplyBuffer_AFSDB(commSock, pDNShdr, cellHosts, numServers, ttl);
+  else
+    *numServers = 0;
+  
+  close(commSock);
+  if (*numServers == 0)
+    return(-1);
+
+  else
+    return 0;
+}
+
+int DNSgetAddr(SOCKET commSock, char *hostName, struct in_addr *iNet)
+{
+  /* Variables for DNS message parsing and creation */
+  PDNS_HDR  pDNShdr;
+
+  SOCKADDR_IN sockAddr;
+  char buffer[BUFSIZE];
+  
+  int     i;
+  u_char *addr;
+  u_long *aPtr;
+  int rc;
+
+  /**********************
+   * Get a DGRAM socket *
+   **********************/
+  
+  sockAddr = setSockAddr(dns_addr, DNS_PORT);
+  
+  rc = send_DNS_Addr_Query(hostName,commSock,sockAddr, buffer);
+  if (rc < 0) return rc;
+  pDNShdr = get_DNS_Response(commSock,sockAddr, buffer);
+  if (pDNShdr == NULL)
+    return -1;
+  
+  addr = processReplyBuffer_Addr(pDNShdr);
+  if (addr == 0)
+    return -1;
+
+  aPtr = (u_long *) addr;
+
+  iNet->s_addr = *aPtr;
+
+  return(0);
+}
+
+#endif /* AFS_AFSDB_ENV */
diff --git a/src/WINNT/afsd/cm_dns.h b/src/WINNT/afsd/cm_dns.h
new file mode 100644 (file)
index 0000000..1e5d28c
--- /dev/null
@@ -0,0 +1,27 @@
+/* Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ *
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
+/* Well-known DNS port is 53 (for both TCP and UDP,
+   although UDP is typically the only one used) */
+
+#define DNS_PORT    53
+
+/* this function will continue to return cell server
+   names for the given cell, ending in null */
+int getAFSServer(char *cellname, int *cellHosts, int *numServers, int *ttl);
+
+/* a supplement for the DJGPP gethostbyname ... which 
+   never bothers calling a DNS server ... so this function
+   takes care of that. This should be called when you
+   failed with gethostbyname (as that WILL check for
+   dotted decimal, and local hostfile) */
+
+struct hostent *DNSgetHostByName(char *hostname);
+
+
+
diff --git a/src/WINNT/afsd/cm_dns_private.h b/src/WINNT/afsd/cm_dns_private.h
new file mode 100644 (file)
index 0000000..1344fe0
--- /dev/null
@@ -0,0 +1,217 @@
+/* Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ *
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
+#ifndef __DNS_AFS_private_h_env_
+#define __DNS_AFS_private_h_env_
+
+#ifdef DJGPP
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+/*#else
+  #include <windows.h>*/
+#endif
+
+#ifdef KERNEL
+#define SOCKET struct osi_socket *
+#else
+#define SOCKET int
+#endif
+
+#define SOCKADDR_IN struct sockaddr_in
+
+#include <stdio.h>
+#include <string.h>
+
+
+#ifdef DJGPP
+
+char *inet_ntoa(struct in_addr in)
+{
+  static char   out[256];
+  char temp[20];
+  unsigned long sVal,pVal;
+
+  out[0] = '\0';
+
+
+  pVal = ntohl(in.s_addr);
+
+  sVal = pVal;
+  sVal >>= 24;
+  sprintf(out,"%ld",sVal);
+
+  sVal = pVal;
+  sVal <<= 8;
+  sVal >>= 24;
+  sprintf(out,"%s.%ld",out,sVal);
+
+  sVal = pVal;
+  sVal <<= 16;
+  sVal >>= 24;
+  sprintf(out,"%s.%ld",out,sVal);
+
+  sVal = pVal;
+  sVal <<= 24;
+  sVal >>= 24;
+  sprintf(out,"%s.%ld",out,sVal);
+
+  return(&out[0]);
+}
+
+unsigned long inet_addr(const char *cp)
+{
+  
+  unsigned long val=0;
+  unsigned char sVal;
+  
+  char   cp2[256];
+
+  char*  ptr = cp2;
+  int    i;
+  int    len;
+
+  strcpy(cp2,cp);
+
+  for (i=0; i<=strlen(cp); i++)
+    {
+      if (cp2[i] == '.')
+       {
+         cp2[i] = '\0';
+         sVal = atoi(ptr);
+         ptr = &cp2[i+1];
+         val = val << 8;
+         val &= 0xffffff00;
+         val |= sVal;
+         //printf("%x\t%lx\n",sVal,val);
+       };
+    };
+  sVal = atoi(ptr);
+  val = val << 8;
+  val &= 0xffffff00;
+  val |= sVal;
+  //printf("%x\t%lx\n",sVal,val);
+  
+  return htonl(val);
+}
+
+#endif /* DJGPP */
+
+#define BUFSIZE                 2048
+
+/*
+ * AFS Server List (a list of host names and their count)
+ */
+#define MAX_AFS_SRVS 20
+typedef struct afs_srvlist
+{
+  unsigned short  count;           /* number of host names */
+  char     host[MAX_AFS_SRVS][256];/* array of hosts*/
+} AFS_SRV_LIST, *PAFS_SRV_LIST;
+
+
+/*
+ * DNS Message Header
+ */
+typedef struct dns_hdr
+{
+  unsigned short id;          /* client query ID number */
+  unsigned short flags;       /* qualify contents <see below> */
+  unsigned short q_count;     /* number of questions */
+  unsigned short rr_count;    /* number of answer RRs */
+  unsigned short auth_count;  /* number of authority RRs */
+  unsigned short add_count;   /* number of additional RRs */
+} DNS_HDR, *PDNS_HDR;
+
+#define DNS_HDR_LEN sizeof(DNS_HDR)
+
+
+
+/* THESE WERE ALSO WRONG !!!! */
+#define DNS_FLAG_RD 0x0100
+
+/*
+ * DNS query class and response type for the tail of the query packet
+ */
+typedef struct dns_qtail
+{
+        unsigned short qtype;                /* Query type (2bytes) - for responses */
+        unsigned short qclass;               /* Query Class (2bytes) - for questions */
+} DNS_QTAIL, *PDNS_QTAIL;
+
+#define DNS_QTAIL_LEN sizeof(DNS_QTAIL)
+
+/* DNS Generic Resource Record format (from RFC 1034 and 1035)
+ *
+ *  NOTE: The first field in the DNS RR Record header is always
+ *   the domain name in QNAME format (see earlier description)
+ */
+typedef struct dns_rr_hdr
+{
+        unsigned short rr_type;        /* RR type code (e.g. A, MX, NS, etc.) */
+        unsigned short rr_class;       /* RR class code (IN for Internet) */
+        unsigned long  rr_ttl;         /* Time-to-live for resource */
+        unsigned short rr_rdlength;    /* length of RDATA field (in octets) */
+} DNS_RR_HDR, *PDNS_RR_HDR;
+
+#define DNS_RR_HDR_LEN sizeof(DNS_RR_HDR)
+
+#define DNS_RRTYPE_A     1
+#define DNS_RRTYPE_NS    2
+#define DNS_RRTYPE_CNAME 5
+#define DNS_RRTYPE_SOA   6
+#define DNS_RRTYPE_WKS   11
+#define DNS_RRTYPE_PTR   12
+#define DNS_RRTYPE_HINFO 13
+#define DNS_RRTYPE_MX    15
+#define DNS_RRTYPE_AFSDB 18
+
+
+#define DNS_RRCLASS_IN    1    // Internet
+#define DNS_RRCLASS_CS    2    // CSNET
+#define DNS_RRCLASS_CH    3    // CHAOS Net
+#define DNS_RRCLASS_HS    4    // Hesiod
+#define DNS_RRCLASS_WILD  255  // WildCard - all classes
+
+/* 
+ * DNS AFSDB Resource Data Field
+ */
+typedef struct dns_afsdb_rr_hdr
+{
+  unsigned short rr_type;        /* RR type code (e.g. A, MX, NS, etc.) */
+  unsigned short rr_class;       /* RR class code (IN for Internet) */
+  unsigned long  rr_ttl;         /* Time-to-live for resource */
+  unsigned short rr_rdlength;    /* length of RDATA field (in octets) */
+  unsigned short rr_afsdb_class; /* 1-AFS , 2-DCE */
+} DNS_AFSDB_RR_HDR, *PDNS_AFSDB_RR_HDR;
+
+#define DNS_AFSDB_RR_HDR_LEN sizeof(DNS_AFSDB_RR_HDR)
+
+/* 
+ * DNS A Resource Data Field
+ */
+typedef struct dns_a_rr_hdr
+{
+  unsigned short rr_type;        /* RR type code (e.g. A, MX, NS, etc.) */
+  unsigned short rr_class;       /* RR class code (IN for Internet) */
+  unsigned long  rr_ttl;         /* Time-to-live for resource */
+  unsigned short rr_rdlength;    /* length of RDATA field (in octets) */
+  unsigned long  rr_addr;        /* Resolved host address */
+} DNS_A_RR_HDR, *PDNS_A_RR_HDR;
+
+#define DNS_A_RR_LEN      14 //sizeof(DNS_A_RR_HDR)
+#define DNS_A_RR_HDR_LEN  10 //(DNS_A_RR_LEN - sizeof(unsigned long))
+
+int  putQName( char *pszHostName, char *pQName );
+unsigned char * printRRQName( unsigned char *pQName, PDNS_HDR buffer );
+unsigned char * skipRRQName(unsigned char *pQName);
+/* void printReplyBuffer_AFSDB(PDNS_HDR replyBuff); */
+
+#endif //__DNS_AFS_private_h_env_
+
diff --git a/src/WINNT/afsd/cm_freelance.c b/src/WINNT/afsd/cm_freelance.c
new file mode 100644 (file)
index 0000000..1da7f85
--- /dev/null
@@ -0,0 +1,525 @@
+#include <afs/param.h>
+#include <afs/stds.h>
+
+#ifndef DJGPP
+#include <windows.h>
+#include <winsock2.h>
+#else
+#include <netdb.h>
+#endif /* !DJGPP */
+#include <stdlib.h>
+#include <malloc.h>
+#include <string.h>
+
+#include <rx/rx.h>
+
+#include "afsd.h"
+#ifdef AFS_FREELANCE_CLIENT
+#include "cm_freelance.h"
+#include "stdio.h"
+
+int cm_noLocalMountPoints;
+int cm_fakeDirSize;
+int cm_fakeDirCallback=0;
+int cm_fakeGettingCallback=0;
+int cm_fakeDirVersion = 0x8;
+cm_localMountPoint_t* cm_localMountPoints;
+osi_mutex_t cm_Freelance_Lock;
+int cm_localMountPointChangeFlag = 0;
+int cm_freelanceEnabled = 0;
+
+void cm_InitFakeRootDir();
+
+void cm_InitFreelance() {
+  
+       lock_InitializeMutex(&cm_Freelance_Lock, "Freelance Lock");
+  
+       // yj: first we make a call to cm_initLocalMountPoints
+       // to read all the local mount points from an ini file
+       cm_InitLocalMountPoints();
+       
+       // then we make a call to InitFakeRootDir to create
+       // a fake root directory based on the local mount points
+       cm_InitFakeRootDir();
+
+       // --- end of yj code
+}
+
+/* yj: Initialization of the fake root directory */
+/* to be called while holding freelance lock unless during init. */
+void cm_InitFakeRootDir() {
+       
+       int i, j, t1, t2;
+       char* currentPos;
+       int noChunks;
+       char mask;
+       
+
+       // allocate space for the fake info
+       cm_dirHeader_t fakeDirHeader;
+       cm_dirEntry_t fakeEntry;
+       cm_pageHeader_t fakePageHeader;
+
+       // i'm going to calculate how much space is needed for
+       // this fake root directory. we have these rules:
+       // 1. there are cm_noLocalMountPoints number of entries
+       // 2. each page is CM_DIR_PAGESIZE in size
+       // 3. the first 13 chunks of the first page are used for
+       //    some header stuff
+       // 4. the first chunk of all subsequent pages are used
+       //    for page header stuff
+       // 5. a max of CM_DIR_EPP entries are allowed per page
+       // 6. each entry takes 1 or more chunks, depending on 
+       //    the size of the mount point string, as determined
+       //    by cm_NameEntries
+       // 7. each chunk is CM_DIR_CHUNKSIZE bytes
+
+       int CPP = CM_DIR_PAGESIZE / CM_DIR_CHUNKSIZE;
+       int curChunk = 13;      // chunks 0 - 12 are used for header stuff
+                                               // of the first page in the directory
+       int curPage = 0;
+       int curDirEntry = 0;
+       int curDirEntryInPage = 0;
+       int sizeOfCurEntry;
+       int dirSize;
+       
+
+       while (curDirEntry!=cm_noLocalMountPoints) {
+               sizeOfCurEntry = cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0);
+               if ((curChunk + sizeOfCurEntry >= CPP) ||
+                       (curDirEntryInPage + 1 >= CM_DIR_EPP)) {
+                       curPage++;
+                       curDirEntryInPage = 0;
+                       curChunk = 1;
+               }
+               curChunk += sizeOfCurEntry;
+               curDirEntry++;
+               curDirEntryInPage++;
+       }
+
+       dirSize = (curPage+1) *  CM_DIR_PAGESIZE;
+       cm_FakeRootDir = malloc(dirSize);
+       cm_fakeDirSize = dirSize;
+
+       
+
+       // yj: when we get here, we've figured out how much memory we need and 
+       // allocated the appropriate space for it. we now prceed to fill
+       // it up with entries.
+       curPage = 0;
+       curDirEntry = 0;
+       curDirEntryInPage = 0;
+       curChunk = 0;
+       
+       // fields in the directory entry that are unused.
+       fakeEntry.flag = 1;
+       fakeEntry.length = 0;
+       fakeEntry.next = 0;
+       fakeEntry.fid.unique = htonl(1);
+
+       // the first page is special, it uses fakeDirHeader instead of fakePageHeader
+       // we fill up the page with dirEntries that belong there and we make changes
+       // to the fakeDirHeader.header.freeBitmap along the way. Then when we're done
+       // filling up the dirEntries in this page, we copy the fakeDirHeader into 
+       // the top of the page.
+
+       // init the freeBitmap array
+       for (i=0; i<8; i++) 
+               fakeDirHeader.header.freeBitmap[i]=0;
+
+       fakeDirHeader.header.freeBitmap[0] = 0xff;
+       fakeDirHeader.header.freeBitmap[1] = 0x7f;
+       
+
+       // we start counting at 13 because the 0th to 12th chunks are used for header
+       curChunk = 13;
+
+       // stick the first 2 entries "." and ".." in
+       fakeEntry.fid.unique = htonl(1);
+       fakeEntry.fid.vnode = htonl(1);
+       strcpy(fakeEntry.name, ".");
+       currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE;
+       memcpy(currentPos, &fakeEntry, CM_DIR_CHUNKSIZE);
+       curChunk++; curDirEntryInPage++;
+       strcpy(fakeEntry.name, "..");
+       currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE;
+       memcpy(currentPos, &fakeEntry, CM_DIR_CHUNKSIZE);
+       curChunk++; curDirEntryInPage++;
+
+       // keep putting stuff into page 0 if
+       // 1. we're not done with all entries
+       // 2. we have less than CM_DIR_EPP entries in page 0
+       // 3. we're not out of chunks in page 0
+
+       while( (curDirEntry!=cm_noLocalMountPoints) && 
+                  (curDirEntryInPage < CM_DIR_EPP) &&
+                  (curChunk + cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0) <= CPP)) 
+       {
+
+               noChunks = cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0);
+               fakeEntry.fid.vnode = htonl(curDirEntry + 2);
+               currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE;
+
+               memcpy(currentPos, &fakeEntry, CM_DIR_CHUNKSIZE);
+               strcpy(currentPos + 12, (cm_localMountPoints+curDirEntry)->namep);
+               curDirEntry++;
+               curDirEntryInPage++;
+               for (i=0; i<noChunks; i++) {
+                       t1 = (curChunk + i) / 8;
+                       t2 = curChunk + i - (t1*8);
+                       fakeDirHeader.header.freeBitmap[t1] |= (1 << t2);
+               }
+               curChunk+=noChunks;
+       }
+
+       // when we get here, we're done with filling in the entries for page 0
+       // copy in the header info
+
+       memcpy(cm_FakeRootDir, &fakeDirHeader, 13 * CM_DIR_CHUNKSIZE);
+
+       curPage++;
+
+       // ok, page 0's done. Move on to the next page.
+       while (curDirEntry!=cm_noLocalMountPoints) {
+               // setup a new page
+               curChunk = 1;                   // the zeroth chunk is reserved for page header
+               curDirEntryInPage = 0; 
+               for (i=0; i<8; i++) {
+                       fakePageHeader.freeBitmap[i]=0;
+               }
+               fakePageHeader.freeCount = 0;
+               fakePageHeader.pgcount = 0;
+               fakePageHeader.tag = htons(1234);
+               
+               // while we're on the same page...
+               while ( (curDirEntry!=cm_noLocalMountPoints) &&
+                               (curDirEntryInPage < CM_DIR_EPP) &&
+                           (curChunk + cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0) <= CPP))
+               {
+                       // add an entry to this page
+
+                       noChunks = cm_NameEntries((cm_localMountPoints+curDirEntry)->namep, 0);
+                       fakeEntry.fid.vnode=htonl(curDirEntry+2);
+                       currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE;
+                       memcpy(currentPos, &fakeEntry, CM_DIR_CHUNKSIZE);
+                       strcpy(currentPos + 12, (cm_localMountPoints+curDirEntry)->namep);
+                       curDirEntry++;
+                       curDirEntryInPage++;
+                       for (i=0; i<noChunks; i++) {
+                               t1 = (curChunk + i) / 8;
+                               t2 = curChunk + i - (t1*8);
+                               fakePageHeader.freeBitmap[t1] |= (1 << t2);
+                       }
+                       curChunk+=noChunks;
+               }
+               memcpy(cm_FakeRootDir + curPage * CM_DIR_PAGESIZE, &fakePageHeader, sizeof(fakePageHeader));
+
+               curPage++;
+       }
+       
+       // we know the fakeDir is setup properly, so we claim that we have callback
+       cm_fakeDirCallback=1;
+
+       // when we get here, we've set up everything! done!
+
+
+}
+
+int cm_FakeRootFid(cm_fid_t *fidp)
+{
+  fidp->cell = 0x1;            /* root cell */
+       fidp->volume = 0x20000001;   /* root.afs ? */
+       fidp->vnode = 0x1;
+       fidp->unique = 0x1;
+}
+  
+int cm_getLocalMountPointChange() {
+  return cm_localMountPointChangeFlag;
+}
+
+int cm_clearLocalMountPointChange() {
+  cm_localMountPointChangeFlag = 0;
+}
+
+/* called directly from ioctl */
+/* called while not holding freelance lock */
+int cm_noteLocalMountPointChange() {
+  lock_ObtainMutex(&cm_Freelance_Lock);
+  cm_fakeDirVersion++;
+  cm_localMountPointChangeFlag = 1;
+  lock_ReleaseMutex(&cm_Freelance_Lock);
+  return 1;
+}
+
+int cm_reInitLocalMountPoints() {
+       cm_fid_t aFid;
+       int i, j, hash;
+       cm_scache_t *scp, **lscpp, *tscp;
+
+       
+       printf("\n\n----- reinitialization starts ----- \n");
+
+
+       // first we invalidate all the SCPs that were created
+       // for the local mount points
+
+       printf("Invalidating local mount point scp...  ");
+
+       aFid.cell = 0x1;
+       aFid.volume=0x20000001;
+       aFid.unique=0x1;
+       aFid.vnode=0x2;
+
+       lock_ObtainWrite(&cm_scacheLock);
+       lock_ObtainMutex(&cm_Freelance_Lock);  /* always scache then freelance lock */
+       for (i=0; i<cm_noLocalMountPoints; i++) {
+               hash = CM_SCACHE_HASH(&aFid);
+               for (scp=cm_hashTablep[hash]; scp; scp=scp->nextp) {
+                       if (scp->fid.volume == aFid.volume &&
+                               scp->fid.vnode == aFid.vnode &&
+                               scp->fid.unique == aFid.unique 
+                               ) {
+
+                               // mark the scp to be reused
+                               lock_ReleaseWrite(&cm_scacheLock);
+                               lock_ObtainMutex(&scp->mx);
+                               cm_DiscardSCache(scp);
+                               lock_ReleaseMutex(&scp->mx);
+                               cm_CallbackNotifyChange(scp);
+                               lock_ObtainWrite(&cm_scacheLock);
+                               scp->refCount--;
+
+                               // take the scp out of the hash
+                               lscpp = &cm_hashTablep[hash];
+                               for (tscp=*lscpp; tscp; lscpp = &tscp->nextp, tscp = *lscpp) {
+                                       if (tscp == scp) break;
+                               }
+                               *lscpp = scp->nextp;
+                               scp->flags &= ~CM_SCACHEFLAG_INHASH;
+
+
+                       }
+               }
+               aFid.vnode = aFid.vnode + 1;
+       }
+       lock_ReleaseWrite(&cm_scacheLock);
+       printf("\tall old scp cleared!\n");
+
+       // we must free the memory that was allocated in the prev
+       // cm_InitLocalMountPoints call
+       printf("Removing old localmountpoints...  ");
+       free(cm_localMountPoints);
+       printf("\tall old localmountpoints cleared!\n");
+
+       // now re-init the localmountpoints
+       printf("Creating new localmountpoints...  ");
+       cm_InitLocalMountPoints();
+       printf("\tcreated new set of localmountpoints!\n");
+       
+       
+       // now we have to free the memory allocated in cm_initfakerootdir
+       printf("Removing old fakedir...  ");
+       free(cm_FakeRootDir);
+       printf("\t\told fakedir removed!\n");
+
+       // then we re-create that dir
+       printf("Creating new fakedir...  ");
+       cm_InitFakeRootDir();
+       printf("\t\tcreated new fakedir!\n");   
+
+       lock_ReleaseMutex(&cm_Freelance_Lock);
+
+       printf("----- reinit complete -----\n\n");
+}
+
+
+// yj: open up the ini file and read all the local mount 
+// points that are stored there. Part of the initialization
+// process for the freelance client.
+/* to be called while holding freelance lock unless during init. */
+long cm_InitLocalMountPoints() {
+       
+       FILE *fp;
+       char line[200];
+       int n, i;
+       char* t;
+       cm_localMountPoint_t* aLocalMountPoint;
+       char hdir[120];
+
+       cm_GetConfigDir(hdir);
+       strcat(hdir, AFS_FREELANCE_INI);
+       // open the ini file for reading
+       fp = fopen(hdir, "r");
+
+       // if we fail to open the file, create an empty one
+       if (!fp) {
+         fp = fopen(hdir, "w");
+         fputs("0\n", fp);
+         fclose(fp);
+         return 0;  /* success */
+       }
+
+       // we successfully opened the file
+#ifdef DEBUG
+       fprintf(stderr, "opened afs_freelance.ini\n");
+#endif
+       
+       // now we read the first line to see how many entries
+       // there are
+       fgets(line, 200, fp);
+
+       // if the line is empty at any point when we're reading
+       // we're screwed. report error and return.
+       if (*line==0) {
+               afsi_log("error occurred while reading afs_freelance.ini");
+               fprintf(stderr, "error occurred while reading afs_freelance.ini");
+               return -1;
+       }
+
+       // get the number of entries there are from the first line
+       // that we read
+       cm_noLocalMountPoints = atoi(line);
+
+       // create space to store the local mount points
+       cm_localMountPoints = malloc(sizeof(cm_localMountPoint_t) * cm_noLocalMountPoints);
+       aLocalMountPoint = cm_localMountPoints;
+               
+       // now we read n lines and parse them into local mount points
+       // where n is the number of local mount points there are, as
+       // determined above.
+       // Each line in the ini file represents 1 local mount point and 
+       // is in the format xxx#yyy:zzz, where xxx is the directory
+       // entry name, yyy is the cell name and zzz is the volume name.
+       // #yyy:zzz together make up the mount point.
+       for (i=0; i<cm_noLocalMountPoints; i++) {
+               fgets(line, 200, fp);
+               // check that the line is not empty
+               if (line[0]==0) {
+                       afsi_log("error occurred while parsing entry in %s: empty line in line %d", AFS_FREELANCE_INI, i);
+                       fprintf(stderr, "error occurred while parsing entry in afs_freelance.ini: empty line in line %d", i);
+                       return -1;
+               }
+               // line is not empty, so let's parse it
+               t = strchr(line, '#');
+               // make sure that there is a '#' separator in the line
+               if (!t) {
+                       afsi_log("error occurred while parsing entry in %s: no # separator in line %d", AFS_FREELANCE_INI, i);
+                       fprintf(stderr, "error occurred while parsing entry in afs_freelance.ini: no # separator in line %d", i);
+                       return -1;
+               }
+               aLocalMountPoint->namep=malloc(t-line+1);
+               memcpy(aLocalMountPoint->namep, line, t-line);
+               *(aLocalMountPoint->namep + (t-line)) = 0;
+               aLocalMountPoint->mountPointStringp=malloc(strlen(line) - (t-line) + 1);
+               memcpy(aLocalMountPoint->mountPointStringp, t, strlen(line)-(t-line)-2);
+               *(aLocalMountPoint->mountPointStringp + (strlen(line)-(t-line)-2)) = 0;
+#ifdef DEBUG
+               fprintf(stderr, "found mount point: name %s, string %s\n",
+                       aLocalMountPoint->namep,
+                       aLocalMountPoint->mountPointStringp);
+#endif
+               
+               aLocalMountPoint++;
+
+       }
+       fclose(fp);
+       return 0;
+}
+
+
+int cm_getNoLocalMountPoints() {
+       return cm_noLocalMountPoints;
+}
+
+cm_localMountPoint_t* cm_getLocalMountPoint(int vnode) {
+       return 0;
+}
+
+long cm_FreelanceAddMount(char *filename, char *cellname, char *volume)
+{
+    FILE *fp;
+    char hfile[120];
+    char line[200];
+    int n;
+
+    lock_ObtainMutex(&cm_Freelance_Lock);
+
+     cm_GetConfigDir(hfile);
+     strcat(hfile, AFS_FREELANCE_INI);
+     fp = fopen(hfile, "r+");
+     if (!fp)
+       return CM_ERROR_INVAL;
+     fgets(line, 200, fp);
+     n = atoi(line);
+     n++;
+     fseek(fp, 0, SEEK_SET);
+     fprintf(fp, "%d", n);
+     fseek(fp, 0, SEEK_END);
+     fprintf(fp, "%s#%s:%s\n", filename, cellname, volume);
+     fclose(fp);
+     lock_ReleaseMutex(&cm_Freelance_Lock);
+
+     cm_noteLocalMountPointChange();
+
+     return 0;
+}
+
+long cm_FreelanceRemoveMount(char *toremove)
+{
+     int i, n, t1, t2;
+     char* cp;
+     char line[200];
+     char shortname[200];
+     char hfile[120], hfile2[120];
+     FILE *fp1, *fp2;
+     char cmd[200];
+     int found=0;
+
+    lock_ObtainMutex(&cm_Freelance_Lock);
+
+     cm_GetConfigDir(hfile);
+     strcat(hfile, AFS_FREELANCE_INI);
+     strcpy(hfile2, hfile);
+     strcat(hfile2, "2");
+     fp1=fopen(hfile, "r+");
+     if (!fp1)
+       return CM_ERROR_INVAL;
+     fp2=fopen(hfile2, "w+");
+     if (!fp2) {
+       fclose(fp1);
+       return CM_ERROR_INVAL;
+     }
+
+     fgets(line, 200, fp1);
+     n=atoi(line);
+     fprintf(fp2, "%d\n", n-1);
+
+     for (i=0; i<n; i++) {
+          fgets(line, 200, fp1);
+          cp=strchr(line, '#');
+          memcpy(shortname, line, cp-line);
+          shortname[cp-line]=0;
+
+          if (strcmp(shortname, toremove)==0) {
+
+          } else {
+           found = 1;
+           fputs(line, fp2);
+          }
+     }
+
+     fclose(fp1);
+     fclose(fp2);
+     if (!found)
+       return CM_ERROR_NOSUCHFILE;
+
+     unlink(hfile);
+     rename(hfile2, hfile);
+
+     lock_ReleaseMutex(&cm_Freelance_Lock);
+
+     cm_noteLocalMountPointChange();
+     return 0;
+}
+
+#endif /* AFS_FREELANCE_CLIENT */
diff --git a/src/WINNT/afsd/cm_freelance.h b/src/WINNT/afsd/cm_freelance.h
new file mode 100644 (file)
index 0000000..63cfae5
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef _CM_FREELANCE_H
+#define _CM_FREELANCE_H 1
+
+
+typedef struct cm_localMountPoint {
+       char* namep;
+       char* mountPointStringp;
+       struct cm_localMountPoint* next;
+} cm_localMountPoint_t;
+
+extern int cm_getNoLocalMountPoints();
+extern long cm_InitLocalMountPoints();
+extern int cm_getLocalMountPointChange();
+extern int cm_reInitLocalMountPoints();
+extern cm_localMountPoint_t* cm_getLocalMountPoint(int vnode);
+
+#define AFS_FREELANCE_INI "afs_freelance.ini"
+
+#endif // _CM_FREELANCE_H
index 58d8873b78685df8f0d06d0aa3f35aa2f683d7b9..eb5a6715ced8ab867d0fc7205412a07cd629146c 100644 (file)
@@ -44,6 +44,9 @@
 #define MAX_PATH 260
 
 osi_mutex_t cm_Afsdsbmt_Lock;
+#ifdef AFS_FREELANCE_CLIENT
+extern osi_mutex_t cm_Freelance_Lock;
+#endif
 
 extern afs_int32 cryptall;
 
@@ -1130,6 +1133,7 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
         char fullCell[256];
        char volume[256];
        char cell[256];
+       int ttl;
 
        cm_InitReq(&req);
         
@@ -1155,7 +1159,11 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
        
                /* Get the full name for this cell */
                code = cm_SearchCellFile(cell, fullCell, 0, 0);
-               if (code)
+#ifdef AFS_AFSDB_ENV
+               if (code && cm_dnsEnabled)
+                  code = cm_SearchCellByDNS(cell, fullCell, &ttl, 0, 0);
+#endif
+                 if (code)
                        return CM_ERROR_NOSUCHCELL;
        
                sprintf(mpInfo, "%c%s:%s", *ioctlp->inDatap, fullCell, volume);
@@ -1164,6 +1172,14 @@ long cm_IoctlCreateMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp)
                strcpy(mpInfo, ioctlp->inDatap);
         }
 
+#ifdef AFS_FREELANCE_CLIENT
+       if (cm_freelanceEnabled && dscp == cm_rootSCachep) {
+         /* we are adding the mount point to the root dir., so call
+            the freelance code to do the add. */
+         code = cm_FreelanceAddMount(leaf, fullCell, volume);
+         return code;
+       }
+#endif
        /* create the symlink with mode 644.  The lack of X bits tells
          * us that it is a mount point.
          */
@@ -1854,9 +1870,9 @@ long cm_IoctlSetRxkcrypt(smb_ioctl_t *ioctlp, cm_user_t *userp)
 extern int afsd_shutdown(int);
 extern int afs_shutdown;
 
-long cm_IoctlShutdown(smb_ioctl_t *ioctlp, cm_user_t *userp)
-{
+long cm_IoctlShutdown(smb_ioctl_t *ioctlp, cm_user_t *userp) {
   afs_shutdown = 1;   /* flag to shut down */
   return 0;
 }
 #endif /* DJGPP */
+
index ee5b338ac54e29a89e883a00d01bc86b19b325c3..04ba13bfa7633aaf6587d041f17227f5ea0dadf3 100644 (file)
@@ -125,6 +125,9 @@ extern long cm_IoctlSetRxkcrypt(smb_ioctl_t *ioctlp, cm_user_t *userp);
 
 extern long cm_IoctlShutdown(smb_ioctl_t *ioctlp, cm_user_t *userp);
 
+extern long cm_IoctlFreemountAddCell(smb_ioctl_t *ioctlp, cm_user_t *userp);
+
+extern long cm_IoctlFreemountRemoveCell(smb_ioctl_t *ioctlp, cm_user_t *userp);
 
 #endif /* __CM_IOCTL_INTERFACES_ONLY__ */
 
index 759a31f342a0a84beafcf2894ec0b7eb5b462da2..d3add600903837ee4ac09c6a08026df7084ccf17 100644 (file)
@@ -43,6 +43,10 @@ osi_rwlock_t cm_scacheLock;
 /* Dummy scache entry for use with pioctl fids */
 cm_scache_t cm_fakeSCache;
 
+#ifdef AFS_FREELANCE_CLIENT
+extern osi_mutex_t cm_Freelance_Lock;
+#endif
+
 /* must be called with cm_scacheLock write-locked! */
 void cm_AdjustLRU(cm_scache_t *scp)
 {
@@ -236,11 +240,16 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
         long code;
         cm_volume_t *volp;
         cm_cell_t *cellp;
+       char* mp;
+       int special; // yj: boolean variable to test if file is on root.afs
+       int isRoot;
         
         hash = CM_SCACHE_HASH(fidp);
         
        osi_assert(fidp->cell != 0);
 
+       // yj: check if we have the scp, if so, we don't need
+       // to do anything else
         lock_ObtainWrite(&cm_scacheLock);
        for(scp=cm_hashTablep[hash]; scp; scp=scp->nextp) {
                if (cm_FidCmp(fidp, &scp->fid) == 0) {
@@ -252,18 +261,85 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
                 }
         }
         
-        /* otherwise, we need to find the volume */
-        lock_ReleaseWrite(&cm_scacheLock);     /* for perf. reasons */
-        cellp = cm_FindCellByID(fidp->cell);
-        if (!cellp) return CM_ERROR_NOSUCHCELL;
+       // yj: when we get here, it means we don't have an scp
+       // so we need to either load it or fake it, depending
+       // on whether the file is "special", see below.
+
+       // yj: if we're trying to get an scp for a file that's
+       // on root.afs of homecell, we want to handle it specially
+       // because we have to fill in the status stuff 'coz we
+       // don't want trybulkstat to fill it in for us
+#ifdef AFS_FREELANCE_CLIENT
+       special = (fidp->cell==0x1 && fidp->volume==0x20000001 && 
+                          !(fidp->vnode==0x1 && fidp->unique==0x1));
+       isRoot = (fidp->cell==0x1 && fidp->volume==0x20000001 && 
+                          fidp->vnode==0x1 && fidp->unique==0x1);
+       if (cm_freelanceEnabled && isRoot) {
+          /* freelance: if we are trying to get the root scp for the first
+             time, we will just put in a place holder entry. */
+         volp = NULL;
+       }
+         
+       if (cm_freelanceEnabled && special) {
+         /*afsi_log("cm_getscache: special"); */
+               lock_ObtainMutex(&cm_Freelance_Lock);
+               mp =(cm_localMountPoints+fidp->vnode-2)->mountPointStringp;
+               lock_ReleaseMutex(&cm_Freelance_Lock);
+               
+               scp = cm_GetNewSCache();
+               
+               scp->fid = *fidp;
+               scp->volp = cm_rootSCachep->volp;
+               if (scp->dotdotFidp == (cm_fid_t *) NULL)
+                       scp->dotdotFidp = (cm_fid_t *) malloc (sizeof(cm_fid_t));
+               scp->dotdotFidp->cell=0x1;
+               scp->dotdotFidp->volume=0x20000001;
+               scp->dotdotFidp->unique=1;
+               scp->dotdotFidp->vnode=1;
+               scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
+               scp->nextp=cm_hashTablep[hash];
+               cm_hashTablep[hash]=scp;
+               scp->flags |= CM_SCACHEFLAG_INHASH;
+               scp->refCount = 1;
+               scp->fileType = CM_SCACHETYPE_MOUNTPOINT;
+
+               lock_ObtainMutex(&cm_Freelance_Lock);
+               scp->length.LowPart = strlen(mp)+4;
+               scp->mountPointStringp=malloc(strlen(mp));
+               strcpy(scp->mountPointStringp,mp);
+               lock_ReleaseMutex(&cm_Freelance_Lock);
+
+               scp->owner=0x0;
+               scp->unixModeBits=0x1ff;
+               scp->clientModTime=0x3b49f6e2;
+               scp->serverModTime=0x3b49f6e2;
+               scp->parentUnique = 0x1;
+               scp->parentVnode=0x1;
+               scp->group=0;
+               scp->dataVersion=0x8;
+               *outScpp = scp;
+               lock_ReleaseWrite(&cm_scacheLock);
+               /*afsi_log("   getscache done");*/
+               return 0;
 
-        code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, &volp);
-        if (code) return code;
+       }
+       // end of yj code
+#endif /* AFS_FREELANCE_CLIENT */
+
+        /* otherwise, we need to find the volume */
+       if (!cm_freelanceEnabled || !isRoot) {
+         lock_ReleaseWrite(&cm_scacheLock);    /* for perf. reasons */
+         cellp = cm_FindCellByID(fidp->cell);
+         if (!cellp) return CM_ERROR_NOSUCHCELL;
+
+         code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, &volp);
+         if (code) return code;
+          lock_ObtainWrite(&cm_scacheLock);
+       }
         
         /* otherwise, we have the volume, now reverify that the scp doesn't
          * exist, and proceed.
          */
-        lock_ObtainWrite(&cm_scacheLock);
        for(scp=cm_hashTablep[hash]; scp; scp=scp->nextp) {
                if (cm_FidCmp(fidp, &scp->fid) == 0) {
                        scp->refCount++;
@@ -281,20 +357,22 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
        scp->fid = *fidp;
        scp->volp = volp;       /* a held reference */
 
-       /* if this scache entry represents a volume root then we need 
-        * to copy the dotdotFipd from the volume structure where the 
-        * "master" copy is stored (defect 11489)
-        */
-       if(scp->fid.vnode == 1 && scp->fid.unique == 1 && volp->dotdotFidp) {
-               if (scp->dotdotFidp == (cm_fid_t *) NULL)
-                       scp->dotdotFidp = (cm_fid_t *) malloc(sizeof(cm_fid_t));
-               *(scp->dotdotFidp) = *volp->dotdotFidp;
+       if (!cm_freelanceEnabled || !isRoot) {
+         /* if this scache entry represents a volume root then we need 
+          * to copy the dotdotFipd from the volume structure where the 
+          * "master" copy is stored (defect 11489)
+          */
+         if(scp->fid.vnode == 1 && scp->fid.unique == 1 && volp->dotdotFidp) {
+           if (scp->dotdotFidp == (cm_fid_t *) NULL)
+             scp->dotdotFidp = (cm_fid_t *) malloc(sizeof(cm_fid_t));
+           *(scp->dotdotFidp) = *volp->dotdotFidp;
+         }
+         
+         if (volp->roID == fidp->volume)
+           scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
+         else if (volp->bkID == fidp->volume)
+           scp->flags |= CM_SCACHEFLAG_RO;
        }
-
-       if (volp->roID == fidp->volume)
-               scp->flags |= (CM_SCACHEFLAG_PURERO | CM_SCACHEFLAG_RO);
-       else if (volp->bkID == fidp->volume)
-                       scp->flags |= CM_SCACHEFLAG_RO;
        scp->nextp = cm_hashTablep[hash];
        cm_hashTablep[hash] = scp;
         scp->flags |= CM_SCACHEFLAG_INHASH;
@@ -504,7 +582,16 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *up, cm_req_t *reqp,
                                goto sleep;
                 }
 
-                if (flags & CM_SCACHESYNC_NEEDCALLBACK) {
+               // yj: modified this so that callback only checked if we're
+               // not checking something on /afs
+               if (  (flags & CM_SCACHESYNC_NEEDCALLBACK)
+#ifdef AFS_FREELANCE_CLIENT
+                       && (!cm_freelanceEnabled || !(!(scp->fid.vnode==0x1 &&
+                                                        scp->fid.unique==0x1) &&
+                                                        scp->fid.cell==0x1 &&
+                                                        scp->fid.volume==0x20000001))
+#endif /* AFS_FREELANCE_CLIENT */
+                   ) {
                        if (!cm_HaveCallback(scp)) {
                                osi_Log1(afsd_logp, "CM SyncOp getting callback on scp %x",
                                        (long) scp);
@@ -703,6 +790,31 @@ void cm_SyncOpDone(cm_scache_t *scp, cm_buf_t *bufp, long flags)
 void cm_MergeStatus(cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volp,
        cm_user_t *userp, int flags)
 {
+       // yj: i want to create some fake status for the /afs directory and the
+       // entries under that directory
+#ifdef AFS_FREELANCE_CLIENT
+       if (cm_freelanceEnabled && scp == cm_rootSCachep) {
+               statusp->InterfaceVersion = 0x1;
+               statusp->FileType = 0x2;
+               statusp->LinkCount = scp->linkCount;
+               statusp->Length = cm_fakeDirSize;
+               statusp->DataVersion = cm_fakeDirVersion;
+               statusp->Author = 0x1;
+               statusp->Owner = 0x0;
+               statusp->CallerAccess = 0x9;
+               statusp->AnonymousAccess = 0x9;
+               statusp->UnixModeBits = 0x1ff;
+               statusp->ParentVnode = 0x1;
+               statusp->ParentUnique = 0x1;
+               statusp->SegSize = 0;
+               statusp->ClientModTime = 0x3b49f6e2;
+               statusp->ServerModTime = 0x3b49f6e2;
+               statusp->Group = 0;
+               statusp->SyncCounter = 0;
+               statusp->dataVersionHigh = 0;
+       }
+#endif /* AFS_FREELANCE_CLIENT */
+
        if (!(flags & CM_MERGEFLAG_FORCE)
                        && statusp->DataVersion < (unsigned long) scp->dataVersion) {
                struct cm_cell *cellp;
index 440d34de710c075d9179b37436231e02abd1e69c..e29d89dd1f37339ff676953b67a77945ecb0d725 100644 (file)
@@ -1059,6 +1059,14 @@ long cm_Unlink(cm_scache_t *dscp, char *namep, cm_user_t *userp, cm_req_t *reqp)
         AFSFetchStatus newDirStatus;
         AFSVolSync volSync;
 
+#ifdef AFS_FREELANCE_CLIENT
+       if (cm_freelanceEnabled && dscp == cm_rootSCachep) {
+         /* deleting a mount point from the root dir. */
+         code = cm_FreelanceRemoveMount(namep);
+         return code;
+       }
+#endif
+
        /* make sure we don't screw up the dir status during the merge */
         lock_ObtainMutex(&dscp->mx);
        sflags = CM_SCACHESYNC_STOREDATA;
@@ -1499,6 +1507,21 @@ long cm_TryBulkProc(cm_scache_t *scp, cm_dirEntry_t *dep, void *rockp,
                 cm_ReleaseSCache(tscp);
         }      /* found entry */
 
+#ifdef AFS_FREELANCE_CLIENT
+       // yj: if this is a mountpoint under root.afs then we don't want it
+       // to be bulkstat-ed, instead, we call getSCache directly and under
+       // getSCache, it is handled specially.
+       if      (cm_freelanceEnabled &&
+           tfid.cell==0x1 && tfid.volume==0x20000001 &&
+                          !(tfid.vnode==0x1 && tfid.unique==0x1) )
+       {
+#ifdef DEBUG
+               afsi_log("   cm_trybulkproc going to call getscache");
+#endif
+               return cm_GetSCache(&tfid, &tscp, NULL, NULL);
+       }
+#endif /* AFS_FREELANCE_CLIENT */
+
        i = bsp->counter++;
         bsp->fids[i].Volume = scp->fid.volume;
         bsp->fids[i].Vnode = tfid.vnode;
index b0b7bc91c6412de811e4eca573e82d4773f712c8..08c2d1e65a09f5bfb63639a304af2a4f7f018dfb 100644 (file)
@@ -17,3 +17,7 @@ EXPORTS
        cm_AppendNewCell                @10
        cm_AppendNewCellLine            @11
        cm_CloseCellFile                @12
+     cm_SearchCellByDNS       @13
+     getAFSServer             @14
+     cm_InitDNS               @15
+     cm_GetConfigDir          @16
index aaf0c8f96bf5e01e1c5648ad1d2a255530acb5e3..efeb5ebee012025c3917497803ec1d8c4ca192f1 100644 (file)
@@ -82,8 +82,10 @@ extern void osi_SleepSpin(long value, Crit_Sec *counterp);
 /* spin lock version of wakeup, used internally only */
 extern void osi_WakeupSpin(long value);
 
+#ifndef DJGPP
 /* exported function to sleep on a value */
 extern void osi_Sleep (long);
+#endif
 
 extern void osi_FreeSleepInfo(osi_sleepInfo_t *);
 
index c3e0194abb34e28fc0395f439ef361fdc2b17afc..928e20c8dffcb8ce8e3f999cf90c886a52fa8c13 100644 (file)
@@ -320,7 +320,7 @@ module_exit(afs_cleanup);
 
 static long get_page_offset(void)
 {
-#if defined(AFS_PPC_LINUX22_ENV) || defined(AFS_SPARC64_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || defined(AFS_ALPHA_LINUX20_ENV) || defined(AFS_S390_LINUX22_ENV) || defined(AFS_IA64_LINUX20_ENV)
+#if defined(AFS_PPC_LINUX22_ENV) || defined(AFS_SPARC64_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV) || defined(AFS_ALPHA_LINUX20_ENV) || defined(AFS_S390_LINUX22_ENV) || defined(AFS_IA64_LINUX20_ENV) || defined(AFS_PARISC_LINUX24_ENV)
     return PAGE_OFFSET;
 #else
     struct task_struct *p;
diff --git a/src/afs/LINUX/osi_vfs.h b/src/afs/LINUX/osi_vfs.h
deleted file mode 100644 (file)
index b5f92e1..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Copyright 2000, International Business Machines Corporation and others.
- * All Rights Reserved.
- * 
- * This software has been released under the terms of the IBM Public
- * License.  For details, see the LICENSE file in the top-level source
- * directory or online at http://www.openafs.org/dl/license10.html
- */
-
-/*
- * Linux interpretations of vnode and vfs structs.
- *
- * The Linux "inode" has been abstracted to the fs independent part to avoid
- * wasting 100+bytes per vnode.
- */
-
-#ifndef OSI_VFS_H_
-#define OSI_VFS_H_
-
-/* The vnode should match the current implementation of the fs independent
- * part of the Linux inode.
- */
-/* The first cut is to continue to use a separate vnode pool. */
-typedef struct vnode {
-       struct list_head        i_hash;
-       struct list_head        i_list;
-       struct list_head        i_dentry;
-#if defined(AFS_LINUX24_ENV)
-        struct list_head        i_dirty_buffers;
-#endif
-#if defined(STRUCT_INODE_HAS_I_DIRTY_DATA_BUFFERS)
-        struct list_head        i_dirty_data_buffers;
-#endif
-       unsigned long           i_ino;
-       unsigned int            i_count;
-       kdev_t                  i_dev;
-       umode_t                 i_mode;
-       nlink_t                 i_nlink;
-       uid_t                   i_uid;
-       gid_t                   i_gid;
-       kdev_t                  i_rdev;
-#if defined(AFS_LINUX24_ENV) || defined(pgoff2loff) 
-        loff_t                  i_size;
-#else
-       off_t                   i_size;
-#endif
-       time_t                  i_atime;
-       time_t                  i_mtime;
-       time_t                  i_ctime;
-       unsigned long           i_blksize;
-       unsigned long           i_blocks;
-       unsigned long           i_version;
-#if !defined(AFS_LINUX24_ENV)
-       unsigned long           i_nrpages;
-#endif
-#ifdef STRUCT_INODE_HAS_I_BYTES
-        unsigned short          i_bytes;
-#endif
-       struct semaphore        i_sem;
-#ifdef STRUCT_INODE_HAS_I_TRUNCATE_SEM
-        struct rw_semaphore     i_truncate_sem;
-#endif
-#if defined(AFS_LINUX24_ENV)
-        struct semaphore        i_zombie;
-#else
-       struct semaphore        i_atomic_write;
-#endif
-       struct inode_operations *i_op;
-#if defined(AFS_LINUX24_ENV)
-        struct file_operations  *i_fop;
-#endif
-       struct super_block      *i_sb;
-#if defined(AFS_LINUX24_ENV)
-        wait_queue_head_t       i_wait;
-#else
-       struct wait_queue       *i_wait;
-#endif
-       struct file_lock        *i_flock;
-#if defined(AFS_LINUX24_ENV)
-        struct address_space    *i_mapping;
-        struct address_space    i_data;
-#else
-       struct vm_area_struct   *i_mmap;
-#if defined(STRUCT_INODE_HAS_I_MMAP_SHARED)
-        struct vm_area_struct   *i_mmap_shared;
-#endif
-       struct page             *i_pages;
-#endif
-#if defined(STRUCT_INODE_HAS_I_MAPPING_OVERLOAD)
-        int                     i_mapping_overload;
-#endif
-       struct dquot            *i_dquot[MAXQUOTAS];
-#if defined(AFS_LINUX24_ENV)
-        struct pipe_inode_info  *i_pipe;
-        struct block_device     *i_bdev;
-#if defined(STRUCT_INODE_HAS_I_CDEV)
-        struct char_device      *i_cdev;
-#endif
-        unsigned long           i_dnotify_mask;
-        struct dnotify_struct   *i_dnotify;
-#endif
-
-       unsigned long           i_state;
-
-       unsigned int            i_flags;
-#if !defined(AFS_LINUX24_ENV)
-       unsigned char           i_pipe;
-#endif
-       unsigned char           i_sock;
-
-#if defined(AFS_LINUX24_ENV)
-        atomic_t                i_writecount;
-#else
-       int                     i_writecount;
-#endif
-       unsigned int            i_attr_flags;
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,10)
-       __u32                   i_generation;
-#endif
-#ifdef notdef
-       union {
-               struct pipe_inode_info          pipe_i;
-               struct minix_inode_info         minix_i;
-               struct ext2_inode_info          ext2_i;
-               struct hpfs_inode_info          hpfs_i;
-               struct ntfs_inode_info          ntfs_i;
-               struct msdos_inode_info         msdos_i;
-               struct umsdos_inode_info        umsdos_i;
-               struct iso_inode_info           isofs_i;
-               struct nfs_inode_info           nfs_i;
-               struct sysv_inode_info          sysv_i;
-               struct affs_inode_info          affs_i;
-               struct ufs_inode_info           ufs_i;
-               struct romfs_inode_info         romfs_i;
-               struct coda_inode_info          coda_i;
-               struct smb_inode_info           smbfs_i;
-               struct hfs_inode_info           hfs_i;
-               struct adfs_inode_info          adfs_i;
-               struct qnx4_inode_info          qnx4_i;    
-               struct socket                   socket_i;
-               void                            *generic_ip;
-       } u;
-#endif
-} vnode_t;
-
-/* Map vnode fields to inode fields. */
-#define i_number       i_ino
-#define v_count                i_count
-#define v_op           i_op
-#if defined(AFS_LINUX24_ENV)
-#define v_fop           i_fop
-#endif
-#define v_type         i_mode
-#define v_vfsp         i_sb
-#define vfs_vnodecovered s_covered
-
-/* v_type bits map to mode bits: */
-#define VNON 0
-#define VREG S_IFREG
-#define VDIR S_IFDIR
-#define VBLK S_IFBLK
-#define VCHR S_IFCHR
-#define VLNK S_IFLNK
-#define VSOCK S_IFSOCK
-
-/* vcexcl - used only by afs_create */
-enum vcexcl { EXCL, NONEXCL } ;
-
-/* afs_open and afs_close needs to distinguish these cases */
-#define FWRITE O_WRONLY|O_RDWR|O_APPEND
-#define FTRUNC O_TRUNC
-
-
-#define IO_APPEND O_APPEND
-#define FSYNC O_SYNC
-
-#define VTOI(V)  ((struct inode*)V)
-#define VN_HOLD(V) ((vnode_t*)V)->i_count++;
-#define VN_RELE(V) osi_iput((struct inode *)V);
-#define VFS_STATFS(V, S) ((V)->s_op->statfs)((V), (S), sizeof(*(S)))
-
-
-
-/* Various mode bits */
-#define VWRITE S_IWUSR
-#define VREAD  S_IRUSR
-#define VEXEC  S_IXUSR
-#define VSUID  S_ISUID
-#define VSGID  S_ISGID
-
-
-#define vfs super_block
-
-typedef struct vattr {
-    int                va_type;        /* One of v_types above. */
-    size_t     va_size;
-    unsigned long va_blocks;
-    unsigned long va_blocksize;
-    int                va_mask;        /* AT_xxx operation to perform. */
-    umode_t    va_mode;        /* mode bits. */
-    uid_t      va_uid;
-    gid_t      va_gid;
-    int                va_fsid;        /* Not used? */
-    dev_t      va_rdev;
-    ino_t      va_nodeid;      /* Inode number */
-    nlink_t    va_nlink;       /* link count for file. */
-    struct timeval va_atime;
-    struct timeval va_mtime;
-    struct timeval va_ctime;
-} vattr_t;
-
-#define VATTR_NULL(A) memset(A, 0, sizeof(struct vattr))
-
-
-/* va_masks - these should match their respective ATTR_xxx #defines in fs.h.
- * afs_notify_change has to use the attr bits in both the Linux and AFS
- * meanings. The glue layer code uses the ATTR_xxx style names.
- */
-#define AT_SIZE                ATTR_SIZE
-#define AT_MODE                ATTR_MODE
-#define AT_UID         ATTR_UID
-#define AT_GID         ATTR_GID
-#define AT_MTIME       ATTR_MTIME
-
-
-#define vnodeops inode_operations
-
-#endif /* OSI_VFS_H_ */
diff --git a/src/afs/LINUX/osi_vfs.hin b/src/afs/LINUX/osi_vfs.hin
new file mode 100644 (file)
index 0000000..ee0588b
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ * 
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
+/*
+ * Linux interpretations of vnode and vfs structs.
+ *
+ * The Linux "inode" has been abstracted to the fs independent part to avoid
+ * wasting 100+bytes per vnode.
+ */
+
+#ifndef OSI_VFS_H_
+#define OSI_VFS_H_
+
+/* The vnode should match the current implementation of the fs independent
+ * part of the Linux inode.
+ */
+/* The first cut is to continue to use a separate vnode pool. */
+/* LINUX VNODE INCLUDED BELOW -- DO NOT MODIFY */
+
+typedef struct vnode vnode_t;
+
+/* Map vnode fields to inode fields. */
+#define i_number       i_ino
+#define v_count                i_count
+#define v_op           i_op
+#if defined(AFS_LINUX24_ENV)
+#define v_fop           i_fop
+#endif
+#define v_type         i_mode
+#define v_vfsp         i_sb
+#define vfs_vnodecovered s_covered
+
+/* v_type bits map to mode bits: */
+#define VNON 0
+#define VREG S_IFREG
+#define VDIR S_IFDIR
+#define VBLK S_IFBLK
+#define VCHR S_IFCHR
+#define VLNK S_IFLNK
+#define VSOCK S_IFSOCK
+
+/* vcexcl - used only by afs_create */
+enum vcexcl { EXCL, NONEXCL } ;
+
+/* afs_open and afs_close needs to distinguish these cases */
+#define FWRITE O_WRONLY|O_RDWR|O_APPEND
+#define FTRUNC O_TRUNC
+
+
+#define IO_APPEND O_APPEND
+#define FSYNC O_SYNC
+
+#define VTOI(V)  ((struct inode*)V)
+#ifdef AFS_LINUX24_ENV
+#define VN_HOLD(V) atomic_inc(&((vnode_t*)V)->i_count)
+#else
+#define VN_HOLD(V) ((vnode_t*)V)->i_count++;
+#endif
+#define VN_RELE(V) osi_iput((struct inode *)V);
+#define VFS_STATFS(V, S) ((V)->s_op->statfs)((V), (S), sizeof(*(S)))
+
+
+
+/* Various mode bits */
+#define VWRITE S_IWUSR
+#define VREAD  S_IRUSR
+#define VEXEC  S_IXUSR
+#define VSUID  S_ISUID
+#define VSGID  S_ISGID
+
+
+#define vfs super_block
+
+typedef struct vattr {
+    int                va_type;        /* One of v_types above. */
+    size_t     va_size;
+    unsigned long va_blocks;
+    unsigned long va_blocksize;
+    int                va_mask;        /* AT_xxx operation to perform. */
+    umode_t    va_mode;        /* mode bits. */
+    uid_t      va_uid;
+    gid_t      va_gid;
+    int                va_fsid;        /* Not used? */
+    dev_t      va_rdev;
+    ino_t      va_nodeid;      /* Inode number */
+    nlink_t    va_nlink;       /* link count for file. */
+    struct timeval va_atime;
+    struct timeval va_mtime;
+    struct timeval va_ctime;
+} vattr_t;
+
+#define VATTR_NULL(A) memset(A, 0, sizeof(struct vattr))
+
+
+/* va_masks - these should match their respective ATTR_xxx #defines in fs.h.
+ * afs_notify_change has to use the attr bits in both the Linux and AFS
+ * meanings. The glue layer code uses the ATTR_xxx style names.
+ */
+#define AT_SIZE                ATTR_SIZE
+#define AT_MODE                ATTR_MODE
+#define AT_UID         ATTR_UID
+#define AT_GID         ATTR_GID
+#define AT_MTIME       ATTR_MTIME
+
+
+#define vnodeops inode_operations
+
+#endif /* OSI_VFS_H_ */
index f43367f492619479565912bb272809dd0eaa4b83..6c3f8ce9f6091a6545bd3858abbb9c585424a84a 100644 (file)
@@ -335,8 +335,8 @@ int afs_statfs(struct super_block *sbp, struct statfs *statp, int size)
 void 
 afs_umount_begin(struct super_block *sbp)
 {
-    afs_shuttingdown=1;
     afs_put_super(sbp);      
+    afs_shuttingdown=1;
     afs_was_mounted=0;
 }
 
@@ -347,7 +347,7 @@ struct super_operations afs_sops = {
     delete_inode:      afs_delete_inode,
     put_super:         afs_put_super,
     statfs:            afs_statfs,
-    umount_begin:      afs_umount_begin,
+    umount_begin:      NULL /* afs_umount_begin */
 };
 #else
 struct super_operations afs_sops = {
@@ -361,7 +361,7 @@ struct super_operations afs_sops = {
     afs_statfs,
     NULL,              /* afs_remount_fs - see doc above */
     NULL,              /* afs_clear_inode */
-    afs_umount_begin,
+    NULL                /* afs_umount_begin */
 };
 #endif
 
index bf487a7a04c85ab5a91b8b43aa981149512777b9..71831dfae2ba92e5d6047ab49076b1dadb06b4d2 100644 (file)
@@ -43,7 +43,7 @@ int osi_VM_FlushVCache(struct vcache *avc, int *slept)
 {
     struct inode *ip = (struct inode*)avc;
 
-    if (avc->vrefCount != 0)
+    if (VREFCOUNT(avc) != 0)
        return EBUSY;
 
     if (avc->opens != 0)
index 068c1a70fdef0893a89893558c0f9d388c055ebf..c7709cd9600b205639d00d18392167443ae13885 100644 (file)
@@ -339,8 +339,13 @@ afs_osi_Write(afile, offset, aptr, asize)
         osi_Panic("afs_osi_Write called with null param");
     if (offset != -1) afile->offset = offset;
     AFS_GUNLOCK();
+#ifdef AFS_SUN59_ENV
+    code = gop_rdwr(UIO_WRITE, afile->vnode, (caddr_t) aptr, asize, afile->offset,
+                 AFS_UIOSYS, 0, curproc->p_fsz_ctl.rlim_cur, &afs_osi_cred, &resid);
+#else
     code = gop_rdwr(UIO_WRITE, afile->vnode, (caddr_t) aptr, asize, afile->offset,
                  AFS_UIOSYS, 0,  (u.u_rlimit[RLIMIT_FSIZE].rlim_cur), &afs_osi_cred, &resid);
+#endif
     AFS_GLOCK();
     if (code == 0) {
        code = asize - resid;
index 7da976e8f657445179d8335ec01ac8c348b8f2d6..1a92793158fa17a9bd761da8f55a14692798ed01 100644 (file)
@@ -308,7 +308,7 @@ afsinit(struct vfssw *vfsswp, int fstype)
     if ( !nfs_checkauth ) afs_warn("nfs_checkauth not initialised");
 #endif
     ufs_iallocp = (int (*)()) modlookup("ufs", "ufs_ialloc");    
-    ufs_iupdatp = (int (*)()) modlookup("ufs", "ufs_iupdat");
+    ufs_iupdatp = (void (*)()) modlookup("ufs", "ufs_iupdat");
     ufs_igetp = (int (*)()) modlookup("ufs", "ufs_iget");    
     ufs_itimes_nolockp = (void (*)()) modlookup("ufs", "ufs_itimes_nolock");
     udp_infop = (struct streamtab *) modlookup("udp", "udpinfo");    
index 19cebd06c3c2c7e52507bdd3eef7886c1c779db0..a005ec193b551ee9014cc364f531021d7370ec77 100644 (file)
@@ -1419,7 +1419,11 @@ afs_seek(vnp, ooff, noffp)
     return code;
 }
 
-int afs_frlock(vnp, cmd, ap, flag, off, credp)
+int afs_frlock(vnp, cmd, ap, flag, off,
+#ifdef AFS_SUN59_ENV
+              flkcb,
+#endif
+              credp)
     struct vnode *vnp;
     int cmd;
 #if    defined(AFS_SUN56_ENV)
@@ -1429,6 +1433,9 @@ int afs_frlock(vnp, cmd, ap, flag, off, credp)
 #endif
     int flag;
     offset_t off;
+#ifdef AFS_SUN59_ENV
+    struct flk_callback *flkcb;
+#endif
     struct AFS_UCRED *credp;
 {
     register afs_int32 code = 0;
@@ -1436,6 +1443,10 @@ int afs_frlock(vnp, cmd, ap, flag, off, credp)
      * Implement based on afs_lockctl
      */
     AFS_GLOCK();
+#ifdef AFS_SUN59_ENV
+    if (flkcb)
+       afs_warn("Don't know how to deal with flk_callback's!\n");
+#endif
     if ((cmd == F_GETLK) || (cmd == F_O_GETLK) || (cmd == F_SETLK) || (cmd ==  F_SETLKW)) {
 #ifdef AFS_SUN53_ENV
        ap->l_pid = ttoproc(curthread)->p_pid;
@@ -1533,9 +1544,16 @@ struct cred *credp;
     return EINVAL;
 }
 
-int  afs_dumpctl(vp, i)
+int  afs_dumpctl(vp, i
+#ifdef AFS_SUN59_ENV
+                , blkp
+#endif
+                )
 struct vnode *vp;
 int i;
+#ifdef AFS_SUN59_ENV
+int *blkp;
+#endif
 {
     afs_warn("afs_dumpctl: Not implemented\n");
     return EINVAL;
index 2549905d471b1616cf0cd7bd0b06c0c23f5dcafc..25090529850df18be05c80252e079ecd9a38bc14 100644 (file)
@@ -831,7 +831,7 @@ static int GetFlockCount(struct vcache *avc, struct vrequest *areq)
     if (code) {
        return(0);              /* failed, say it is 'unlocked' */
     } else {
-       return((int)OutStatus.spare2);
+       return((int)OutStatus.lockCount);
     }
 }
 #endif
index 4ee681d61469ddddf50554f879b5358141d8efb0..1d73d09d768cc31c3cc040311900c61699568884 100644 (file)
@@ -353,7 +353,7 @@ extern int BlobScan(afs_int32 *afile, afs_int32 ablob);
  * CForeign bit set.
  */
 struct vcache * BStvc = (struct vcache *) 0;
-void afs_DoBulkStat(adp, dirCookie, areqp)
+int afs_DoBulkStat(adp, dirCookie, areqp)
   struct vcache *adp;
   long dirCookie;
   struct vrequest *areqp;
@@ -397,6 +397,7 @@ void afs_DoBulkStat(adp, dirCookie, areqp)
     struct volume *volp=0;     /* volume ptr */
     struct VenusFid dotdot;
     int        flagIndex;              /* First file with bulk fetch flag set */
+    int inlinebulk=0;           /* Did we use InlineBulk RPC or not? */
     XSTATS_DECLS
 
     /* first compute some basic parameters.  We dont want to prefetch more
@@ -607,8 +608,16 @@ tagain:
 #ifdef RX_ENABLE_LOCKS
            AFS_GUNLOCK();
 #endif /* RX_ENABLE_LOCKS */
-           code = RXAFS_BulkStatus(tcp->id, &fidParm, &statParm, &cbParm,
-                                   &volSync);
+           code = RXAFS_InlineBulkStatus(tcp->id, &fidParm, &statParm,
+                                         &cbParm, &volSync);
+           if (code == RXGEN_OPCODE) {
+               code = RXAFS_BulkStatus(tcp->id, &fidParm, &statParm, &cbParm,
+                                       &volSync);
+               inlinebulk=0;
+           } else {
+               inlinebulk=1;
+           }
+
 #ifdef RX_ENABLE_LOCKS
            AFS_GLOCK();
 #endif /* RX_ENABLE_LOCKS */
@@ -680,6 +689,8 @@ tagain:
      * We also have to take into account racing token revocations.
      */
     for(i=0; i<fidIndex; i++) {
+       if ((&statsp[i])->errorCode) 
+           continue;
        afid.Cell = adp->fid.Cell;
        afid.Fid.Volume = adp->fid.Fid.Volume;
        afid.Fid.Vnode = fidsp[i].Vnode;
@@ -846,8 +857,20 @@ tagain:
     if ( volp )
        afs_PutVolume(volp, READ_LOCK);
     
+    /* If we did the InlineBulk RPC pull out the return code */
+    if (inlinebulk) {
+       if ((&statsp[0])->errorCode) {
+           afs_Analyze(tcp, (&statsp[0])->errorCode, &adp->fid, areqp, 
+                       AFS_STATS_FS_RPCIDX_BULKSTATUS, SHARED_LOCK, 
+                       (struct cell *)0);
+           code = (&statsp[0])->errorCode;
+       }
+    } else {
+       code = 0;
+    }
     osi_FreeLargeSpace(statMemp);
     osi_FreeLargeSpace(cbfMemp);
+    return code;
 }
 
 /* was: (AFS_DEC_ENV) || defined(AFS_OSF30_ENV) || defined(AFS_NCR_ENV) */
@@ -885,6 +908,7 @@ afs_lookup(adp, aname, avcp, acred)
     char *tname = (char *)0;
     register struct vcache *tvc=0;
     register afs_int32 code;
+    register afs_int32 bulkcode = 0;
     int pass = 0, hit = 0;
     long dirCookie;
     extern afs_int32 afs_mariner;                      /*Writing activity to log?*/
@@ -892,6 +916,7 @@ afs_lookup(adp, aname, avcp, acred)
     afs_hyper_t versionNo;
     int no_read_access = 0;
     struct sysname_info sysState;   /* used only for @sys checking */
+    int dynrootRetry = 1;
 
     AFS_STATCNT(afs_lookup);
 #ifdef AFS_OSF_ENV
@@ -903,7 +928,7 @@ afs_lookup(adp, aname, avcp, acred)
     *avcp = (struct vcache *) 0;   /* Since some callers don't initialize it */
 
     if (code = afs_InitReq(&treq, acred)) { 
-      goto done;
+       goto done;
     }
 
     /* come back to here if we encounter a non-existent object in a read-only
@@ -911,10 +936,12 @@ afs_lookup(adp, aname, avcp, acred)
 
   redo:
     *avcp = (struct vcache *) 0;   /* Since some callers don't initialize it */
+    bulkcode = 0;
 
     if (!(adp->states & CStatd)) {
-       if (code = afs_VerifyVCache2(adp, &treq))
-         goto done;
+       if (code = afs_VerifyVCache2(adp, &treq)) {
+           goto done;
+       }
     }
     else code = 0;
 
@@ -947,7 +974,7 @@ afs_lookup(adp, aname, avcp, acred)
        *avcp = tvc;
        code = (tvc ? 0 : ENOENT);
        hit = 1;
-       if (tvc && !tvc->vrefCount) {
+       if (tvc && !VREFCOUNT(tvc)) {
            osi_Panic("TT1");
        }
        if (code) {
@@ -980,13 +1007,13 @@ afs_lookup(adp, aname, avcp, acred)
        ObtainReadLock(&afs_xvcache);   
        osi_vnhold(adp, 0);
        ReleaseReadLock(&afs_xvcache);  
-      code = 0;
-      *avcp = tvc = adp;
-      hit = 1;
-       if (adp && !adp->vrefCount) {
+       code = 0;
+       *avcp = tvc = adp;
+       hit = 1;
+       if (adp && !VREFCOUNT(adp)) {
            osi_Panic("TT2");
        }
-      goto done;
+       goto done;
     }
 
     Check_AtSys(adp, aname, &sysState, &treq);
@@ -1090,9 +1117,27 @@ afs_lookup(adp, aname, avcp, acred)
     }
     tname = sysState.name;
 
-    ReleaseReadLock(&adp->lock);
     afs_PutDCache(tdc);
 
+    if (code == ENOENT && afs_IsDynroot(adp) && dynrootRetry) {
+       struct cell *tcell;
+
+       ReleaseReadLock(&adp->lock);
+       dynrootRetry = 0;
+       if (*tname == '.')
+           tcell = afs_GetCellByName(tname + 1, READ_LOCK);
+       else
+           tcell = afs_GetCellByName(tname, READ_LOCK);
+       if (tcell) {
+           afs_PutCell(tcell, READ_LOCK);
+           afs_RefreshDynroot();
+           if (tname != aname && tname) osi_FreeLargeSpace(tname);
+           goto redo;
+       }
+    } else {
+       ReleaseReadLock(&adp->lock);
+    }
+
     /* new fid has same cell and volume */
     tfid.Cell = adp->fid.Cell;
     tfid.Fid.Volume = adp->fid.Fid.Volume;
@@ -1110,7 +1155,7 @@ afs_lookup(adp, aname, avcp, acred)
     /* prefetch some entries, if the dir is currently open.  The variable
      * dirCookie tells us where to start prefetching from.
      */
-    if (AFSDOBULK && adp->opens > 0 && !(adp->states & CForeign)) {
+    if (AFSDOBULK && adp->opens > 0 && !(adp->states & CForeign) && !afs_IsDynroot(adp)) {
         afs_int32 retry;
        /* if the entry is not in the cache, or is in the cache,
         * but hasn't been statd, then do a bulk stat operation.
@@ -1122,23 +1167,26 @@ afs_lookup(adp, aname, avcp, acred)
           ReleaseReadLock(&afs_xvcache);       
         } while (tvc && retry);
 
-       if (!tvc || !(tvc->states & CStatd)) {
-           afs_DoBulkStat(adp, dirCookie, &treq);
-       }
+       if (!tvc || !(tvc->states & CStatd)) 
+           bulkcode = afs_DoBulkStat(adp, dirCookie, &treq);
+       else 
+           bulkcode = 0;
 
        /* if the vcache isn't usable, release it */
        if (tvc && !(tvc->states & CStatd)) {
            afs_PutVCache(tvc);
            tvc = (struct vcache *) 0;
        }
+    } else {
+       tvc = (struct vcache *) 0;
+       bulkcode = 0;
     }
-    else tvc = (struct vcache *) 0;
-    
+
     /* now get the status info, if we don't already have it */
     /* This is kind of weird, but we might wind up accidentally calling
      * RXAFS_Lookup because we happened upon a file which legitimately
      * has a 0 uniquifier. That is the result of allowing unique to wrap
-     * to 0. This was fixed in AFS 3.4. For CForeigh, Unique == 0 means that
+     * to 0. This was fixed in AFS 3.4. For CForeign, Unique == 0 means that
      * the file has not yet been looked up.
      */
     if (!tvc) {
@@ -1147,10 +1195,10 @@ afs_lookup(adp, aname, avcp, acred)
            tvc = afs_LookupVCache(&tfid, &treq, &cached, WRITE_LOCK, 
                                   adp, tname);
        } 
-       if (!tvc) {  /* lookup failed or wasn't called */
-           tvc = afs_GetVCache(&tfid, &treq, &cached, (struct vcache*)0,
-                               WRITE_LOCK);
-       }
+       if (!tvc && !bulkcode) {  /* lookup failed or wasn't called */
+          tvc = afs_GetVCache(&tfid, &treq, &cached, (struct vcache*)0,
+                              WRITE_LOCK);
+       } 
     } /* if !tvc */
     } /* sub-block just to reduce stack usage */
 
@@ -1174,6 +1222,7 @@ afs_lookup(adp, aname, avcp, acred)
            ReleaseWriteLock(&tvc->lock);
 
            if (code) {
+               afs_PutVCache(tvc, WRITE_LOCK);
                if (tvolp) afs_PutVolume(tvolp, WRITE_LOCK);
                goto done;
            }
@@ -1225,7 +1274,7 @@ afs_lookup(adp, aname, avcp, acred)
            }
        }
        *avcp = tvc;
-       if (tvc && !tvc->vrefCount) {
+       if (tvc && !VREFCOUNT(tvc)) {
            osi_Panic("TT3");
        }
        code = 0;
@@ -1293,6 +1342,7 @@ done:
 #endif
        }
     }
+    if (bulkcode) code = bulkcode; else 
     code = afs_CheckCode(code, &treq, 19);
     if (code) {
        /* If there is an error, make sure *avcp is null.
index 0ad500cd5b8078932e09c89514e238b400eec323..c3df294f89cedc00406d7d10571bf124e2c42223 100644 (file)
@@ -317,12 +317,12 @@ tagain:
     osi_dnlc_remove ( adp, aname, tvc);
     if (tvc) afs_symhint_inval(tvc);
 
-    Tadp1 = adp; Tadpr = adp->vrefCount; Ttvc = tvc; Tnam = aname; Tnam1 = 0;
-    if (tvc) Ttvcr = tvc->vrefCount;
+    Tadp1 = adp; Tadpr = VREFCOUNT(adp); Ttvc = tvc; Tnam = aname; Tnam1 = 0;
+    if (tvc) Ttvcr = VREFCOUNT(tvc);
 #ifdef AFS_AIX_ENV
-    if (tvc && (tvc->vrefCount > 2) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
+    if (tvc && (VREFCOUNT(tvc) > 2) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
 #else
-    if (tvc && (tvc->vrefCount > 1) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
+    if (tvc && (VREFCOUNT(tvc) > 1) && tvc->opens > 0 && !(tvc->states & CUnlinked)) {
 #endif
        char *unlname = newname();
 
index 53ab95983b58b0466802957e99372fcdb862f925..ab1ecaae0c26da703cde5c114d1493ca6ae8a78d 100644 (file)
@@ -132,8 +132,12 @@ afs_ustrategy(abp)
        tuio.afsio_offset = (u_int) dbtob(abp->b_blkno);
 #ifdef AFS_SUN5_ENV
        tuio._uio_offset._p._u = 0;
+#ifdef AFS_SUN59_ENV
+       tuio.uio_limit = curproc->p_fsz_ctl.rlim_cur;
+#else
        tuio.uio_limit = u.u_rlimit[RLIMIT_FSIZE].rlim_cur;
 #endif
+#endif
 #else
        tuio.afsio_offset = DEV_BSIZE * abp->b_blkno;
 #endif
index 55ad6f1fdccb85f3690824daaa3e11aa7687eb62..8f8c598981e6f886b4f6953f483a56f986eb4e23 100644 (file)
@@ -909,7 +909,7 @@ afs_close(OSI_VC_ARG(avc), aflags, acred)
        ReleaseWriteLock(&avc->lock);
     }
 #ifdef AFS_OSF_ENV
-    if ((avc->vrefCount <= 2) && (avc->states & CUnlinked)) {
+    if ((VREFCOUNT(avc) <= 2) && (avc->states & CUnlinked)) {
        afs_remunlink(avc, 1);  /* ignore any return code */
     }
 #endif
index 9ed8343a3d68be010b3347692fd0f7401ad3c61a..d1918d5367533af6cbe2d95969f7aec192e7276d 100644 (file)
@@ -189,6 +189,7 @@ struct afs_cbr {
 #define        CNoSUID             2       /* 1 if no suid progs can run from this cell */
 #define CHasVolRef        16       /* Volumes were referenced in this cell*/
 #define CLinkedCell       32
+#define CAlias            64       /* This cell entry is an alias */
 
 struct cell {
     struct afs_q lruq;                      /* lru q next and prev */
@@ -201,6 +202,7 @@ struct cell {
     short states;                          /* state flags */
     short cellIndex;                       /* relative index number per cell */
     time_t timeout;                        /* data expire time, if non-zero */
+    struct cell *alias;                            /* what this cell is an alias for */
 };
 
 #define        afs_PutCell(cellp, locktype)
@@ -522,6 +524,18 @@ struct SimpleLocks {
 #define vrefCount   v.v_usecount
 #endif /* AFS_FBSD_ENV */
 
+#ifdef AFS_LINUX24_ENV
+#define VREFCOUNT(v)           atomic_read(&((vnode_t *) v)->v_count)
+#define VREFCOUNT_SET(v, c)    atomic_set(&((vnode_t *) v)->v_count, c)
+#define VREFCOUNT_DEC(v)       atomic_dec(&((vnode_t *) v)->v_count)
+#define VREFCOUNT_INC(v)       atomic_inc(&((vnode_t *) v)->v_count)
+#else
+#define VREFCOUNT(v)           ((v)->vrefCount)
+#define VREFCOUNT_SET(v, c)    (v)->vrefCount = c;
+#define VREFCOUNT_DEC(v)       (v)->vrefCount--;
+#define VREFCOUNT_INC(v)       (v)->vrefCount++;
+#endif
+
 #define        AFS_MAXDV   0x7fffffff      /* largest dataversion number */
 #define        AFS_NOTRUNC 0x7fffffff      /* largest dataversion number */
 
@@ -946,6 +960,7 @@ extern struct brequest afs_brs[NBRS];               /* request structures */
 
 extern struct cell         *afs_GetCell();
 extern struct cell         *afs_GetCellByName();
+extern struct cell         *afs_GetCellByIndex();
 extern struct unixuser     *afs_GetUser();
 extern struct volume       *afs_GetVolume();
 extern struct volume       *afs_GetVolumeByName();
@@ -978,6 +993,17 @@ extern void afs_shutdown();
 /* afs_osifile.c */
 extern void shutdown_osifile();
 
+/* afs_dynroot.c */
+extern int afs_IsDynrootFid();
+extern void afs_GetDynrootFid();
+extern int afs_IsDynroot();
+extern void afs_RefreshDynroot();
+extern void afs_GetDynroot();
+extern void afs_PutDynroot();
+extern int afs_DynrootNewVnode();
+extern int afs_SetDynrootEnable();
+extern int afs_GetDynrootEnable();
+
 
 /* Performance hack - we could replace VerifyVCache2 with the appropriate
  * GetVCache incantation, and could eliminate even this code from afs_UFSRead 
@@ -1036,6 +1062,7 @@ extern int afs_CacheTooFull;
  * afs_GetDownD wakes those processes once the cache is 95% full
  * (CM_CACHESIZEDRAINEDPCT).
  */
+extern void afs_MaybeWakeupTruncateDaemon();
 extern void afs_CacheTruncateDaemon();
 extern int afs_WaitForCacheDrain;
 #define CM_MAXDISCARDEDCHUNKS  16      /* # of chunks */
@@ -1051,19 +1078,6 @@ extern int afs_WaitForCacheDrain;
      afs_freeDCCount - afs_discardDCCount < \
        ((100-CM_DCACHECOUNTFREEPCT)*afs_cacheFiles)/100)
 
-#define        afs_MaybeWakeupTruncateDaemon() \
-    do { \
-       if (!afs_CacheTooFull && afs_CacheIsTooFull()) { \
-           afs_CacheTooFull = 1; \
-            if (!afs_TruncateDaemonRunning) { \
-               afs_osi_Wakeup((char *)afs_CacheTruncateDaemon); \
-           } \
-       } else if (!afs_TruncateDaemonRunning && \
-                  afs_blocksDiscarded > CM_MAXDISCARDEDCHUNKS) { \
-           afs_osi_Wakeup((char *)afs_CacheTruncateDaemon); \
-       } \
-    } while (0)
-
 /* Handy max length of a numeric string. */
 #define        CVBS    12  /* max afs_int32 is 2^32 ~ 4*10^9, +1 for NULL, +luck */
 
index 8f019ba244cf66e4487327e7e08aaeced26ca04e..3fc6e4f22108f1793ed3bc622f2a852eb361bf74 100644 (file)
@@ -232,17 +232,18 @@ char *DRead(fid,page)
       MReleaseWriteLock(&afs_bufferLock);
       return 0;
     }
+    MObtainWriteLock(&tb->lock,260);
+    MReleaseWriteLock(&afs_bufferLock);
+    tb->lockers++;
     tfile = afs_CFileOpen(fid[0]);
     sizep = (afs_int32 *)tfile;
     if (page * AFS_BUFFER_PAGESIZE >= *sizep) {
        dirp_Zap(tb->fid);
+       tb->lockers--;
+       MReleaseWriteLock(&tb->lock);
        afs_CFileClose(tfile);
-       MReleaseWriteLock(&afs_bufferLock);
        return 0;
     }
-    MObtainWriteLock(&tb->lock,260);
-    MReleaseWriteLock(&afs_bufferLock);
-    tb->lockers++;
     code = afs_CFileRead(tfile, tb->page * AFS_BUFFER_PAGESIZE,
                         tb->data, AFS_BUFFER_PAGESIZE);
     afs_CFileClose(tfile);
index 1ac95bf803525ff3f49436c4c7177731c6dbe8ca..72d5b4d5014f1ef978017ed54f19d995ee088028 100644 (file)
@@ -609,13 +609,25 @@ long parm, parm2, parm3, parm4, parm5, parm6;
        int cellLen = (sizeArg & 0xffff0000) >> 16;
        afs_int32 *kmsg = afs_osi_Alloc(kmsgLen);
        char *cellname = afs_osi_Alloc(cellLen);
+
+       AFS_COPYIN((afs_int32 *)parm2, cellname, cellLen, code);
        AFS_COPYIN((afs_int32 *)parm3, kmsg, kmsgLen, code);
-       if (!code) code = afs_AfsdbHandler(cellname, cellLen, kmsg);
+       if (!code) {
+           code = afs_AfsdbHandler(cellname, cellLen, kmsg);
+           if (*cellname == 1) *cellname = 0;
+           if (code == -2) {   /* Shutting down? */
+               *cellname = 1;
+               code = 0;
+           }
+       }
        if (!code) AFS_COPYOUT(cellname, (char *)parm2, cellLen, code);
        afs_osi_Free(kmsg, kmsgLen);
        afs_osi_Free(cellname, cellLen);
     }
 #endif
+    else if (parm == AFSOP_SET_DYNROOT) {
+       code = afs_SetDynrootEnable(parm2);
+    }
     else
       code = EINVAL;
 
@@ -935,6 +947,7 @@ asmlinkage int afs_syscall(long syscall, long parm1, long parm2, long parm3,
     long linux_ret=0;
     long *retval = &linux_ret;
     long eparm[4]; /* matches AFSCALL_ICL in fstrace.c */
+    /* eparm is also used by AFSCALL_CALL in afsd.c */
 #else
 #if defined(UKERNEL)
 Afs_syscall ()
@@ -995,7 +1008,7 @@ Afs_syscall ()
     uap->parm1 = parm1;
     uap->parm2 = parm2;
     uap->parm3 = parm3;
-    if (syscall == AFSCALL_ICL) {
+    if (syscall == AFSCALL_ICL || syscall == AFSCALL_CALL) {
        AFS_COPYIN((char*)parm4, (char*)eparm, sizeof(eparm), code);
        uap->parm4 = eparm[0];
        uap->parm5 = eparm[1];
@@ -1201,6 +1214,12 @@ afs_shutdown()
        afs_osi_Wakeup((char*)&afs_CacheTruncateDaemon);
        afs_osi_Sleep(&afs_termState);
     }
+#ifdef AFS_AFSDB_ENV
+    afs_warn("AFSDB... ");
+    afs_StopAfsdb();
+    while (afs_termState == AFSOP_STOP_AFSDB)
+       afs_osi_Sleep(&afs_termState);
+#endif
 #if    defined(AFS_SUN5_ENV) || defined(RXK_LISTENER_ENV)
     afs_warn("RxEvent... ");
     /* cancel rx event deamon */
index c43d92c50dbbb32402921ff6a955d9ca998a1db5..193c64274f75ebd60420b1f560d51c7deef03cf1 100644 (file)
@@ -157,7 +157,7 @@ int SRXAFSCB_GetCE(a_call, a_index, a_result)
     a_result->DataVersion = hgetlo(tvc->m.DataVersion);
     a_result->callback = afs_data_pointer_to_int32(tvc->callback);             /* XXXX Now a pointer; change it XXXX */
     a_result->cbExpires = tvc->cbExpires;
-    a_result->refCount = tvc->vrefCount;
+    a_result->refCount = VREFCOUNT(tvc);
     a_result->opens = tvc->opens;
     a_result->writers = tvc->execsOrWriters;
     a_result->mvstat = tvc->mvstat;
index 82bf5a26d4c2f3998f892be85ad3e08f1087f19b..add7e6045770ec8a3e22a0ccde8205b3b2c212f3 100644 (file)
@@ -52,21 +52,33 @@ afs_uint32 afs_nextCellNum = 0x100;
 /* Local variables. */
 struct cell *afs_rootcell = 0;
 
+/* Handler waiting for request from client */
 static char afs_AfsdbHandlerWait;
+/* Client waiting for handler to become available or finish request */
 static char afs_AfsdbLookupWait;
 
+/* Set to 1 when we've seen the userspace AFSDB process at least once */
 char afs_AfsdbHandlerPresent = 0;
+/* Set to 1 when there is a client interacting with the AFSDB handler.
+ * Protects the in and out variables below.  Protected by GLOCK. */
 char afs_AfsdbHandlerInuse = 0;
+/* Set to 1 when AFSDB has been shut down */
+char afs_AfsdbHandlerShutdown = 0;
 
+/* Input to handler from the client: cell name to look up */
 char *afs_AfsdbHandler_CellName;
+/* Outputs from handler to client: cell hosts, TTL, and real cell name */
 afs_int32 *afs_AfsdbHandler_CellHosts;
 int *afs_AfsdbHandler_Timeout;
+char **afs_AfsdbHandler_RealName;
 
-char afs_AfsdbHandler_ReqPending;
-char afs_AfsdbHandler_Completed;
+/* Client sets ReqPending to 1 whenever it queues a request for it */
+char afs_AfsdbHandler_ReqPending = 0;
+/* Handler sets Completed to 1 when it completes the client request */
+char afs_AfsdbHandler_Completed = 0;
 
 
-struct cell *afs_GetCellByName_int();
+static struct cell *afs_GetCellByName_int();
 
 int afs_strcasecmp(s1, s2)
     register char *s1, *s2;
@@ -87,6 +99,16 @@ int afs_strcasecmp(s1, s2)
 
 
 #ifdef AFS_AFSDB_ENV
+void afs_StopAfsdb()
+{
+    if (afs_AfsdbHandlerPresent) {
+       afs_osi_Wakeup(&afs_AfsdbHandlerWait);
+    } else {
+       afs_AfsdbHandlerShutdown = 1;
+       afs_termState = AFSOP_STOP_RXEVENT;
+    }
+}
+
 int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg)
     char *acellName;
     int acellNameLen;
@@ -94,6 +116,7 @@ int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg)
 {
     /* afs_syscall_call() has already grabbed the global lock */
 
+    if (afs_AfsdbHandlerShutdown) return -2;
     afs_AfsdbHandlerPresent = 1;
 
     if (afs_AfsdbHandler_ReqPending) {
@@ -103,6 +126,9 @@ int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg)
        *afs_AfsdbHandler_Timeout = kernelMsg[1];
        if (*afs_AfsdbHandler_Timeout) *afs_AfsdbHandler_Timeout += osi_Time();
 
+       *afs_AfsdbHandler_RealName = afs_osi_Alloc(strlen(acellName) + 1);
+       strcpy(*afs_AfsdbHandler_RealName, acellName);
+
        for (i=0; i<MAXCELLHOSTS; i++) {
            if (i >= hostCount)
                afs_AfsdbHandler_CellHosts[i] = 0;
@@ -117,9 +143,21 @@ int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg)
     }
 
     /* Wait for a request */
-    while (afs_AfsdbHandler_ReqPending == 0)
+    while (afs_AfsdbHandler_ReqPending == 0 && afs_termState != AFSOP_STOP_AFSDB)
        afs_osi_Sleep(&afs_AfsdbHandlerWait);
 
+    /* Check if we're shutting down */
+    if (afs_termState == AFSOP_STOP_AFSDB) {
+       /* Inform anyone waiting for us that we're going away */
+       afs_AfsdbHandlerShutdown = 1;
+       afs_AfsdbHandlerPresent = 0;
+       afs_osi_Wakeup(&afs_AfsdbLookupWait);
+
+       afs_termState = AFSOP_STOP_RXEVENT;
+       afs_osi_Wakeup(&afs_termState);
+       return -2;
+    }
+
     /* Copy the requested cell name into the request buffer */
     strncpy(acellName, afs_AfsdbHandler_CellName, acellNameLen);
 
@@ -129,16 +167,20 @@ int afs_AfsdbHandler(acellName, acellNameLen, kernelMsg)
 #endif
 
 
-int afs_GetCellHostsFromDns(acellName, acellHosts, timeout)
+int afs_GetCellHostsFromDns(acellName, acellHosts, timeout, realName)
     char *acellName;
     afs_int32 *acellHosts;
     int *timeout;
+    char **realName;
 {
 #ifdef AFS_AFSDB_ENV
     char grab_glock = 0;
 
     if (!afs_AfsdbHandlerPresent) return ENOENT;
 
+    /* Initialize host list to empty in case the handler is gone */
+    *acellHosts = 0;
+
     if (!ISAFS_GLOCK()) {
        grab_glock = 1;
        AFS_GLOCK();
@@ -153,6 +195,7 @@ int afs_GetCellHostsFromDns(acellName, acellHosts, timeout)
     afs_AfsdbHandler_CellName = acellName;
     afs_AfsdbHandler_CellHosts = acellHosts;
     afs_AfsdbHandler_Timeout = timeout;
+    afs_AfsdbHandler_RealName = realName;
 
     /* Wake up the AFSDB handler */
     afs_AfsdbHandler_Completed = 0;
@@ -160,7 +203,7 @@ int afs_GetCellHostsFromDns(acellName, acellHosts, timeout)
     afs_osi_Wakeup(&afs_AfsdbHandlerWait);
 
     /* Wait for the handler to get back to us with the reply */
-    while (!afs_AfsdbHandler_Completed)
+    while (afs_AfsdbHandlerPresent && !afs_AfsdbHandler_Completed)
        afs_osi_Sleep(&afs_AfsdbLookupWait);
 
     /* Release the AFSDB handler and wake up others waiting for it */
@@ -180,20 +223,28 @@ int afs_GetCellHostsFromDns(acellName, acellHosts, timeout)
 void afs_RefreshCell(tc)
     register struct cell *tc;
 {
-    afs_int32 acellHosts[MAXCELLHOSTS];
+    afs_int32 cellHosts[MAXCELLHOSTS];
+    char *realName = NULL;
     int timeout;
 
     /* Don't need to do anything if no timeout or it's not expired */
     if (!tc->timeout || tc->timeout > osi_Time()) return;
 
-    if (!afs_GetCellHostsFromDns(tc->cellName, acellHosts, &timeout)) {
-       afs_NewCell(tc->cellName, acellHosts, tc->states,
-                   tc->lcellp ? tc->lcellp->cellName : (char *) 0,
-                   tc->fsport, tc->vlport, timeout);
-    }
+    if (afs_GetCellHostsFromDns(tc->cellName, cellHosts, &timeout, &realName))
+       /* In case of lookup failure, keep old data */
+       goto done;
+
+    /* Refresh the DB servers for the real cell; other values stay the same. */
+    afs_NewCell(realName, cellHosts, 0, (char *) 0, 0, 0, timeout, (char *) 0);
+
+    /* If this is an alias, update the alias entry too */
+    if (afs_strcasecmp(tc->cellName, realName))
+       afs_NewCell(tc->cellName, 0, CAlias, (char *) 0, 0, 0,
+                   timeout, realName);
 
-    /* In case of a DNS failure, keep old cell data.. */
-    return;
+done:
+    if (realName)
+       afs_osi_Free(realName, strlen(realName) + 1);
 }
 
 
@@ -201,19 +252,35 @@ struct cell *afs_GetCellByName_Dns(acellName, locktype)
     register char *acellName;
     afs_int32 locktype;
 {
-    afs_int32 acellHosts[MAXCELLHOSTS];
+    afs_int32 cellHosts[MAXCELLHOSTS];
+    char *realName = NULL;
     int timeout;
 
-    if (afs_GetCellHostsFromDns(acellName, acellHosts, &timeout))
-       return (struct cell *) 0;
-    if (afs_NewCell(acellName, acellHosts, CNoSUID, (char *) 0, 0, 0, timeout))
-       return (struct cell *) 0;
+    if (afs_GetCellHostsFromDns(acellName, cellHosts, &timeout, &realName))
+       goto bad;
+    if (afs_NewCell(realName, cellHosts, CNoSUID, (char *) 0, 0, 0,
+                   timeout, (char *) 0))
+       goto bad;
 
+    /* If this is an alias, create an entry for it too */
+    if (afs_strcasecmp(acellName, realName)) {
+       if (afs_NewCell(acellName, 0, CAlias, (char *) 0, 0, 0,
+                       timeout, realName))
+           goto bad;
+    }
+
+    if (realName)
+       afs_osi_Free(realName, strlen(realName) + 1);
     return afs_GetCellByName_int(acellName, locktype, 0);
+
+bad:
+    if (realName)
+       afs_osi_Free(realName, strlen(realName) + 1);
+    return (struct cell *) 0;
 }
 
 
-struct cell *afs_GetCellByName_int(acellName, locktype, trydns)
+static struct cell *afs_GetCellByName_int(acellName, locktype, trydns)
     register char *acellName;
     afs_int32 locktype;
     char trydns;
@@ -230,6 +297,10 @@ struct cell *afs_GetCellByName_int(acellName, locktype, trydns)
            QAdd(&CellLRU, &tc->lruq);
            ReleaseWriteLock(&afs_xcell);
            afs_RefreshCell(tc);
+           if (tc->states & CAlias) {
+               tc = tc->alias;
+               afs_RefreshCell(tc);
+           }
            return tc;
        }
     }
@@ -300,20 +371,21 @@ struct cell *afs_GetCellByIndex(cellindex, locktype)
 } /*afs_GetCellByIndex*/
 
 
-afs_int32 afs_NewCell(acellName, acellHosts, aflags, linkedcname, fsport, vlport, timeout)
+afs_int32 afs_NewCell(acellName, acellHosts, aflags, linkedcname, fsport, vlport, timeout, aliasFor)
     int aflags;
     char *acellName;
     register afs_int32 *acellHosts;
     char *linkedcname;
     u_short fsport, vlport;
     int timeout;
+    char *aliasFor;
 {
     register struct cell *tc, *tcl=0;
     register afs_int32 i, newc=0, code=0;
     register struct afs_q *cq, *tq;
 
     AFS_STATCNT(afs_NewCell);
-    if (*acellHosts == 0)
+    if (!(aflags & CAlias) && *acellHosts == 0)
        /* need >= one host to gen cell # */
        return EINVAL;
 
@@ -323,6 +395,13 @@ afs_int32 afs_NewCell(acellName, acellHosts, aflags, linkedcname, fsport, vlport
     for (cq = CellLRU.next; cq != &CellLRU; cq = tq) {
        tc = QTOC(cq); tq = QNext(cq);
        if (afs_strcasecmp(tc->cellName, acellName) == 0) {
+           /* if the cell we've found has the correct name but no timeout,
+            * and we're called with a non-zero timeout, bail out:  never
+            * override static configuration entries with AFSDB ones. */
+           if (timeout && !tc->timeout) {
+               ReleaseWriteLock(&afs_xcell);
+               return 0;
+           }
            /* we don't want to keep pinging old vlservers which were down,
             * since they don't matter any more.  It's easier to do this than
             * to remove the server from its various hash tables. */
@@ -387,6 +466,26 @@ afs_int32 afs_NewCell(acellName, acellHosts, aflags, linkedcname, fsport, vlport
     tc->timeout = timeout;
  
     memset((char *)tc->cellHosts, 0, sizeof(tc->cellHosts));
+    if (aflags & CAlias) {
+       struct cell *tca = NULL;
+
+       if (!aliasFor) {
+           code = EINVAL;
+           goto bad;
+       }
+       for (cq = CellLRU.next; cq != &CellLRU; cq = tq) {
+           tca = QTOC(cq); tq = QNext(cq);
+           if (!afs_strcasecmp(tca->cellName, aliasFor))
+               break;
+       }
+       if (!tca) {
+           code = ENOENT;
+           goto bad;
+       }
+       tc->alias = tca;
+       goto done;
+    }
+
     for (i=0; i<MAXCELLHOSTS; i++) {
         struct server *ts;
        afs_uint32 temp = acellHosts[i];
@@ -398,6 +497,7 @@ afs_int32 afs_NewCell(acellName, acellHosts, aflags, linkedcname, fsport, vlport
        afs_PutServer(ts, WRITE_LOCK);
     }
     afs_SortServers(tc->cellHosts, MAXCELLHOSTS);      /* randomize servers */
+done:
     ReleaseWriteLock(&afs_xcell);
     return 0;
 bad:
index 18cda8fd12f691b3adc04a7034e66345ee0dc1db..5ee44eb4185778a2da10fd5325fbb7e72d0d6968 100644 (file)
@@ -268,6 +268,7 @@ void afs_Daemon() {
 afs_CheckRootVolume () {
     char rootVolName[32];
     register struct volume *tvp;
+    int usingDynroot = afs_GetDynrootEnable();
 
     AFS_STATCNT(afs_CheckRootVolume);
     if (*afs_rootVolumeName == 0) {
@@ -276,7 +277,12 @@ afs_CheckRootVolume () {
     else {
        strcpy(rootVolName, afs_rootVolumeName);
     }
-    tvp = afs_GetVolumeByName(rootVolName, LOCALCELL, 1, (struct vrequest *) 0, READ_LOCK);
+    if (usingDynroot) {
+       afs_GetDynrootFid(&afs_rootFid);
+       tvp = afs_GetVolume(&afs_rootFid, (struct vrequest *) 0, READ_LOCK);
+    } else {
+       tvp = afs_GetVolumeByName(rootVolName, LOCALCELL, 1, (struct vrequest *) 0, READ_LOCK);
+    }
     if (!tvp) {
        char buf[128];
        int len = strlen(rootVolName);
@@ -288,23 +294,25 @@ afs_CheckRootVolume () {
        }
     }
     if (tvp) {
-       int volid = (tvp->roVol? tvp->roVol : tvp->volume);
-       afs_rootFid.Cell = LOCALCELL;
-       if (afs_rootFid.Fid.Volume && afs_rootFid.Fid.Volume != volid
-           && afs_globalVp) {
-           /* If we had a root fid before and it changed location we reset
-            * the afs_globalVp so that it will be reevaluated.
-            * Just decrement the reference count. This only occurs during
-            * initial cell setup and can panic the machine if we set the
-            * count to zero and fs checkv is executed when the current
-            * directory is /afs.
-            */
-           AFS_FAST_RELE(afs_globalVp);
-           afs_globalVp = 0;
+       if (!usingDynroot) {
+           int volid = (tvp->roVol? tvp->roVol : tvp->volume);
+           afs_rootFid.Cell = LOCALCELL;
+           if (afs_rootFid.Fid.Volume && afs_rootFid.Fid.Volume != volid
+               && afs_globalVp) {
+               /* If we had a root fid before and it changed location we reset
+                * the afs_globalVp so that it will be reevaluated.
+                * Just decrement the reference count. This only occurs during
+                * initial cell setup and can panic the machine if we set the
+                * count to zero and fs checkv is executed when the current
+                * directory is /afs.
+                */
+               AFS_FAST_RELE(afs_globalVp);
+               afs_globalVp = 0;
+           }
+           afs_rootFid.Fid.Volume = volid;
+           afs_rootFid.Fid.Vnode = 1;
+           afs_rootFid.Fid.Unique = 1;
        }
-       afs_rootFid.Fid.Volume = volid;
-       afs_rootFid.Fid.Vnode = 1;
-       afs_rootFid.Fid.Unique = 1;
        afs_initState = 300;    /* won */
        afs_osi_Wakeup(&afs_initState);
        afs_PutVolume(tvp, READ_LOCK);
index f2c0459b95b0987159f77b3ae3d68308c6b4f9e9..f1839c31e10c09845e1ef586545f6a7db372cfdd 100644 (file)
@@ -218,6 +218,17 @@ struct CTD_stats {
     int CTD_nSleeps;
 } CTD_stats;
 
+void afs_MaybeWakeupTruncateDaemon() {
+    if (!afs_CacheTooFull && afs_CacheIsTooFull()) {
+       afs_CacheTooFull = 1;
+       if (!afs_TruncateDaemonRunning)
+           afs_osi_Wakeup((char *)afs_CacheTruncateDaemon);
+    } else if (!afs_TruncateDaemonRunning &&
+              afs_blocksDiscarded > CM_MAXDISCARDEDCHUNKS) {
+       afs_osi_Wakeup((char *)afs_CacheTruncateDaemon);
+    }
+}
+
 u_int afs_min_cache = 0;
 void afs_CacheTruncateDaemon() {
     osi_timeval_t CTD_tmpTime;
@@ -294,7 +305,11 @@ void afs_CacheTruncateDaemon() {
            afs_stats_AddTo(CTD_stats.CTD_sleepTime, CTD_tmpTime);
        }
        if (afs_termState == AFSOP_STOP_TRUNCDAEMON) {
+#ifdef AFS_AFSDB_ENV
+           afs_termState = AFSOP_STOP_AFSDB;
+#else
            afs_termState = AFSOP_STOP_RXEVENT;
+#endif
            afs_osi_Wakeup(&afs_termState);
            break;
        }
@@ -1432,18 +1447,19 @@ struct tlocal1 {
 
 /* these fields are protected by the lock on the vcache and luck 
  * on the dcache */
-#define updateV2DC(l,v,d,src) { \
-    if (!l || 0 == NBObtainWriteLock(&((v)->lock),src)) { \
-       if (hsame((v)->m.DataVersion, (d)->f.versionNo) && (v)->callback) { \
-           (v)->quick.dc = (d);                                          \
-           (v)->quick.stamp = (d)->stamp = MakeStamp();                  \
-           (v)->quick.minLoc = AFS_CHUNKTOBASE((d)->f.chunk);            \
-           /* Don't think I need these next two lines forever */         \
-           (v)->quick.len = (d)->f.chunkBytes;                           \
-           (v)->h1.dchint = (d);                                         \
-       }                                                                 \
-       if(l) ReleaseWriteLock(&((v)->lock));                             \
-    } }
+void updateV2DC(int l, struct vcache *v, struct dcache *d, int src) {
+    if (!l || 0 == NBObtainWriteLock(&(v->lock),src)) {
+       if (hsame(v->m.DataVersion, d->f.versionNo) && v->callback) {
+           v->quick.dc = d;
+           v->quick.stamp = d->stamp = MakeStamp();
+           v->quick.minLoc = AFS_CHUNKTOBASE(d->f.chunk);
+           /* Don't think I need these next two lines forever */
+           v->quick.len = d->f.chunkBytes;
+           v->h1.dchint = d;
+       }
+       if(l) ReleaseWriteLock(&((v)->lock));
+    }
+}
 
 struct dcache *afs_GetDCache(avc, abyte, areq, aoffset, alen, aflags)
     register struct vcache *avc;    /*Held*/
@@ -1769,7 +1785,7 @@ struct dcache *afs_GetDCache(avc, abyte, areq, aoffset, alen, aflags)
 
        /* Watch for standard race condition */
        if (hsame(avc->m.DataVersion, tdc->f.versionNo)) {
-         updateV2DC(0,avc,tdc,569);          /* set hint */
+           updateV2DC(0,avc,tdc,569);          /* set hint */
            if (setLocks) ReleaseWriteLock(&avc->lock);
            afs_stats_cmperf.dcacheHits++;
            goto done;
@@ -1864,6 +1880,35 @@ struct dcache *afs_GetDCache(avc, abyte, areq, aoffset, alen, aflags)
         afs_stats_cmperf.dcacheMisses++; 
        afs_Trace3(afs_iclSetp, CM_TRACE_FETCHPROC, ICL_TYPE_POINTER, avc,
                   ICL_TYPE_INT32, Position, ICL_TYPE_INT32, size);
+
+       /*
+        * Dynamic root support:  fetch data from local memory.
+        */
+       if (afs_IsDynroot(avc)) {
+           char *dynrootDir;
+           int dynrootLen;
+
+           afs_GetDynroot(&dynrootDir, &dynrootLen, &tsmall->OutStatus);
+
+           dynrootDir += Position;
+           dynrootLen -= Position;
+           if (size > dynrootLen)
+               size = dynrootLen;
+           if (size < 0) size = 0;
+           code = afs_osi_Write(file, -1, dynrootDir, size);
+           afs_PutDynroot();
+
+           if (code == size)
+               code = 0;
+           else
+               code = -1;
+
+           tdc->validPos = Position + size;
+           afs_CFileTruncate(file, size); /* prune it */
+       } else
+       /*
+        * Not a dynamic vnode:  do the real fetch.
+        */
        do {
            tc = afs_Conn(&avc->fid, areq, SHARED_LOCK);
            if (tc) {
diff --git a/src/afs/afs_dynroot.c b/src/afs/afs_dynroot.c
new file mode 100644 (file)
index 0000000..6e42e2b
--- /dev/null
@@ -0,0 +1,461 @@
+/*
+ * Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ *
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
+/*
+ * Dynamic /afs volume support.
+ *
+ * Implements:
+ * afs_IsDynrootFid
+ * afs_GetDynrootFid
+ * afs_IsDynroot
+ * afs_RefreshDynroot
+ * afs_GetDynroot
+ * afs_PutDynroot
+ * afs_DynrootNewVnode
+ * afs_SetDynrootEnable
+ * afs_GetDynrootEnable
+ *
+ */
+
+#include <afsconfig.h>
+#include "../afs/param.h"
+
+#include "../afs/stds.h"
+#include "../afs/sysincludes.h" /* Standard vendor system headers */
+#include "../afs/afsincludes.h"
+#include "../afs/afs_osi.h"
+#include "../afsint/afsint.h"
+#include "../afs/lock.h"
+
+#include "../afs/prs_fs.h"
+#include "../afs/dir.h"
+
+#define AFS_DYNROOT_CELL       1
+#define AFS_DYNROOT_VOLUME     1
+#define AFS_DYNROOT_VNODE      1
+#define AFS_DYNROOT_UNIQUE     1
+
+#define VNUM2CIDX(vnum)                ((vnum) >> 2)
+#define VNUM2RW(vnum)          (((vnum) >> 1) & 1)
+#define CIDXRW2VNUM(cidx, rw)  (((cidx) << 2) | ((rw) << 1))
+
+static int afs_dynrootEnable = 0;
+
+static afs_rwlock_t afs_dynrootDirLock;
+/* Start of variables protected by afs_dynrootDirLock */
+static char *afs_dynrootDir = NULL;
+static int afs_dynrootDirLen;
+static int afs_dynrootDirLinkcnt;
+static int afs_dynrootCellCount;
+static int afs_dynrootVersion = 1;
+static int afs_dynrootVersionHigh = 1;
+/* End of variables protected by afs_dynrootDirLock */
+
+extern afs_int32 afs_cellindex;
+extern afs_rwlock_t afs_xvcache;
+
+/*
+ * Returns non-zero iff fid corresponds to the top of the dynroot volume.
+ */
+int
+afs_IsDynrootFid(struct VenusFid *fid)
+{
+    return
+       (afs_dynrootEnable &&
+        fid->Cell       == AFS_DYNROOT_CELL   &&
+        fid->Fid.Volume == AFS_DYNROOT_VOLUME &&
+        fid->Fid.Vnode  == AFS_DYNROOT_VNODE  &&
+        fid->Fid.Unique == AFS_DYNROOT_UNIQUE);
+}
+
+/*
+ * Obtain the magic dynroot volume Fid.
+ */
+void
+afs_GetDynrootFid(struct VenusFid *fid) 
+{
+    fid->Cell       = AFS_DYNROOT_CELL;
+    fid->Fid.Volume = AFS_DYNROOT_VOLUME;
+    fid->Fid.Vnode  = AFS_DYNROOT_VNODE;
+    fid->Fid.Unique = AFS_DYNROOT_UNIQUE;
+}
+
+/*
+ * Returns non-zero iff avc is a pointer to the dynroot /afs vnode.
+ */
+int
+afs_IsDynroot(avc)
+    struct vcache *avc;
+{
+    return afs_IsDynrootFid(&avc->fid);
+}
+
+/*
+ * Add directory entry by given name to a directory.  Assumes the
+ * caller has allocated the directory to be large enough to hold
+ * the necessary entry.
+ */
+static void
+afs_dynroot_addDirEnt(dirHeader, curPageP, curChunkP, name, vnode)
+    struct DirHeader *dirHeader;
+    int *curPageP;
+    int *curChunkP;
+    char *name;
+    int vnode;
+{
+    char *dirBase = (char *) dirHeader;
+    struct PageHeader *pageHeader;
+    struct DirEntry *dirEntry;
+    int sizeOfEntry, i, t1, t2;
+    int curPage = *curPageP;
+    int curChunk = *curChunkP;
+    int didNewPage = 0;
+
+    /*
+     * Check if we need to flip pages..  If so, init the new page.
+     */
+    sizeOfEntry = afs_dir_NameBlobs(name);
+    if (curChunk + sizeOfEntry > EPP) {
+       curPage++;
+       curChunk = 1;
+       didNewPage = 1;
+    }
+
+    pageHeader = (struct PageHeader *) (dirBase + curPage * AFS_PAGESIZE);
+    if (didNewPage) {
+       pageHeader->pgcount = 0;
+       pageHeader->tag = htons(1234);
+       pageHeader->freecount = 0;
+       pageHeader->freebitmap[0] = 0x01;
+       for (i = 1; i < EPP/8; i++)
+           pageHeader->freebitmap[i] = 0;
+
+       dirHeader->alloMap[curPage] = EPP - 1;
+    }
+
+    dirEntry = (struct DirEntry *) (pageHeader + curChunk);
+    dirEntry->flag        = 1;
+    dirEntry->length      = 0;
+    dirEntry->next        = 0;
+    dirEntry->fid.vnode   = htonl(vnode);
+    dirEntry->fid.vunique = htonl(1);
+    strcpy(dirEntry->name, name);
+
+    for (i = curChunk; i < curChunk + sizeOfEntry; i++) {
+       t1 = i / 8;
+       t2 = i % 8;
+       pageHeader->freebitmap[t1] |= (1 << t2);
+    }
+
+    /*
+     * Add the new entry to the correct hash chain.
+     */
+    i = DirHash(name);
+    dirEntry->next = dirHeader->hashTable[i];
+    dirHeader->hashTable[i] = htons(curPage * EPP + curChunk);
+
+    curChunk += sizeOfEntry;
+    dirHeader->alloMap[curPage] -= sizeOfEntry;
+
+    *curPageP = curPage;
+    *curChunkP = curChunk;
+}
+
+/*
+ * Regenerates the dynroot contents from the current list of
+ * cells.  Useful when the list of cells has changed due to
+ * an AFSDB lookup, for instance.
+ */
+void
+afs_RefreshDynroot()
+{
+    int cellidx, maxcellidx, i;
+    struct cell *c;
+    int curChunk, curPage;
+    int dirSize;
+    char *newDir, *dotCell;
+    struct DirHeader *dirHeader;
+    struct PageHeader *pageHeader;
+    struct DirEntry *dirEntry;
+    int doFlush = 0;
+    int linkCount = 0;
+
+    /*
+     * Save afs_cellindex here, in case it changes between the
+     * two loops.
+     */
+    maxcellidx = afs_cellindex;
+
+    /*
+     * Compute the amount of space we need for the fake dir
+     */
+    curChunk = 13;
+    curPage = 0;
+
+    for (cellidx = 0; cellidx < maxcellidx; cellidx++) {
+       int sizeOfCurEntry;
+
+       c = afs_GetCellByIndex(cellidx, READ_LOCK);
+       if (!c) continue;
+
+       sizeOfCurEntry = afs_dir_NameBlobs(c->cellName);
+       if (curChunk + sizeOfCurEntry > EPP) {
+           curPage++;
+           curChunk = 1;
+       }
+       curChunk += sizeOfCurEntry;
+
+       dotCell = afs_osi_Alloc(strlen(c->cellName) + 2);
+       strcpy(dotCell, ".");
+       strcat(dotCell, c->cellName);
+       sizeOfCurEntry = afs_dir_NameBlobs(dotCell);
+       if (curChunk + sizeOfCurEntry > EPP) {
+           curPage++;
+           curChunk = 1;
+       }
+       curChunk += sizeOfCurEntry;
+
+       afs_PutCell(c, READ_LOCK);
+    }
+
+    dirSize = (curPage + 1) * AFS_PAGESIZE;
+    newDir = afs_osi_Alloc(dirSize);
+
+    /*
+     * Now actually construct the directory.
+     */
+    curChunk = 13;
+    curPage = 0;
+    dirHeader = (struct DirHeader *) newDir;
+
+    dirHeader->header.pgcount = 0;
+    dirHeader->header.tag = htons(1234);
+    dirHeader->header.freecount = 0;
+
+    dirHeader->header.freebitmap[0] = 0xff;
+    dirHeader->header.freebitmap[1] = 0x1f;
+    for (i = 2; i < EPP/8; i++)
+       dirHeader->header.freebitmap[i] = 0;
+    dirHeader->alloMap[0] = EPP - DHE - 1;
+    for (i = 1; i < MAXPAGES; i++)
+       dirHeader->alloMap[i] = EPP;
+    for (i = 0; i < NHASHENT; i++)
+       dirHeader->hashTable[i] = 0;
+
+    /* Install "." and ".." */
+    afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, ".", 1);
+    afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, "..", 1);
+    linkCount += 2;
+
+    for (cellidx = 0; cellidx < maxcellidx; cellidx++) {
+       c = afs_GetCellByIndex(cellidx, READ_LOCK);
+       afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk,
+                             c->cellName, CIDXRW2VNUM(cellidx, 0));
+
+       dotCell = afs_osi_Alloc(strlen(c->cellName) + 2);
+       strcpy(dotCell, ".");
+       strcat(dotCell, c->cellName);
+       afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk,
+                             dotCell, CIDXRW2VNUM(cellidx, 1));
+
+       linkCount += 2;
+
+       afs_PutCell(c, READ_LOCK);
+    }
+
+    ObtainWriteLock(&afs_dynrootDirLock, 549);
+    if (afs_dynrootDir) afs_osi_Free(afs_dynrootDir, afs_dynrootDirLen);
+    afs_dynrootDir = newDir;
+    afs_dynrootDirLen = dirSize;
+    afs_dynrootDirLinkcnt = linkCount;
+    if (afs_dynrootCellCount != maxcellidx) {
+       /*
+        * New cells added -- bump data version, invalidate vcache.
+        */
+       afs_dynrootCellCount = maxcellidx;
+       afs_dynrootVersion++;
+       afs_dynrootVersionHigh = osi_Time();
+       doFlush = 1;
+    }
+    ReleaseWriteLock(&afs_dynrootDirLock);
+
+    if (doFlush) {
+       afs_int32 retry;
+       struct vcache *tvc;
+       struct VenusFid tfid;
+
+       afs_GetDynrootFid(&tfid);
+       do {
+           retry = 0;
+           ObtainReadLock(&afs_xvcache);
+           tvc = afs_FindVCache(&tfid, 0, 0, &retry, 0);
+           ReleaseReadLock(&afs_xvcache);
+       } while (retry);
+       if (tvc) {
+           tvc->states &= ~(CStatd | CUnique);
+           osi_dnlc_purgedp(tvc);
+           afs_PutVCache(tvc);
+       }
+    }
+}
+
+/*
+ * Returns a pointer to the base of the dynroot directory in memory,
+ * length thereof, and a FetchStatus.
+ */
+void
+afs_GetDynroot(dynrootDir, dynrootLen, status)
+    char **dynrootDir;
+    int *dynrootLen;
+    struct AFSFetchStatus *status;
+{
+    ObtainReadLock(&afs_dynrootDirLock);
+    if (!afs_dynrootDir) {
+       ReleaseReadLock(&afs_dynrootDirLock);
+       afs_RefreshDynroot();
+       ObtainReadLock(&afs_dynrootDirLock);
+    }
+
+    if (dynrootDir) *dynrootDir = afs_dynrootDir;
+    if (dynrootLen) *dynrootLen = afs_dynrootDirLen;
+
+    if (status) {
+       memset(status, 0, sizeof(struct AFSFetchStatus));
+       status->FileType        = Directory;
+       status->LinkCount       = afs_dynrootDirLinkcnt;
+       status->Length          = afs_dynrootDirLen;
+       status->DataVersion     = afs_dynrootVersion;
+       status->CallerAccess    = PRSFS_LOOKUP | PRSFS_READ;
+       status->AnonymousAccess = PRSFS_LOOKUP | PRSFS_READ;
+       status->UnixModeBits    = 0755;
+       status->ParentVnode     = 1;
+       status->ParentUnique    = 1;
+       status->dataVersionHigh = afs_dynrootVersionHigh;
+    }
+}
+
+/*
+ * Puts back the dynroot read lock.
+ */
+void
+afs_PutDynroot()
+{
+    ReleaseReadLock(&afs_dynrootDirLock);
+}
+
+/*
+ * Inform dynroot that a new vnode is being created.  Return value
+ * is non-zero if this vnode is handled by dynroot, in which case
+ * FetchStatus will be filled in.
+ */
+int
+afs_DynrootNewVnode(avc, status)
+    struct vcache *avc;
+    struct AFSFetchStatus *status;
+{
+    if (!afs_dynrootEnable) return 0;
+
+    if (afs_IsDynroot(avc)) {
+       afs_GetDynroot(0, 0, status);
+       afs_PutDynroot();
+       return 1;
+    }
+
+    /*
+     * Check if this is an entry under /afs, e.g. /afs/cellname.
+     */
+    if (avc->fid.Cell       == AFS_DYNROOT_CELL &&
+       avc->fid.Fid.Volume == AFS_DYNROOT_VOLUME) {
+
+       struct cell *c;
+       int namelen, linklen, cellidx, rw;
+
+       cellidx = VNUM2CIDX(avc->fid.Fid.Vnode);
+       rw = VNUM2RW(avc->fid.Fid.Vnode);
+
+       c = afs_GetCellByIndex(cellidx, READ_LOCK);
+       if (!c) {
+           afs_warn("dynroot vnode inconsistency, can't find cell %d\n",
+                    cellidx);
+           return 0;
+       }
+
+       memset(status, 0, sizeof(struct AFSFetchStatus));
+
+       if (c->states & CAlias) {
+           /*
+            * linkData needs to contain the name of the cell
+            * we're aliasing for.
+            */
+           struct cell *tca = c->alias;
+
+           if (!tca) {
+               afs_warn("dynroot: alias %s missing cell alias pointer\n",
+                        c->cellName);
+               linklen = 7;
+               avc->linkData = afs_osi_Alloc(linklen + 1);
+               strcpy(avc->linkData, "unknown");
+           } else {
+               int namelen = strlen(tca->cellName);
+               linklen = rw + namelen;
+               avc->linkData = afs_osi_Alloc(linklen + 1);
+               strcpy(avc->linkData, rw ? "." : "");
+               strcat(avc->linkData, tca->cellName);
+           }
+
+           status->UnixModeBits = 0755;
+       } else {
+           /*
+            * linkData needs to contain "#cell:root.cell" or "%cell:root.cell"
+            */
+           namelen = strlen(c->cellName);
+           linklen = 1 + namelen + 10;
+           avc->linkData = afs_osi_Alloc(linklen + 1);
+           strcpy(avc->linkData, rw ? "%" : "#");
+           strcat(avc->linkData, c->cellName);
+           strcat(avc->linkData, ":root.cell");
+
+           status->UnixModeBits = 0644;
+       }
+
+       status->FileType        = SymbolicLink;
+       status->LinkCount       = 1;
+       status->Length          = linklen;
+       status->DataVersion     = 1;
+       status->CallerAccess    = PRSFS_LOOKUP | PRSFS_READ;
+       status->AnonymousAccess = PRSFS_LOOKUP | PRSFS_READ;
+       status->ParentVnode     = 1;
+       status->ParentUnique    = 1;
+
+       afs_PutCell(c, READ_LOCK);
+       return 1;
+    }
+
+    return 0;
+}
+
+/*
+ * Enable or disable dynroot.  Returns 0 if successful.
+ */
+int
+afs_SetDynrootEnable(enable)
+    int enable;
+{
+    afs_dynrootEnable = enable;
+    return 0;
+}
+
+/*
+ * Check if dynroot support is enabled.
+ */
+int
+afs_GetDynrootEnable()
+{
+    return afs_dynrootEnable;
+}
diff --git a/src/afs/afs_nfsdisp.c b/src/afs/afs_nfsdisp.c
new file mode 100644 (file)
index 0000000..3bafeff
--- /dev/null
@@ -0,0 +1,863 @@
+/*
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
+/*
+ * Implements:
+ */
+#include <afsconfig.h>
+#include "../afs/param.h"
+
+RCSID("$Header$");
+
+#include "../afs/stds.h"
+#include "../afs/sysincludes.h" /* Standard vendor system headers */
+#if defined(AFS_SUN55_ENV) && !defined(AFS_NONFSTRANS) 
+#include "../rpc/types.h"
+#include "../rpc/auth.h"
+#include "../rpc/auth_unix.h"
+#include "../rpc/auth_des.h"
+#include "../rpc/auth_kerb.h"
+#include "../sys/tiuser.h"
+#include "../rpc/xdr.h"
+#include "../rpc/svc.h"
+#include "../nfs/nfs.h"
+#include "../nfs/export.h"
+#include "../nfs/nfs_clnt.h"
+#include "../nfs/nfs_acl.h"
+#include "../afs/afsincludes.h"        
+#include "../afs/afs_stats.h"   
+#include "../afs/exporter.h"
+
+static int xlatorinit_v2_done=0;
+static int xlatorinit_v3_done=0;
+
+extern int afs_nobody;
+extern int afs_NFSRootOnly;
+
+/* It's bigger than this, but we don't care about anything else */
+struct rfs_disp_tbl {
+       void  (*dis_proc)();    
+};
+
+struct afs_nfs_disp_tbl {
+    void (*afs_proc)();
+    void (*orig_proc)();
+};
+
+struct afs_nfs2_resp {
+    nfsstat status;
+};
+
+#ifndef ACL2_NPROC
+#define ACL2_NPROC     5
+#endif
+
+struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC];
+struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC];
+
+static int 
+is_afs_fh(fhandle_t *fhp) {
+    if ((fhp->fh_fsid.val[0] == AFS_VFSMAGIC) &&
+       (fhp->fh_fsid.val[1] == AFS_VFSFSID)) 
+       return 1;
+    return 0;
+}
+
+afs_int32 
+nfs2_to_afs_call(int which, caddr_t *args, fhandle_t **fhpp, fhandle_t **fh2pp)
+{
+    struct vnode *vp;
+    fhandle_t *fhp1=0;
+    fhandle_t *fhp2=0;
+    int errorcode;
+
+    *fh2pp = (fhandle_t *)0;
+    switch (which) {
+       case RFS_GETATTR:
+        case RFS_READLINK:
+        case RFS_STATFS:
+           fhp1 = (fhandle_t *)args;
+           break;
+       case RFS_SETATTR: 
+       {
+           struct nfssaargs *sargs = (struct nfssaargs *)args; 
+           fhp1 = (fhandle_t *)&sargs->saa_fh;
+           break;
+       } 
+        case RFS_LOOKUP: 
+       {
+           struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
+           fhp1 = (fhandle_t *)&sargs->da_fhandle;
+           break;
+       } 
+       case RFS_READ:
+       {
+           struct nfsreadargs *sargs = (struct nfsreadargs *)args;
+           fhp1 = (fhandle_t *)&sargs->ra_fhandle;
+           break;
+       } 
+        case RFS_WRITE: 
+       {
+           struct nfswriteargs *sargs = (struct nfswriteargs *)args;
+           fhp1 = (fhandle_t *)&sargs->wa_fhandle;
+           break;
+       } 
+        case RFS_CREATE: 
+       {
+           struct nfscreatargs *sargs = (struct nfscreatargs *)args;
+           fhp1 = (fhandle_t *)&sargs->ca_da.da_fhandle;
+           break;
+       } 
+        case RFS_REMOVE: 
+       {
+           struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
+           fhp1 = (fhandle_t *)&sargs->da_fhandle;
+           break;
+       }
+        case RFS_RENAME: 
+       {
+           struct nfsrnmargs *sargs = (struct nfsrnmargs *)args;
+           fhp1 = (fhandle_t *)&sargs->rna_from.da_fhandle;
+           fhp2 = (fhandle_t *)&sargs->rna_to.da_fhandle;
+           break;
+       } 
+        case RFS_LINK: 
+       {
+           struct nfslinkargs *sargs = (struct nfslinkargs *)args;
+           fhp1 = (fhandle_t *)&sargs->la_from;
+           fhp2 = (fhandle_t *)&sargs->la_to.da_fhandle;
+           break;
+       } 
+        case RFS_SYMLINK: 
+       {
+           struct nfsslargs *sargs = (struct nfsslargs *)args;
+           fhp1 = (fhandle_t *)&sargs->sla_from.da_fhandle;
+           break;
+       } 
+        case RFS_MKDIR: 
+       {
+           struct nfscreatargs *sargs = (struct nfscreatargs *)args;
+           fhp1 = (fhandle_t *)&sargs->ca_da.da_fhandle;
+           break;
+       } 
+        case RFS_RMDIR: 
+       {
+           struct nfsdiropargs *sargs = (struct nfsdiropargs *)args;
+           fhp1 = (fhandle_t *)&sargs->da_fhandle;
+           break;
+       } 
+        case RFS_READDIR: 
+       {
+           struct nfsrddirargs *sargs = (struct nfsrddirargs *)args;
+           fhp1 = (fhandle_t *)&sargs->rda_fh;
+           break;
+       } 
+       default:
+           return NULL;
+    }
+
+    /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
+    if (is_afs_fh(fhp1)) {
+       *fhpp = fhp1;
+       if (fhp2) 
+           *fh2pp = fhp2;
+       return 1;           
+    }
+    if (is_afs_fh(fhp2)) {
+       *fhpp = fhp1;
+       *fh2pp = fhp2;
+       return 1;           
+    }
+    return NULL;
+}
+
+afs_int32 
+acl2_to_afs_call(int which, caddr_t *args, fhandle_t **fhpp)
+{
+    fhandle_t *fhp;
+
+    switch(which) {
+    case ACLPROC2_NULL:
+    {
+       return NULL;
+    }
+    case ACLPROC2_GETACL: 
+    {
+       struct GETACL2args *sargs = (struct GETACL2args *) args;
+       fhp = &sargs->fh;
+       break;
+    }
+    case ACLPROC2_SETACL: 
+    {
+       struct SETACL2args *sargs = (struct SETACL2args *) args;
+       fhp = &sargs->fh;
+       break;
+    }
+    case ACLPROC2_GETATTR: 
+    {
+       struct GETATTR2args *sargs = (struct GETATTR2args *) args;
+       fhp = &sargs->fh;
+       break;
+    }
+    case ACLPROC2_ACCESS: 
+    {
+       struct ACCESS2args *sargs = (struct ACCESS2args *) args;
+       fhp = &sargs->fh;
+       break;
+    }
+    default:
+       return NULL;
+    }
+
+    if (is_afs_fh(fhp)) {
+       *fhpp = fhp;
+       return 1;
+    }
+
+    return NULL;
+}
+
+int
+afs_nfs2_dispatcher(int type, afs_int32 which, char *argp, 
+                   struct exportinfo **expp, 
+                   struct svc_req *rp, struct AFS_UCRED *crp)
+{
+    afs_int32 call = 0;
+    afs_int32 code = 0;
+    afs_int32 client = 0;
+    struct sockaddr *sa;
+    fhandle_t *fh = (fhandle_t *)argp;
+    fhandle_t *fh2 = (fhandle_t *)0;
+
+    if (!xlatorinit_v2_done)
+       return 2;
+
+    sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
+    client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
+
+    AFS_GLOCK();
+    code = 0;
+    switch (type) {
+    case 0:
+       code = nfs2_to_afs_call(which, argp, &fh, &fh2);
+       break;
+    case 1:
+       code = acl2_to_afs_call(which, argp, &fh);
+       break;
+    default:
+       break;
+    }
+
+    if (code) {
+       struct afs_exporter *out = 0;
+       afs_int32 dummy;
+       static int once = 0;
+       struct SmallFid Sfid;
+
+       memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
+
+       /* We ran */
+       call = 1;
+       if (!once && *expp) {
+           afs_nobody = (*expp)->exi_export.ex_anon;
+           once = 1;
+       }
+       code = afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp,
+                                       client, &dummy, &out);
+       /* Be careful to release this */
+       if (!code && out)
+           EXP_RELE(out);
+
+       /* We ran and failed */
+       if (code == EINVAL) 
+           call = 2;
+    }
+
+    AFS_GUNLOCK();
+    return call;
+}
+
+void 
+afs_nfs2_smallfidder(struct nfsdiropres *dr)
+{
+    register fhandle_t *fhp = (fhandle_t *)&dr->dr_fhandle;
+    afs_int32 addr[2];
+    struct vcache *vcp;
+
+#if defined(AFS_SUN57_64BIT_ENV)
+    /* See also afs_fid() */    
+    memcpy((char *)addr, fhp->fh_data, 10);
+    addr[1] = (addr[1] >> 48) & 0xffff;
+#else 
+    memcpy((char *)addr, fhp->fh_data, 2 * sizeof(long));
+#endif
+
+    AFS_GLOCK();
+    vcp = (struct vcache *)addr[0];
+
+    /* See also afs_osi_vget */
+    if (addr[1] == AFS_XLATOR_MAGIC)
+    {
+       if (dr->dr_status == NFS_OK) {
+           struct SmallFid Sfid;
+           struct cell *tcell;
+
+           /* Make up and copy out a SmallFid */
+           tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
+           Sfid.Volume = vcp->fid.Fid.Volume;
+           Sfid.CellAndUnique = ((tcell->cellIndex << 24) |
+                                 (vcp->fid.Fid.Unique & 0xffffff));
+           afs_PutCell(tcell, READ_LOCK);
+           Sfid.Vnode = (u_short)(vcp->fid.Fid.Vnode & 0xffff);
+           fhp->fh_len = SIZEOF_SMALLFID;
+           memcpy(dr->dr_fhandle.fh_data, (char*)&Sfid, fhp->fh_len);
+       }
+
+       /* If we have a ref, release it */
+       if (vcp->vrefCount >= 1) 
+           AFS_RELE((struct vnode *) vcp);
+    } 
+    AFS_GUNLOCK();
+}
+
+void
+afs_nfs2_noaccess(struct afs_nfs2_resp *resp)
+{
+    r->status = NFSERR_ACCES;
+}
+
+void afs_nfs2_null(char *args, char *xp, char *exp, char *rp, char *crp)
+{
+}
+
+void 
+afs_nfs2_root(char *args, char *xp, char *exp, char *rp, char *crp)
+{
+}
+
+void 
+afs_nfs2_writecache(char *args, char *xp, char *exp, char *rp, char *crp)
+{
+}
+
+#define NFS_V2_REQ(FUNCNAME, RFSOP, POST) \
+void FUNCNAME(char *args, char *xp, char *exp, char *rp, char *crp) { \
+    u_int call; \
+    struct cred *svcred = curthread->t_cred; \
+    curthread->t_cred = (struct cred*)crp; \
+    call=afs_nfs2_dispatcher(0, RFSOP, (char *)args, &exp, rp, crp); \
+    if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp); \
+    else { (*afs_rfs_disp_tbl[RFSOP].orig_proc)(args, xp, exp, rp, crp); \
+    if (POST && afs_NFSRootOnly && call) afs_nfs2_smallfidder(xp); } \
+    curthread->t_cred = svcred; \
+    return; \
+}
+
+NFS_V2_REQ(afs_nfs2_getattr, RFS_GETATTR, 0) 
+NFS_V2_REQ(afs_nfs2_setattr, RFS_SETATTR, 0)
+NFS_V2_REQ(afs_nfs2_lookup, RFS_LOOKUP, 1)
+NFS_V2_REQ(afs_nfs2_readlink, RFS_READLINK, 0);
+NFS_V2_REQ(afs_nfs2_read, RFS_READ, 0);
+NFS_V2_REQ(afs_nfs2_write, RFS_WRITE, 0);
+NFS_V2_REQ(afs_nfs2_create, RFS_CREATE, 1);
+NFS_V2_REQ(afs_nfs2_remove, RFS_REMOVE, 0);
+NFS_V2_REQ(afs_nfs2_rename, RFS_RENAME, 0);
+NFS_V2_REQ(afs_nfs2_link, RFS_LINK, 0);
+NFS_V2_REQ(afs_nfs2_symlink, RFS_SYMLINK, 0);
+NFS_V2_REQ(afs_nfs2_mkdir, RFS_MKDIR, 1);
+NFS_V2_REQ(afs_nfs2_rmdir, RFS_RMDIR, 0);
+NFS_V2_REQ(afs_nfs2_readdir, RFS_READDIR, 0);
+NFS_V2_REQ(afs_nfs2_statfs, RFS_STATFS, 0);
+
+struct afs_nfs_disp_tbl afs_rfs_disp_tbl[RFS_NPROC] = {
+    { afs_nfs2_null },
+    { afs_nfs2_getattr },
+    { afs_nfs2_setattr },
+    { afs_nfs2_root },
+    { afs_nfs2_lookup },
+    { afs_nfs2_readlink },
+    { afs_nfs2_read },
+    { afs_nfs2_writecache },   
+    { afs_nfs2_write },
+    { afs_nfs2_create },
+    { afs_nfs2_remove },       
+    { afs_nfs2_rename },
+    { afs_nfs2_link }, 
+    { afs_nfs2_symlink },
+    { afs_nfs2_mkdir },
+    { afs_nfs2_rmdir },
+    { afs_nfs2_readdir },
+    { afs_nfs2_statfs }
+};
+
+#define ACL_V2_REQ(FUNCNAME, ACLOP) \
+void FUNCNAME(char *args, char *xp, char *exp, char *rp, char *crp) { \
+    u_int call; \
+    struct cred *svcred = curthread->t_cred; \
+    curthread->t_cred = (struct cred*)crp; \
+    call=afs_nfs2_dispatcher(1, ACLOP, (char *)args, &exp, rp, crp); \
+    if (call>1) afs_nfs2_noaccess((struct afs_nfs2_resp *)xp); \
+    else (*afs_rfs_disp_tbl[ACLOP].orig_proc)(args, xp, exp, rp, crp); \
+    curthread->t_cred = svcred; \
+    return; \
+}
+
+ACL_V2_REQ(afs_acl2_getacl, ACLPROC2_GETACL)
+ACL_V2_REQ(afs_acl2_setacl, ACLPROC2_SETACL)
+ACL_V2_REQ(afs_acl2_getattr, ACLPROC2_GETATTR)
+ACL_V2_REQ(afs_acl2_access, ACLPROC2_ACCESS)
+
+struct afs_nfs_disp_tbl afs_acl_disp_tbl[ACL2_NPROC] = {
+    { afs_nfs2_null }, 
+    { afs_acl2_getacl }, 
+    { afs_acl2_setacl },
+    { afs_acl2_getattr }, 
+    { afs_acl2_access } 
+};
+
+/* Munge the dispatch tables to link us in first */
+void 
+afs_xlatorinit_v2(struct rfs_disp_tbl *_rfs_tbl, 
+                 struct rfs_disp_tbl *_acl_tbl)
+{
+    int i;
+
+    if (xlatorinit_v2_done++) return;
+
+    for (i=0; i < RFS_NPROC; i++) {
+       afs_rfs_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
+       _rfs_tbl[i].dis_proc = afs_rfs_disp_tbl[i].afs_proc;
+    }
+
+    for (i=0; i < ACL2_NPROC; i++) {
+       afs_acl_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
+       _acl_tbl[i].dis_proc = afs_acl_disp_tbl[i].afs_proc;
+    }
+}
+
+#ifndef RFS3_NPROC
+#define RFS3_NPROC     22
+#endif
+
+#ifndef ACL3_NPROC
+#define ACL3_NPROC     3
+#endif
+
+struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS3_NPROC];
+struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC];
+
+struct afs_nfs3_resp {
+    nfsstat3 status;
+    bool_t flags; 
+};
+
+static int 
+is_afs_fh3(nfs_fh3 *fhp) {
+    if ((fhp->fh3_fsid.val[0] == AFS_VFSMAGIC) &&
+       (fhp->fh3_fsid.val[1] == AFS_VFSFSID)) 
+       return 1;
+    return 0;
+}
+
+void
+afs_nfs3_noaccess(struct afs_nfs3_resp *resp)
+{
+    resp->status = NFS3ERR_ACCES;
+    resp->flags = FALSE;
+}
+
+afs_int32 
+nfs3_to_afs_call(int which, caddr_t *args, nfs_fh3 **fhpp, nfs_fh3 **fh2pp)
+{
+    struct vnode *vp;
+    nfs_fh3 *fhp1=0;
+    nfs_fh3 *fhp2=0;
+    int errorcode;
+
+    *fh2pp = (nfs_fh3 *)0;
+    switch (which) {
+        case NFSPROC3_GETATTR: 
+       {
+            GETATTR3args *arg = (GETATTR3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->object;
+            break;
+        } 
+        case NFSPROC3_SETATTR: 
+       {
+            SETATTR3args *arg = (SETATTR3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->object;
+            break;
+        } 
+        case NFSPROC3_LOOKUP: 
+       {
+            LOOKUP3args *arg = (LOOKUP3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->what.dir;
+            break;
+        } 
+        case NFSPROC3_ACCESS: 
+       {
+            ACCESS3args *arg = (ACCESS3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->object;
+            break;
+        } 
+        case NFSPROC3_READLINK: 
+       {
+            READLINK3args *arg = (READLINK3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->symlink;       
+            break;
+        } 
+        case NFSPROC3_READ: 
+       {
+            READ3args *arg = (READ3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->file;
+            break;
+        } 
+        case NFSPROC3_WRITE: 
+       {
+            WRITE3args *arg = (WRITE3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->file;
+            break;
+        } 
+        case NFSPROC3_CREATE: 
+       {
+            CREATE3args *arg = (CREATE3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->where.dir;
+            break;
+        } 
+        case NFSPROC3_MKDIR: 
+       {
+            MKDIR3args *arg = (MKDIR3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->where.dir;
+            break;
+        } 
+        case NFSPROC3_SYMLINK: 
+       {
+            SYMLINK3args *arg = (SYMLINK3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->where.dir;
+            break;
+        } 
+        case NFSPROC3_MKNOD:
+       {
+            MKNOD3args *arg = (MKNOD3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->where.dir;
+            break;
+        } 
+        case NFSPROC3_REMOVE: 
+       {
+            REMOVE3args *arg = (REMOVE3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->object.dir;
+            break;
+        } 
+        case NFSPROC3_RMDIR: 
+       {
+            RMDIR3args *arg = (RMDIR3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->object.dir;
+            break;
+        } 
+        case NFSPROC3_RENAME: 
+       {
+            RENAME3args *arg = (RENAME3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->from.dir;
+            fhp2 = (nfs_fh3 *) &arg->to.dir;
+            break;
+        } 
+        case NFSPROC3_LINK: 
+       {
+            LINK3args *arg = (LINK3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->file;
+            fhp2 = (nfs_fh3 *) &arg->link.dir;
+            break;
+        } 
+        case NFSPROC3_READDIR: 
+       {
+            READDIR3args *arg = (READDIR3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->dir;
+            break;
+        } 
+        case NFSPROC3_READDIRPLUS: 
+       {
+            READDIRPLUS3args *arg = (READDIRPLUS3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->dir;
+            break;
+        } 
+        case NFSPROC3_FSSTAT: 
+       {
+            FSSTAT3args *arg = (FSSTAT3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->fsroot;
+            break;
+        } 
+        case NFSPROC3_FSINFO: 
+       {
+            FSINFO3args *arg = (FSINFO3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->fsroot;
+            break;
+        } 
+        case NFSPROC3_PATHCONF: 
+       {
+            PATHCONF3args *arg = (PATHCONF3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->object;
+            break;
+        } 
+        case NFSPROC3_COMMIT: 
+       {
+            COMMIT3args *arg = (COMMIT3args *)args;
+            fhp1 = (nfs_fh3 *) &arg->file;
+            break;
+        }
+       default:
+           return NULL;
+    }
+
+    /* Ok if arg 1 is in AFS or if 2 args and arg 2 is in AFS */
+    if (is_afs_fh3(fhp1)) {
+       *fhpp = fhp1;
+       if (fhp2) 
+           *fh2pp = fhp2;
+       return 1;           
+    }
+    if (is_afs_fh3(fhp2)) {
+       *fhpp = fhp1;
+       *fh2pp = fhp2;
+       return 1;           
+    }
+    return NULL;
+}
+
+afs_int32 
+acl2_to_afs_call(int which, caddr_t *args, nfs_fh3 **fhpp)
+{
+    nfs_fh3 *fhp;
+
+    switch(which) {
+    case ACLPROC3_GETACL: 
+    {
+        struct GETACL3args *sargs = (struct GETACL3args *) args;
+        fhp = &sargs->fh;
+        break;
+    }
+    case ACLPROC3_SETACL: 
+    {
+        struct SETACL3args *sargs = (struct SETACL3args *) args;
+        fhp = &sargs->fh;
+        break;
+    }
+    default:
+       return NULL;
+    }
+
+    if (is_afs_fh3(fhp)) {
+       *fhpp = fhp;
+       return 1;
+    }
+
+    return NULL;
+}
+
+int
+afs_nfs3_dispatcher(int type, afs_int32 which, char *argp, 
+                   struct exportinfo **expp, 
+                   struct svc_req *rp, struct AFS_UCRED *crp)
+{
+    afs_int32 call = 0;
+    afs_int32 code = 0;
+    afs_int32 client = 0;
+    struct sockaddr *sa;
+    nfs_fh3 *fh = (nfs_fh3 *)argp;
+    nfs_fh3 *fh2 = (nfs_fh3 *)0;
+
+    if (!xlatorinit_v3_done)
+       return 2;
+
+    sa = (struct sockaddr *)svc_getrpccaller(rp->rq_xprt)->buf;
+    client = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
+
+    AFS_GLOCK();
+    code = 0;
+    switch (type) {
+    case 0:
+       code = nfs3_to_afs_call(which, argp, &fh, &fh2);
+       break;
+    case 1:
+       code = acl3_to_afs_call(which, argp, &fh);
+       break;
+    default:
+       break;
+    }
+
+    if (code) {
+       struct afs_exporter *out = 0;
+       afs_int32 dummy;
+       static int once = 0;
+       struct SmallFid Sfid;
+
+       memcpy((char *)&Sfid, fh->fh_data, SIZEOF_SMALLFID);
+
+       /* We ran */
+       call = 1;
+       if (!once && *expp) {
+           afs_nobody = (*expp)->exi_export.ex_anon;
+           once = 1;
+       }
+       code = afs_nfsclient_reqhandler((struct afs_exporter *)0, &crp,
+                                       client, &dummy, &out);
+       /* Be careful to release this */
+       if (!code && out)
+           EXP_RELE(out);
+
+       /* We ran and failed */
+       if (code == EINVAL) 
+           call = 2;
+    }
+
+    AFS_GUNLOCK();
+    return call;
+}
+
+void 
+afs_nfs3_smallfidder(struct nfs_fh3 *fhp int status)
+{
+    afs_int32 addr[2];
+    struct vcache *vcp;
+
+#if defined(AFS_SUN57_64BIT_ENV)
+    /* See also afs_fid() */    
+    memcpy((char *)addr, fhp->fh3_data, 10);
+    addr[1] = (addr[1] >> 48) & 0xffff;
+#else 
+    memcpy((char *)addr, fhp->fh3_data, 2 * sizeof(long));
+#endif
+
+    AFS_GLOCK();
+    vcp = (struct vcache *)addr[0];
+
+    /* See also afs_osi_vget */
+    if (addr[1] == AFS_XLATOR_MAGIC)
+    {
+       if (status == NFS_OK) {
+           struct SmallFid Sfid;
+           struct cell *tcell;
+
+           /* Make up and copy out a SmallFid */
+           tcell = afs_GetCell(vcp->fid.Cell, READ_LOCK);
+           Sfid.Volume = vcp->fid.Fid.Volume;
+           Sfid.CellAndUnique = ((tcell->cellIndex << 24) |
+                                 (vcp->fid.Fid.Unique & 0xffffff));
+           afs_PutCell(tcell, READ_LOCK);
+           Sfid.Vnode = (u_short)(vcp->fid.Fid.Vnode & 0xffff);
+           fhp->fh3_len = SIZEOF_SMALLFID;
+           memcpy(fhp->fh3_data, (char*)&Sfid, fhp->fh3_len);
+       }
+
+       /* If we have a ref, release it */
+       if (vcp->vrefCount >= 1) 
+           AFS_RELE((struct vnode *) vcp);
+    } 
+    AFS_GUNLOCK();
+}
+
+#define NFS_V3_REQ(FUNCNAME, NFSOP, POST, RESP, RESPP) \
+void FUNCNAME(char *args, char *xp, char *exp, char *rp, char *crp) { \
+    u_int call; \
+    struct cred *svcred = curthread->t_cred; \
+    curthread->t_cred = (struct cred*)crp; \
+    call=afs_nfs3_dispatcher(0, NFSOP, (char *)args, &exp, rp, crp); \
+    if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp); \
+    else { (*afs_rfs3_disp_tbl[NFSOP].orig_proc)(args, xp, exp, rp, crp); \
+    if (POST && afs_NFSRootOnly && call) { \
+    RESP *resp = ( RESP *)xp; \
+    afs_nfs3_smallfidder( RESPP , resp->status); } \
+    curthread->t_cred = svcred; \
+    return; \
+}
+
+NFS_V3_REQ(afs_nfs3_getattr, NFSPROC3_GETATTR, 0, x, x) 
+NFS_V3_REQ(afs_nfs3_setattr, NFSPROC3_SETATTR, 0, x, x)
+NFS_V3_REQ(afs_nfs3_lookup, NFSPROC3_LOOKUP, 1, LOOKUP3res, &resp->resok.object)
+NFS_V3_REQ(afs_nfs3_access, NFSPROC3_ACCESS, 0, x, x);
+NFS_V3_REQ(afs_nfs3_readlink, NFSPROC3_READLINK, 0, x, x);
+NFS_V3_REQ(afs_nfs3_read, NFSPROC3_READ, 0, x, x);
+NFS_V3_REQ(afs_nfs3_write, NFSPROC3_WRITE, 0, x, x);
+NFS_V3_REQ(afs_nfs3_create, NFSPROC3_CREATE, 1, CREATE3res, &resp->resok.obj.handle);
+NFS_V3_REQ(afs_nfs3_mkdir, NFSPROC3_MKDIR, 1, MKDIR3res, &resp->resok.obj.handle);
+NFS_V3_REQ(afs_nfs3_symlink, NFSPROC3_SYMLINK, 0, x, x);
+NFS_V3_REQ(afs_nfs3_mknod, NFSPROC3_MKNOD, 0, x, x);
+NFS_V3_REQ(afs_nfs3_remove, NFSPROC3_REMOVE, 0, x, x);
+NFS_V3_REQ(afs_nfs3_rmdir, NFSPROC3_RMDIR, 0, x, x);
+NFS_V3_REQ(afs_nfs3_rename, NFSPROC3_RENAME, 0, x, x);
+NFS_V3_REQ(afs_nfs3_link, NFSPROC3_LINK, 0, x, x);
+NFS_V3_REQ(afs_nfs3_readdir, NFSPROC3_READDIR, 0, x, x);
+NFS_V3_REQ(afs_nfs3_readdirplus, NFSPROC3_READDIRPLUS, 0, x, x);
+NFS_V3_REQ(afs_nfs3_fsstat, NFSPROC3_FSSTAT, 0, x, x);
+NFS_V3_REQ(afs_nfs3_fsinfo, NFSPROC3_FSINFO, 0, x, x);
+NFS_V3_REQ(afs_nfs3_pathconf, NFSPROC3_PATHCONF, 0, x, x);
+NFS_V3_REQ(afs_nfs3_commit, NFSPROC3_COMMIT, 0, x, x);
+
+struct afs_nfs_disp_tbl afs_rfs3_disp_tbl[RFS_NPROC] = {
+    { afs_nfs2_null },
+    { afs_nfs3_getattr },
+    { afs_nfs3_setattr },
+    { afs_nfs3_lookup },
+    { afs_nfs3_access },
+    { afs_nfs3_readlink },
+    { afs_nfs3_read },
+    { afs_nfs3_write },
+    { afs_nfs3_create },
+    { afs_nfs3_mkdir },
+    { afs_nfs3_symlink },
+    { afs_nfs3_mknod },
+    { afs_nfs3_remove },        
+    { afs_nfs3_rmdir },
+    { afs_nfs3_rename },
+    { afs_nfs3_link },  
+    { afs_nfs3_readdir },
+    { afs_nfs3_readdirplus },
+    { afs_nfs3_fsstat },
+    { afs_nfs3_fsinfo },
+    { afs_nfs3_pathconf },
+    { afs_nfs3_commit }
+};
+
+#define ACL_V3_REQ(FUNCNAME, NFSOP) \
+void FUNCNAME(char *args, char *xp, char *exp, char *rp, char *crp) { \
+    u_int call; \
+    struct cred *svcred = curthread->t_cred; \
+    curthread->t_cred = (struct cred*)crp; \
+    call=afs_nfs3_dispatcher(1, NFSOP, (char *)args, &exp, rp, crp); \
+    if (call>1) afs_nfs3_noaccess((struct afs_nfs3_resp *)xp); \
+    else (*afs_rfs3_disp_tbl[NFSOP].orig_proc)(args, xp, exp, rp, crp); \
+    curthread->t_cred = svcred; \
+    return; \
+}
+
+ACL_V3_REQ(afs_acl3_getacl, ACLPROC3_GETACL)
+ACL_V3_REQ(afs_acl3_setacl, ACLPROC3_SETACL)
+
+struct afs_nfs_disp_tbl afs_acl3_disp_tbl[ACL3_NPROC] = {
+    { afs_nfs2_null }, 
+    { afs_acl3_getacl }, 
+    { afs_acl3_setacl },
+};
+
+/* Munge the dispatch tables to link us in first */
+void 
+afs_xlatorinit_v3(struct rfs_disp_tbl *_rfs_tbl, 
+                  struct rfs_disp_tbl *_acl_tbl)
+{
+    int i;
+
+    if (xlatorinit_v3_done++) return;
+
+    for (i=0; i < RFS3_NPROC; i++) {
+        afs_rfs3_disp_tbl[i].orig_proc = _rfs_tbl[i].dis_proc;
+        _rfs_tbl[i].dis_proc = afs_rfs3_disp_tbl[i].afs_proc;
+    }
+
+    for (i=0; i < ACL3_NPROC; i++) {
+        afs_acl3_disp_tbl[i].orig_proc = _acl_tbl[i].dis_proc;
+        _acl_tbl[i].dis_proc = afs_acl3_disp_tbl[i].afs_proc;
+    }
+}
+#endif /* !defined(AFS_NONFSTRANS)
index fce1b4b0cf8b9bad2b0311a99dd21e3f2e824655..c0fcb12f2943cd053f59449671a1cc3c2d1be10b 100644 (file)
@@ -2295,7 +2295,7 @@ static PNewCell(avc, afun, areq, ain, aout, ainSize, aoutSize, acred)
     }
 
     linkedstate |= CNoSUID; /* setuid is disabled by default for fs newcell */
-    code = afs_NewCell(newcell, cellHosts, linkedstate, linkedcell, fsport, vlport, (int)0);
+    code = afs_NewCell(newcell, cellHosts, linkedstate, linkedcell, fsport, vlport, (int)0, (char *) 0);
     return code;
 }
 
@@ -2560,13 +2560,13 @@ struct AFS_UCRED *acred;
     for(i = 0; i < VCSIZE; i++) {
        for(tvc = afs_vhashT[i]; tvc; tvc=tvc->hnext) {
            if (tvc->fid.Fid.Volume == volume && tvc->fid.Cell == cell) {
-#if    defined(AFS_SGI_ENV) || defined(AFS_ALPHA_ENV)  || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV)
+#if    defined(AFS_SGI_ENV) || defined(AFS_ALPHA_ENV)  || defined(AFS_SUN5_ENV)  || defined(AFS_HPUX_ENV) || defined(AFS_LINUX20_ENV)
                VN_HOLD((struct vnode *)tvc);
 #else
 #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
                osi_vnhold(tvc, 0);
 #else
-               tvc->vrefCount++;
+               VREFCOUNT_INC(tvc);
 #endif
 #endif
                ReleaseReadLock(&afs_xvcache);
index c148ee4b6fa1042f420a6e0fbd8cded49669917b..21a8898efe4f9bf8dd5030680c103ece34d87584 100644 (file)
@@ -801,10 +801,13 @@ void afs_SortServers(struct server *aservers[], int count)
     for (i=0; i<count; i++) {
        if (!aservers[i]) break;
        for (low=i,j=i+1; j<=count; j++) {
-         if (!aservers[j]) break;
-         if (aservers[j]->addr->sa_iprank < aservers[low]->addr->sa_iprank) {
-            low = j;
-         }
+          if ((!aservers[j]) || (!aservers[j]->addr)) 
+              break;
+          if ((!aservers[low]) || (!aservers[low]->addr))
+              break;
+          if (aservers[j]->addr->sa_iprank < aservers[low]->addr->sa_iprank) {
+              low = j;
+          }
        }
        if (low != i) {
          ts = aservers[i]; 
@@ -1084,6 +1087,10 @@ static afs_SetServerPrefs(sa)
 
     if (sa) sa->sa_iprank= 0;
     for (ill = (struct ill_s *)*addr /*ill_g_headp*/; ill; ill = ill->ill_next ) {
+#ifdef AFS_SUN58_ENV
+       /* Make sure this is an IPv4 ILL */
+       if (ill->ill_isv6) continue;
+#endif
        for (ipif = ill->ill_ipif; ipif; ipif = ipif->ipif_next ) {
            subnet = ipif->ipif_local_addr & ipif->ipif_net_mask;
            subnetmask = ipif->ipif_net_mask;
index aa047826608e557c3e655bf258687173de92fcb1..cbdca631bbcc8a640adb9a14a489ef61f5ffacef 100644 (file)
@@ -180,9 +180,9 @@ void afs_CheckLocks()
        for(i=0;i<VCSIZE;i++) {
            for(tvc = afs_vhashT[i]; tvc; tvc=tvc->hnext) {
 #ifdef AFS_OSF_ENV
-               if (tvc->vrefCount > 1)
+               if (VREFCOUNT(tvc) > 1)
 #else  /* AFS_OSF_ENV */
-               if (tvc->vrefCount)
+               if (VREFCOUNT(tvc))
 #endif
                    afs_warn("Stat cache entry at %x is held\n", tvc);
                if (CheckLock(&tvc->lock))
index 923dc6ecd7ea73ffcccaaaa645b2b9af6a0c9ca7..53ed8aa172dd49f04acf1f043b76be02e6fc9650 100644 (file)
@@ -213,7 +213,7 @@ int afs_FlushVCache(struct vcache *avc, int *slept)
     /* This should put it back on the vnode free list since usecount is 1 */
     afs_vcount--;
     vSetType(avc, VREG);
-    if (avc->vrefCount > 0) {
+    if (VREFCOUNT(avc) > 0) {
         VN_UNLOCK((struct vnode *)avc);
         AFS_RELE((struct vnode *)avc);
     } else {
@@ -568,6 +568,10 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
         int vmax = 2 * afs_cacheStats;
         int vn = VCACHE_FREE;
 
+         AFS_GUNLOCK();
+        shrink_dcache_sb(afs_globalVFS);
+        AFS_GLOCK();
+
         i = 0;
         for(tq = VLRU.prev; tq != &VLRU && vn > 0; tq = uq) {
            tvc = QTOV(tq);
@@ -582,7 +586,7 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
            if (tvc == afs_globalVp)
                continue;
 
-           if ( tvc->vrefCount && tvc->opens == 0 ) {
+           if ( VREFCOUNT(tvc) && tvc->opens == 0 ) {
                struct inode *ip = (struct inode*)tvc;
                if (list_empty(&ip->i_dentry)) {
                    vn --;
@@ -656,10 +660,10 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
                 refpanic ("Exceeded pool of AFS vnodes(VLRU cycle?)");
            else if (QNext(uq) != tq)
                 refpanic ("VLRU inconsistent");
-           else if (tvc->vrefCount < 1) 
+           else if (VREFCOUNT(tvc) < 1) 
                 refpanic ("refcnt 0 on VLRU");
 
-           if ( tvc->vrefCount == 1   &&   tvc->opens == 0 
+           if ( VREFCOUNT(tvc) == 1   &&   tvc->opens == 0 
                && (tvc->states & CUnlinkedDel) == 0) {
                code = afs_FlushVCache(tvc, &fv_slept);
                if (code == 0) {
@@ -711,7 +715,7 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
 
 #ifdef AFS_DARWIN_ENV
           if (tvc->opens == 0 && ((tvc->states & CUnlinkedDel) == 0) &&
-                tvc->vrefCount == 1 && UBCINFOEXISTS(&tvc->v)) {
+                VREFCOUNT(tvc) == 1 && UBCINFOEXISTS(&tvc->v)) {
                osi_VM_TryReclaim(tvc, &fv_slept);
                if (fv_slept) {
                   uq = VLRU.prev;
@@ -720,7 +724,7 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
                }
             }
 #endif
-          if (tvc->vrefCount == 0 && tvc->opens == 0
+          if (VREFCOUNT(tvc) == 0 && tvc->opens == 0
               && (tvc->states & CUnlinkedDel) == 0) {
                code = afs_FlushVCache(tvc, &fv_slept);
                if (code == 0) {
@@ -815,7 +819,7 @@ struct vcache *afs_NewVCache(struct VenusFid *afid, struct server *serverp,
     /* Hold it for the LRU (should make count 2) */
     VN_HOLD((struct vnode *)tvc);
 #else  /* AFS_OSF_ENV */
-    tvc->vrefCount = 1;        /* us */
+    VREFCOUNT_SET(tvc, 1);     /* us */
 #endif /* AFS_OSF_ENV */
 #ifdef AFS_AIX32_ENV
     LOCK_INIT(&tvc->pvmlock, "vcache pvmlock");
@@ -1081,7 +1085,7 @@ afs_FlushActiveVcaches(doflocks)
                /*
                 * That's because if we come in via the CUnlinkedDel bit state path we'll be have 0 refcnt
                 */
-               osi_Assert(tvc->vrefCount > 0);
+               osi_Assert(VREFCOUNT(tvc) > 0);
                AFS_RWLOCK((vnode_t *)tvc, VRWLOCK_WRITE);
 #endif
                ObtainWriteLock(&tvc->lock,52);
@@ -1136,7 +1140,7 @@ afs_FlushActiveVcaches(doflocks)
                AFS_FAST_RELE(tvc);
                if (didCore) {
 #ifdef AFS_GFS_ENV
-                   tvc->vrefCount--;
+                   VREFCOUNT_DEC(tvc);
 #else
                    AFS_RELE((struct vnode *)tvc);
 #endif
@@ -1145,7 +1149,7 @@ afs_FlushActiveVcaches(doflocks)
                }
            }          
 #ifdef AFS_DARWIN_ENV
-            if (tvc->vrefCount == 1 && UBCINFOEXISTS(&tvc->v)) {
+            if (VREFCOUNT(tvc) == 1 && UBCINFOEXISTS(&tvc->v)) {
                if (tvc->opens) panic("flushactive open, hasubc, but refcnt 1");
                osi_VM_TryReclaim(tvc,0);
            }
@@ -1683,8 +1687,15 @@ loop:
     /* stat the file */
     afs_RemoveVCB(afid);
     {
-    struct AFSFetchStatus OutStatus;
-    code = afs_FetchStatus(tvc, afid, areq, &OutStatus);
+       struct AFSFetchStatus OutStatus;
+
+       if (afs_DynrootNewVnode(tvc, &OutStatus)) {
+           afs_ProcessFS(tvc, &OutStatus, areq);
+           tvc->states |= CStatd | CUnique;
+           code = 0;
+       } else {
+           code = afs_FetchStatus(tvc, afid, areq, &OutStatus);
+       }
     }
 
     if (code) {
@@ -2694,7 +2705,7 @@ void shutdown_vcache(void)
                    vms_delete(tvc->segid);
                    AFS_GLOCK();
                    tvc->segid = tvc->vmh = NULL;
-                   if (tvc->vrefCount) osi_Panic("flushVcache: vm race");
+                   if (VREFCOUNT(tvc)) osi_Panic("flushVcache: vm race");
                }
                if (tvc->credp) {
                    crfree(tvc->credp);
index 46bc9ba8af2e927a146831712221f843b3293e6c..53da1b47f7a25e09842a94e8f6ad2fe3cc2056eb 100644 (file)
@@ -72,6 +72,7 @@ afs_int32 fvTable[NFENTRIES];
 /* Forward declarations */
 static struct volume *afs_NewVolumeByName(char *aname, afs_int32 acell, int agood,
                                   struct vrequest *areq, afs_int32 locktype);
+static struct volume *afs_NewDynrootVolume(struct VenusFid *fid);
 static inVolList();
 
 
@@ -402,8 +403,12 @@ struct volume *afs_GetVolume(afid, areq, locktype)
 
     tv = afs_FindVolume(afid, locktype);
     if (!tv) {
-       bp = afs_cv2string(&tbuf[CVBS], afid->Fid.Volume);
-       tv = afs_NewVolumeByName(bp, afid->Cell, 0, areq, locktype);
+       if (afs_IsDynrootFid(afid)) {
+          tv = afs_NewDynrootVolume(afid);
+       } else {
+          bp = afs_cv2string(&tbuf[CVBS], afid->Fid.Volume);
+          tv = afs_NewVolumeByName(bp, afid->Cell, 0, areq, locktype);
+       }
     }
     return tv;
 } /*afs_GetVolume*/
@@ -549,6 +554,29 @@ struct volume *afs_GetVolumeByName(aname, acell, agood, areq, locktype)
   return(tv);
 }
 
+static struct volume *afs_NewDynrootVolume(struct VenusFid *fid) {
+    struct cell *tcell;
+    struct volume *tv;
+    struct vldbentry tve;
+    char *bp, tbuf[CVBS];
+
+    tcell = afs_GetCell(fid->Cell, READ_LOCK);
+    if (!tcell)
+       return (struct volume *) 0;
+    if (!(tcell->states & CHasVolRef))
+       tcell->states |= CHasVolRef;
+
+    bp = afs_cv2string(&tbuf[CVBS], fid->Fid.Volume);
+    memset(&tve, 0, sizeof(tve));
+    strcpy(tve.name, "local-dynroot");
+    tve.volumeId[ROVOL] = fid->Fid.Volume;
+    tve.flags = VLF_ROEXISTS;
+
+    tv = afs_SetupVolume(0, bp, &tve, tcell, 0, 0, 0);
+    afs_PutCell(tcell, READ_LOCK);
+    return tv;
+}
+
 int lastnvcode;
 static struct volume *afs_NewVolumeByName(char *aname, afs_int32 acell, int agood,
                                   struct vrequest *areq, afs_int32 locktype)
index fb5c2e95cc9d2d7009200f1f09773c1248f8b3b8..343776412740c2c0d5645487487c397982a60fad 100644 (file)
@@ -86,7 +86,7 @@ typedef struct afs_bozoLock afs_bozoLock_t;
 #define BEGINMAC do {
 #define ENDMAC   } while (0)
 
-#if defined(AFS_SUN5_ENV)
+#if defined(AFS_SUN5_ENV) || defined(AFS_OBSD_ENV)
 #define MyPidxx (curproc->p_pid)
 #else
 #if defined(AFS_AIX41_ENV)
index cc5b65b9871dfb80aee9644676c80400119033c1..67bf2fee0a65b349a89e0332ad7af87f380b9113 100644 (file)
@@ -103,6 +103,8 @@ dest: ${DEST}/root.client/usr/vice/etc/afsd ${DEST}/etc/vsys
                        ${INSTALL} -f afs.rc.solaris.2.7 ${DEST}/root.client/usr/vice/etc/modload/afs.rc ;;\
                sun4x_58 ) \
                        ${INSTALL} -f afs.rc.solaris.2.8 ${DEST}/root.client/usr/vice/etc/modload/afs.rc ;;\
+               sun4x_59 ) \
+                       ${INSTALL} -f afs.rc.solaris.2.9 ${DEST}/root.client/usr/vice/etc/modload/afs.rc ;;\
                 sun4x_5? ) \
                         ${INSTALL} -f afs.rc.solaris.2_5 ${DEST}/root.client/usr/vice/etc/modload/afs.rc ;;\
                alpha_osf* ) \
index 693dc49419310c8c45a78997e800b8dcd4b79a92..f299203e75b9370c047d64557d57d3b5c06178dc 100644 (file)
@@ -14,19 +14,31 @@ AFS_CLIENT=on
 AFS_SERVER=off
 
 # AFS client configuration options:
+XXLARGE="-stat 4000 -dcache 4000 -daemons 6 -volumes 256 -files 50000"
+XLARGE="-stat 3600 -dcache 3600 -daemons 5 -volumes 196 -files 50000"
 LARGE="-stat 2800 -dcache 2400 -daemons 5 -volumes 128"
 MEDIUM="-stat 2000 -dcache 800 -daemons 3 -volumes 70"
 SMALL="-stat 300 -dcache 100 -daemons 2 -volumes 50"
+
+# cachesize and according options are set by /afs/rc.d/init.d/afs
+#   * if you set CACHESIZE to "AUTOMATIC", it will automatically be chosen
+#     deduced by parition sizes (does not work if your cache is on / or /usr)
+#   * if you set OPTIONS to "AUTOMATIC", the init script will choose a set
+#     of options based on the cache size
+# otherwise the values specified here will be used. So be careful!
+# Note: if you leave these as-is, no changes are made.
+CACHESIZE=
 OPTIONS=$MEDIUM
 
+# you should never need to change these settings
+AFSDIR=/afs
+CACHEDIR=/usr/vice/cache
+CACHEINFO=/usr/vice/etc/cacheinfo
+
 # Set to "-verbose" for a lot of debugging information from afsd. Only
 # useful for debugging as it prints _a lot_ of information.
 VERBOSE=
 
-# OPTIONS are the options passed to afsd.
-OPTIONS="$OPTIONS $VERBOSE"
-
-
 # Sample server preferences function. Set server preferences using this.
 # afs_serverprefs() {
 #    /usr/afsws/etc/fs setserverprefs <host> <rank>
diff --git a/src/afsd/afs.ppc_darwin.plist b/src/afsd/afs.ppc_darwin.plist
new file mode 100644 (file)
index 0000000..d802e7a
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+       <key>CFBundleDevelopmentRegion</key>
+       <string>English</string>
+       <key>CFBundleExecutable</key>
+       <string>afs</string>
+       <key>CFBundleIdentifier</key>
+       <string>org.openafs.filesystems.afs</string>
+       <key>CFBundleInfoDictionaryVersion</key>
+       <string>6.0</string>
+       <key>CFBundleName</key>
+       <string>afs</string>
+       <key>CFBundlePackageType</key>
+       <string>KEXT</string>
+       <key>CFBundleShortVersionString</key>
+       <string>1.1.1</string>
+       <key>CFBundleSignature</key>
+       <string>????</string>
+       <key>CFBundleVersion</key>
+       <string>1.1.1</string>
+       <key>OSBundleLibraries</key>
+       <dict>
+               <key>com.apple.kernel.bsd</key>
+               <string>1.0.0b1</string>
+               <key>com.apple.kernel.mach</key>
+               <string>1.0.0b1</string>
+       </dict>
+</dict>
+</plist>
index a55abbb74104f68f9f523adfb1edb1ca47d1f429..72d184463dcf97e0605820335d7b2b4c2546a8c8 100644 (file)
@@ -9,26 +9,83 @@
 # AFS  Start and stop AFS components
 # 
 # 
-# chkconfig: 345 60 20
+# chkconfig: 35 60 20
 # description:  AFS is a distributed file system which provides location
 #              transparency, caching and secure authentication.
 #              Additional configuration can be done in the /etc/sysconfig/afs
 #              file. Read the documentation in that file for more information.
 #
+# The following section is used at least by SuSE insserv(8)
+### BEGIN INIT INFO
+# Provides: afs
+# Required-Start: $network
+# Required-Stop: $network
+# Default-Start: 3 5
+# Default-Stop: 0 1 2 6
+# Description:  AFS is a distributed file system which provides location
+#              transparency, caching and secure authentication.
+#              Additional configuration can be done in the /etc/sysconfig/afs
+#              file. Read the documentation in that file for more information.
+### END INIT INFO
+#
 # Note that AFS does not use a pid file in /var/run. It is turned off by
 # unmounting /afs.
 
 
+# check for special bootup functions
+if [ -f /etc/rc.d/init.d/functions ] ; then
+       . /etc/rc.d/init.d/functions
+       afs_rh=1
+else
+       # special (RedHat) functions not available...
+       # so I provide neccessary replacements (e.g. for SuSE)
+
+       function echo_failure () { echo -n " - failed." ; }
+
+       function echo_success () { echo -n " - successful." ; }
+
+       # these are hopefully all functions I use...
+fi
+
+runcmd() {
+   echo -n "$1 "
+   shift
+   if [ "$BOOTUP" = "color" ]; then
+      $* && echo_success || echo_failure
+   else
+      $*
+   fi
+   echo
+}
+
+SYSCNF=/etc/sysconfig/afs
+
 # Gather up options and post startup script name, if present
-if [ -f /etc/sysconfig/afs ]; then
-       . /etc/sysconfig/afs
+if [ -f $SYSCNF ] ; then
+       . $SYSCNF
 fi
 
+CACHEINFO=${CACHEINFO:-/usr/vice/etc/cacheinfo}
+CACHE=${CACHEDIR:-/usr/vice/cache}
+AFS=${AFSDIR:-/afs}
+
 # is_on returns 1 if value of arg is "on"
 is_on() {
        if  test "$1" = "on" ; then return 0
        else return 1
-       fi
+        fi
+}
+
+on_network() {
+    ADDRS=`ifconfig -a | grep 'inet addr' | grep -v 127.0.0.1 | wc -l`
+    if [ "$ADDRS" = "" ]; then
+       echo afs: No interfaces with IP address 1>&2
+       return 1
+    elif [ $ADDRS = 0 ]; then
+       echo afs: No interfaces with IP address 1>&2
+       return 1
+    fi
+    return 0
 }
 
 # If choose_client can't correctly determine which client to use, set
@@ -106,7 +163,6 @@ set_prefix()
        esac
 }
 
-
 MODLOADDIR=/usr/vice/etc/modload
 # load_client loads the AFS client module if it's not already loaded. 
 load_client() {
@@ -126,8 +182,48 @@ load_client() {
        /sbin/insmod ${PREFIX:+-P $PREFIX} -f -m $MODLOADDIR/$LIBAFS > $MODLOADDIR/libafs.map 2>&1
 }
 
+generate_cacheinfo() {
+    if [ "$CACHESIZE" = "AUTOMATIC" ]; then
+       LINE=`df -k $CACHE | tail -1`
+       PART=`echo $LINE | awk '{ if ( ($NF != "/usr")  && ($NF != "/") ) print $NF; else print "NONE";}'`
+       if [ "$PART" = "NONE" ]; then
+           echo "$CACHE or /usr/vice is not a separate partition"
+           echo "you have to change the cachesize in $SYSCNF by hand"
+           exit 1
+       else
+           PARTSIZE=`echo $LINE | awk '{print $2}'`
+           CACHESIZE=`echo $PARTSIZE | awk '{printf "%d",int(($1*.8)/1000)*1000}'`
+       fi
+    fi
+    if [ "x$CACHESIZE" != "x" ]; then
+       echo $AFS:$CACHE:$CACHESIZE >$CACHEINFO
+       chmod 0644 $CACHEINFO
+    else
+       CACHESIZE=`awk -F: '{print $3}' < $CACHEINFO`
+    fi
+}
+
+choose_afsdoptions() {
+       if [ -z "$OPTIONS" -o "$OPTIONS" = "AUTOMATIC" ]; then
+               if [ $CACHESIZE -lt 131072 ]; then
+                       OPTIONS=$SMALL
+               elif [ $CACHESIZE -lt 524288 ]; then
+                       OPTIONS=$MEDIUM
+               elif [ $CACHESIZE -lt 1048576 ]; then
+                       OPTIONS=$LARGE
+               elif [ $CACHESIZE -lt 2097152 ]; then
+                       OPTIONS=$XLARGE
+               else
+                       OPTIONS=$XXLARGE
+               fi
+       fi
+       AFSD_OPTIONS="$OPTIONS $VERBOSE"
+}
+
 case "$1" in 
   start)
+    if [ ! "$afs_rh" -o ! -f /var/lock/subsys/afs ]; then
+       on_network || exit 1
        # Load kernel extensions
        if  load_client  ; then :
        else
@@ -139,33 +235,36 @@ case "$1" in
        # Start bosserver, it if exists
        if  is_on $AFS_SERVER && test -x /usr/afs/bin/bosserver  ; then
                /usr/afs/bin/bosserver 
+               test "$afs_rh" && touch /var/lock/subsys/afs
        fi
 
        # Start AFS client
        if  is_on $AFS_CLIENT && test -x /usr/vice/etc/afsd  ; then
-               /usr/vice/etc/afsd ${OPTIONS}
-
-               # Start AFS version of inetd.conf if present.
-               if  test -f /usr/afsws/etc/inetd.conf -a -x /usr/afsws/etc/inetd.afs ; then
-                       /usr/afsws/etc/inetd.afs /usr/afsws/etc/inetd.conf
-               fi
+               generate_cacheinfo
+               choose_afsdoptions
+               /usr/vice/etc/afsd ${AFSD_OPTIONS}
+               test "$afs_rh" && touch /var/lock/subsys/afs
                $AFS_POST_INIT
        fi
-
+    fi
        ;;
 
   stop)
+    if [ ! "$afs_rh" -o -f /var/lock/subsys/afs ]; then
        # Stop AFS
        echo "Stopping AFS services..... "
 
        if  is_on $AFS_CLIENT  ; then
-               killall inetd.afs
+               if [ -x /usr/vice/etc/killafs ] ; then
+                       runcmd "Sending all processes using /afs the TERM signal ..." /usr/vice/etc/killafs TERM
+                       runcmd "Sending all processes using /afs the KILL signal ..." /usr/vice/etc/killafs KILL
+               fi
                umount /afs
        fi
 
-       if  is_on $AFS_SERVER && test -x /usr/afs/bin/bos ; then
+       if  is_on $AFS_SERVER && test -x /usr/bin/bos ; then
                echo "Stopping AFS bosserver"
-               /usr/afs/bin/bos shutdown localhost -localauth -wait
+               /usr/bin/bos shutdown localhost -localauth -wait
                killall -HUP bosserver
        fi
 
@@ -175,10 +274,21 @@ case "$1" in
                /sbin/rmmod $LIBAFS
        fi
 
+       rm -f /var/lock/subsys/afs
+    fi
+       ;;
+
+  restart)
+       # Restart AFS
+       $0 stop
+       $0 start
        ;;
 
   *)
-       echo Usage: 'afs <start|stop>'
+       echo Usage: 'afs <start|stop|restart>'
 
 esac
 
+exit 0
+
+action fool the Red Hat initscripts
diff --git a/src/afsd/afs.rc.solaris.2.9 b/src/afsd/afs.rc.solaris.2.9
new file mode 100644 (file)
index 0000000..00967eb
--- /dev/null
@@ -0,0 +1,188 @@
+#!/bin/sh
+#
+# afs.rc: rc script for AFS on Solaris 2.x platforms
+#
+# Install this script as /etc/init.d/afs.rc
+# then make links like this:
+# ln -s ../init.d/afs.rc /etc/rc0.d/K66afs
+# ln -s ../init.d/afs.rc /etc/rc2.d/S70afs 
+#
+CONFIG=/usr/vice/etc/config
+AFSDOPT=$CONFIG/afsd.options
+PACKAGE=$CONFIG/package.options
+
+LARGE="-stat 2800 -dcache 2400 -daemons 5 -volumes 128 -afsdb"
+MEDIUM="-stat 2000 -dcache 800 -daemons 3 -volumes 70 -afsdb"
+SMALL="-stat 300 -dcache 100 -daemons 2 -volumes 50 -afsdb"
+
+if [ -f $AFSDOPT ]; then
+    OPTIONS=`cat $AFSDOPT`
+else
+    OPTIONS=$MEDIUM
+fi
+
+# Need the commands ps, awk, kill, sleep
+PATH=${PATH}${PATH:+:}/sbin:/bin:/usr/bin
+
+killproc() {            # kill the named process(es)
+      awkfield2='$2'
+        pid=`ps -ef | awk "/$1/ && ! /awk/ {print $awkfield2}"`
+        [ "$pid" != "" ] && kill -KILL $pid
+}
+
+case $1 in
+'start')
+
+#
+# Make sure afs exists in /etc/name_to_sysnum
+#
+if grep -s "afs" /etc/name_to_sysnum > /dev/null; then
+    echo "Entry for afs already exists in /etc/name_to_sysnum"
+else
+    echo "Creating entry for afs in /etc/name_to_sysnum"
+    cp /etc/name_to_sysnum /etc/name_to_sysnum.orig
+    sed '/nfs/i\
+afs                    65' /etc/name_to_sysnum > /tmp/name_to_sysnum
+    mv /tmp/name_to_sysnum /etc/name_to_sysnum
+    echo "Rebooting now for new /etc/name_to_sysnum to take effect"
+    reboot
+fi
+
+## Check to see that /bin/isalist exists and is executable
+if [ ! -x /bin/isalist ] ;then
+      echo "/bin/isalist not executable"
+      exit 1;
+fi
+
+## Determine if we are running the 64 bit OS
+## If sparcv9 then the location of the afs and nfs extensions differ
+
+case `/bin/isalist` in
+    *sparcv9* )
+              nfssrv=/kernel/misc/sparcv9/nfssrv
+              afs=/kernel/fs/sparcv9/afs ;;
+          * )
+              nfssrv=/kernel/misc/nfssrv
+              afs=/kernel/fs/afs ;;
+esac
+
+
+#
+# Load kernel extensions
+#
+# nfssrv has to be loaded first
+
+
+if [ -f $nfssrv ]; then
+      echo "Loading NFS server kernel extensions"
+      modload $nfssrv
+else
+      echo "$nfssrv does not exist. Skipping AFS startup."
+      exit 1
+fi
+
+## Load AFS kernel extensions
+
+if [ -f $afs ]; then
+      echo "Loading AFS kernel extensions"
+      modload $afs
+else
+      echo "$afs does not exist. Skipping AFS startup."
+      exit 1
+fi
+
+#
+# Start the AFS server processes if a bosserver exists
+#
+
+if [ -x /usr/afs/bin/bosserver ]; then
+      echo "Starting AFS Server processes"
+      /usr/afs/bin/bosserver &
+      OPTIONS="$OPTIONS -nosettime"
+      sleep 30
+fi
+
+#
+# Check that all of the client configuration files exist
+#
+
+for file in /usr/vice/etc/afsd /usr/vice/etc/cacheinfo \
+          /usr/vice/etc/ThisCell /usr/vice/etc/CellServDB
+do
+      if [ ! -f ${file} ]; then
+              echo "${file} does not exist. Not starting AFS client."
+              exit 1
+      fi
+done
+
+#
+# Check that the root directory for AFS (/afs) 
+# and the cache directory (/usr/vice/cache) both exist
+#
+
+for dir in `awk -F: '{print $1, $2}' /usr/vice/etc/cacheinfo`
+do
+      if [ ! -d ${dir} ]; then
+              echo "${dir} does not exist. Not starting AFS client."
+              exit 2
+      fi
+done
+
+echo "Starting afsd"
+/usr/vice/etc/afsd $OPTIONS
+
+#
+# Run package to update the disk
+#
+if [ -f /usr/afsws/etc/package -a -f $PACKAGE ]; then
+      /usr/afsws/etc/package -v -o `cat $PACKAGE` > /dev/console 2>&1
+case $? in
+0)
+      (echo "Package completed successfully") > /dev/console 2>&1
+      date > /dev/console 2>&1
+      ;;
+4)
+      (echo "Rebooting to restart system") > /dev/console 2>&1
+      sync
+      /etc/reboot
+      ;;
+*)
+      (echo "Package update failed; continuing") > /dev/console 2>&1
+      ;;
+esac
+fi
+
+#
+# Start AFS inetd services
+# (See the AFS Command Ref. for notes on the proper configuration of inetd.afs)
+#
+if [ -f /usr/sbin/inetd.afs -a -f /etc/inetd.conf.afs ]; then
+      /usr/sbin/inetd.afs /etc/inetd.conf.afs
+fi
+
+echo ;;
+
+'stop')
+
+#
+# Stop the AFS inetd and server processes
+# Note that the afsd processes cannot be killed
+#
+
+echo "Killing inetd.afs"
+killproc inetd.afs
+
+bosrunning=`ps -ef | awk '/bosserver/ && ! /awk/'`
+if [ "${bosrunning}" != "" ]; then
+      echo "Shutting down AFS server processes"
+      /usr/afs/bin/bos shutdown localhost -localauth -wait
+      echo "Killing AFS bosserver"
+      killproc bosserver
+fi
+
+echo ;;
+
+*)    echo "Invalid option supplied to $0"
+      exit 1;;
+esac
index 3edd97e83c83d063e70398e782c99e68a79fe992..74023d1df192bc460904e72729994b6603307d7a 100644 (file)
@@ -113,6 +113,14 @@ RCSID("$Header$");
 #include <sys/vfs.h>
 #endif
 
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
 #include <netinet/in.h>
 #include <afs/afs_args.h>
 #include <afs/cellconfig.h>
@@ -231,6 +239,7 @@ static int enable_process_stats = 0;        /* enable rx stats */
 #ifdef AFS_AFSDB_ENV
 static int enable_afsdb = 0;           /* enable AFSDB support */
 #endif
+static int enable_dynroot = 0;         /* enable dynroot support */
 #ifdef notdef
 static int inodes = 60;                        /* VERY conservative, but has to be */
 #endif
@@ -1058,6 +1067,10 @@ static AfsdbLookupHandler()
     struct afsconf_cell acellInfo;
     int i;
 
+    kernelMsg[0] = 0;
+    kernelMsg[1] = 0;
+    acellName[0] = '\0';
+
     while (1) {
        /* On some platforms you only get 4 args to an AFS call */
        int sizeArg = ((sizeof acellName) << 16) | (sizeof kernelMsg);
@@ -1067,6 +1080,9 @@ static AfsdbLookupHandler()
            continue;
        }
 
+       if (*acellName == 1)    /* Shutting down */
+           break;
+
        code = afsconf_GetAfsdbInfo(acellName, 0, &acellInfo);
        if (code) {
            kernelMsg[0] = 0;
@@ -1079,8 +1095,12 @@ static AfsdbLookupHandler()
                kernelMsg[1] = 0;
            for (i=0; i<acellInfo.numServers; i++)
                kernelMsg[i+2] = acellInfo.hostAddr[i].sin_addr.s_addr;
+           strncpy(acellName, acellInfo.name, sizeof(acellName));
+           acellName[sizeof(acellName) - 1] = '\0';
        }    
     }
+
+    exit(1);
 }
 #endif
 
@@ -1288,6 +1308,10 @@ mainproc(as, arock)
            nFilesPerDir = res;
        }
     }
+    if (as->parms[26].items) {
+       /* -dynroot */
+       enable_dynroot = 1;
+    }
 
     /*
      * Pull out all the configuration info for the workstation's AFS cache and
@@ -1519,6 +1543,14 @@ mainproc(as, arock)
     }
 #endif
 
+    if (enable_dynroot) {
+       if (afsd_verbose)
+           printf("%s: Enabling dynroot support in kernel.\n", rn);
+       code = call_syscall(AFSOP_SET_DYNROOT, 1);
+       if (code)
+           printf("%s: Error enabling dynroot support.\n", rn);
+    }
+
     /* Initialize AFS daemon threads. */
     if (afsd_verbose)
        printf("%s: Forking AFS daemon.\n", rn);
@@ -1870,6 +1902,7 @@ char **argv; {
 #endif
                ), "Enable AFSDB support");
     cmd_AddParm(ts, "-files_per_subdir", CMD_SINGLE, CMD_OPTIONAL, "log(2) of the number of cache files per cache subdirectory");
+    cmd_AddParm(ts, "-dynroot", CMD_FLAG, CMD_OPTIONAL, "Enable dynroot support");
     return (cmd_Dispatch(argc, argv));
 }
 
@@ -1951,6 +1984,16 @@ call_syscall(param1, param2, param3, param4, param5, param6, param7)
 long param1, param2, param3, param4, param5, param6, param7;
 {
     int error;
+#ifdef AFS_LINUX20_ENV
+    long eparm[4];
+
+    eparm[0] = param4;
+    eparm[1] = param5;
+    eparm[2] = param6;
+    eparm[3] = param7;
+
+    param4 = eparm;
+#endif
 
     error = syscall(AFS_SYSCALL, AFSCALL_CALL, param1, param2, param3, param4, param5, param6, param7);
     if (afsd_verbose) printf("SScall(%d, %d)=%d ", AFS_SYSCALL, AFSCALL_CALL, error);
index 9235f51750dc1e5014450352ab5f42db3ef3512b..791b85ce855f04d9acc5b3efad0414579528d8b6 100644 (file)
@@ -9,6 +9,19 @@
 
 #include <afsconfig.h>
 #include <afs/param.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 
 RCSID("$Header$");
 
@@ -46,4 +59,5 @@ main (argc, argv)
     }
     code = syscall(AFS_SYSCALL, parms[0], parms[1], parms[2], parms[3], parms[4], parms[5]);
     printf("code %d\n", code);
+    return 0;
 }
index 2e6a1654cb7efeddeed4935bd322aceb36850a9f..fe6bb2f249d2efa17dd01735248ce7e12153e7df 100644 (file)
 #define ReleaseLockEvent       "AFS_SRX_RelLock"
 #define SetVolumeStatusEvent    "AFS_SRX_SetVolS"
 #define FlushCPSEvent           "AFS_SRX_FlusCPS"
+#define InlineBulkFetchStatusEvent     "AFS_SRX_BIFchSt"
 #define PrivilegeEvent         "AFS_Priv"
 #define PrivSetID              "AFS_PrivSet"
 /* Next 5 lines on behalf of MR-AFS */
index 5d9cb48d879a5ca8ea9a67131ea624a863a980b5..5ff836ac2d29cb27bf3191b4b7ce82741e33c18e 100644 (file)
@@ -74,7 +74,8 @@ EXELIBS =\
        $(EXELIBDIR)\afslwp.lib \
        $(EXELIBDIR)\afs\afsutil.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
-       $(EXELIBDIR)\afs\afsreg.lib
+       $(EXELIBDIR)\afs\afsreg.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
 
 $(SETKEY_EXEFILE): $(SETKEY_EXEOBJS) $(EXELIBS)
index cd4c38d1ddc264f765312d837929a5ac30449453..a9d89598cbc70ead4613a42f9cec135acba3575a 100644 (file)
@@ -24,12 +24,16 @@ RCSID("$Header$");
 #include <sys/utime.h>
 #include <io.h>
 #include <WINNT/afssw.h>
+#ifdef AFS_AFSDB_ENV
+#include <cm_dns.h>
+#endif /* AFS_AFSDB_ENV */
 #else
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netdb.h>
 #include <sys/file.h>
 #include <sys/time.h>
+#include <afs/afsint.h>
 #ifdef AFS_AFSDB_ENV
 #include <arpa/nameser.h>
 #include <resolv.h>
@@ -39,8 +43,19 @@ RCSID("$Header$");
 #include <ctype.h>
 #include <time.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 #endif /* UKERNEL */
 #include <afs/afsutil.h>
 #include "cellconfig.h"
@@ -53,19 +68,19 @@ static afsconf_CloseInternal();
 static afsconf_Reopen();
 
 static struct afsconf_servPair serviceTable [] = {
-    "afs",     7000,
-    "afscb",   7001,
-    "afsprot", 7002,
-    "afsvldb", 7003,
-    "afskauth",        7004,
-    "afsvol",  7005,
-    "afserror",        7006,
-    "afsnanny",        7007,
-    "afsupdate",7008,
-    "afsrmtsys",7009,
-    "afsres",   7010,   /* residency database for MR-AFS */
-    "afsremio", 7011,   /* remote I/O interface for MR-AFS */
-    0, 0               /* insert new services before this spot */
+    { "afs",       7000, },
+    { "afscb",     7001, },
+    { "afsprot",   7002, },
+    { "afsvldb",   7003, },
+    { "afskauth",  7004, },
+    { "afsvol",    7005, },
+    { "afserror",  7006, },
+    { "afsnanny",  7007, },
+    { "afsupdate", 7008, },
+    { "afsrmtsys", 7009, },
+    { "afsres",    7010, },  /* residency database for MR-AFS */
+    { "afsremio",  7011, },  /* remote I/O interface for MR-AFS */
+    { 0, 0 }                /* insert new services before this spot */
 };
 
 /*
@@ -106,7 +121,7 @@ char *abuffer; {
     register int tc;
 
     tp = abuffer;
-    while (tc = *tp) {
+    while ((tc = *tp)) {
        if (!isspace(tc)) break;
        tp++;
     }
@@ -353,9 +368,12 @@ char clones[];
 #else
     i = GetCellUnix(adir);
 #endif
+
+#ifndef AFS_FREELANCE_CLIENT  /* no local cell not fatal in freelance */
     if (i) {
        return i;
     }
+#endif
 
     /* now parse the individual lines */
     curEntry = 0;
@@ -553,6 +571,7 @@ afsconf_GetExtendedCellInfo(adir, acellName, aservice, acellInfo, clones)
 }
 
 #ifdef AFS_AFSDB_ENV
+#if !defined(AFS_NT40_ENV)
 afsconf_GetAfsdbInfo(acellName, aservice, acellInfo)
     char *acellName;
     char *aservice;
@@ -563,6 +582,7 @@ afsconf_GetAfsdbInfo(acellName, aservice, acellInfo)
     size_t len;
     unsigned char answer[1024];
     unsigned char *p;
+    char realCellName[256];
     char host[256];
     int server_num = 0;
     int minttl = 0;
@@ -582,7 +602,6 @@ afsconf_GetAfsdbInfo(acellName, aservice, acellInfo)
     code = dn_expand(answer, answer + len, p, host, sizeof(host));
     if (code < 0)
        return AFSCONF_NOTFOUND;
-    strncpy(acellInfo->name, host, sizeof(acellInfo->name));
 
     p += code + QFIXEDSZ;      /* Skip name */
 
@@ -606,6 +625,15 @@ afsconf_GetAfsdbInfo(acellName, aservice, acellInfo)
            short afsdb_type;
 
            afsdb_type = (p[0] << 8) | p[1];
+           if (afsdb_type == 1) {
+               /*
+                * We know this is an AFSDB record for our cell, of the
+                * right AFSDB type.  Write down the true cell name that
+                * the resolver gave us above.
+                */
+               strcpy(realCellName, host);
+           }
+
            code = dn_expand(answer, answer+len, p+2, host, sizeof(host));
            if (code < 0)
                return AFSCONF_NOTFOUND;
@@ -630,6 +658,7 @@ afsconf_GetAfsdbInfo(acellName, aservice, acellInfo)
 
     if (server_num == 0)               /* No AFSDB records */
        return AFSCONF_NOTFOUND;
+    strncpy(acellInfo->name, realCellName, sizeof(acellInfo->name));
     acellInfo->numServers = server_num;
 
     if (aservice) {
@@ -645,6 +674,58 @@ afsconf_GetAfsdbInfo(acellName, aservice, acellInfo)
 
     return 0;
 }
+#else  /* windows */
+int afsconf_GetAfsdbInfo(acellName, aservice, acellInfo)
+  char *aservice;
+  char *acellName;
+  struct afsconf_cell *acellInfo;
+{
+    register afs_int32 i;
+    int tservice;
+    struct afsconf_entry DNSce;
+    char *DNStmpStrp; /* a temp string pointer */
+    struct hostent *thp;
+    afs_int32 cellHosts[AFSMAXCELLHOSTS];
+    int numServers;
+    int rc;
+    int *ttl;
+
+    DNSce.cellInfo.numServers=0;
+    DNSce.next = NULL;
+    rc = getAFSServer(acellName, cellHosts, &numServers, &ttl);
+    /* ignore the ttl here since this code is only called by transitory programs
+       like klog, etc. */
+    if (rc < 0)
+      return -1;
+    if (numServers == 0)
+      return -1;
+
+    for (i = 0; i < numServers; i++)
+    {
+        memcpy(&acellInfo->hostAddr[i].sin_addr.s_addr, &cellHosts[i], sizeof(long));
+        acellInfo->hostAddr[i].sin_family = AF_INET;
+
+        /* sin_port supplied by connection code */
+    }
+
+    acellInfo->numServers = numServers;
+    strcpy(acellInfo->name, acellName);
+    if (aservice) {
+        LOCK_GLOBAL_MUTEX
+        tservice = afsconf_FindService(aservice);
+     UNLOCK_GLOBAL_MUTEX
+        if (tservice < 0) {
+            return AFSCONF_NOTFOUND;  /* service not found */
+     }
+     for(i=0; i< acellInfo->numServers; i++) {
+            acellInfo->hostAddr[i].sin_port = tservice;
+     }
+    }
+    acellInfo->linkedCell = NULL;    /* no linked cell */
+    acellInfo->flags = 0;
+    return 0;
+}
+#endif /* windows */
 #endif /* AFS_AFSDB_ENV */
 
 afsconf_GetCellInfo(adir, acellName, aservice, acellInfo)
index a4ad0bb72d5af72720e08a14085c3cafb61b2962..e208ac8e3df1a3dd7a1bf7cd2d70e1b56ad19cec 100644 (file)
@@ -48,10 +48,20 @@ RCSID("$Header$");
 #include <errno.h>
 #include <sys/ioctl.h>
 #include <netinet/in.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <afs/vice.h>
 #ifdef AFS_AIX_ENV
 #include <sys/lockf.h>
 #endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 #include "auth.h"
 #include <afs/venus.h>
 #include <afs/afsutil.h>
index e5b08b0548d6fcf4d99bc62de9afa0567fbabddc..aafb8fedd69760d008896e3ae3975bc28cc29afe 100644 (file)
@@ -15,9 +15,6 @@ RCSID("$Header$");
 #include <afs/pthread_glock.h>
 #include <afs/afsutil.h>
 #include <sys/types.h>
-#ifdef AFS_SUN5_ENV 
-#include <fcntl.h>
-#endif
 #ifdef AFS_NT40_ENV
 #include <winsock2.h>
 #include <fcntl.h>
@@ -30,6 +27,19 @@ RCSID("$Header$");
 #endif
 #include <stdio.h>
 #include <errno.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
 #include "cellconfig.h"
 #include "keys.h"
 
index b52f5667b4754a9da329f669ce64aa3cb1357bd8..255edb968ad2f0115baac5a9a16e330d33bee1fa 100644 (file)
@@ -34,6 +34,11 @@ RCSID("$Header$");
 #include <afs/fileutil.h>
 #include "bnode.h"
 
+#ifdef AFS_AIX_ENV
+/* All known versions of AIX lack WCOREDUMP but this works */
+#define WCOREDUMP(x) ((x) & 0x80)
+#endif
+
 #define BNODE_LWP_STACKSIZE    (16 * 1024)
 
 int bnode_waiting = 0;
@@ -528,6 +533,12 @@ static int bproc() {
                            RememberProcName(tp);
                            tb->errorSignal = 0;
                        }
+                       if (tp->coreName)
+                           bozo_Log("%s:%s exited with code %d",
+                               tb->name, tp->coreName, tp->lastExit);
+                       else
+                           bozo_Log("%s exited with code %d",
+                               tb->name, tp->lastExit);
                    }
                    else {
                        /* Signal occurred, perhaps spurious due to shutdown request.
@@ -542,6 +553,14 @@ static int bproc() {
                            tb->lastErrorExit = FT_ApproxTime();
                            RememberProcName(tp);
                        }
+                       if (tp->coreName)
+                           bozo_Log("%s:%s exited on signal %d%s",
+                               tb->name, tp->coreName, tp->lastSignal,
+                               WCOREDUMP(status) ? " (core dumped)" : "");
+                       else
+                           bozo_Log("%s exited on signal %d%s",
+                               tb->name, tp->lastSignal,
+                               WCOREDUMP(status) ? " (core dumped)" : "");
                        SaveCore(tb, tp);
                    }
                    tb->lastAnyExit = FT_ApproxTime();
index 12b30692f460f7435446e67eacbba82bc079fc57..d6cc0f50c626546eafdf44a2b0da17809b9a27b8 100644 (file)
@@ -1259,7 +1259,10 @@ char *orphans;
     parms[1] = "now";      /* when to do it */
     code = BOZO_CreateBnode(aconn, "cron", "salvage-tmp", parms[0], parms[1],
                            parms[2], parms[3], parms[4], notifier);
-    if (code) goto done;
+    if (code) {
+       printf("bos: failed to start 'salvager' (%s)\n", em(code));
+       goto done;
+    }
     /* now wait for bnode to disappear */
     while (1) {
        IOMGR_Sleep(5);
@@ -1485,7 +1488,6 @@ struct cmd_syndesc *as; {
        /* now do the salvage operation */
        printf("Starting salvage.\n");
        rc = DoSalvage(tconn, (char *) 0, (char *) 0, outName, showlog,parallel,tmpDir,orphans);
-       if (rc) printf("bos: failed to start 'salvager' (%s)\n", em(rc));
        if (curGoal == BSTAT_NORMAL) {
            printf("bos: restarting fs.\n");
            code = BOZO_SetTStatus(tconn, "fs", BSTAT_NORMAL);
@@ -1526,7 +1528,6 @@ struct cmd_syndesc *as; {
        printf("Starting salvage.\n");
        rc = DoSalvage(tconn, as->parms[1].items->data, (char *) 0,
                       outName, showlog,parallel,tmpDir,orphans);
-       if (rc) printf("bos: failed to start 'salvager' (%s)\n", em(rc));
        if (curGoal == BSTAT_NORMAL) {
            printf("bos: restarting fs.\n");
            code = BOZO_SetTStatus(tconn, "fs", BSTAT_NORMAL);
@@ -1578,10 +1579,8 @@ struct cmd_syndesc *as; {
        printf("Starting salvage.\n");
        rc = DoSalvage(tconn, as->parms[1].items->data, tname, outName,
                       showlog,parallel,tmpDir,orphans);
-       if (rc) {
-          printf("bos: failed to start 'salvager' (%s)\n", em(rc));
+       if (rc) 
           return rc;
-       }
     }
     return 0;
 }
index beefbae3f6583c99a6edaaef83c13069fe2124a1..8e0753b1115a1bef93ba55375bb0c5dbd72e5b59 100644 (file)
@@ -28,3 +28,14 @@ ac_cv_linux_fs_struct_address_space_has_page_lock=no)])
 AC_MSG_RESULT($ac_cv_linux_fs_struct_address_space_has_page_lock)
 CPPFLAGS="$save_CPPFLAGS"])
 
+
+dnl LINUX_BUILD_VNODE_FROM_INODE (configdir, outputdir)
+dnl            defaults: (src/config, src/afs/LINUX)
+
+AC_DEFUN(LINUX_BUILD_VNODE_FROM_INODE, [
+AC_MSG_CHECKING(whether to build osi_vfs.h)
+configdir=ifelse([$1], ,src/config,$1)
+outputdir=ifelse([$2], ,src/afs/LINUX,$2)
+chmod +x $configdir/make_vnode.pl
+$configdir/make_vnode.pl -i $LINUX_KERNEL_PATH -o $outputdir
+])
index ae22e138ee63c0842ce412aacde2f964beea58f9..98ad569998ce52743eca41a1809833ea62af9354 100644 (file)
@@ -72,3 +72,19 @@ ac_cv_linux_fs_struct_inode_has_i_truncate_sem=yes,
 ac_cv_linux_fs_struct_inode_has_i_truncate_sem=no)])
 AC_MSG_RESULT($ac_cv_linux_fs_struct_inode_has_i_truncate_sem)
 CPPFLAGS="$save_CPPFLAGS"])
+
+AC_DEFUN(LINUX_FS_STRUCT_INODE_HAS_I_DEVICES, [
+AC_MSG_CHECKING(for i_devices in struct inode)
+save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="-I${LINUX_KERNEL_PATH}/include -D__KERNEL__ $CPPFLAGS"
+AC_CACHE_VAL(ac_cv_linux_fs_struct_inode_has_i_cdev, 
+[
+AC_TRY_COMPILE(
+[#include <linux/fs.h>],
+[struct inode _inode;
+printf("%d\n", _inode.i_devices);], 
+ac_cv_linux_fs_struct_inode_has_i_devices=yes,
+ac_cv_linux_fs_struct_inode_has_i_devices=no)])
+AC_MSG_RESULT($ac_cv_linux_fs_struct_inode_has_i_devices)
+CPPFLAGS="$save_CPPFLAGS"])
+
index b2915f4b00672d47cf79873e0216898018276b5b..9cbbf641c83b1adc57b90ceea89d88d4ee8ab467 100644 (file)
@@ -370,7 +370,9 @@ int main (argc, argv) int argc; char **argv; {
     fprintf (hfile, "#define ERROR_TABLE_BASE_%s (%ldL)\n",
             lcname, (long int) table_number);
     fprintf (hfile, "#define init_%s_err_tbl initialize_%s_error_table\n",
-            lcname, lcname);
+            lcname, table_name);
+    fprintf (hfile, "#define initialize_%s_error_table initialize_%s_error_table\n",
+            lcname, table_name);
     fprintf (hfile, "#define %s_err_base ERROR_TABLE_BASE_%s\n", lcname,
             lcname);
     fclose(hfile);             /* bye bye include file */
index 7aa3fd84360c0988ef742801e036a49da1a0569c..57fc9707d2864c7b18ff9b1d1f09872638589ef2 100644 (file)
@@ -1,9 +1,15 @@
 AFS_component_version_number.c
 Makefile
-Makefile.i386_linux24
+Makefile.*_*[0123456789]
 Makefile.version
 Makefile.version-NOCML
 afsconfig.h
 afsconfig.h.in
 config
 mkvers
+Makefile.hp_ux102
+Makefile.hp_ux110
+Makefile.i386_linux22
+Makefile.i386_linux24
+Makefile.sun4x_56
+Makefile.sun4x_57
diff --git a/src/config/Makefile.alpha_linux_24.in b/src/config/Makefile.alpha_linux_24.in
new file mode 100644 (file)
index 0000000..83fba93
--- /dev/null
@@ -0,0 +1,45 @@
+# Makefile for Linux 2.2.16 kernel on Alpha with glibc 2.2
+# Keep macros within each section in sorted order for clean diff displays.
+#
+# AFS_OSTYPE used to indicate suffixes and os specific subdirectories.
+AFS_OSTYPE = LINUX
+# Base directory for linux kernel source. Actually a prefix which is complete
+# when LINUX_VERS is appended to it.
+LINUX_SRCDIR = /usr/src/linux-
+# Default list of Linux kernels to build. Build will run only if all
+# can be built. To build a different set, specify LINUX_VERS to make.
+#LINUX_VERS = 2.2.16
+
+#
+# compilation and link editor flags
+DBG=-g
+OPTMZ=-O2
+PAM_CFLAGS = -O2 -Dlinux -DLINUX_PAM -fPIC
+# Put -O2 here to _ensure_ all Makefiles pick it up.
+XCFLAGS= -O2
+MT_CFLAGS=-DAFS_PTHREAD_ENV -pthread -D_REENTRANT ${XCFLAGS}
+XLDFLAGS=
+SHARE_LDFLAGS = -shared -Xlinker -x
+SHLIB_SUFFIX=so
+SHLIB_CFLAGS=
+#
+# libraries
+MTLIBS=-lpthread
+TXLIBS= /usr/lib/libncurses.so
+XLIBS=@LIB_AFSDB@
+#
+# programs
+AR=ar
+AS=as
+CP=cp
+INSTALL=${TOP_SRCDIR}/pinstall/pinstall
+LD=ld   
+MT_CC=cc
+MV=mv
+RANLIB=ranlib
+RM=rm
+#
+# Other OS specific requirements
+#
+YACC = bison -y
+LEX = flex -l
index 7206ea95f554383bda9267935db3fc61413b134b..ddbacc3083f82033ce5b819470d47c6c735dd01e 100644 (file)
@@ -15,7 +15,7 @@ AFS_OSTYPE = DJGPP
 OPTMZ=-O2
 #PAM_CFLAGS = -O2 -Dlinux -DLINUX_PAM -fPIC
 # Put -O2 here to _ensure_ all Makefiles pick it up.
-XCFLAGS= ${DBG} -Dfds_bits=fd_bits
+XCFLAGS= ${DBG} -Dfds_bits=fd_bits -DAFS_AFSDB_ENV -DAFS_FREELANCE_CLIENT
 MT_CFLAGS=${XCFLAGS}
 XLDFLAGS=
 SHARE_LDFLAGS = -shared -Xlinker -x
diff --git a/src/config/Makefile.parisc_linux24.in b/src/config/Makefile.parisc_linux24.in
new file mode 100644 (file)
index 0000000..9635c31
--- /dev/null
@@ -0,0 +1,43 @@
+# AFS_OSTYPE used to indicate suffixes and os specific subdirectories.
+AFS_OSTYPE = LINUX
+
+# Base directory for linux kernel source. Actually a prefix which is complete
+# when LINUX_VERS is appended to it.
+LINUX_SRCDIR = /usr/src/linux-
+# Default list of Linux kernels to build. Build will run only if all
+# can be built. To build a different set, specify LINUX_VERS to make.
+LINUX_VERS = @LINUX_VERSION@
+
+#
+# compilation and link editor flags
+DBG=-g
+OPTMZ=-O2
+PAM_CFLAGS = -O2 -Dlinux -DLINUX_PAM -fPIC
+# Put -O2 here to _ensure_ all Makefiles pick it up.
+XCFLAGS= -O2
+MT_CFLAGS=-DAFS_PTHREAD_ENV -pthread -D_REENTRANT ${XCFLAGS}
+XLDFLAGS=
+SHARE_LDFLAGS = -shared -Xlinker -x
+SHLIB_SUFFIX=so
+SHLIB_CFLAGS=
+#
+# libraries
+MTLIBS=-lpthread
+TXLIBS= /usr/lib/libncurses.so
+XLIBS= @LIB_AFSDB@
+#
+# programs
+AR=ar
+AS=as
+CP=cp
+LD=ld
+MT_CC=cc
+MV=mv
+RANLIB=ranlib
+RM=rm
+INSTALL=${TOP_SRCDIR}/pinstall/pinstall
+#
+# Other OS specific requirements
+#
+YACC = bison -y
+LEX = flex -l
index 797477171129270a88630a8fbf0885fcba129c7d..7ad11f211b8a6b139046307c729a6a7bc27b45cf 100644 (file)
@@ -35,7 +35,3 @@ MV=mv
 RANLIB=ranlib
 RM=rm
 INSTALL=${TOP_SRCDIR}/pinstall/pinstall
-#
-# This is the XBSA make flag and pathname to XBSA header files (xbsa.h)
-XBSA_FLAGS=-Dxbsa
-XBSADIR=/usr/tivoli/tsm/client/api/bin/xopen
index add17886574361e2503e2c3167fec2cac0b35b54..8055c01a46ca35807e171236f20c0986392c59d1 100644 (file)
@@ -49,7 +49,3 @@ INSTALL=${TOP_SRCDIR}/pinstall/pinstall
 FS_CONV_SOL26         = fs_conv_sol26
 install_FS_CONV_SOL26 = $(DESTDIR)${afssrvsbindir}/fs_conv_sol26
 dest_FS_CONV_SOL26    = $(DEST)/root.server/usr/afs/bin/fs_conv_sol26
-#
-# This is the XBSA make flag and pathname to XBSA header files (xbsa.h)
-XBSA_FLAGS=-Dxbsa
-XBSADIR=/opt/tivoli/tsm/client/api/bin/xopen
index 3f5e0c07b50d1271fbd4656f9d7349d5fe32d882..5b8a3ea4218dd4ece8fb9ac9f78a9543e1a4b64d 100644 (file)
@@ -53,7 +53,3 @@ INSTALL=${TOP_SRCDIR}/pinstall/pinstall
 FS_CONV_SOL26         = fs_conv_sol26
 install_FS_CONV_SOL26 = $(DESTDIR)${afssrvsbindir}/fs_conv_sol26
 dest_FS_CONV_SOL26    = $(DEST)/root.server/usr/afs/bin/fs_conv_sol26
-#
-# This is the XBSA make flag and pathname to XBSA header files (xbsa.h)
-XBSA_FLAGS=-Dxbsa
-XBSADIR=/opt/tivoli/tsm/client/api/bin/xopen
index 945a14282e9ad6cddb56a5787dd07290e71dc0b5..e1fb1301ac2b3917a7a306bfcaff8a3509edb25e 100644 (file)
@@ -46,7 +46,3 @@ INSTALL=${TOP_SRCDIR}/pinstall/pinstall
 FS_CONV_SOL26         = fs_conv_sol26
 install_FS_CONV_SOL26 = $(DESTDIR)${afssrvsbindir}/fs_conv_sol26
 dest_FS_CONV_SOL26    = $(DEST)/root.server/usr/afs/bin/fs_conv_sol26
-#
-# This is the XBSA make flag and pathname to XBSA header files (xbsa.h)
-XBSA_FLAGS=-Dxbsa
-XBSADIR=/opt/tivoli/tsm/client/api/bin/xopen
diff --git a/src/config/Makefile.sun4x_59.in b/src/config/Makefile.sun4x_59.in
new file mode 100644 (file)
index 0000000..e1fb130
--- /dev/null
@@ -0,0 +1,48 @@
+# Keep macros within each section in sorted order for clean diff displays.
+#
+# AFS_OSTYPE used to indicate suffixes and os specific subdirectories.
+AFS_OSTYPE = SOLARIS
+#
+# compilation and link editor flags
+XCFLAGS=-dy -Bdynamic
+MT_CFLAGS=-mt -DAFS_PTHREAD_ENV ${XCFLAGS}
+PAM_CFLAGS = -KPIC
+PAMLIBS= -lc -lpam -lsocket -lnsl -lm
+SHARE_LDFLAGS = -G -Bsymbolic
+LWP_OPTMZ=-g
+OPTMZ=-O
+DBG=-g
+
+## Compilation flags for 64 bit Solaris
+XCFLAGS64 = ${XCFLAGS} -xarch=v9
+
+#
+# libraries
+XLIBS=@LIB_AFSDB@ -lsocket -lnsl -lintl -ldl 
+TXLIBS=-lcurses
+MTLIBS=-lpthread -lsocket
+XLIBELFA=-lelf
+XLIBKVM=-lkvm
+#
+SHLIB_SUFFIX=so
+SHLIB_CFLAGS=-KPIC
+#
+# programs
+AR=/usr/ccs/bin/ar
+AS=as
+CC=/opt/SUNWspro/bin/cc
+MT_CC=/opt/SUNWspro/bin/cc
+CP=/bin/cp
+LEX=lex
+LD= /usr/ccs/bin/ld
+LORDER = /usr/ccs/bin/lorder
+MV=mv
+RANLIB=/bin/true
+RM=rm
+STRIP= /usr/ccs/bin/strip
+INSTALL=${TOP_SRCDIR}/pinstall/pinstall
+#
+# this is for the vol package
+FS_CONV_SOL26         = fs_conv_sol26
+install_FS_CONV_SOL26 = $(DESTDIR)${afssrvsbindir}/fs_conv_sol26
+dest_FS_CONV_SOL26    = $(DEST)/root.server/usr/afs/bin/fs_conv_sol26
index 83cce8977154cdf0734d0dd95f1d75426ba2d168..2d48de1d5eed9e6d6c5822fe0eeeffa1373fb625 100644 (file)
@@ -152,7 +152,9 @@ afscdefs =\
        -I$(DESTDIR)\include\rx \
        -DWIN32_LEAN_AND_MEAN \
        -DSTRICT \
-       -D_WIN32_IE=0x0400
+       -D_WIN32_IE=0x0400 \
+     -DAFS_AFSDB_ENV \
+     -DAFS_FREELANCE_CLIENT
 
 afscdefs = $(afscdefs) $(AFSDEV_AUXCDEFINES)
 
index 2c314157afe57958be1ed5071176ab64e1758276..176015c36d8a31703dacabefe3275e0277a04255 100644 (file)
@@ -164,7 +164,9 @@ afscdefs =\
        -I$(DESTDIR)\include\rx \
        -DWIN32_LEAN_AND_MEAN \
        -DSTRICT \
-       -D_WIN32_IE=0x0400
+       -D_WIN32_IE=0x0400 \
+     -DAFS_AFSDB_ENV \
+     -DAFS_FREELANCE_CLIENT
 
 !      IF ((EXIST($(MSSDK)\include)) && (("$(SYS_NAME)"=="i386_win95" ) || ("$(SYS_NAME)"=="I386_WIN95" )))
 afscdefs=$(afscdefs) -I$(MSSDK)\include $(afscppdefs) \
index 51427adee7698c78447a3cf65339b60f563c0109..93a50a9079be14d3b1a0b2d09c6937e5c77dc8d7 100644 (file)
@@ -39,6 +39,7 @@
 
 #define        AFSOP_ADDCELL2           29     /* 2nd add cell protocol interface */
 #define        AFSOP_AFSDB_HANDLER      30     /* userspace AFSDB lookup handler */
+#define        AFSOP_SET_DYNROOT        31     /* enable/disable dynroot support */
 
 /* The range 20-30 is reserved for AFS system offsets in the afs_syscall */
 #define        AFSCALL_PIOCTL          20
 /* #define AFSOP_STOP_RXEVENT   214     defined in osi.h             */
 /* #define AFSOP_STOP_COMPLETE     215  defined in osi.h             */
 /* #define AFSOP_STOP_RXK_LISTENER   217     defined in osi.h        */
+#define AFSOP_STOP_AFSDB       218     /* Stop AFSDB handler */
 
 /* Main afs syscall entry; this number may vary per system (i.e. defined in afs/param.h) */
 #ifndef        AFS_SYSCALL
index 0323ea6ed7a490c530d9a7c8fb3177fc59dbc79f..8fdc667fbec06a97c922b4285c69d1d5ff103e23 100644 (file)
@@ -80,6 +80,7 @@
 #define SYS_NAME_ID_sunx86_55                   937
 #define SYS_NAME_ID_sun4x_57            938
 #define SYS_NAME_ID_sun4x_58            939
+#define SYS_NAME_ID_sun4x_59            940
 
 /* Sigh. If I leave a gap here IBM will do this sequentially. If I don't
    they won't allocate sunx86 IDs at all. So leave a gap and pray. */
 #define SYS_NAME_ID_ia64_linux22       2201
 #define SYS_NAME_ID_ia64_linux24       2202
 
+#define SYS_NAME_ID_m68k_linux22        2301
+#define SYS_NAME_ID_m68k_linux24        2302
+
+#define SYS_NAME_ID_parisc_linux22      2401
+#define SYS_NAME_ID_parisc_linux24      2402
+
 /*
  * Placeholder to keep system-wide standard flags since this file is included by all 
  * files (i.e in afs/param.h)
index 9237e564356f0f5c0aa47c8ba0f9df60f1a9f8a1..6168147e690f4cdd2acf159887f2158e654084f2 100644 (file)
@@ -194,7 +194,7 @@ static /**/const char *const rcsid[] = { (char *)rcsid, "\100(#)" msg }
 #undef HAVE_RES_SEARCH
 //#undef HAVE_SOCKET
 
-#if ENDIANESS_IN_SYS_PARAM_H
+#ifdef ENDIANESS_IN_SYS_PARAM_H
 # ifndef KERNEL
 #  include <sys/types.h>
 #  include <sys/param.h>
@@ -204,7 +204,8 @@ static /**/const char *const rcsid[] = { (char *)rcsid, "\100(#)" msg }
 # endif
 #endif
 
-#undef AFS_AFSDB_ENV
+/*#undef AFS_AFSDB_ENV*/
+#define AFS_AFSDB_ENV 1
 #undef AFS_NAMEI_ENV
 #undef BOS_RESTRICTED_MODE
 
diff --git a/src/config/make_vnode.pl b/src/config/make_vnode.pl
new file mode 100644 (file)
index 0000000..c020861
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/perl
+#
+# Make VNODE structure from INODE structure
+#
+# Created By:  Derek Atkins <warlord@MIT.EDU>
+#
+
+$linux_header_dir="/usr/src/linux";
+$outdir="./src/afs/LINUX";
+
+$sepline="/* LINUX VNODE INCLUDED BELOW -- DO NOT MODIFY */\n";
+
+# makeVfs (fs.h, vfs.hin, vfs.out)
+sub makeVfs {
+    my ($in,$base,$out) = @_;
+    my ($seplinefound);
+
+    open (IN, "$in") || die "Cannot open $in for reading";
+    open (BASE, "$base" ) || die "Cannot open base file $base";
+    open (OUT, ">$out") || die "Cannot open tempfile $out";
+
+    while (<BASE>) {
+       print OUT;
+       if ($_ eq $sepline) {
+           $seplinefound = 1;
+           last;
+       }
+    }
+
+    print OUT $sepline if !$seplinefound;
+
+    my ($state) = 0;
+    while (<IN>) {
+
+       # Look for 'struct inode' definition
+       if ($state == 0) {
+           next unless m/^struct\s+inode\s*\{/;
+           $state++;
+           s/inode/vnode/;
+           # Fallthrough
+       }
+
+       # Look for 'union {' -- print otherwise
+       if ($state == 1) {
+           if (m/^\s*union\s*\{/) {
+               $state++;
+               print OUT "#ifdef notdef\n";
+           }
+           print OUT;
+           next;
+       }
+
+       # Look for the end of the union -- ignore otherwise
+       if ($state == 2) {
+           print OUT;
+           next unless (m/^\s+\}\s*u;/);
+           $state++;
+           print OUT "#endif /* notdef */\n";
+           next;
+       }
+
+       # Look for end brace -- print until we find it
+       if ($state == 3) {
+           print OUT;
+           if (m/^\s*\};/) { $state++ }
+       }
+    }
+
+    while (<BASE>) { print OUT; }
+
+    close (IN);
+    close (BASE);
+    close (OUT);
+}
+
+sub usage {
+    print "usage: $0 [-i linux_header_dir] [-o output_dir] [-h]\n";
+    exit 1;
+}
+
+sub testArg {
+    my ($arg) = @_;
+    return $arg if ($arg && $arg ne "");
+    usage;
+}
+
+while ($_ = shift @ARGV) {
+    if (m/^-i/) { $linux_header_dir = testArg(shift @ARGV); next; }
+    if (m/^-o/) { $outdir = testArg(shift @ARGV); next; }
+    usage;
+}
+
+$linux_fs_h="$linux_header_dir/include/linux/fs.h";
+$vfs_h="$outdir/osi_vfs.h";
+$vfs_hin="$outdir/osi_vfs.hin";
+
+makeVfs ($linux_fs_h, $vfs_hin, "$vfs_h.new");
+
+system ("cmp", "-s", $vfs_h, "$vfs_h.new");
+$exit_value = $? >> 8;
+$signal_num = $? & 127;
+$core_dump  = $? & 128;
+
+if ($exit_value == 0 || $signal_num > 0) {
+    unlink "$vfs_h.new";
+    print "nothing to do... $vfs_h not changed.\n"
+} else {
+    unlink "$vfs_h";
+    rename ("$vfs_h.new", $vfs_h);
+    print "wrote $vfs_h\n";
+}
+
+exit 0;
index 0eb60b0434b9ea1c805c90b557885a01f2e6c8b6..f6cac44b91efa77431918679ec166d51012372dd 100644 (file)
@@ -85,18 +85,16 @@ void Usage(void)
 
 main(int argc, char **argv)
 {
-    int n = 0;
     char stampsFile[1024];
     char stateFile[1024];
     char s[1024];
-    char *p;
     int i;
     char *baseDir;
     int argDir = 0;
     char *outputFile = NULL;
     char outputFileBuf[sizeof(VERS_FILE) + 2];
     struct stat sbuf;
-    time_t versTime, stampsTime, stateTime;
+    time_t versTime;
     int reBuild = 0;
     int code;
     char *cml_prefix = NULL;
diff --git a/src/config/param.alpha_linux_24.h b/src/config/param.alpha_linux_24.h
new file mode 100644 (file)
index 0000000..ebb4e2e
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _PARAM_ALPHA_LINUX_24_H_
+#define _PARAM_ALPHA_LINUX_24_H_
+
+/* Linux 2.2.16 kernel on Alpha with glibc 2.2 */
+/* In user space the AFS_LINUX20_ENV should be sufficient. In the kernel,
+ * it's a judgment call. If something is obviously sparc64 specific, use that
+ * #define instead. Note that "20" refers to the linux 2.0 kernel. The "2"
+ * in the sysname is the current version of the client. This takes into
+ * account the perferred OS user space configuration as well as the kernel.
+ */
+
+#define AFS_LINUX20_ENV        1
+#define AFS_LINUX22_ENV        1
+#define AFS_LINUX24_ENV     1
+#define AFS_ALPHA_LINUX20_ENV  1
+#define AFS_ALPHA_LINUX22_ENV  1
+#define AFS_ALPHA_LINUX24_ENV  1
+#define __alpha        1
+#define AFS_LINUX_64BIT_KERNEL 1
+#define AFS_NONFSTRANS 1
+
+#define AFS_MOUNT_AFS "afs"    /* The name of the filesystem type. */
+#define AFS_SYSCALL 338
+#define AFS_64BIT_IOPS_ENV  1
+#define AFS_NAMEI_ENV     1   /* User space interface to file system */
+
+#define AFS_64BIT_ENV          1       /* Defines afs_int32 as int, not long. */
+#define AFS_64BITPOINTER_ENV   1       /* pointers are 64 bits. */
+
+#if defined(__KERNEL__) && !defined(KDUMP_KERNEL)
+#include <linux/config.h>
+#ifdef CONFIG_SMP
+#undef CONFIG_SMP
+#endif
+/* Using "AFS_SMP" to map to however many #define's are required to get
+ * MP to compile for Linux
+ */
+#ifdef AFS_SMP
+#define CONFIG_SMP
+#ifndef __SMP__
+#define __SMP__
+#endif
+#define AFS_GLOBAL_SUNLOCK
+#endif
+#if defined(MODULE) && defined(CONFIG_MODVERSIONS)
+#define MODVERSIONS
+#include <linux/modversions.h>
+#endif
+#endif /* __KERNEL__  && !DUMP_KERNEL*/
+
+#include <afs/afs_sysnames.h>
+
+#define AFS_USERSPACE_IP_ADDR 1
+#define RXK_LISTENER_ENV 1
+#define AFS_GCPAGS             0       /* if nonzero, garbage collect PAGs */
+
+/* Machine / Operating system information */
+#define SYS_NAME       "alpha_linux_24"
+#define SYS_NAME_ID    SYS_NAME_ID_alpha_linux_24
+#define AFSLITTLE_ENDIAN    1
+#define AFS_HAVE_FFS        1       /* Use system's ffs. */
+#define AFS_HAVE_STATVFS    0  /* System doesn't support statvfs */
+#define AFS_VM_RDWR_ENV            1   /* read/write implemented via VM */
+
+#ifdef KERNEL
+#ifndef MIN
+#define MIN(A,B) ((A) < (B) ? (A) : (B))
+#endif
+#ifndef MAX
+#define MAX(A,B) ((A) > (B) ? (A) : (B))
+#endif
+#endif /* KERNEL */
+
+#endif /* _PARAM_ALPHA_LINUX_24_H_ */
diff --git a/src/config/param.alpha_linux_24_usr.h b/src/config/param.alpha_linux_24_usr.h
new file mode 100644 (file)
index 0000000..3795484
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef _PARAM_ALPHA_LINUX_24_USR_H_
+#define _PARAM_ALPHA_LINUX_24_USR_H_
+
+/* In user space the AFS_LINUX20_ENV should be sufficient. In the kernel,
+ * it's a judgment call. If something is obviously sparc64 specific, use that
+ * #define instead. Note that "20" refers to the linux 2.0 kernel. The "2"
+ * in the sysname is the current version of the client. This takes into
+ * account the perferred OS user space configuration as well as the kernel.
+ */
+
+#define UKERNEL                        1       /* user space kernel */
+#define AFS_ENV                        1
+#define AFS_USR_LINUX20_ENV    1
+#define AFS_USR_LINUX22_ENV    1
+#define AFS_USR_LINUX24_ENV    1
+#define AFS_NONFSTRANS 1
+
+#define AFS_MOUNT_AFS "afs"    /* The name of the filesystem type. */
+#define AFS_SYSCALL 338
+#define AFS_64BIT_IOPS_ENV  1
+#define AFS_64BIT_ENV       1
+#define AFS_NAMEI_ENV     1   /* User space interface to file system */
+#include <afs/afs_sysnames.h>
+
+#define AFS_USERSPACE_IP_ADDR 1
+#define RXK_LISTENER_ENV 1
+#define AFS_GCPAGS             0       /* if nonzero, garbage collect PAGs */
+
+
+/* Machine / Operating system information */
+#define SYS_NAME       "alpha_linux_24"
+#define SYS_NAME_ID    SYS_NAME_ID_alpha_linux_24
+#define AFSLITTLE_ENDIAN    1
+#define AFS_HAVE_FFS        1       /* Use system's ffs. */
+#define AFS_HAVE_STATVFS    0  /* System doesn't support statvfs */
+#define AFS_VM_RDWR_ENV            1   /* read/write implemented via VM */
+
+#define        afsio_iov       uio_iov
+#define        afsio_iovcnt    uio_iovcnt
+#define        afsio_offset    uio_offset
+#define        afsio_seg       uio_segflg
+#define        afsio_fmode     uio_fmode
+#define        afsio_resid     uio_resid
+#define        AFS_UIOSYS      1
+#define        AFS_UIOUSER     UIO_USERSPACE
+#define        AFS_CLBYTES     MCLBYTES
+#define        AFS_MINCHANGE   2
+#define        VATTR_NULL      usr_vattr_null
+
+#define AFS_DIRENT
+#ifndef CMSERVERPREF
+#define CMSERVERPREF
+#endif
+
+#endif /* _PARAM_ALPHA_LINUX_24_USR_H_ */
index 405bfb300e942623107dfa3ef860965168447eb3..e8e04c63741ad9684460ca1bb45266e80fe0172c 100644 (file)
@@ -81,8 +81,8 @@
 #define vfs_fsid       mnt_stat.f_fsid
 #define va_nodeid      va_fileid
 #define vfs_vnodecovered mnt_vnodecovered
-#define direct         dirent
 #define vnode_t                struct vnode
+#define setgroups      sys_setgroups
 
 #ifndef MUTEX_DEFAULT
 #define MUTEX_DEFAULT   0
diff --git a/src/config/param.parisc_linux24.h b/src/config/param.parisc_linux24.h
new file mode 100644 (file)
index 0000000..af619cc
--- /dev/null
@@ -0,0 +1,68 @@
+#ifndef AFS_PARAM_H
+#define AFS_PARAM_H
+
+/* In user space the AFS_LINUX20_ENV should be sufficient. In the kernel,
+ * it's a judgment call. If something is obviously ppc specific, use that
+ * #define instead. Note that "20" refers to the linux 2.0 kernel. The "2"
+ * in the sysname is the current version of the client. This takes into
+ * account the perferred OS user space configuration as well as the kernel.
+ */
+
+#define AFS_LINUX20_ENV        1
+#define AFS_LINUX22_ENV        1
+#define AFS_LINUX24_ENV        1
+#define AFS_PARISC_LINUX24_ENV    1
+#define AFS_NONFSTRANS 1
+
+#define AFS_MOUNT_AFS "afs"    /* The name of the filesystem type. */
+#define AFS_SYSCALL 137
+#define AFS_64BIT_IOPS_ENV  1
+#define AFS_NAMEI_ENV     1   /* User space interface to file system */
+
+#if defined(__KERNEL__) && !defined(KDUMP_KERNEL)
+#include <linux/config.h>
+#ifdef CONFIG_SMP
+#undef CONFIG_SMP
+#endif
+/* Using "AFS_SMP" to map to however many #define's are required to get
+ * MP to compile for Linux
+ */
+#ifdef AFS_SMP
+#define CONFIG_SMP
+#ifndef __SMP__
+#define __SMP__
+#endif
+#define AFS_GLOBAL_SUNLOCK
+#endif
+
+#if defined(MODULE) && defined(CONFIG_MODVERSIONS)
+#define MODVERSIONS
+#include <linux/modversions.h>
+#endif
+#endif /* __KERNEL__  && !DUMP_KERNEL*/
+
+#include <afs/afs_sysnames.h>
+
+#define AFS_USERSPACE_IP_ADDR 1
+#define RXK_LISTENER_ENV 1
+#define AFS_GCPAGS             0       /* if nonzero, garbage collect PAGs */
+
+
+/* Machine / Operating system information */
+#define SYS_NAME       "parisc_linux24"
+#define SYS_NAME_ID    SYS_NAME_ID_parisc_linux24
+#define AFSBIG_ENDIAN    1
+#define AFS_HAVE_FFS        1       /* Use system's ffs. */
+#define AFS_HAVE_STATVFS    0  /* System doesn't support statvfs */
+#define AFS_VM_RDWR_ENV            1   /* read/write implemented via VM */
+
+#ifdef KERNEL
+#ifndef MIN
+#define MIN(A,B) ((A) < (B) ? (A) : (B))
+#endif
+#ifndef MAX
+#define MAX(A,B) ((A) > (B) ? (A) : (B))
+#endif
+#endif /* KERNEL */
+
+#endif /* AFS_PARAM_H */
diff --git a/src/config/param.parisc_linux24_usr.h b/src/config/param.parisc_linux24_usr.h
new file mode 100644 (file)
index 0000000..56b37eb
--- /dev/null
@@ -0,0 +1,54 @@
+#ifndef AFS_PARAM_H
+#define AFS_PARAM_H
+
+/* In user space the AFS_LINUX20_ENV should be sufficient. In the kernel,
+ * it's a judgment call. If something is obviously ppc specific, use that
+ * #define instead. Note that "20" refers to the linux 2.0 kernel. The "2"
+ * in the sysname is the current version of the client. This takes into
+ * account the perferred OS user space configuration as well as the kernel.
+ */
+
+#define UKERNEL                        1       /* user space kernel */
+#define AFS_ENV                        1
+#define AFS_USR_LINUX20_ENV    1
+#define AFS_USR_LINUX22_ENV    1
+#define AFS_USR_LINUX24_ENV    1
+#define AFS_NONFSTRANS 1
+
+#define AFS_MOUNT_AFS "afs"    /* The name of the filesystem type. */
+#define AFS_SYSCALL 137
+#define AFS_64BIT_IOPS_ENV  1
+#define AFS_NAMEI_ENV     1   /* User space interface to file system */
+#include <afs/afs_sysnames.h>
+
+#define AFS_USERSPACE_IP_ADDR 1
+#define RXK_LISTENER_ENV 1
+#define AFS_GCPAGS             0       /* if nonzero, garbage collect PAGs */
+
+
+/* Machine / Operating system information */
+#define SYS_NAME       "parisc_linux24"
+#define SYS_NAME_ID    SYS_NAME_ID_parisc_linux24
+#define AFSBIG_ENDIAN       1
+#define AFS_HAVE_FFS        1       /* Use system's ffs. */
+#define AFS_HAVE_STATVFS    0  /* System doesn't support statvfs */
+#define AFS_VM_RDWR_ENV            1   /* read/write implemented via VM */
+
+#define        afsio_iov       uio_iov
+#define        afsio_iovcnt    uio_iovcnt
+#define        afsio_offset    uio_offset
+#define        afsio_seg       uio_segflg
+#define        afsio_fmode     uio_fmode
+#define        afsio_resid     uio_resid
+#define        AFS_UIOSYS      1
+#define        AFS_UIOUSER     UIO_USERSPACE
+#define        AFS_CLBYTES     MCLBYTES
+#define        AFS_MINCHANGE   2
+#define        VATTR_NULL      usr_vattr_null
+
+#define AFS_DIRENT
+#ifndef CMSERVERPREF
+#define CMSERVERPREF
+#endif
+
+#endif /* AFS_PARAM_H */
index 88749e23c590d046d1f4715262cee2a4a74ee991..30557129a01bb9069eebc821c2972675cab2fbaa 100644 (file)
 #define        DEBUG           1
 
 #define AFS_SGI_DUAL_FS_CACHE 1 /* implies supports EFS or XFS cache */
+
+#define memset(A, B, S) bzero(A, S)
+#define memcpy(B, A, S) bcopy(A, B, S)
+#define memcmp(A, B, S) bcmp(A, B, S)
+
 #endif /* KERNEL */
 
 #ifndef CMSERVERPREF
index 1163011ec458302d7e2cfa32f471b2f42dc0e5ad..0cecc287c4932043e236b604b58cf3325f122fee 100644 (file)
 #define AFS_EVENT_LOCK  1 /* osi_Sleep/osi_Wakeup use spinlock. */
 #define AFS_SGI_DUAL_FS_CACHE 1 /* implies supports EFS or XFS cache */
 
+#define memset(A, B, S) bzero(A, S)
+#define memcpy(B, A, S) bcopy(A, B, S)
+#define memcmp(A, B, S) bcmp(A, B, S)
+
 #endif /* KERNEL */
 
 #ifndef CMSERVERPREF
index 2650bfa6fbb4c84ca102f8bed664dc7929f1d8ca..9e2b2d8aaf13af6d514aa86633a612f999cd4155 100644 (file)
 #define AFS_EVENT_LOCK  1 /* osi_Sleep/osi_Wakeup use spinlock. */
 #define AFS_SGI_DUAL_FS_CACHE 1 /* implies supports EFS or XFS cache */
 
+#define memset(A, B, S) bzero(A, S)
+#define memcpy(B, A, S) bcopy(A, B, S)
+#define memcmp(A, B, S) bcmp(A, B, S)
+
 #endif /* KERNEL */
 
 #ifndef CMSERVERPREF
index de7e674184d5fad1e54decae3ed5d7a639e42699..63afdd23e440f3eb5d95876c5f4249c09b7de7ab 100644 (file)
 #define AFS_EVENT_LOCK  1 /* osi_Sleep/osi_Wakeup use spinlock. */
 #define AFS_SGI_DUAL_FS_CACHE 1 /* implies supports EFS or XFS cache */
 
+#define memset(A, B, S) bzero(A, S)
+#define memcpy(B, A, S) bcopy(A, B, S)
+#define memcmp(A, B, S) bcmp(A, B, S)
+
 #endif /* KERNEL */
 
 #ifndef CMSERVERPREF
diff --git a/src/config/param.sun4x_59.h b/src/config/param.sun4x_59.h
new file mode 100644 (file)
index 0000000..60a07e5
--- /dev/null
@@ -0,0 +1,113 @@
+#ifndef        AFS_PARAM_H
+#define        AFS_PARAM_H
+
+#define AFS_VFS_ENV    1
+/* Used only in vfsck code; is it needed any more???? */
+
+#define AFS_VFSINCL_ENV        1       /* NOBODY uses this.... */
+#define AFS_GREEDY43_ENV       1       /* Used only in rx/rx_user.c */
+#define AFS_ENV                        1
+#define AFS_SUN_ENV            1
+#define AFS_SUN5_ENV           1
+#define        AFS_SUN52_ENV           1
+#define        AFS_SUN53_ENV           1
+#define        AFS_SUN54_ENV           1
+#define        AFS_SUN55_ENV           1
+#define        AFS_SUN56_ENV           1
+#define AFS_SUN57_ENV          1
+#define AFS_SUN58_ENV          1
+#define AFS_SUN59_ENV          1
+
+#define AFS_64BIT_ENV          1       /* Defines afs_int32 as int, not long. */
+
+#ifdef AFS_NAMEI_ENV
+#define AFS_64BIT_IOPS_ENV     1       /* needed for NAMEI... */
+#else /* AFS_NAMEI_ENV */
+#define AFS_3DISPARES           1       /* Utilize the 3 available disk inode 'spares' */
+#endif /* AFS_NAMEI_ENV */
+
+#include <afs/afs_sysnames.h>
+
+#define AFS_GLOBAL_SUNLOCK     1       /* For global locking */
+#define RXK_LISTENER_ENV   1
+#define AFS_GCPAGS             1       /* if nonzero, garbage collect PAGs */
+
+#define        AFS_SYSCALL             65
+
+/* File system entry (used if mount.h doesn't define MOUNT_AFS */
+#define AFS_MOUNT_AFS   "afs"
+
+/* Machine / Operating system information */
+#define sys_sun4x_59   1
+#define SYS_NAME       "sun4x_59"
+#define SYS_NAME_ID    SYS_NAME_ID_sun4x_59
+#define AFSBIG_ENDIAN  1
+#define AFS_HAVE_FFS    1       /* Use system's ffs. */
+#define AFS_HAVE_VXFS  1       /* Support cache on Veritas vxfs file system */
+#define AFS_HAVE_STATVFS 1     /* System supports statvfs */
+#define AFS_VM_RDWR_ENV        1       /* read/write implemented via VM */
+#define AFS_USE_GETTIMEOFDAY 1  /* use gettimeofday to implement rx clock */
+
+#define NEARINODE_HINT  1   /* hint to ufs module to scatter inodes on disk*/
+#define nearInodeHash(volid, hval) {                                 \
+                unsigned char*  ts = (unsigned char*)&(volid)+sizeof(volid)-1;\
+                for ( (hval)=0; ts >= (unsigned char*)&(volid); ts--){\
+                    (hval) *= 173;                      \
+                    (hval) += *ts;                      \
+                }                                       \
+                }
+
+/* Extra kernel definitions (from kdefs file) */
+#ifdef KERNEL
+/* sun definitions here */
+#define        AFS_UIOFMODE            1       /* Only in afs/afs_vnodeops.c (afs_ustrategy) */
+#define        AFS_SYSVLOCK            1       /* sys v locking supported */
+/*#define      AFS_USEBUFFERS  1*/
+#define        afsio_iov               uio_iov
+#define        afsio_iovcnt    uio_iovcnt
+#define        afsio_offset    uio_offset
+#define        afsio_seg               uio_segflg
+#define        afsio_fmode     uio_fmode
+#define        afsio_resid     uio_resid
+#define        AFS_UIOSYS      UIO_SYSSPACE
+#define        AFS_UIOUSER     UIO_USERSPACE
+#define        AFS_CLBYTES     MCLBYTES
+#define        AFS_MINCHANGE   2
+#define        osi_GetTime(x)  uniqtime(x)
+
+/**
+  * These defines are for the 64 bit Solaris 7 port
+  * AFS_SYSCALL32 is used to protect the ILP32 syscall interface
+  * AFS_64BIT_ENV is for use of 64 bit inode numbers
+  */
+#if defined(__sparcv9)
+#define        AFS_SUN57_64BIT_ENV     1
+#define AFS_64BIT_INO          1
+#endif
+
+/**
+  * Solaris 7 64 bit has two versions of uniqtime. Since we consistently
+  * use 32 bit quantities for time in afs, we now use uniqtime32
+  */
+#if defined(AFS_SUN57_64BIT_ENV)
+#undef osi_GetTime
+#define osi_GetTime(x)  uniqtime32(x)
+#endif
+
+
+
+#define        AFS_KALLOC(n)   kmem_alloc(n, KM_SLEEP)
+#define AFS_KALLOC_NOSLEEP(n)   kmem_alloc(n, KM_NOSLEEP)
+#define        AFS_KFREE       kmem_free
+#define        VATTR_NULL      vattr_null
+#define memset(A, B, S) bzero(A, S)
+#define memcpy(B, A, S) bcopy(A, B, S)
+#define memcmp(A, B, S) bcmp(A, B, S)
+#endif /* KERNEL */
+#define        AFS_DIRENT      
+#ifndef CMSERVERPREF
+#define CMSERVERPREF
+#endif
+#define        ROOTINO         UFSROOTINO
+
+#endif /* AFS_PARAM_H */
diff --git a/src/config/param.sun4x_59_usr.h b/src/config/param.sun4x_59_usr.h
new file mode 100644 (file)
index 0000000..3ce9e7d
--- /dev/null
@@ -0,0 +1,62 @@
+#ifndef        AFS_PARAM_H
+#define        AFS_PARAM_H
+
+#define AFS_VFS_ENV    1
+/* Used only in vfsck code; is it needed any more???? */
+#define RXK_LISTENER_ENV       1
+#define AFS_USERSPACE_IP_ADDR  1
+#define AFS_GCPAGS             0       /* if nonzero, garbage collect PAGs */
+
+#define UKERNEL                        1       /* user space kernel */
+#define AFS_GREEDY43_ENV       1       /* Used only in rx/rx_user.c */
+#define AFS_ENV                        1
+#define AFS_USR_SUN5_ENV       1
+#define AFS_USR_SUN6_ENV       1
+#define AFS_USR_SUN7_ENV       1
+#define AFS_USR_SUN8_ENV       1
+#define AFS_USR_SUN9_ENV       1
+
+#define AFS_64BIT_ENV          1
+
+#include <afs/afs_sysnames.h>
+
+/*#define AFS_GLOBAL_SUNLOCK   1       /* For global locking */
+
+#define        AFS_3DISPARES           1       /* Utilize the 3 available disk inode 'spares' */
+#define        AFS_SYSCALL             65
+
+/* File system entry (used if mount.h doesn't define MOUNT_AFS */
+#define AFS_MOUNT_AFS   1
+
+/* Machine / Operating system information */
+#define sys_sun4x_59   1
+#define SYS_NAME       "sun4x_59"
+#define SYS_NAME_ID    SYS_NAME_ID_sun4x_59
+#define AFSBIG_ENDIAN  1
+#define AFS_HAVE_FFS            1       /* Use system's ffs. */
+#define AFS_HAVE_STATVFS      0       /* System doesn't support statvfs */
+
+/* Extra kernel definitions (from kdefs file) */
+#ifdef KERNEL
+#define        AFS_UIOFMODE            1       /* Only in afs/afs_vnodeops.c (afs_ustrategy) */
+#define        AFS_SYSVLOCK            1       /* sys v locking supported */
+/*#define      AFS_USEBUFFERS  1*/
+#define        afsio_iov       uio_iov
+#define        afsio_iovcnt    uio_iovcnt
+#define        afsio_offset    uio_offset
+#define        afsio_seg       uio_segflg
+#define        afsio_fmode     uio_fmode
+#define        afsio_resid     uio_resid
+#define        AFS_UIOSYS      1
+#define        AFS_UIOUSER     UIO_USERSPACE
+#define        AFS_CLBYTES     MCLBYTES
+#define        AFS_MINCHANGE   2
+#define        VATTR_NULL      usr_vattr_null
+#endif /* KERNEL */
+#define        AFS_DIRENT      
+#ifndef CMSERVERPREF
+#define CMSERVERPREF
+#endif
+#define        ROOTINO         UFSROOTINO
+
+#endif /* AFS_PARAM_H */
index edf8d0e1e3cd7d0bad7a1b392332905afa2edc18..f1be8c1a5c8e6cac91d8a466edec5b444cdd991d 100644 (file)
@@ -43,6 +43,9 @@
 #include "conf-i386-obsd.h"
 #else
 #if defined(AFS_LINUX20_ENV) || defined(AFS_DJGPP_ENV)
+#ifdef AFS_PARISC_LINUX20_ENV
+#include "conf-parisc-linux.h"
+#else
 #ifdef AFS_PPC_LINUX20_ENV
 #include "conf-ppc-linux.h"
 #else
@@ -67,7 +70,8 @@
 #endif /* AFS_S390_LINUX20_ENV */
 #endif /* AFS_SPARC64_LINUX20_ENV */
 #endif /* AFS_SPARC_LINUX20_ENV */
-#endif
+#endif /* AFS_PPC_LINUX20_ENV */
+#endif /* AFS_PARISC_LINUX24_ENV */
 #else
 #if defined(AFS_DARWIN_ENV) && defined(AFS_PPC_ENV)
 #include "conf-ppc-darwin.h"
diff --git a/src/des/conf-parisc-linux.h b/src/des/conf-parisc-linux.h
new file mode 100644 (file)
index 0000000..3d29372
--- /dev/null
@@ -0,0 +1,4 @@
+#define BITS32
+#define BIG
+#define MSBFIRST
+#define MUSTALIGN
index b0b7c4ef99c575de96398d6d65545a6c0d82e99c..79fa2b43bba132157aac342ae211dc238514b28d 100644 (file)
@@ -17,6 +17,16 @@ RCSID("$Header$");
 
 #include <mit-cpyright.h>
 #include <stdio.h>
+#include <stdlib.h>
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+
 #include "des_internal.h"
 
 extern void gen PROTOTYPE((FILE * stream));
index e84d8ac4868ee7aa367639484aa5d69350f9fb79..5c9afd6de548bf0e8ca4ef965e7c5ac94240aff8 100644 (file)
@@ -15,6 +15,7 @@ RCSID("$Header$");
 
 #include <mit-cpyright.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include "des_internal.h"
 
 #define WANT_IP_TABLE
index 369b250693ba56653a12606beaf5b87c70d2c0fa..97aaede321b17e742f913bfdd496ab406fa5bbab 100644 (file)
@@ -39,8 +39,8 @@ struct PageHeader
     };
 
 struct DirHeader
-    {/* A directory header object.
-     */struct PageHeader header;
+    {/* A directory header object. */
+    struct PageHeader header;
     char alloMap[MAXPAGES];    /* one byte per 2K page */
     unsigned short hashTable[NHASHENT];
     };
index bb3e5166e9cc19dbe63aabb7f29c1647ff8ae869..aa210a8b12ca8c4c33fd3552ebc525b180fcab44 100644 (file)
@@ -101,9 +101,9 @@ struct AFSFetchStatus {
     afs_uint32 Group;
     afs_uint32 SyncCounter;
     afs_uint32 dataVersionHigh; /* For AFS/DFS translator, hi bits of dvn */
-    afs_uint32 spare2;
+    afs_uint32 lockCount;
     afs_uint32 spare3;
-    afs_uint32 spare4;
+    afs_uint32 errorCode;
 };
 
 struct AFSStoreStatus {
@@ -570,3 +570,10 @@ ResidencyCmd(
   IN struct ResidencyCmdInputs *Inputs,
   OUT struct ResidencyCmdOutputs *Outputs
 ) = 220; 
+
+InlineBulkStatus(
+  IN  AFSCBFids *FidsArray,
+  OUT AFSBulkStats *StatArray,
+  AFSCBs *CBArray,
+  AFSVolSync *Sync
+) = 65536;
index def0154fe5b83ce5d85b61ab63f2208bf0ddada7..02577f9a8686997fd51948424a3c92ddcd48697c 100644 (file)
@@ -94,7 +94,8 @@ AFSLIBS =  \
        $(DESTDIR)\lib\afsrx.lib \
        $(DESTDIR)\lib\afsubik.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
-       $(DESTDIR)\lib\afsrxkad.lib
+       $(DESTDIR)\lib\afsrxkad.lib \
+       $(DESTDIR)\lib\cm_dns.obj
        
 TOKENLIB = $(DESTDIR)\lib\afs\afspioctl.lib
 
index b250875c38adaa83264530a35fef4ef8f8325c28..72483fd8d246c32b4ddf4719646be3dfe750d5f1 100644 (file)
@@ -715,7 +715,7 @@ int StringToKey (
       
     printf ("Converting %s with the DES string to key yields key='",
            as->parms[0].items->data);
-    ka_PrintBytes (&key, sizeof(key));
+    ka_PrintBytes ((char *)&key, sizeof(key));
     printf ("'.\n");
 
     return 0;
index 704595aaf14844ae74dc719c4135111bf71544fc..82d7ecd5e8ad1bbc2798a4208036794715304eb8 100644 (file)
@@ -45,6 +45,13 @@ RCSID("$Header$");
 #include <sys/socket.h>
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/rxkad.h>
 #include <afs/cellconfig.h>
 #include <ubik.h>
index c16c3d54b71136000a7c845434c4871668566237..8678c579cb82fc8caeeff25bbfdb0ea93811a586 100644 (file)
@@ -37,6 +37,13 @@ RCSID("$Header$");
 #include <winsock2.h>
 #include <crypt.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <afs/cellconfig.h>
 #include <afs/auth.h>
 #include <afs/afsutil.h>
index d1275e3ca42a87195bc645be8c05cc95ba803085..280f295985c989e9b8b5140295ad5f6f62099ecc 100644 (file)
 
 RCSID("$Header$");
 
-#include <fcntl.h>
 #ifdef AFS_NT40_ENV
-#include <fcntl.h>
 #include <io.h>
 #else
 #include <sys/file.h>
 #endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/rxkad.h>
 #include "ubik_int.h"
 #include "kauth.h"
index e70b30d6912a46cbbd3aff8429fab277ace56826..d0a96ffae51396aed74ee9c2ae983c069349c843 100644 (file)
@@ -18,6 +18,13 @@ RCSID("$Header$");
 #else
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <lock.h>
 #include <ubik.h>
 #include <rx/xdr.h>
index 9047d12eb1beae67ce8d21569575fb8d204f616d..8b01262030b8aebef51541e20fb909f961f067e4 100644 (file)
@@ -36,6 +36,13 @@ RCSID("$Header$");
 #else
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <afs/cellconfig.h>
 #include <rx/xdr.h>
 #include <rx/rx.h>
index e95ab32fd17126451f97f53fba144a59c1d27158..c48b679ae9e74733edc77f9e531ebb5e5535c7e0 100644 (file)
@@ -23,10 +23,16 @@ RCSID("$Header$");
 
 #include <stdio.h>
 #include <afs/afsutil.h>
-#ifndef AFS_NT40_ENV
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
+#endif
+#ifdef HAVE_FCNTL_H
 #include <fcntl.h>
+#endif
 #include <sys/types.h>
 #include <time.h>
 #include <signal.h>
index b7694199fc7f752b0fd65b8f7dc2db9a876b19e6..1de47739f827843a080fa117d2955ef16c05a18f 100644 (file)
@@ -28,6 +28,13 @@ RCSID("$Header$");
 #else
 #include <WINNT/afsevent.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <afs/cellconfig.h>
 #include <afs/com_err.h>
 
index c8a83d3238f669576798fd353d3066e43677464a..7a62c2821791c8fd122f378265ed6405ebec3f54 100644 (file)
@@ -15,7 +15,6 @@ RCSID("$Header$");
 #include <afs/stds.h>
 #include <sys/types.h>
 #ifdef AFS_NT40_ENV
-#include <fcntl.h>
 #include <winsock2.h>
 #include <WINNT/afsevent.h>
 #else
@@ -26,6 +25,16 @@ RCSID("$Header$");
 #include "kalog.h"           /* for OpenLog() */
 #include <time.h>
 #include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
 #ifdef AFS_AIX32_ENV
 #include <signal.h>
 #endif
index a240d938b5d87975769c8a5afb366602dfe96b18..397bdd78791fa730696b113bf4e9826c301aaa18 100644 (file)
@@ -21,6 +21,13 @@ RCSID("$Header$");
 #include <netinet/in.h>
 #include <sys/file.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <time.h>
 #include <stdio.h>
 #include <ctype.h>
index 485c59a1ab122010269f09e78c4b8f8336feb14c..b07094a815d949a96fcee7c48c707a5f38f49d91 100644 (file)
@@ -18,6 +18,13 @@ RCSID("$Header$");
 #ifdef AFS_AIX32_ENV
 #include <signal.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 
 #include <lock.h>
 #include <ubik.h>
index 0db876f438898a57810cdb2e688e1693e8a54fed..a615470623b34e4c60d7d7bae73a9803b038114d 100644 (file)
@@ -28,6 +28,13 @@ RCSID("$Header$");
 #ifndef AFS_NT40_ENV
 #include <pwd.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <signal.h>
 #include <afs/com_err.h>
 #include <afs/auth.h>
@@ -240,8 +247,10 @@ CommandProc (as, arock)
     code = ka_Init(0);
     if (code ||
        !(lcell = ka_LocalCell())) {
+#ifndef AFS_FREELANCE_CLIENT
        if (!Pipe) com_err (rn, code , "Can't get local cell name!");
        exit (1);
+#endif
     }
 
     code = rx_Init(0);
@@ -346,7 +355,15 @@ CommandProc (as, arock)
        memset(as->parms[aNEWPASSWORD].items->data, 0, strlen(as->parms[aNEWPASSWORD].items->data));
     }
 
+#ifdef AFS_FREELANCE_CLIENT
+    if (!foundExplicitCell && !lcell) {
+       if (!Pipe) com_err (rn, code, "no cell name provided");
+        exit(1);
+    }
+#else
     if (!foundExplicitCell) strcpy (realm, lcell);
+#endif /* freelance */
+    
     if (code = ka_CellToRealm (realm, realm, &local)) {
        if (!Pipe) com_err (rn, code, "Can't convert cell to realm");
        exit (1);
index 07f26c34a1559e05a2949a373acdf68f215bbfcf..8653f9c712a08ca3ecbd118ccb06ae729be72fa2 100644 (file)
 RCSID("$Header$");
 
 #include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #ifdef AFS_NT40_ENV
 #include <WINNT/afsevent.h>
 #endif
index 2afb5464def3fada0d90329b457397006cdc4a8d..41cf8d1cba5960f33be245b101c9228fd03efb16 100644 (file)
 
 RCSID("$Header$");
 
-#ifdef AFS_NT40_ENV
+#ifdef HAVE_FCNTL_H
 #include <fcntl.h>
+#endif
+#ifdef AFS_NT40_ENV
 #include <io.h>
 #else
 #include <sys/file.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <sys/types.h>
 #include <rx/xdr.h>
 #include <errno.h>
index 816ebd416bad6ea1b0699e26dec3884ab61bee8b..79dbf777dcc2bfe23e2e2039b6467985fa42d13c 100644 (file)
@@ -27,6 +27,13 @@ RCSID("$Header$");
 #include <netdb.h>
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <afs/afsutil.h>
 #include <time.h>
 #include <afs/com_err.h>
index e25f2a616ac9f399cd92e543bf56744263d8c9e2..b3e6a94f58bf9fbd073699cfe4e60d78edce05bc 100644 (file)
@@ -22,6 +22,13 @@ RCSID("$Header$");
 #include <sys/file.h>
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <stdio.h>
 #include <errno.h>
 #include <time.h>
index 0de5a103bad3754f697d14819004350c5d7591b9..646cc9e51da564ff59256042e7fd4fcf84330548 100644 (file)
@@ -43,6 +43,13 @@ RCSID("$Header$");
 #include <sys/socket.h>
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 /* netinet/in.h and cellconfig.h  are needed together */
 #include <afs/cellconfig.h>
     /* these are needed together */
index 00509706d9da189c09d584a7ab57aedbb4a10ee7..20ed0d9622e089dfe3e29ca2871a70efb9e934c1 100644 (file)
@@ -44,6 +44,13 @@ RCSID("$Header$");
 #else
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <afs/cellconfig.h>
 #include <afs/auth.h>
 #include <afs/ptint.h>
index a62e37862c0649e81a99466fabe87a1e4255d88d..c37c66dac6c371eaff8cb4352097af2cc73f05fa 100644 (file)
@@ -96,6 +96,7 @@ afs_int32 ka_UserAuthenticateGeneral(
        char fullRealm[256];
        char upperRealm[256];
        struct servent *sp;
+       int ttl;
 
        struct ktc_principal server;
        struct ktc_principal client;
@@ -106,6 +107,11 @@ afs_int32 ka_UserAuthenticateGeneral(
 
        code = cm_SearchCellFile(realm, fullRealm, ka_AddHostProc, NULL);
 
+#ifdef AFS_AFSDB_ENV
+       if (code) {
+         code = cm_SearchCellByDNS(realm, fullRealm, &ttl, ka_AddHostProc, NULL);
+        }
+#endif
        if (code) {
                *reasonP = "specified realm is unknown";
                return (code);
@@ -310,24 +316,27 @@ static check_response
     ptr = (char *) cip->dat + 8;
 
     /* Check and extract server's name */
-    if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length)
+    if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length) {
        return(INTK_BADPW);
+    }
 
     (void) strncpy(s_service, ptr, sizeof(s_service)-1);
     s_service[sizeof(s_service)-1] = '\0';
     ptr += strlen(s_service) + 1;
 
     /* Check and extract server's instance */
-    if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length)
+    if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length) {
        return(INTK_BADPW);
+    }
 
     (void) strncpy(s_instance,ptr, sizeof(s_instance)-1);
     s_instance[sizeof(s_instance)-1] = '\0';
     ptr += strlen(s_instance) + 1;
 
     /* Check and extract server's realm */
-    if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length)
+    if ((strlen(ptr) + (ptr - (char *) cip->dat)) > cip->length) {
        return(INTK_BADPW);
+    }
 
     (void) strncpy(s_realm,ptr, sizeof(s_realm));
     s_realm[sizeof(s_realm)-1] = '\0';
@@ -340,8 +349,9 @@ static check_response
     ticket_len = (unsigned char) *ptr++;
     
     if ((ticket_len < 0) ||
-       ((ticket_len + (ptr - (char *) cip->dat)) > (int) cip->length))
+       ((ticket_len + (ptr - (char *) cip->dat)) > (int) cip->length)) {
        return(INTK_BADPW);
+    }
 
     /* Check returned server name, instance, and realm fields */
     /*
index f63a8840cd9984f4d202b343612353679b4f3810..282329d4a0b7c702c16e768933a811bcb5760c6f 100644 (file)
@@ -1,7 +1,16 @@
-MODLOAD-2.4.7-ac3-MP
-MODLOAD-2.4.7-ac3-SP
+MODLOAD-*
+MODLOAD32
+MODLOAD64
 Makefile
+MakefileProto.AIX
+MakefileProto.DARWIN
+MakefileProto.DUX
+MakefileProto.FBSD
+MakefileProto.HPUX
+MakefileProto.IRIX
 MakefileProto.LINUX
+MakefileProto.OBSD
+MakefileProto.SOLARIS
 afs
 afsint
 config
index dc869c28db72e4d5e8f0914ae059b9deb06a1b73..9f1afd2ac1f60aa0e99c3a55c4bd5ae1757d1844 100644 (file)
@@ -55,6 +55,7 @@ AFSAOBJS = \
        afs_daemons.o   \
        afs_dcache.o \
        afs_dir.o               \
+       afs_dynroot.o           \
        afs_init.o \
        afs_lock.o      \
        afs_mariner.o \
@@ -152,6 +153,8 @@ afs_conn.o: $(AFS)/afs_conn.c
        $(CRULE2);
 afs_dcache.o: $(AFS)/afs_dcache.c
        $(CRULE2);
+afs_dynroot.o:         $(AFS)/afs_dynroot.c
+       $(CRULE2);
 afs_init.o: $(AFS)/afs_init.c
        $(CRULE2);
 afs_mariner.o: $(AFS)/afs_mariner.c
index 67e3c39088225584536f4da0ff958066f75ec413..ef84b2263657274b421cd949d747d98dba1e8649 100644 (file)
@@ -87,7 +87,7 @@ setup:
 LIBAFS = libafs.o
 LIBAFSNONFS = libafs.nonfs.o
 
-INST_LIBAFS ${DESTDIR}${afskerneldir}/${LIBAFS}
+INST_LIBAFS ${DESTDIR}${afskerneldir}/${LIBAFS}
 INST_LIBAFSNONFS = ${DESTDIR}${afskerneldir}/${LIBAFSNONFS}
 
 DEST_LIBAFS = ${DEST}/root.client/bin/${LIBAFS}
index 81226b45890bf32eab4612a62d79228b6f5ddf17..8ee1512b1df8280ac83c27792b0d4947d1239bc8 100644 (file)
@@ -81,6 +81,11 @@ CCFLAGS =   -O2 -fomit-frame-pointer -fno-strength-reduce \
        -fno-strict-aliasing -fsigned-char -msoft-float -pipe \
        -fno-builtin -ffixed-r2
 DEFINES = -D__KERNEL__  -D__powerpc__ -DKERNEL -D_KERNEL -DMODULE ${SMP_DEF}
+<parisc_linux24>
+CCFLAGS =   -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -fno-strength-reduce \
+        -fno-strict-aliasing -fsigned-char -mno-space-regs -mfast-indirect-calls \
+        -mdisable-fpregs -ffunction-sections -march=1.1 -mschedule=7100
+DEFINES = -D__KERNEL__  -D__linux__ -DKERNEL -D_KERNEL -DMODULE ${SMP_DEF}
 <ia64_linux24>
 CCFLAGS =   -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe \
        -ffixed-r13 -mfixed-range=f10-f15,f32-f127 -falign-functions=32 -mb-step
index 33864289d496081d35972f5396653b2f9ebdea88..afc4dbb5951bb5a1c3ba2ef4acc682c601439134 100644 (file)
@@ -52,7 +52,7 @@ DEFINES= -DAFSDEBUG -DKERNEL -DAFS -DVICE -DNFS -DUFS -DINET -DQUOTA -DGETMOUNT
 KDEFS= -Dsun4c -DSUN4C_60 -DNFSCLIENT -DSYSACCT -DOLDSCSI -DVDDRV -D_KERNEL \
        -DSYSV -dn ${ARCH_DEFS}
 
-<sun4x_57 sun4x_58>
+<sun4x_57 sun4x_58 sun4x_59>
 KDEFS_32 = 
 KDEFS_64 = -xarch=v9
 
@@ -60,19 +60,19 @@ KDEFS_64 = -xarch=v9
 CFLAGS=-I. -I.. -I${TOP_SRCDIR}/config ${FSINCLUDES} $(DEFINES) $(KDEFS) $(KOPTS) ${DBUG}
 
 # Name of directory to hold object files and libraries.
-<all -sun4x_57 -sun4x_58>
+<all -sun4x_57 -sun4x_58 -sun4x_59>
 KOBJ = MODLOAD
-<sun4x_57 sun4x_58>
+<sun4x_57 sun4x_58 sun4x_59>
 KOBJ = MODLOAD32 MODLOAD64
 
 
 # This tells Makefile.common to use it's single directory build target.
-<all -sun4x_57 -sun4x_58>
+<all -sun4x_57 -sun4x_58 -sun4x_59>
 COMPDIRS = single_compdir
 INSTDIRS = single_instdir
 DESTDIRS = single_destdir
 
-<sun4x_57 sun4x_58>
+<sun4x_57 sun4x_58 sun4x_59>
 COMPDIRS = solaris_compdirs
 INSTDIRS = solaris_instdirs
 DESTDIRS = solaris_destdirs
@@ -104,7 +104,7 @@ setup:
 ## This is the target for a Solaris 7. Here we build both the 32 bit and
 ## the 64 bit libafs in MODLOAD32 and MODLOAD64 directories respectively
 
-<sun4x_57 sun4x_58>
+<sun4x_57 sun4x_58 sun4x_59>
 ${COMPDIRS} ${INSTDIRS} ${DESTDIRS}:
        for t in ${KOBJ} ; do \
                echo Building directory: $$t ; \
@@ -133,7 +133,7 @@ solaris_destdirs_libafs: dest_libafs
 LIBAFS = libafs.o
 LIBAFSNONFS = libafs.nonfs.o
 
-<all -sun4x_57 -sun4x_58>
+<all -sun4x_57 -sun4x_58 -sun4x_59>
 INST_LIBAFS = ${DESTDIR}${afskerneldir}/${LIBAFS}
 INST_LIBAFSNONFS = ${DESTDIR}${afskerneldir}/${LIBAFSNONFS}
 
@@ -169,7 +169,7 @@ ${LIBAFSNONFS}:  $(AFSAOBJS) $(AFSNONFSOBJS)
        $(RM) -f $@
        $(LD) -r -o $@  $(AFSAOBJS) ${AFSNONFSOBJS}
 
-<sun4x_57 sun4x_58>
+<sun4x_57 sun4x_58 sun4x_59>
 
 libafs: ${LIBAFSNONFS}
 
index 4182a212b0458d2bbf8ba4e820abc8760adb7410..c739b875408bba4353d3cdb784cafc8e50b8e681 100644 (file)
@@ -90,6 +90,7 @@ DLLOBJS =\
        $(SYSOBJS) \
        $(WINNTAFSDOBJS) \
        $(AUDITOBJS) \
+       $(DESTDIR)\lib\cm_dns.obj \
        afsauthent.res
 
 audit.obj: $(AUDIT)\audit.c
@@ -231,4 +232,4 @@ install: $(LIBFILE)
 install9x: install
 
 clean ::
-       $(DEL) $(LIBFILE)
\ No newline at end of file
+       $(DEL) $(LIBFILE)
index bb8fe04cc9566a9293d528d3dd116a53f16dbfd9..00a930380c55718465f327e614ecdec6f6b23448 100644 (file)
@@ -63,6 +63,7 @@ UAFSOBJ = \
        $(UOBJ)/afs_daemons.o   \
        $(UOBJ)/afs_dcache.o \
        $(UOBJ)/afs_dir.o               \
+       $(UOBJ)/afs_dynroot.o \
        $(UOBJ)/afs_init.o \
        $(UOBJ)/afs_lock.o      \
        $(UOBJ)/afs_mariner.o \
@@ -179,6 +180,7 @@ AFSWEBOBJ = \
        $(WEBOBJ)/afs_daemons.o \
        $(WEBOBJ)/afs_dcache.o \
        $(WEBOBJ)/afs_dir.o \
+       $(WEBOBJ)/afs_dynroot.o \
        $(WEBOBJ)/afs_init.o \
        $(WEBOBJ)/afs_lock.o \
        $(WEBOBJ)/afs_mariner.o \
@@ -297,6 +299,7 @@ AFSWEBOBJKRB = \
        $(WEBOBJ)/afs_daemons.o \
        $(WEBOBJ)/afs_dcache.o \
        $(WEBOBJ)/afs_dir.o \
+       $(WEBOBJ)/afs_dynroot.o \
        $(WEBOBJ)/afs_init.o \
        $(WEBOBJ)/afs_lock.o \
        $(WEBOBJ)/afs_mariner.o \
@@ -417,6 +420,8 @@ $(UOBJ)/afs_conn.o: $(AFS)/afs_conn.c
        $(CRULE1);
 $(UOBJ)/afs_dcache.o: $(AFS)/afs_dcache.c
        $(CRULE1);
+$(UOBJ)/afs_dynroot.o: $(AFS)/afs_dynroot.c
+       $(CRULE1);
 $(UOBJ)/afs_init.o: $(AFS)/afs_init.c
        $(CRULE1);
 $(UOBJ)/afs_mariner.o: $(AFS)/afs_mariner.c
@@ -660,6 +665,8 @@ $(WEBOBJ)/afs_conn.o: $(AFS)/afs_conn.c
        $(CRULE2);
 $(WEBOBJ)/afs_dcache.o: $(AFS)/afs_dcache.c
        $(CRULE2);
+$(WEBOBJ)/afs_dynroot.o: $(AFS)/afs_dynroot.c
+       $(CRULE2);
 $(WEBOBJ)/afs_init.o: $(AFS)/afs_init.c
        $(CRULE2);
 $(WEBOBJ)/afs_mariner.o: $(AFS)/afs_mariner.c
index 967267fe5307932ef22b41e3d69806cc980961e0..be2903a9eaf9959243a3c4038fc89fc93237d8ab 100644 (file)
@@ -44,7 +44,7 @@ AFSLIBS =  ${TOP_LIBDIR}/libkauth.a ${TOP_LIBDIR}/libprot.a \
           ${TOP_LIBDIR}/librxkad.a ${TOP_LIBDIR}/libsys.a \
           ${TOP_LIBDIR}/libdes.a ${TOP_LIBDIR}/librx.a \
           ${TOP_LIBDIR}/liblwp.a ${TOP_LIBDIR}/libcmd.a \
-          ${TOP_LIBDIR}/afs/libcom_err.a ${TOP_LIBDIR}/afs/util.a
+          ${TOP_LIBDIR}/libcom_err.a ${TOP_LIBDIR}/util.a
 
 KAFSLIBS = ${TOP_LIBDIR}/libkauth.krb.a ${TOP_LIBDIR}/libprot.a \
           ${TOP_LIBDIR}/libubik.a ${TOP_LIBDIR}/libauth.krb.a \
index f3c7a7c5da68804a1bdf391127ba34aed33c3cca..c6c769e386f589604d0ca4286782cfd572dea0ae 100644 (file)
@@ -1 +1,2 @@
+AFS_component_version_number.c
 Makefile
index e0a8daed144b4ecd323a78826fd0f0a4bb38506c..67a9fd3538c74f603d0a3642f563627149d085de 100644 (file)
@@ -61,11 +61,12 @@ sigvec(int sig, const struct sigvec* vec, struct sigvec* ovec)
 {
        assert(0);
 }
-#endif  /* AFS_HPUX110_ENV */
+
 sigsetmask(int mask)
 {
        assert(0);
 }
+#endif  /* AFS_HPUX110_ENV */
 
 /* converts string to integer */
 
index dd8b9de4e838f5428fe3018b22b2647e84e43baa..f2c0b0feaf4509adecb1b684318fac873c8d6084 100644 (file)
@@ -81,6 +81,7 @@ RCSID("$Header$");
 #include <unistd.h>
 #include <string.h>
 #include <sys/wait.h>
+#include <stdlib.h>
 
 struct stat istat, ostat;
 
index f476a0aae818c6d934d2c642ae5a932992d00c97..6ae1e7874c12b75af17c05e33b7226f00c9608c7 100644 (file)
@@ -16,3 +16,4 @@ ptserver
 readgroup
 readpwd
 testpt
+ptclient
index 02ea65629cda6b966b897408dd8d535ff4a9e893..1e277f057a04f757d6584d3b52bdc5ab359b84ae 100644 (file)
@@ -65,7 +65,8 @@ PTSERVER_EXELIBS =\
        $(DESTDIR)\lib\afs\afsutil.lib \
        $(DESTDIR)\lib\afs\afsaudit.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
-       $(DESTDIR)\lib\afs\afsreg.lib
+       $(DESTDIR)\lib\afs\afsreg.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
 !IF (("$(SYS_NAME)"!="i386_win95" ) && ("$(SYS_NAME)"!="I386_WIN95" ))
 PTSERVER_EXELIBS =$(PTSERVER_EXELIBS) $(DESTDIR)\lib\afs\afsprocmgmt.lib
@@ -100,7 +101,8 @@ PTS_EXELIBS =\
        $(DESTDIR)\lib\afs\afscmd.lib \
        $(DESTDIR)\lib\afs\afsreg.lib \
        $(DESTDIR)\lib\afs\afseventlog.lib \
-       $(DESTDIR)\lib\afs\afspioctl.lib
+       $(DESTDIR)\lib\afs\afspioctl.lib \
+       $(DESTDIR)\lib\cm_dns.obj
 
 $(PTS): $(PTS_EXEOBJS) $(PTS_EXELIBS) 
        $(EXECONLINK)
index 3bddbe67adba09be2f727e48adf8e1e521c15a06..f41b03f6f0b7959eedf103d272a17244480088a8 100644 (file)
@@ -26,6 +26,13 @@ RCSID("$Header$");
 #include <sys/file.h>
 #endif
 #include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <errno.h>
 #include <fcntl.h>
 #include <afs/cellconfig.h>
index 7311c2d2a1209da1aeb527ea2eeefb0c13cd00fd..8fa312ff0b8d9c172dbc7f6d4fe470d23e65c640 100644 (file)
@@ -22,6 +22,7 @@ RCSID("$Header$");
 #else
 #include <netinet/in.h>
 #endif
+#include <netdb.h>
 #include <stdio.h>
 #include <rx/xdr.h>
 #include <rx/rx.h>
@@ -163,6 +164,8 @@ char **argv;
     prlist alist;
     idlist lid;
     namelist lnames;
+    struct hostent *hostinfo;
+    struct in_addr *hostaddr;
     afs_int32 *ptr;
     char *foo;
     afs_int32 over;
@@ -404,6 +407,31 @@ char **argv;
                alist.prlist_val = 0;
            }
        }
+       else if (!strcmp(op,"lh")) {
+           alist.prlist_len = 0;
+           alist.prlist_val = 0;
+           /* scanf("%d",&id); */
+           if (GetString(name, sizeof(name))) code = PRBADARG;
+           else if (!(hostinfo = gethostbyname(name))) code = PRBADARG;
+           else {
+               hostaddr = hostinfo->h_addr_list[0];
+               id = ntohl(hostaddr->s_addr);
+               code = ubik_Call(PR_GetHostCPS,pruclient,0,id, &alist, &over);
+           }
+           if (CodeOk(code)) printf("%s\n",pr_ErrorMsg(code));
+           if (code == PRSUCCESS) {
+               ptr = alist.prlist_val;
+               if (over) {
+                   printf("Number of groups greater than PR_MAXGROUPS!\n");
+                   printf("Excess of %d.\n",over);
+               }
+               for (i=0;i<alist.prlist_len;i++,ptr++)
+                   printf("%d\n",*ptr);
+               free(alist.prlist_val);
+               alist.prlist_len = 0;
+               alist.prlist_val = 0;
+           }
+       }
        else if (!strcmp(op,"nu")) {
            /* scanf("%s",name); */
            if (GetString (name, sizeof(name))) code = PRBADARG;
@@ -527,6 +555,7 @@ PrintHelp()
     printf("dg gid - delete the entry for group gid.\n");
     printf("rm id gid - remove user id from group gid.\n");
     printf("l id - get the CPS for id.\n");
+    printf("lh host - get the host CPS for host.\n");
     printf("nu name - create new user with name - returns an id.\n");
     printf("ng name - create new group with name - returns an id.\n");
     printf("lm  - list max user id and max (really min) group id.\n");
index ac984c80a7307eacd132a176a19a37653c9bed78..a102910e2be6bb6060f537812ce95e0ca5a0f139 100644 (file)
@@ -25,9 +25,15 @@ RCSID("$Header$");
 #ifdef AFS_NT40_ENV 
 #include <winsock2.h>
 #else
-#include <strings.h>
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include "ptserver.h"
 #include "pterror.h"
 #include "afs/audit.h"
@@ -107,9 +113,9 @@ afs_int32 WhoIsThis (acall, at, aid)
        goto done;                      /* no longer supported */
     }
     else if (code == 2) {              /* kad class */
-       if (code = rxkad_GetServerInfo
+       if ((code = rxkad_GetServerInfo
            (acall->conn, (afs_int32 *) 0, 0/*was &exp*/,
-            name, inst, tcell, (afs_int32 *) 0))
+            name, inst, tcell, (afs_int32 *) 0)))
            goto done;
 #if 0
        /* This test is unnecessary, since rxkad_GetServerInfo already check.
@@ -1153,10 +1159,11 @@ struct prcheckentry *aentry;
         ABORT_WITH(tt,PRPERM);
 
     aentry->flags = tentry.flags >> PRIVATE_SHIFT;
-    if (aentry->flags == 0)
+    if (aentry->flags == 0) {
        if (tentry.flags & PRGRP)
            aentry->flags = PRP_GROUP_DEFAULT >> PRIVATE_SHIFT;
        else aentry->flags = PRP_USER_DEFAULT >> PRIVATE_SHIFT;
+    }
     aentry->owner = tentry.owner;
     aentry->id = tentry.id;
     strncpy(aentry->name,tentry.name,PR_MAXNAMELEN);
@@ -1635,7 +1642,7 @@ static stolower(s)
 register char *s;
 {
     register int tc;
-    while (tc = *s) {
+    while ((tc = *s)) {
        if (isupper(tc)) *s = tolower(tc);
        s++;
     }
@@ -1656,7 +1663,7 @@ afs_int32 addWildCards(tt,alist,host)
     int size = 0, i, code;
     int added = 0;
  
-    while (host = (host & wild)) {
+    while ((host = (host & wild))) {
        wild = htonl ( ntohl(wild) << 8) ;
        iaddr.s_addr = host;
        code = NameToID(tt, inet_ntoa(iaddr),&hostid);
@@ -1678,7 +1685,7 @@ afs_int32 addWildCards(tt,alist,host)
        added +=  wlist.prlist_len;
        for (i=0; i< wlist.prlist_len; i++) {
            if (!inCPS(*alist,wlist.prlist_val[i]))
-               if (code = AddToPRList (alist, &size, wlist.prlist_val[i] )) {
+               if ((code = AddToPRList (alist, &size, wlist.prlist_val[i] ))) {
                    free(wlist.prlist_val);
                    return(code);
                }
@@ -1720,17 +1727,17 @@ afs_int32 WhoIsThisWithName(acall, at, aid, aname)
        int clen;
        extern char *pr_realmName;
 
-       if (code = rxkad_GetServerInfo
+       if ((code = rxkad_GetServerInfo
            (acall->conn, (afs_int32 *) 0, 0/*was &exp*/,
-            name, inst, tcell, (afs_int32 *) 0))
+            name, inst, tcell, (afs_int32 *) 0)))
            goto done;
        strncpy (vname, name, sizeof(vname));
-       if (ilen = strlen (inst)) {
+       if ((ilen = strlen(inst))) {
            if (strlen(vname) + 1 + ilen >= sizeof(vname)) goto done;
            strcat (vname, ".");
            strcat (vname, inst);
        }
-       if (clen = strlen (tcell)){
+       if ( (clen = strlen(tcell))) {
 
 #if    defined(AFS_ATHENA_STDENV) || defined(AFS_KERBREALM_ENV)
            static char local_realm[AFS_REALM_SZ] = "";
index 7546c9ff68b0cae3f58d7a42ad8fd774a4b3ac08..b6dce8ac6f4f9c38924249ffb5ed592807e21cfb 100644 (file)
@@ -833,7 +833,14 @@ int main (argc, argv)
 {
     register afs_int32 code;
     register struct cmd_syndesc *ts;
+#ifdef WIN32
+    WSADATA WSAjunk;
+#endif
 
+#ifdef WIN32
+    WSAStartup(0x0101, &WSAjunk);
+#endif
+    
 #ifdef AFS_AIX32_ENV
     /*
      * The following signal action for AIX is necessary so that in case of a 
index b05ff9ab20d1263e7745b963fa004f89958f0246..6195610c7e3de2faef5fa52b50686e4c00034da4 100644 (file)
@@ -25,6 +25,13 @@ RCSID("$Header$");
 #include <netdb.h>
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <rx/rx_globals.h>
index cea872b55baf4f98656298b59cd8f571b1b4c4d6..70b483977eb2979e583d9cf852398841098aaebf 100644 (file)
@@ -39,6 +39,13 @@ RCSID("$Header$");
 #include <netinet/in.h>
 #endif
 #include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/rx.h>
 #include <rx/xdr.h>
 #include <rx/rxkad.h>
index 1b78fe4f508bd3d08f1f7dbc6761c785b49853ea..6b9d52f092a67cb9b132e5284372a1795f923b46 100644 (file)
@@ -19,8 +19,14 @@ RCSID("$Header$");
 #include <winsock2.h>
 #else
 #include <netinet/in.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
+#endif
 #include <lock.h>
 #include <ubik.h>
 #include <rx/xdr.h>
@@ -104,7 +110,7 @@ static afs_int32 CorrectGroupName (ut, aname, cid, oid, cname)
        if (ntohl(tentry.flags) & PRGRP) {
            if ((tentry.count == 0) && !admin) return PRGROUPEMPTY;
            /* terminate prefix at colon if there is one */
-           if (prefix = strchr(tentry.name, ':')) *prefix = 0;
+           if ((prefix = strchr(tentry.name, ':'))) *prefix = 0;
        }
        prefix = tentry.name;
     }
@@ -126,7 +132,7 @@ static afs_int32 CorrectGroupName (ut, aname, cid, oid, cname)
     }
   done:
     /* check for legal name with either group rules or user rules */
-    if (suffix = strchr(cname, ':')) {
+    if ((suffix = strchr(cname, ':'))) {
        /* check for confusing characters */
        if (strchr(cname, '\n') ||      /* restrict so recreate can work */
            strchr(suffix+1, ':'))      /* avoid multiple colons */
@@ -156,11 +162,12 @@ int AccessOK (ut, cid, tentry, mem, any)
     } else {
        flags = oid = aid = 0;
     }
-    if (!(flags & PRACCESS))           /* provide default access */
+    if (!(flags & PRACCESS)) {         /* provide default access */
        if (flags & PRGRP)
            flags |= PRP_GROUP_DEFAULT;
        else
            flags |= PRP_USER_DEFAULT;
+    }
 
     if (flags & any) return 1;
     if (oid) {
@@ -622,7 +629,7 @@ afs_int32 AddToEntry (tt, entry, loc, aid)
     afs_int32 nptr;
     afs_int32 last;                            /* addr of last cont. block */
     afs_int32 first = 0;
-    afs_int32 cloc;
+    afs_int32 cloc = 0;
     afs_int32 slot = -1;
 
     if (entry->id == aid) return PRINCONSISTENT;
@@ -796,7 +803,7 @@ afs_int32 GetList2 (at, tentry, tentry2 , alist, add)
   prlist *alist;
   afs_int32 add;
 {
-    afs_int32 code;
+    afs_int32 code = 0;
     afs_int32 i;
     struct contentry centry;
     afs_int32 nptr;
index 4129c87c983bd49c5d747cf48e2ae5bce03fde94..2308636021f09c579d5e79c29b09a156fd85e8ac 100644 (file)
 RCSID("$Header$");
 
 #include <stdio.h>
-#ifndef AFS_NT40_ENV
-#include <strings.h>
-#else
+#ifdef AFS_NT40_ENV
 #include <WINNT/afsevent.h>
 #endif
 #include <ctype.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/rx.h>
 #include <rx/xdr.h>
 #include <afs/cellconfig.h>
index 7548ea4617534ab017a12e11b9254af57c9879a6..19f2de3a5113a805835438a4a14a2add11c17cb0 100644 (file)
 RCSID("$Header$");
 
 #include <stdio.h>
-#ifndef AFS_NT40_ENV
-#include <strings.h>
-#else
+#ifdef AFS_NT40_ENV
 #include <WINNT/afsevent.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/rx.h>
 #include <rx/xdr.h>
 #include <afs/cellconfig.h>
index 1ba7e8d44d176bd7eb121bf5423d43d9c9c0fb0d..ad94f8f07be45e9148bca7ef4aa2f82eaab42c61 100644 (file)
@@ -23,6 +23,22 @@ RCSID("$Header$");
 #include <netdb.h>
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
 #include <rx/rx.h>
 #include <rx/xdr.h>
 #include <afs/rxgen_consts.h>
index 50464d86fe6a92a5eda43f4b8c7b2a1393a2db19..048ff54a73c5b0211964f839696937eedf9df8f6 100644 (file)
@@ -22,6 +22,13 @@ RCSID("$Header$");
 #include <netinet/in.h>
 #include <netdb.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include "ptserver.h"
 #include "pterror.h"
 
index 4e02690a897aed046559f0ad63d73c9dbd049bb4..4128f9e87ba588e299bb348b46516d5c30dd94c0 100644 (file)
@@ -324,7 +324,6 @@ struct ifnet * rxi_FindIfnet(addr, pifad)
 {
   afs_uint32 ppaddr;
   int match_value = 0;
-  struct hashbucket *slop;
 
   if (numMyNetAddrs == 0)
     (void) rxi_GetIFInfo();
@@ -332,15 +331,13 @@ struct ifnet * rxi_FindIfnet(addr, pifad)
   ppaddr = ntohl(addr);
   *pifad = (struct in_ifaddr*)&hashinfo_inaddr;
 
-  slop = hash_enum(&hashinfo_inaddr, rxi_MatchIfnet, HTF_INET,
+  (void) hash_enum(&hashinfo_inaddr, rxi_MatchIfnet, HTF_INET,
                   (caddr_t)&ppaddr, (caddr_t)&match_value, (caddr_t)pifad);
-
-  if (slop)
-      return ((struct in_ifaddr*)slop)->ia_ifp;
+   
+  if (match_value)
+      return (*pifad)->ia_ifp;
   else
       return NULL;
-
-      
 }
 
 static int rxi_EnumGetIfInfo(struct hashbucket *h, caddr_t key, caddr_t arg1,
index 9598b9179cb46da7aea27c46c2e198166510a046..d884bfc52c00d2477558915ada40478302d418e5 100644 (file)
@@ -27,8 +27,13 @@ RCSID("$Header$");
 #include "../sys/fcntl.h"
 #ifdef AFS_SUN58_ENV
 #include "../netinet/ip6.h"
+#define ipif_local_addr ipif_lcl_addr
+#ifndef V4_PART_OF_V6
+#define V4_PART_OF_V6(v6)       v6.s6_addr32[3]
+#endif
 #endif
 #include "../inet/ip.h"
+#include "../inet/ip_if.h"
 #include "../netinet/udp.h"
 
 /*
@@ -47,9 +52,137 @@ int (*sockfs_sosendmsg)
 int (*sockfs_sosetsockopt)
     (struct sonode *, int, int, void *, int) = NULL;
 
-int rxi_GetIFInfo()
+static afs_uint32 myNetAddrs[ADDRSPERSITE];
+static int myNetMTUs[ADDRSPERSITE];
+static int numMyNetAddrs = 0;
+
+int
+rxi_GetIFInfo()
 {
-    return 0;
+    int i = 0;
+    int different = 0;
+
+    ill_t *ill;
+    ipif_t *ipif;
+    int rxmtu, maxmtu;
+
+    int mtus[ADDRSPERSITE];
+    afs_uint32 addrs[ADDRSPERSITE];
+    afs_uint32 ifinaddr;
+
+    memset(mtus, 0, sizeof(mtus));
+    memset(addrs, 0, sizeof(addrs));
+
+    for (ill = ill_g_head; ill; ill = ill->ill_next) {
+#ifdef AFS_SUN58_ENV
+       /* Make sure this is an IPv4 ILL */
+       if (ill->ill_isv6) continue;
+#endif
+
+       /* Iterate over all the addresses on this ILL */
+       for (ipif = ill->ill_ipif; ipif; ipif = ipif->ipif_next) {
+           if (i >= ADDRSPERSITE) break;
+
+           /* Ignore addresses which are down.. */
+           if (!(ipif->ipif_flags & IFF_UP)) continue;
+
+           /* Compute the Rx interface MTU */
+           rxmtu = (ipif->ipif_mtu - RX_IPUDP_SIZE);
+
+           ifinaddr = ntohl(ipif->ipif_local_addr);
+           if (myNetAddrs[i] != ifinaddr)
+               different++;
+
+           /* Copy interface MTU and address; adjust maxmtu */
+           mtus[i] = rxmtu;
+           rxmtu = rxi_AdjustIfMTU(rxmtu);
+           maxmtu = rxmtu * rxi_nRecvFrags + ((rxi_nRecvFrags-1) *
+                                              UDP_HDR_SIZE);
+           maxmtu = rxi_AdjustMaxMTU(rxmtu, maxmtu);
+           addrs[i] = ifinaddr;
+           i++;
+
+           if (ifinaddr != 0x7f000001 && maxmtu > rx_maxReceiveSize) {
+               rx_maxReceiveSize = MIN( RX_MAX_PACKET_SIZE, maxmtu);
+               rx_maxReceiveSize = MIN( rx_maxReceiveSize,
+                                        rx_maxReceiveSizeUser);
+           }
+       }
+    }
+
+    rx_maxJumboRecvSize = RX_HEADER_SIZE +
+                         rxi_nDgramPackets * RX_JUMBOBUFFERSIZE +
+                         (rxi_nDgramPackets-1) * RX_JUMBOHEADERSIZE;
+    rx_maxJumboRecvSize = MAX(rx_maxJumboRecvSize, rx_maxReceiveSize);
+
+    if (different) {
+       int j;
+
+       for (j = 0; j < i; j++) {
+           myNetMTUs[j] = mtus[j];
+           myNetAddrs[j] = addrs[j];
+       }
+    }
+
+    return different;
+}
+
+int
+rxi_FindIfMTU(addr)
+    afs_uint32 addr;
+{
+    ill_t *ill;
+    ipif_t *ipif;
+    afs_uint32 myAddr, netMask;
+    int match_value = 0;
+    int mtu = -1;
+
+    if (numMyNetAddrs == 0)
+       rxi_GetIFInfo();
+    myAddr = ntohl(addr);
+
+    if      (IN_CLASSA(myAddr)) netMask = IN_CLASSA_NET;
+    else if (IN_CLASSB(myAddr)) netMask = IN_CLASSB_NET;
+    else if (IN_CLASSC(myAddr)) netMask = IN_CLASSC_NET;
+    else                       netMask = 0;
+
+    for (ill = ill_g_head; ill; ill = ill->ill_next) {
+#ifdef AFS_SUN58_ENV
+       /* Make sure this is an IPv4 ILL */
+       if (ill->ill_isv6) continue;
+#endif
+
+       /* Iterate over all the addresses on this ILL */
+       for (ipif = ill->ill_ipif; ipif; ipif = ipif->ipif_next) {
+           afs_uint32 thisAddr, subnetMask;
+           int thisMtu;
+
+           thisAddr   = ipif->ipif_local_addr;
+           subnetMask = ipif->ipif_net_mask;
+           thisMtu    = ipif->ipif_mtu;
+
+           if ((myAddr & netMask) == (thisAddr & netMask)) {
+               if ((myAddr & subnetMask) == (thisAddr & subnetMask)) {
+                   if (myAddr == thisAddr) {
+                       match_value = 4;
+                       mtu = thisMtu;
+                   }
+
+                   if (match_value < 3) {
+                       match_value = 3;
+                       mtu = thisMtu;
+                   }
+               }
+
+               if (match_value < 2) {
+                   match_value = 2;
+                   mtu = thisMtu;
+               }
+           }
+       }
+    }
+
+    return mtu;
 }
 
 /* rxi_NewSocket, rxi_FreeSocket and osi_NetSend are from the now defunct
index c74472db32240343f0e3c55cbf8b39b7130c6ace..1ecacf6c0b63747f2f9c21e6fb1d76fae2a5d6d9 100644 (file)
@@ -3460,7 +3460,7 @@ struct rx_packet *rxi_ReceiveAckPacket(call, np, istack)
 
     /* if the ack packet has a receivelen field hanging off it,
      * update our state */
-    if ( np->length >= rx_AckDataSize(ap->nAcks) +sizeof(afs_int32)) {
+    if ( np->length >= rx_AckDataSize(ap->nAcks) + 2*sizeof(afs_int32)) {
       afs_uint32 tSize;
 
       /* If the ack packet has a "recommended" size that is less than 
index 79ab60835246fb2872ab8cbba86e207342c49671..d05cae904f600df081c34e4180de61816d5a5b51 100644 (file)
@@ -224,6 +224,9 @@ returned with an error code of RX_CALL_DEAD ( transient error ) */
 #define rx_SetConnAbortThreshold(A) (rxi_connAbortThreshhold = (A))
 #define rx_SetConnAbortDelay(A) (rxi_connAbortDelay = (A))
 
+#define rx_GetCallAbortCode(call) ((call)->abortCode)
+#define rx_SetCallAbortCode(call, code) ((call)->abortCode = (code))
+
 #define cpspace(call) ((call)->curlen)
 #define cppos(call) ((call)->curpos)
 
@@ -291,7 +294,7 @@ struct rx_securityClass {
     int refCount;
 };
 
-#define RXS_OP(obj,op,args) ((obj->ops->op_ ## op) ? (*(obj)->ops->op_ ## op)args : 0)
+#define RXS_OP(obj,op,args) ((obj && (obj->ops->op_ ## op)) ? (*(obj)->ops->op_ ## op)args : 0)
 
 #define RXS_Close(obj) RXS_OP(obj,Close,(obj))
 #define RXS_NewConnection(obj,conn) RXS_OP(obj,NewConnection,(obj,conn))
index e27c6262664e1db26aed6a7880b6a062e5a90adf..5d94973a6d6a8b998f1942e962b209cfc3f982fc 100644 (file)
@@ -33,6 +33,7 @@ RCSID("$Header$");
 #include <sys/time.h>
 #include <stdio.h>
 #include <errno.h>
+#include <stdlib.h>
 #include "rx_clock.h"
 #endif
 
index 6c19b3e42af834965d35fa61dfca29137d4e6512..4bef1ec2a15e6d0aac21878c7ba9f5d34fb9f15f 100644 (file)
@@ -303,9 +303,9 @@ int rxi_getAllAddrMaskMtu (addrBuffer, maskBuffer, mtuBuffer, maxSize)
                     ifr.ifr_addr.sa_family=AF_INET;
                     strncpy(ifr.ifr_name, sdl->sdl_data, sdl->sdl_nlen);
                     if (ioctl(s, SIOCGIFMTU, (caddr_t)&ifr) < 0)
-                         mtuBuffer[count]=1500;
+                         mtuBuffer[count]=htonl(1500);
                     else
-                         mtuBuffer[count]=ifr.ifr_mtu;
+                         mtuBuffer[count]=htonl(ifr.ifr_mtu);
                     count++;
                }
                addrcount--;
@@ -464,14 +464,14 @@ int rxi_getAllAddrMaskMtu (addrBuffer, maskBuffer, mtuBuffer, maxSize)
         if ( ioctl(s, SIOCGIFMTU, (caddr_t)ifr) < 0) {
            perror("SIOCGIFMTU");
         } else {
-           mtuBuffer[count] = ifr->ifr_metric;
+           mtuBuffer[count] = htonl(ifr->ifr_metric);
         }
 #endif /* SIOCGIFMTU */
 #ifdef SIOCRIPMTU
         if ( ioctl(s, SIOCRIPMTU, (caddr_t)ifr) < 0) {
            perror("SIOCRIPMTU");
         } else {
-           mtuBuffer[count] = ifr->ifr_metric;
+           mtuBuffer[count] = htonl(ifr->ifr_metric);
         }
 #endif /* SIOCRIPMTU */
 
index 53a57c5736e7bd06f871c369fed47c5f942dc398..8755fb31f4258ae95d888aac995071b738b4ad57 100644 (file)
@@ -343,6 +343,7 @@ register struct rx_peer *pp;
     u_short rxmtu;
     afs_int32 i, mtu;
 
+#ifndef AFS_SUN5_ENV
 #ifdef AFS_USERSPACE_IP_ADDR   
     i = rxi_Findcbi(pp->host);
     if (i == -1) {
@@ -402,6 +403,30 @@ register struct rx_peer *pp;
       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
     }
 #endif/* else AFS_USERSPACE_IP_ADDR */
+#else /* AFS_SUN5_ENV */
+    mtu = rxi_FindIfMTU(pp->host);
+
+    if (mtu <= 0) {
+       pp->timeout.sec = 3;
+       /* pp->timeout.usec = 0; */
+       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
+    } else {
+       pp->timeout.sec = 2;
+       /* pp->timeout.usec = 0; */
+       pp->ifMTU = MIN(RX_MAX_PACKET_SIZE, rx_MyMaxSendSize);
+    }
+
+    if (mtu > 0) {
+       /* Diminish the packet size to one based on the MTU given by
+        * the interface. */
+       if (mtu > (RX_IPUDP_SIZE + RX_HEADER_SIZE)) {
+           rxmtu = mtu - RX_IPUDP_SIZE;
+           if (rxmtu < pp->ifMTU) pp->ifMTU = rxmtu;
+       }
+    } else {   /* couldn't find the interface, so assume the worst */
+       pp->ifMTU = RX_REMOTE_PACKET_SIZE;
+    }
+#endif /* AFS_SUN5_ENV */
 #else /* ADAPT_MTU */
     pp->rateFlag = 2;   /* start timing after two full packets */
     pp->timeout.sec = 2;
index a11c14537c0dba1dcaca4e4cc89b2b3b1ae98284..92b2bc33265d8ba97a6f6d84b6d7b075b6992a64 100644 (file)
@@ -111,6 +111,7 @@ extern rxk_portRocks_t rxk_portRocks;
 
 extern struct osi_socket *rxk_NewSocket(short aport);
 extern struct ifnet *rxi_FindIfnet();
+extern int rxi_FindIfMTU();
 
 extern int rxk_initDone;
 
index 743a44a22139b947fbd5a7511973f5f95fdae075..1f66c25c8d020f3b3a9e7f11b92b25e3b9999c5b 100644 (file)
 #ifndef _RX_MISC_H_
 #define _RX_MISC_H_
 
-#ifndef        AFS_SUN5_ENV
 #define MISCMTU
 #define ADAPT_MTU
-#endif
 
-#if defined(AFS_SUN5_ENV) && !defined(KERNEL)
-#define MISCMTU
-#define ADAPT_MTU
+#if defined(AFS_SUN5_ENV)
 #include <sys/sockio.h>
 #include <sys/fcntl.h>
 #endif
index b248117ff8fb20d7d6a4aa314a1ec7bd1f3e4510..8b7051eca7d77127e58de865c3d61135a9bbbfd4 100644 (file)
@@ -272,7 +272,7 @@ static struct rx_packet * allocCBuf(int class)
   queue_Remove(c);
   if (!(c->flags & RX_PKTFLAG_FREE))
     osi_Panic("rxi_AllocPacket: packet not free\n");
-  c->flags &= ~RX_PKTFLAG_FREE;
+  c->flags = 0;                /* clear RX_PKTFLAG_FREE, initialize the rest */
   c->header.flags = 0;
   
 #ifdef KERNEL
@@ -631,7 +631,7 @@ struct rx_packet *rxi_AllocPacketNoLock(class)
   dpf(("Alloc %x, class %d\n", p, class));
   
   queue_Remove(p);
-  p->flags &= ~RX_PKTFLAG_FREE;
+  p->flags = 0;                /* clear RX_PKTFLAG_FREE, initialize the rest */
   p->header.flags = 0;
   
   /* have to do this here because rx_FlushWrite fiddles with the iovs in
@@ -788,8 +788,8 @@ int rxi_ReadPacket(socket, p, host, port)
     * our problems caused by the lack of a length field in the rx header.
     * Use the extra buffer that follows the localdata in each packet
     * structure. */
-    savelen = p->wirevec[p->niovecs].iov_len;
-    p->wirevec[p->niovecs].iov_len += RX_EXTRABUFFERSIZE;
+    savelen = p->wirevec[p->niovecs-1].iov_len;
+    p->wirevec[p->niovecs-1].iov_len += RX_EXTRABUFFERSIZE;
 
     memset((char *)&msg, 0, sizeof(msg));
     msg.msg_name = (char *) &from;
@@ -799,7 +799,7 @@ int rxi_ReadPacket(socket, p, host, port)
     nbytes = rxi_Recvmsg(socket, &msg, 0);
 
    /* restore the vec to its correct state */
-    p->wirevec[p->niovecs].iov_len = savelen;
+    p->wirevec[p->niovecs-1].iov_len = savelen;
 
     p->length = (nbytes - RX_HEADER_SIZE);
     if ((nbytes > tlen) || (p->length  & 0x8000)) {  /* Bogus packet */
@@ -1854,18 +1854,29 @@ register struct rx_packet *p;
     register afs_uint32 *buf = (afs_uint32*)(p->wirevec[0].iov_base);      /* MTUXXX */
     afs_uint32 temp;
 
-    p->header.epoch = ntohl(*buf++);
-    p->header.cid = ntohl(*buf++);
-    p->header.callNumber = ntohl(*buf++);
-    p->header.seq = ntohl(*buf++);
-    p->header.serial = ntohl(*buf++);
-    temp = ntohl(*buf++);
+    p->header.epoch = ntohl(*buf);
+    buf++;
+    p->header.cid = ntohl(*buf);
+    buf++;
+    p->header.callNumber = ntohl(*buf);
+    buf++;
+    p->header.seq = ntohl(*buf);
+    buf++;
+    p->header.serial = ntohl(*buf);
+    buf++;
+
+    temp = ntohl(*buf);
+    buf++;
+
     /* C will truncate byte fields to bytes for me */
     p->header.type = temp>>24;
     p->header.flags = temp>>16;
     p->header.userStatus = temp>>8;
     p->header.securityIndex = temp>>0;
-    temp = ntohl(*buf++);
+
+    temp = ntohl(*buf);
+    buf++;
+
     p->header.serviceId = (temp&0xffff);
     p->header.spare = temp>>16;
     /* Note: top 16 bits of this last word are the security checksum */
index 05f0589ace44a5b151ae1ab33eb5e95a6839734f..f3885207c445d4452d39843607864cad53639e6e 100644 (file)
@@ -36,7 +36,7 @@ char rxi_tracename[80]="/tmp/rxcalltrace";
 #else
 char rxi_tracename[80]="\0Change This pathname (and preceding NUL) to initiate tracing";
 #endif
-int rxi_logfd = 0;
+int rxi_logfd = -1;
 char rxi_tracebuf[4096];
 afs_uint32 rxi_tracepos = 0;
 
@@ -52,7 +52,7 @@ struct rx_trace {
 
 void rxi_flushtrace()
 {
-    if (rxi_logfd)
+    if (rxi_logfd >= 0)
        write(rxi_logfd, rxi_tracebuf, rxi_tracepos);
     rxi_tracepos = 0;
 }
@@ -67,9 +67,9 @@ void rxi_calltrace(event, call)
   if (!rxi_tracename[0])
     return;
 
-  if (!rxi_logfd) {
+  if (rxi_logfd < 0) {
     rxi_logfd = open(rxi_tracename, O_WRONLY | O_CREAT | O_TRUNC, 0777);
-    if (!rxi_logfd)
+    if (rxi_logfd < 0)
       rxi_tracename[0] = '\0';
   }
   clock_GetTime(&now);
@@ -153,7 +153,7 @@ char **argv;
   }
 
   rxi_logfd = open(rxi_tracename, O_RDONLY);
-  if (!rxi_logfd) {
+  if (rxi_logfd < 0) {
     perror("");
     exit(errno);
   }
index 67d9d18668e783722e0359dd37ed39314e2acf8f..92c2747e13a7206a813eed7f7f7561045baf87b0 100644 (file)
@@ -111,6 +111,7 @@ struct cmd_syndesc *as;
     struct rx_debugConn tconn;
     short noConns;
     short showPeers;
+    short showLong;
     int version_flag;
     char version[64];
     afs_int32 length=64;
@@ -130,6 +131,7 @@ struct cmd_syndesc *as;
     version_flag=(as->parms[10].items ? 1 : 0);
     noConns = (as->parms[11].items ? 1 : 0);
     showPeers = (as->parms[12].items ? 1 : 0);
+    showLong = (as->parms[13].items ? 1 : 0);
 
     if (as->parms[0].items)
        hostName = as->parms[0].items->data;
@@ -500,6 +502,15 @@ struct cmd_syndesc *as;
                   tpeer.rtt >> 3, tpeer.rtt_dev >> 2);
            printf("\ttimeout %d.%03d sec\n",
                   tpeer.timeout.sec, tpeer.timeout.usec / 1000);
+           if (!showLong) continue;
+
+           printf("\tin/out packet skew: %d/%d\n",
+                  tpeer.inPacketSkew, tpeer.outPacketSkew);
+           printf("\tcongestion window %d, MTU %d\n",
+                  tpeer.cwind, tpeer.MTU);
+           printf("\tcurrent/if/max jumbogram size: %d/%d/%d\n",
+                  tpeer.nDgramPackets, tpeer.ifDgramPackets,
+                  tpeer.maxDgramPackets);
        }
     }
     exit(0);
@@ -542,6 +553,7 @@ char **argv;
     cmd_AddParm(ts,"-version",CMD_FLAG,CMD_OPTIONAL,"show AFS version id");
     cmd_AddParm(ts,"-noconns",CMD_FLAG,CMD_OPTIONAL,"show no connections");
     cmd_AddParm(ts,"-peers",CMD_FLAG,CMD_OPTIONAL,"show peers");
+    cmd_AddParm(ts,"-long",CMD_FLAG,CMD_OPTIONAL,"detailed output");
 
     cmd_Dispatch(argc, argv);
     exit(0);
index 12dd07946012e02fcdc788012fcb5914a2d18a32..f12d5315c3f269fb3f2da7a1811623b477640008 100644 (file)
@@ -41,6 +41,13 @@ RCSID("$Header$");
 #include <afs/stds.h>
 #include <sys/types.h>
 #include <time.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #ifdef AFS_NT40_ENV
 #include <winsock2.h>
 #else
@@ -119,7 +126,8 @@ rxkad_AllocCID(aobj, aconn)
        clock_GetTime(&tgen.time);      /* changes time1 and time2 */
        tgen.time.sec = htonl(tgen.time.sec);
        tgen.time.usec = htonl(tgen.time.usec);
-       tgen.counter = htonl(counter++);
+       tgen.counter = htonl(counter);
+       counter++;
 #ifdef KERNEL
        tgen.random1 = afs_random() & 0x7fffffff;       /* was "80000" */
        tgen.random2 = afs_random() & 0x7fffffff;       /* was "htonl(100)" */
index 1ce045d480cd926fcd6c605d4284ed87880006b7..361f21c8994e3cc5d8ca67110bcaa02baba02e26 100644 (file)
@@ -51,6 +51,13 @@ RCSID("$Header$");
 #endif
 #include <rx/rx.h>
 #include <rx/xdr.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 
 #endif /* KERNEL */
 
index 84b949b8c69e7a57f0039af730cf98a84681318f..c027f031d14d8b9be00fb642444f9df5b72c23b6 100644 (file)
@@ -24,6 +24,13 @@ RCSID("$Header$");
 #else
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/rx.h>
 #include <rx/xdr.h>
 #include <des.h>
index 32576c1573dff4b1403fc246a297083311a3ade3..15c63cb857d361e70679c25ad60779fd7d6b66d5 100644 (file)
@@ -33,6 +33,13 @@ RCSID("$Header$");
 #else
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <des.h>
index e28ea9b77c2b08cdaae59e5b08436e4ca7d2a80e..399b818b04f3ba5222071cd3395cae0298e50f54 100644 (file)
@@ -25,6 +25,13 @@ RCSID("$Header$");
 #endif
 #include <sys/stat.h>
 #include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <afs/afsint.h>
 #include <afs/venus.h>
 #include <rx/xdr.h>
index d52a873a8c4fb599ae27731270a98dd7ff9af064..338ce9c901fa724ec10114f326e4a70dd9a556eb 100644 (file)
@@ -5,8 +5,6 @@
 # License.  For details, see the LICENSE file in the top-level source
 # directory or online at http://www.openafs.org/dl/license10.html
 
-# */
-
 DEST=@DEST@
 TOP_INCDIR=@TOP_INCDIR@
 TOP_LIBDIR=@TOP_LIBDIR@
@@ -30,49 +28,36 @@ SHELL    =/bin/sh
 
 include ../config/Makefile.${SYS_NAME}
 
-CC      =${MT_CC}
-CFLAGS  = ${DBG} -w -I${TOP_SRCDIR}/config ${MT_CFLAGS}
+BUTMOBJS    =file_tm.o
+BUTMLIBS    =libbutm.a
+BUTMINCLS   =${TOP_INCDIR}/afs/com_err.h ${TOP_INCDIR}/afs/butm.h
+BUTMINCLUDE =-I${TOP_INCDIR}
+
+CC      = ${MT_CC}
+CFLAGS  = ${DBG} -w -I${TOP_SRCDIR}/config ${MT_CFLAGS} @XBSA_CFLAGS@ ${BUTMINCLUDE}
 
 LDFLAGS = ${DBG} ${XLDFLAGS}
 
-VICED   =../viced
-VLSERVER=../vlserver
 LWP     =../lwp
-LIBACL  =../libacl
-UTIL    =../util
-DIR     =../dir
-VOL     =../vol
-FSINT   =../fsint
 BUTM    =../butm
 BUTC    =../butc
 BUCOORD = ../bucoord
 VOLSER  = ../volser
 
-# ----------------------------------------------------------------
-# The default is to build butc without using the TSM API libraries. 
-# To build with TSM support, set XBSA_NOBUILD="". Be sure you have
-#  the TSM API version 3.7.1 installed.
-# ----------------------------------------------------------------
-XBSA_NOBUILD="true"
-
 BUCOORDOBJS=ubik_db_if.o ${BUCOORD}/volstub.o ${BUCOORD}/dlq.o \
            ${BUCOORD}/status.o ${BUCOORD}/bucoord_errs.o
 
 VOLSERLIBOBJ=${VOLSER}/volint.cs.o  vsprocs.o              ${VOLSER}/vsutils.o \
             ${VOLSER}/lockprocs.o  ${VOLSER}/volint.xdr.o ${VOLSER}/volerr.o \
             ${VOLSER}/volint.ss.o  AFS_component_version_number.o 
-VOLSERLIBS=libvolser.a
+VOLSERLIBS  =libvolser.a
 
-LWPOBJS    =lock.o
-
-BUTMOBJS   =file_tm.o
-BUTMLIBS   =libbutm.a
-BUTMINCLS=${TOP_INCDIR}/afs/com_err.h ${TOP_INCDIR}/afs/butm.h
-BUTMINCLUDE=-I${TOP_INCDIR}
+LWPOBJS     =lock.o
 
 BUTCOBJS   =dbentries.o tcprocs.o lwps.o tcmain.o list.o recoverDb.o \
            tcudbprocs.o dump.o tcstatus.o butc_xbsa.o \
             ${LWPOBJS} ${BUCOORDOBJS}
+
 BUTCINCLS=${TOP_INCDIR}/afs/partition.h \
            ${TOP_INCDIR}/afs/volume.h \
            ${TOP_INCDIR}/afs/vlserver.h \
@@ -86,6 +71,7 @@ BUTCINCLS=${TOP_INCDIR}/afs/partition.h \
            ${TOP_INCDIR}/afs/tcdata.h \
            ${TOP_INCDIR}/afs/bubasics.h \
            ${TOP_INCDIR}/afs/butm.h
+
 BUTCINCLUDE=-I. -I${TOP_INCDIR}
 BUTCLIBS=${TOP_LIBDIR}/libbudb.a \
            ${TOP_LIBDIR}/libbubasics.a \
@@ -100,220 +86,84 @@ BUTCLIBS=${TOP_LIBDIR}/libbudb.a \
            ${TOP_LIBDIR}/libprocmgmt.a \
            ${TOP_LIBDIR}/librx.a
 
-include ../config/Makefile.version
+#
+# Build targets
+#
+
+all: butc
+
+butc: ${BUTCOBJS} ${BUTCLIBS}
+       ${CC} ${CFLAGS} ${BUTCOBJS} ${BUTCLIBS} ${MTLIBS} ${XLIBS} -o butc
 
-#----------------------------------------------- BUTC
+libvolser.a: vsprocs.o ${VOLSERLIBOBJ}
+       -$(RM) -f $@
+       $(AR) crv $@ vsprocs.o ${VOLSERLIBOBJ}
+       $(RANLIB) $@
 
-butc: pre ${BUTCOBJS} ${BUTCLIBS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCOBJS} ${BUTCLIBS} $$hdrdir ${MTLIBS} ${XLIBS} -o butc
+libbutm.a: ${BUTMOBJS} AFS_component_version_number.o
+       -$(RM) -f libbutm.a
+       $(AR) crv libbutm.a $(BUTMOBJS) AFS_component_version_number.o
+       ${RANLIB} libbutm.a
 
 dbentries.o: ${BUTC}/dbentries.c ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/dbentries.c
+       ${CC} ${CFLAGS} -c ${BUTC}/dbentries.c
 
 tcprocs.o: ${BUTC}/tcprocs.c ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/tcprocs.c
+       ${CC} ${CFLAGS} -c ${BUTC}/tcprocs.c
 
 lwps.o: ${BUTC}/lwps.c ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/lwps.c
+       ${CC} ${CFLAGS} -c ${BUTC}/lwps.c
 
 tcmain.o: ${BUTC}/tcmain.c ${BUTCINCLS} AFS_component_version_number.c
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/tcmain.c
+       ${CC} ${CFLAGS} -c ${BUTC}/tcmain.c
 
 list.o: ${BUTC}/list.c ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/list.c
+       ${CC} ${CFLAGS} -c ${BUTC}/list.c
 
 recoverDb.o: ${BUTC}/recoverDb.c ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/recoverDb.c
+       ${CC} ${CFLAGS} -c ${BUTC}/recoverDb.c
 
 tcudbprocs.o: ${BUTC}/tcudbprocs.c ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/tcudbprocs.c
+       ${CC} ${CFLAGS} -c ${BUTC}/tcudbprocs.c
 
 dump.o: ${BUTC}/dump.c ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/dump.c
+       ${CC} ${CFLAGS} -c ${BUTC}/dump.c
 
 tcstatus.o: ${BUTC}/tcstatus.c ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/tcstatus.c
+       ${CC} ${CFLAGS} -c ${BUTC}/tcstatus.c
 
 butc_xbsa.o: ${BUTC}/butc_xbsa.c ${BUTC}/butc_xbsa.h ${BUTCINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUTC}/butc_xbsa.c
-
-#----------------------------------------------- BUCOORD
+       ${CC} ${CFLAGS} -c ${BUTC}/butc_xbsa.c
 
 ubik_db_if.o: ${BUCOORD}/ubik_db_if.c
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${BUCOORD}/ubik_db_if.c
-
-#----------------------------------------------- VOLSER
-# Build the libvolser.a library here. The file compiled
-# for is is vsprocs.c. The rest are from the VOLSER dir.
-
-libvolser.a: vsprocs.o ${VOLSERLIBOBJ}
-       -$(RM) -f $@
-       $(AR) crv $@ vsprocs.o ${VOLSERLIBOBJ}
-       $(RANLIB) $@
+       ${CC} ${CFLAGS} -c ${BUCOORD}/ubik_db_if.c
 
 vsprocs.o: ${VOLSER}/vsprocs.c
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${VOLSER}/vsprocs.c
-
-#----------------------------------------------- LWP
+       ${CC} ${CFLAGS} -c ${VOLSER}/vsprocs.c
 
 lock.o: ${LWP}/lock.c
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTCINCLUDE} $$hdrdir -c ${LWP}/lock.c
-
-#----------------------------------------------- BUTC
+       ${CC} ${CFLAGS} -c ${LWP}/lock.c
 
 file_tm.o: ${BUTM}/file_tm.c ${BUTMINCLS}
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir=-I"${XBSADIR}" ; \
-       else                               hdrdir=-I"${XBSA_HDRDIR}" ; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then hdrdir="" ; fi; \
-       ${CC} ${CFLAGS} $$xbsaflags ${BUTMINCLUDE} $$hdrdir -c ${BUTM}/file_tm.c
-
-libbutm.a: ${BUTMOBJS} AFS_component_version_number.o
-       -$(RM) -f libbutm.a
-       $(AR) crv libbutm.a $(BUTMOBJS) AFS_component_version_number.o
-       ${RANLIB} libbutm.a
-
-#-----------------------------------------------
-clean:
-       $(RM) -f *.o *.a core AFS_component_version_number.c butc
-
-pre:
-       if [ "${XBSA_NOBUILD}" = "" ]; then xbsaflags="${XBSA_FLAGS}" ; \
-       else                                xbsaflags=""; \
-       fi; \
-       if [ "$$xbsaflags" = "" ]; then \
-               echo 'Will not build with XBSA'; \
-       else \
-               if [ "${XBSA_HDRDIR}" = "" ]; then hdrdir="${XBSADIR}" ; \
-               else                               hdrdir="${XBSA_HDRDIR}" ; \
-               fi; \
-               if test "$$hdrdir" != "" -a ! -f "$$hdrdir/xbsa.h"; then \
-                       echo '*** This build of butc cannot support XBSA because'; \
-                       echo '*** the required header file "'$$hdrdir'/xbsa.h"'; \
-                       echo '*** does not exist. If you know the pathname to the'; \
-                       echo '*** header file, then use XBSA_HDRDIR="<path>" as a make'; \
-                       echo '*** argument.'; \
-                       echo '*** If you do not want to build an XBSA version of butc,'; \
-                       echo '*** then use XBSA_NOBUILD="true" as a make argument.'; \
-                       exit 2; \
-               else \
-                       echo 'Will use XBSA header files from "'$$hdrdir'" (XBSA_HDRDIR)'; \
-               fi; \
-       fi
+       ${CC} ${CFLAGS} -c ${BUTM}/file_tm.c
 
-all: butc
-
-install install.noversion:  ${DESTDIR}${sbindir}/butc
+#
+# Install targets
+#
+install: ${DESTDIR}${sbindir}/butc
+dest: ${DEST}/etc/butc
 
-noversion: install
-system: install
 ${DEST}/etc/butc: butc
        ${INSTALL} $? $@
 
 ${DESTDIR}${sbindir}/butc: butc
        ${INSTALL} $? $@
 
+#
+# Misc targets
+#
+include ../config/Makefile.version
 
-dest:  ${DEST}/etc/butc
+clean:
+       $(RM) -f *.o *.a core AFS_component_version_number.c butc
 
index 3fc756c62d66b713154201a60fb4e3b2a144587b..f039557c4ec4d5d37262682bb312a899a22ff266 100644 (file)
@@ -25,6 +25,13 @@ RCSID("$Header$");
 #endif
 #include <errno.h>
 #include <lock.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <rx/rx_multi.h>
@@ -50,6 +57,7 @@ int (*ubik_CRXSecurityProc)();
 char *ubik_CRXSecurityRock;
 afs_int32 ubikSecIndex;
 struct rx_securityClass     *ubikSecClass;
+static verifyInterfaceAddress();
 
 
 /* Module responsible for both deciding if we're currently the sync site,
@@ -170,7 +178,7 @@ ubeacon_InitServerListCommon(ame, info, clones, aservers)
     struct ubik_server *magicServer;
 
     /* verify that the addresses passed in are correct */
-    if (code = verifyInterfaceAddress(&ame, info, aservers))
+    if ((code = verifyInterfaceAddress(&ame, info, aservers)))
        return code;
 
     /* get the security index to use, if we can */
@@ -229,7 +237,7 @@ ubeacon_InitServerListCommon(ame, info, clones, aservers)
        }
     } else {
         i = 0;
-        while (servAddr = *aservers++) {
+        while ((servAddr = *aservers++)) {
            if (i >= MAXSERVERS) return UNHOSTS;            /* too many hosts */
            ts = (struct ubik_server *) malloc(sizeof(struct ubik_server));
            memset(ts, 0, sizeof(struct ubik_server));
index bf9785b9f20f82016ff70e11081899ba2de057df..a41aef44bbf2d4c910ebf4173a87dfa25bef29c8 100644 (file)
@@ -20,6 +20,13 @@ RCSID("$Header$");
 #include <netinet/in.h>
 #endif
 #include <errno.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <lock.h>
 #include <rx/xdr.h>
 
index 70f31c46b20294779c4a0bdb2d17478d54f5ed75..0fcaf8f564841bc39ddf46332ba6da67a67e4476 100644 (file)
@@ -25,6 +25,13 @@ RCSID("$Header$");
 #include <lwp.h>
 #include <lock.h>
 #include <errno.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 
 #define        UBIK_INTERNALS 1
 #include "ubik.h"
index b5d6409bd8e34f0b4cb3db97b307e195b46a1bbb..f4b0a40f27795ba1dbcb976f78b8f56365b3b82b 100644 (file)
@@ -23,6 +23,13 @@ RCSID("$Header$");
 #endif
 #include <assert.h>
 #include <lock.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <errno.h>
@@ -365,7 +372,7 @@ urecovery_Initialize(adbase)
  */
 urecovery_Interact() {
     afs_int32 code, tcode;
-    struct ubik_server *bestServer;
+    struct ubik_server *bestServer = NULL;
     struct ubik_server *ts;
     int dbok, doingRPC, now;
     afs_int32 lastProbeTime, lastDBVCheck;
index 6f0d9438e2352a927de221aafa587cb255f3d07d..bb5354a7b037fa99fff08a696569baeb78bfb15e 100644 (file)
@@ -19,6 +19,13 @@ RCSID("$Header$");
 #include <sys/file.h>
 #include <netinet/in.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <lock.h>
 #include <rx/xdr.h>
 #include <rx/rx.h>
@@ -58,7 +65,7 @@ SDISK_Begin(rxcall, atid)
 {
     register afs_int32 code;
 
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
     DBHOLD(ubik_dbase);
@@ -87,7 +94,7 @@ SDISK_Commit(rxcall, atid)
     register afs_int32 code;
     register struct ubik_dbase *dbase;
     
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
 
@@ -125,7 +132,7 @@ SDISK_ReleaseLocks(rxcall, atid)
     register struct ubik_dbase *dbase;
     register afs_int32 code;
 
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
 
@@ -161,7 +168,7 @@ SDISK_Abort(rxcall, atid)
     register afs_int32 code;
     register struct ubik_dbase *dbase;
     
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
 
@@ -200,7 +207,7 @@ SDISK_Lock(rxcall, atid, afile, apos, alen, atype)
     register struct ubik_dbase *dbase;
     struct ubik_trans *ubik_thisTrans;
 
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
     if (!ubik_currentTrans) {
@@ -249,7 +256,7 @@ SDISK_WriteV(rxcall, atid, io_vector, io_buffer)
     struct ubik_iovec *iovec;
     char              *iobuf;
 
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
     if (!ubik_currentTrans) {
@@ -296,7 +303,7 @@ SDISK_Write(rxcall, atid, afile, apos, adata)
     register afs_int32 code;
     register struct ubik_dbase *dbase;
 
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
     if (!ubik_currentTrans) {
@@ -328,7 +335,7 @@ SDISK_Truncate(rxcall, atid, afile, alen)
     register afs_int32 code;
     register struct ubik_dbase *dbase;
 
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
     if (!ubik_currentTrans) { 
@@ -357,7 +364,7 @@ SDISK_GetVersion(rxcall, aversion)
 {
     register afs_int32 code;
 
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
 
@@ -401,7 +408,7 @@ SDISK_GetFile(rxcall, file, version)
     afs_int32 tlen;
     afs_int32 length;
     
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       return code;
     }
 /* temporarily disabled because it causes problems for migration tool.  Hey, it's just
@@ -463,7 +470,7 @@ SDISK_SendFile(rxcall, file, length, avers)
 
     /* send the file back to the requester */
     
-    if (code = ubik_CheckAuth(rxcall)) {
+    if ((code = ubik_CheckAuth(rxcall))) {
       goto failed;
     }
 
@@ -640,7 +647,7 @@ SDISK_SetVersion(rxcall, atid, oldversionp, newversionp)
   afs_int32               code=0;
   struct ubik_dbase   *dbase;
 
-  if (code = ubik_CheckAuth(rxcall)) {
+  if ((code = ubik_CheckAuth(rxcall))) {
      return(code);
   }
 
index a413ba3e9084f1c3c68f79de503e92525ea44feb..12772caa227326648b61b8e37288625032f0d05c 100644 (file)
@@ -22,6 +22,13 @@ RCSID("$Header$");
 #endif
 #include <time.h>
 #include <lock.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <afs/cellconfig.h>
index 0aad08a85f14c570ea87e7112047f0f61ec50460..8a0c119e414fb92e2a402b06c59a931c843c2784 100644 (file)
@@ -23,6 +23,13 @@ RCSID("$Header$");
 #endif
 #include <time.h>
 #include <lock.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 
index 2f9e832f0ee1873499bdd2da16e6216ea174454a..88a40731085d7590ff83b006c0cce27eb544b0d3 100644 (file)
@@ -23,6 +23,13 @@ RCSID("$Header$");
 #endif
 #include <time.h>
 #include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <lock.h>
index 038e027679f8496111bceaa0a0ce87754fc1c0ea..49d05123eafe4b0ea21a074cfddf7bc83b33469f 100644 (file)
@@ -24,6 +24,13 @@ RCSID("$Header$");
 #endif
 #include <time.h>
 #include <stdio.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <lock.h>
index 28e75e2f1d02a76242d8e0833bbd1ad182cd6356..e850aa8773d9a06bee4bc62b7fc3d0e0bb6fd73a 100644 (file)
@@ -21,6 +21,13 @@ RCSID("$Header$");
 #endif
 #include <afs/afsutil.h>
 #include <lock.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <rx/xdr.h>
 #include <rx/rx.h>
 #include <afs/afsutil.h>
index abd0215831ec3ef78e72fbbdf913ff6c9d33057d..9ec65f3408976c4ed78255d4d4d6589108d3bf9c 100644 (file)
@@ -314,8 +314,11 @@ again:
                                                  mode, atime, time);
                    if (errcode == 1) /* this file failed, but keep trying */
                      goto fail_dirbuf;  
-                   if (errcode == -1) /* time to quit */
+                   if (errcode == -1) /* time to quit */ {
+                     fclose(stream);
+                     unlink(dirbuf);
                      return -1;
+                   }
                }
 
            }
index 8604d2aa26d86847f0debda79b2bc25daa2228e9..6d4474f6d7357663d50e2b43f784f076555d2c2b 100644 (file)
@@ -14,6 +14,8 @@ libexecdir=@libexecdir@
 libdir=@libdir@
 includedir=@includedir@
 mandir=@mandir@
+sysconfdir=@sysconfdir@
+localstatedir=@localstatedir@
 COMPILE_ET=${TOP_SRCDIR}/comerr/compile_et
 RXGEN=${TOP_SRCDIR}/rxgen/rxgen
 TOP_SRCDIR=@TOP_SRCDIR@
@@ -438,8 +440,6 @@ test:
        cd test; $(MAKE)
 
 include ../config/Makefile.version
-${DESTDIR}${bindir}/sys: sys
-       ${INSTALL} $? $@
 
 dest: \
        ${DEST}/include/afs/dirpath.h \
index 6363e67ed367e516a24de6092b470ecd4cb0d52d..4f5267544ead49e71a96dcb2f2daa7d7c5712817 100644 (file)
 /* ReallyAbort:  called from assert. May/85 */
 #include <afsconfig.h>
 #include <afs/param.h>
+#include <stdlib.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
 
 RCSID("$Header$");
 
@@ -25,7 +29,14 @@ void afs_NTAbort(void)
 
 void AssertionFailed(char *file, int line)
 {
-    fprintf(stderr, "Assertion failed! file %s, line %d.\n", file, line);
+    char tdate[26];
+    time_t when;
+
+    time(&when);
+    strcpy(tdate, ctime(&when));
+    tdate[24] = '0';
+    fprintf(stderr, "%s: Assertion failed! file %s, line %d.\n",
+       tdate, file, line);
     fflush(stderr);
 #ifdef AFS_NT40_ENV
     afs_NTAbort();
index 7f7dbdfb1854324fe8f0b04286a04ab3e9a20b86..ae44a1db28493cdca1c2324561b63140c34ee46a 100644 (file)
 
 RCSID("$Header$");
 
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <ctype.h>
 #include <stddef.h>
 #include <stdarg.h>
index 1f0cb1c30cb976bd85cff444bd4ba655a7db64c2..d17cf765d8e00b1953206905235abca7c8780754 100644 (file)
@@ -24,13 +24,24 @@ RCSID("$Header$");
 #include <windows.h>
 #include <io.h>
 #include "errmap_nt.h"
-#else
+#endif
+
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#ifdef HAVE_STRING_H
 #include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
 #include <sys/types.h>
 #include <dirent.h>
 #include <sys/stat.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
 #include "fileutil.h"
 
 
index 2e953218a5a81598050006710350b2547d6d8bd7..60ee5a39c03669d589cb783d26497b99e8bb88db 100644 (file)
@@ -18,11 +18,13 @@ RCSID("$Header$");
 #include "ktime.h"
 #include <time.h>
 #include <ctype.h>
-#if defined(AFS_SUN5_ENV) || defined(AFS_NT40_ENV)
+#ifdef HAVE_STRING_H
 #include <string.h>
 #else
+#ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
+#endif
 #include "afsutil.h"
 
 
@@ -39,10 +41,10 @@ static struct parseseqS
     char ps_keychar;
     afs_int32 ps_maxValue;
 } parseseq[] = {
-    KTIMEDATE_YEAR, 'y', MAX_YEAR_VALUE,       /* no max. value */
-    KTIMEDATE_MONTH, 'm', MAX_MONTH_VALUE,     /* months max. 12 */
-    KTIMEDATE_DAY, 'd',        MAX_DAY_VALUE,          /* days max. 31 */
-    0, 0, 0,
+    { KTIMEDATE_YEAR, 'y', MAX_YEAR_VALUE, },          /* no max. value */
+    { KTIMEDATE_MONTH, 'm', MAX_MONTH_VALUE, },                /* months max. 12 */
+    { KTIMEDATE_DAY, 'd',      MAX_DAY_VALUE, },       /* days max. 31 */
+    { 0, 0, 0, }
 };
 
 /* Encodings to and from relative dates. The caller is responsible for
index b2b2207d800b45b15dd761f140ee967002b9c5bc..663a383b7731a07fa332cb533cce0be9e2ab8f23 100644 (file)
@@ -19,11 +19,14 @@ RCSID("$Header$");
 #ifdef AFS_NT40_ENV
 #include <malloc.h>
 #endif
-#if defined(AFS_SUN5_ENV) || defined(AFS_NT40_ENV)
+#ifdef HAVE_STRING_H
 #include <string.h>
 #else
+#ifdef HAVE_STRINGS_H
 #include <strings.h>
 #endif
+#endif
+#include <stdlib.h>
 #include "afsutil.h"
 
 #include "ktime.h"
@@ -50,6 +53,7 @@ static char *day[] = {
 };
 
 /* free token list returned by parseLine */
+#ifdef undef
 static LocalFreeTokens(alist)
     register struct token *alist; {
     register struct token *nlist;
@@ -60,6 +64,7 @@ static LocalFreeTokens(alist)
     }
     return 0;
 }
+#endif
 
 static space(x)
 int x; {
@@ -71,7 +76,7 @@ static LocalParseLine(aline, alist)
     char *aline;
     struct token **alist; {
     char tbuffer[256];
-    register char *tptr;
+    register char *tptr = NULL;
     int inToken;
     struct token *first, *last;
     register struct token *ttok;
@@ -121,26 +126,26 @@ static struct ptemp {
     char *key;
     afs_int32 value;
 } ptkeys [] = {
-    "sun", 0x10000,
-    "mon", 0x10001,
-    "tue", 0x10002,
-    "wed", 0x10003,
-    "thu", 0x10004,
-    "fri", 0x10005,
-    "sat", 0x10006,
-    "sunday", 0x10000,
-    "monday", 0x10001,
-    "tuesday", 0x10002,
-    "wednesday", 0x10003,
-    "thursday", 0x10004,
-    "thur", 0x10004,
-    "friday", 0x10005,
-    "saturday", 0x10006,
-    "am", 0x20000,
-    "pm", 0x20001,
-    "a.m.", 0x20000,
-    "p.m.", 0x20001,
-    0, 0,
+    { "sun", 0x10000, },
+    { "mon", 0x10001, },
+    { "tue", 0x10002, },
+    { "wed", 0x10003, },
+    { "thu", 0x10004, },
+    { "fri", 0x10005, },
+    { "sat", 0x10006, },
+    { "sunday", 0x10000, },
+    { "monday", 0x10001, },
+    { "tuesday", 0x10002, },
+    { "wednesday", 0x10003, },
+    { "thursday", 0x10004, },
+    { "thur", 0x10004, },
+    { "friday", 0x10005, },
+    { "saturday", 0x10006, },
+    { "am", 0x20000, },
+    { "pm", 0x20001, },
+    { "a.m.", 0x20000, },
+    { "p.m.", 0x20001, },
+    { 0, 0, }
 };
 
 /* ktime_DateOf
@@ -395,6 +400,7 @@ struct ktime *aktime; {
 
 
 /* compare date in both formats, and return as in strcmp */
+#ifdef undef
 static KTimeCmp(aktime, atm)
 register struct ktime *aktime;
 register struct tm *atm; {
@@ -418,6 +424,7 @@ register struct tm *atm; {
     }
     return 0;
 }
+#endif
 
 /* compare date in both formats, and return as in strcmp */
 static KDateCmp(akdate, atm)
index 79b99f241719af693396866c9a55c4a68a6c878d..f4629c39a8ec051861f505fc847652e11c04887b 100644 (file)
@@ -37,6 +37,17 @@ RCSID("$Header$");
 #include <sys/time.h>
 #endif /* ITIMER_REAL */
 #include <net/if.h>
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
 #endif
 #include <sys/stat.h>
 #include <fcntl.h>
index 8d28180c7c886bc2ac5d40d8efbcbfbd20e193ea..41aaea35b74407d67c84554e55c5e5f3e5936117 100644 (file)
@@ -3,5 +3,7 @@ Makefile
 cmdebug
 fs
 fstrace
-kdump-2.4.7-ac3
+kdump-*
 up
+kdump
+kdump64
index 8075bfafff19f87272984e1ee98527c11b6fc60b..1d6cdf2680d4120718f0f2702df1d9181d38b9d4 100644 (file)
@@ -69,7 +69,7 @@ CMLIBS=${TOP_LIBDIR}/libsys.a \
 
 LIBS = ${FSLIBS} 
 
-all: fs up fstrace cmdebug kdump kdump64
+all: fs up fstrace cmdebug livesys kdump kdump64
 
 #
 # Build targets
@@ -82,6 +82,9 @@ cacheout.o: cacheout.c
 ${DEST}/bin/fs ${DEST}/root.server/usr/afs/bin/fs: fs
        ${INSTALL} -s $? $@
 
+${DEST}/bin/livesys: livesys
+       ${INSTALL} -s $? $@
+
 ${DEST}/bin/up: up
        ${INSTALL} -s $? $@
 
@@ -106,6 +109,7 @@ ${DEST}/etc/kdump: kdump
                ${INSTALLex} -f kdump.sh.solaris7 $@; \
                ${INSTALL} -s -f $? ${DEST}/etc/kdump32;; \
        *linux* ) \
+               ${INSTALLex} -f kdump.sh.linux $@; \
                ${INSTALL} -s kdump-${LINUX_VERSION} ${DEST}/etc/kdump-${LINUX_VERSION} ;; \
        hp_ux11* ) \
                ${INSTALLex} -f kdump.sh.hp_ux11 $@; \
@@ -134,6 +138,11 @@ fs.o: fs.c ${INCLS} AFS_component_version_number.c
 fs: fs.o $(LIBS)
        ${CC} ${CFLAGS} -g -o fs fs.o ${TOP_LIBDIR}/libprot.a $(LIBS) ${XLIBS}
 
+livesys.o: livesys.c ${INCLS} AFS_component_version_number.c
+
+livesys: livesys.c $(LIBS)
+       ${CC} -g -o livesys $(CFLAGS) livesys.c $(LIBS) ${XLIBS}
+
 twiddle: twiddle.c $(LIBS)
        ${CC} -g -o twiddle $(CFLAGS) twiddle.c $(LIBS) ${XLIBS}
 
@@ -262,6 +271,7 @@ kdump64 : kdump64.o
 #
 install: \
        ${DESTDIR}${bindir}/fs \
+       ${DESTDIR}${bindir}/livesys \
        ${DESTDIR}${afssrvbindir}/fs \
        ${DESTDIR}${bindir}/up \
        ${DESTDIR}${sbindir}/fstrace \
@@ -284,6 +294,9 @@ include ../config/Makefile.version
 ${DESTDIR}${bindir}/fs: fs
        ${INSTALL} -s $? $@
 
+${DESTDIR}${bindir}/livesys: livesys
+       ${INSTALL} -s $? $@
+
 ${DESTDIR}${afssrvbindir}/fs: fs
        ${INSTALL} -s $? $@
 
@@ -330,6 +343,7 @@ ${DESTDIR}${sbindir}/kdump64: kdump64
 
 dest: \
        ${DEST}/bin/fs \
+       ${DEST}/bin/livesys \
        ${DEST}/root.server/usr/afs/bin/fs \
        ${DEST}/bin/up \
        ${DEST}/etc/fstrace \
diff --git a/src/venus/kdump.sh.linux b/src/venus/kdump.sh.linux
new file mode 100644 (file)
index 0000000..af40a22
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+# Copyright 2000, International Business Machines Corporation and others.
+# All Rights Reserved.
+# 
+# This software has been released under the terms of the IBM Public
+# License.  For details, see the LICENSE file in the top-level source
+# directory or online at http://www.openafs.org/dl/license10.html
+
+## Wrapper script for kdump on Linux.
+
+REL=`uname -r`
+DASH='-'
+exec $0${DASH}${REL} ${1+"$@"}
diff --git a/src/venus/livesys.c b/src/venus/livesys.c
new file mode 100644 (file)
index 0000000..f736bb1
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2000, International Business Machines Corporation and others.
+ * All Rights Reserved.
+ * 
+ * This software has been released under the terms of the IBM Public
+ * License.  For details, see the LICENSE file in the top-level source
+ * directory or online at http://www.openafs.org/dl/license10.html
+ */
+
+#include <afsconfig.h>
+#include <afs/param.h>
+
+RCSID("$Header$");
+
+#include <afs/afs_args.h>
+#include <rx/xdr.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <errno.h>
+#include <stdio.h>
+#include <netinet/in.h>
+#include <sys/stat.h>
+#include <afs/stds.h>
+#include <afs/vice.h>
+#include <afs/venus.h>
+#ifdef AFS_AIX32_ENV
+#include <signal.h>
+#endif
+#include <strings.h>
+
+#define        MAXSIZE 2048
+static char space[MAXSIZE];
+
+int main(argc, argv)
+    int argc;
+    char **argv;
+{
+    afs_int32 code;
+    struct ViceIoctl blob;
+    char *input = space;
+    afs_int32 setp = 0;
+
+#ifdef AFS_AIX32_ENV
+    /*
+     * The following signal action for AIX is necessary so that in case of a
+     * crash (i.e. core is generated) we can include the user's data section
+     * in the core dump. Unfortunately, by default, only a partial core is
+     * generated which, in many cases, isn't too useful.
+     */
+    struct sigaction nsa;
+
+    sigemptyset(&nsa.sa_mask);
+    nsa.sa_handler = SIG_DFL;
+    nsa.sa_flags = SA_FULLDUMP;
+    sigaction(SIGSEGV, &nsa, NULL);
+#endif
+
+    blob.in = space;
+    blob.out = space;
+    blob.out_size = MAXSIZE;
+    blob.in_size = sizeof(afs_int32);
+    memcpy(space, &setp, sizeof(afs_int32));
+    code = pioctl(0, VIOC_AFS_SYSNAME, &blob, 1);
+    if (code) {
+       fprintf(stderr, "livesys: %s\n", error_message(code));
+       return 1;
+    }
+    input = space;
+    memcpy(&setp, input, sizeof(afs_int32));
+    input += sizeof(afs_int32);
+    if (!setp) {
+       fprintf(stderr, "No sysname name value was found\n");
+       return 1;
+    }
+    printf("%s\n", input);
+    return 0;
+}
index f3c7a7c5da68804a1bdf391127ba34aed33c3cca..932b9cc9daf72f1ccb8f198588dbef0d47f86bbe 100644 (file)
@@ -1 +1,3 @@
+AFS_component_version_number.c
 Makefile
+vfsck
index b5cc861b193e3ba8e16c36f17022da15b663662d..69b880bf18ea2f7a77bce9159d537780b572c2fd 100644 (file)
@@ -523,7 +523,7 @@ SRXAFS_FetchData (tcon, Fid, Pos, Len, OutStatus, CallBack, Sync)
 
     /* Check whether the caller has permission access to fetch the data */
     if (errorCode = Check_PermissionRights(targetptr, client, rights,
-                                          CHK_FETCHDATA, 0))
+                                          CHK_FETCHDATA, 0)) 
        goto Bad_FetchData;
 
     /*
@@ -783,8 +783,8 @@ Bad_FetchACL:
  * This routine is called exclusively by SRXAFS_FetchStatus(), and should be
  * merged into it when possible.
  */
-SAFSS_FetchStatus (tcon, Fid, OutStatus, CallBack, Sync)
-    struct rx_connection *tcon;                /* Rx connection handle */
+SAFSS_FetchStatus (tcall, Fid, OutStatus, CallBack, Sync)
+    struct rx_call *tcall;
     struct AFSFid *Fid;                        /* Fid of target file */
     struct AFSFetchStatus *OutStatus;  /* Returned status for the fid */
     struct AFSCallBack *CallBack;      /* if r/w, callback promise for Fid */
@@ -799,6 +799,7 @@ SAFSS_FetchStatus (tcon, Fid, OutStatus, CallBack, Sync)
     afs_int32 rights, anyrights;               /* rights for this and any user */
     struct client *t_client;            /* tmp ptr to client data */
     struct in_addr logHostAddr;                /* host ip holder for inet_ntoa */
+    struct rx_connection *tcon = rx_ConnectionOf(tcall);
 
     /* Get ptr to client data for user Id for logging */
     t_client = (struct client *)  rx_GetSpecific(tcon, rxcon_client_key);
@@ -824,8 +825,11 @@ SAFSS_FetchStatus (tcon, Fid, OutStatus, CallBack, Sync)
     /* Are we allowed to fetch Fid's status? */
     if (targetptr->disk.type != vDirectory) {
       if (errorCode = Check_PermissionRights(targetptr, client, rights,
-                                            CHK_FETCHSTATUS, 0))
-       goto Bad_FetchStatus;
+                                            CHK_FETCHSTATUS, 0)) {
+         if (rx_GetCallAbortCode(tcall) == errorCode) 
+             rx_SetCallAbortCode(tcall, 0);
+         goto Bad_FetchStatus;
+      }
     }
 
     /* set OutStatus From the Fid  */
@@ -924,9 +928,12 @@ SRXAFS_BulkStatus(tcon, Fids, OutStats, CallBacks, Sync)
 
        /* Are we allowed to fetch Fid's status? */
        if (targetptr->disk.type != vDirectory) {
-         if (errorCode = Check_PermissionRights(targetptr, client, rights,
-                                              CHK_FETCHSTATUS, 0))
-               goto Bad_BulkStatus;
+           if (errorCode = Check_PermissionRights(targetptr, client, rights,
+                                                  CHK_FETCHSTATUS, 0)) {
+               if (rx_GetCallAbortCode(tcall) == errorCode) 
+                   rx_SetCallAbortCode(tcall, 0);
+               goto Bad_BulkStatus;
+           }
        }
 
        /* set OutStatus From the Fid  */
@@ -984,6 +991,155 @@ Audit_and_Return:
 } /*SRXAFS_BulkStatus*/
 
 
+SRXAFS_InlineBulkStatus(tcon, Fids, OutStats, CallBacks, Sync)
+    struct rx_connection *tcon;
+    struct AFSCBFids *Fids;
+    struct AFSBulkStats *OutStats;
+    struct AFSCBs *CallBacks;
+    struct AFSVolSync *Sync;
+{
+    register int i;
+    afs_int32 nfiles;
+    Vnode * targetptr =        0;              /* pointer to vnode to fetch */
+    Vnode * parentwhentargetnotdir = 0;        /* parent vnode if targetptr is a file */
+    int            errorCode = 0;              /* return code to caller */
+    Volume * volptr = 0;               /* pointer to the volume */
+    struct client *client;             /* pointer to the client data */
+    afs_int32 rights, anyrights;               /* rights for this and any user */
+    register struct AFSFid *tfid;      /* file id we're dealing with now */
+    struct rx_call *tcall = (struct rx_call *) tcon; 
+    AFSFetchStatus *tstatus;
+#if FS_STATS_DETAILED
+    struct fs_stats_opTimingData *opP;      /* Ptr to this op's timing struct */
+    struct timeval opStartTime,
+                   opStopTime;             /* Start/stop times for RPC op*/
+    struct timeval elapsedTime;                    /* Transfer time */
+
+    /*
+     * Set our stats pointer, remember when the RPC operation started, and
+     * tally the operation.
+     */
+    opP = &(afs_FullPerfStats.det.rpcOpTimes[FS_STATS_RPCIDX_BULKSTATUS]);
+    FS_LOCK
+    (opP->numOps)++;
+    FS_UNLOCK
+    TM_GetTimeOfDay(&opStartTime, 0);
+#endif /* FS_STATS_DETAILED */
+
+    ViceLog(1, ("SAFS_InlineBulkStatus\n"));
+    FS_LOCK
+    AFSCallStats.TotalCalls++;
+    FS_UNLOCK
+
+    nfiles = Fids->AFSCBFids_len;      /* # of files in here */
+    if (nfiles <= 0) {                  /* Sanity check */
+       errorCode = EINVAL;
+       goto Audit_and_Return;
+    }
+
+    /* allocate space for return output parameters */
+    OutStats->AFSBulkStats_val = (struct AFSFetchStatus *)
+       malloc(nfiles * sizeof(struct AFSFetchStatus));
+    OutStats->AFSBulkStats_len = nfiles;
+    CallBacks->AFSCBs_val = (struct AFSCallBack *)
+       malloc(nfiles * sizeof(struct AFSCallBack));
+    CallBacks->AFSCBs_len = nfiles;
+
+    if (errorCode = CallPreamble((struct rx_call **) &tcon, ACTIVECALL)) {
+       goto Bad_InlineBulkStatus;
+    }
+
+    tfid = Fids->AFSCBFids_val;
+    for (i=0; i<nfiles; i++, tfid++) {
+       /*
+        * Get volume/vnode for the fetched file; caller's rights to it
+        * are also returned
+        */
+       if (errorCode =
+           GetVolumePackage(tcon, tfid, &volptr, &targetptr,
+                            DONTCHECK, &parentwhentargetnotdir, &client,
+                            READ_LOCK, &rights, &anyrights)) {
+           tstatus = &OutStats->AFSBulkStats_val[i];
+           tstatus->errorCode = errorCode;
+           parentwhentargetnotdir = (Vnode *) 0;
+           targetptr = (Vnode *) 0;
+           volptr = (Volume *) 0;
+           continue;
+       }
+
+       /* set volume synchronization information, but only once per call */
+       if (i == nfiles)
+           SetVolumeSync(Sync, volptr);
+
+       /* Are we allowed to fetch Fid's status? */
+       if (targetptr->disk.type != vDirectory) {
+           if (errorCode = Check_PermissionRights(targetptr, client, rights,
+                                                  CHK_FETCHSTATUS, 0)) {
+               tstatus = &OutStats->AFSBulkStats_val[i];
+               tstatus->errorCode = errorCode;
+               PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0, volptr);
+               parentwhentargetnotdir = (Vnode *) 0;
+               targetptr = (Vnode *) 0;
+               volptr = (Volume *) 0;
+               continue;
+           }
+       }
+
+       /* set OutStatus From the Fid  */
+       GetStatus(targetptr, &OutStats->AFSBulkStats_val[i],
+                 rights, anyrights, parentwhentargetnotdir);
+
+       /* If a r/w volume, also set the CallBack state */
+       if (VolumeWriteable(volptr))
+           SetCallBackStruct(AddBulkCallBack(client->host, tfid),
+                             &CallBacks->AFSCBs_val[i]);
+       else {
+         struct AFSFid myFid;          
+         memset(&myFid, 0, sizeof(struct AFSFid));
+         myFid.Volume = tfid->Volume;
+         SetCallBackStruct(AddVolCallBack(client->host, &myFid),
+                             &CallBacks->AFSCBs_val[i]);
+       }
+
+       /* put back the file ID and volume */
+       PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *) 0, volptr);
+       parentwhentargetnotdir = (Vnode *) 0;
+       targetptr = (Vnode *) 0;
+       volptr = (Volume *) 0;
+    }
+
+Bad_InlineBulkStatus: 
+    /* Update and store volume/vnode and parent vnodes back */
+    PutVolumePackage(parentwhentargetnotdir, targetptr, (Vnode *)0, volptr);
+    CallPostamble(tcon);
+
+#if FS_STATS_DETAILED
+    TM_GetTimeOfDay(&opStopTime, 0);
+    if (errorCode == 0) {
+       FS_LOCK
+        (opP->numSuccesses)++;
+        fs_stats_GetDiff(elapsedTime, opStartTime, opStopTime);
+        fs_stats_AddTo((opP->sumTime), elapsedTime);
+        fs_stats_SquareAddTo((opP->sqrTime), elapsedTime);
+        if (fs_stats_TimeLessThan(elapsedTime, (opP->minTime))) {
+           fs_stats_TimeAssign((opP->minTime), elapsedTime);
+        }
+        if (fs_stats_TimeGreaterThan(elapsedTime, (opP->maxTime))) {
+           fs_stats_TimeAssign((opP->maxTime), elapsedTime);
+        }
+       FS_UNLOCK
+    }  
+
+#endif /* FS_STATS_DETAILED */
+
+Audit_and_Return:
+    ViceLog(2, ("SAFS_InlineBulkStatus returns %d\n", errorCode)); 
+    osi_auditU (tcall, InlineBulkFetchStatusEvent, errorCode, AUD_FIDS, Fids, AUD_END);
+    return 0;
+
+} /*SRXAFS_InlineBulkStatus*/
+
+
 SRXAFS_FetchStatus (tcon, Fid, OutStatus, CallBack, Sync)
     struct AFSVolSync *Sync;
     struct rx_connection *tcon;                /* Rx connection handle */
@@ -1014,7 +1170,7 @@ SRXAFS_FetchStatus (tcon, Fid, OutStatus, CallBack, Sync)
     if (code = CallPreamble((struct rx_call **) &tcon, ACTIVECALL))
        goto Bad_FetchStatus;
 
-    code = SAFSS_FetchStatus (tcon, Fid, OutStatus, CallBack, Sync);
+    code = SAFSS_FetchStatus (tcall, Fid, OutStatus, CallBack, Sync);
 
 Bad_FetchStatus:    
     CallPostamble(tcon);
@@ -2380,15 +2536,15 @@ SAFSS_Symlink (tcon, DirFid, Name, LinkContents, InStatus, OutFid, OutFidStatus,
     }
 
     /*
-     * If we're creating a mount point (owner mode bits sans x bit), we must
-     * have administer access to the directory, too.  Always allow sysadmins
+     * If we're creating a mount point (any x bits clear), we must have
+     * administer access to the directory, too.  Always allow sysadmins
      * to do this.
      */
-    if ((InStatus->Mask & AFS_SETMODE) && !(InStatus->UnixModeBits & 0100)) {
+    if ((InStatus->Mask & AFS_SETMODE) && !(InStatus->UnixModeBits & 0111)) {
        /*
-        * We have a symlink, 'cause we're trying to set the Unix mode bits
-        * to something without the owner x bits (default mode bits if
-        * AFS_SETMODE is false is 0777)
+        * We have a mountpoint, 'cause we're trying to set the Unix mode
+        * bits to something with some x bits missing (default mode bits
+        * if AFS_SETMODE is false is 0777)
         */
        if (VanillaUser(client) && !(rights & PRSFS_ADMINISTER)) {
            errorCode = EACCES;
@@ -6213,8 +6369,8 @@ void GetStatus(targetptr, status, rights, anyrights, parentptr)
 {
     /* initialize return status from a vnode  */
     status->InterfaceVersion = 1;
-    status->SyncCounter = status->dataVersionHigh = status->spare2 =
-    status->spare3 = status->spare4 = 0;
+    status->SyncCounter = status->dataVersionHigh = status->lockCount =
+    status->spare3 = status->errorCode = 0;
     if (targetptr->disk.type == vFile)
        status->FileType = File;
     else if (targetptr->disk.type == vDirectory)
@@ -6237,7 +6393,8 @@ void GetStatus(targetptr, status, rights, anyrights, parentptr)
     status->SegSize = 0;
     status->ServerModTime = targetptr->disk.serverModifyTime;                  
     status->Group = targetptr->disk.group;
-    status->spare2 = targetptr->disk.lock.lockCount;
+    status->lockCount = targetptr->disk.lock.lockCount;
+    status->errorCode = 0;
 
 } /*GetStatus*/
 
index 0d943aafd14a287455fd5a331e727af4d20af3d4..78ea7013142773ff372f5bd13671afbba37e3a46 100644 (file)
@@ -358,7 +358,12 @@ static TAdd(cb, thead)
 
        cb->tprev = thp->tprev;
        cb->tnext = *thead;
-       thp->tprev = (itocb(thp->tprev)->tnext = cbtoi(cb));
+       if (thp) {
+         if (thp->tprev) 
+           thp->tprev = (itocb(thp->tprev)->tnext = cbtoi(cb));
+         else 
+           thp->tprev = cbtoi(cb);
+       }
     }
     cb->thead = ttoi(thead);
 
@@ -374,8 +379,10 @@ static TDel(cb)
 
     if (*thead == cbtoi(cb))
        *thead = (*thead == cb->tnext? 0: cb->tnext);
-    itocb(cb->tprev)->tnext = cb->tnext;
-    itocb(cb->tnext)->tprev = cb->tprev;
+    if (itocb(cb->tprev)) 
+      itocb(cb->tprev)->tnext = cb->tnext;
+    if (itocb(cb->tnext)) 
+      itocb(cb->tnext)->tprev = cb->tprev;
 
 } /*TDel*/
 
index 0cda0be6c7658d801988247f85bf5e5dfab58b6d..31c044d67959f9452b7fb1d07fecaaa7b2f4f539 100644 (file)
@@ -114,8 +114,10 @@ static void GetCEBlock()
     register int i;
 
     block = (struct CEBlock *)malloc(sizeof(struct CEBlock));
-    if (!block)
+    if (!block) {
+       ViceLog(0, ("Failed malloc in GetCEBlock\n"));
        ShutDownAndCore(PANIC);
+    }
 
     for(i = 0; i < (CESPERBLOCK -1); i++) {
        Lock_Init(&block->entry[i].lock);
@@ -137,8 +139,10 @@ static struct client *GetCE()
 
     if (CEFree == 0)
        GetCEBlock();
-    if (CEFree == 0)
+    if (CEFree == 0) {
+       ViceLog(0, ("CEFree NULL in GetCE\n"));
        ShutDownAndCore(PANIC);
+    }
 
     entry = CEFree;
     CEFree = entry->next;
@@ -193,8 +197,10 @@ static void GetHTBlock()
     static int index = 0;
 
     block = (struct HTBlock *)malloc(sizeof(struct HTBlock));
-    if (!block)
+    if (!block) {
+       ViceLog(0, ("Failed malloc in GetHTBlock\n"));
        ShutDownAndCore(PANIC);
+    }
 
 #ifdef AFS_PTHREAD_ENV
     for(i=0; i < (h_HTSPERBLOCK); i++)
@@ -264,14 +270,20 @@ int h_Release_r(host)
     register struct host *host;
 {      
     
-    if (!((host)->holds[h_holdSlot()] &= ~h_holdbit()) ) {
+    if (!((host)->holds[h_holdSlot()] & ~h_holdbit()) ) {
        if (! h_OtherHolds_r(host) ) {
+           /* must avoid masking this until after h_OtherHolds_r runs
+              but it should be run before h_TossStuff_r */
+           (host)->holds[h_holdSlot()] &= ~h_holdbit();
            if ( (host->hostFlags & HOSTDELETED) || 
                (host->hostFlags & CLIENTDELETED) ) {
                h_TossStuff_r(host);
            }           
-       }
-    }
+       } else 
+           (host)->holds[h_holdSlot()] &= ~h_holdbit();
+    } else 
+      (host)->holds[h_holdSlot()] &= ~h_holdbit();
+
     return 0;
 }
 
@@ -1590,8 +1602,8 @@ static int h_DumpHost(host, held, file)
     char tmpStr[256];
 
     H_LOCK
-    sprintf(tmpStr, "ip:%x holds:%d port:%d hidx:%d cbid:%d lock:%x last:%u active:%u down:%d del:%d cons:%d cldel:%d\n\t hpfailed:%d hcpsCall:%u hcps [",
-           host->host, host->holds, host->port, host->index, host->cblist,
+    sprintf(tmpStr, "ip:%x port:%d hidx:%d cbid:%d lock:%x last:%u active:%u down:%d del:%d cons:%d cldel:%d\n\t hpfailed:%d hcpsCall:%u hcps [",
+           host->host, host->port, host->index, host->cblist,
            CheckLock(&host->lock), host->LastCall, host->ActiveCall, 
            (host->hostFlags & VENUSDOWN), host->hostFlags&HOSTDELETED, 
            host->Console, host->hostFlags & CLIENTDELETED, 
@@ -1609,8 +1621,16 @@ static int h_DumpHost(host, held, file)
            sprintf(tmpStr, " %x", host->interface->addr[i]);
            STREAM_WRITE(tmpStr, strlen(tmpStr), 1, file);
        }
-    sprintf(tmpStr, "]\n");
+    sprintf(tmpStr, "] holds: ");
+    STREAM_WRITE(tmpStr, strlen(tmpStr), 1, file);
+
+    for (i = 0 ; i < h_maxSlots ; i++) {
+      sprintf(tmpStr, "%04x", host->holds[i]);
+      STREAM_WRITE(tmpStr, strlen(tmpStr), 1, file);
+    }
+    sprintf(tmpStr, " slot/bit: %d/%d\n", h_holdSlot(), h_holdbit());
     STREAM_WRITE(tmpStr, strlen(tmpStr), 1, file);
+
     H_UNLOCK
     return held;
 
index 4d7fef13626b4fcd83efe7c631de312eec7f193c..0280e7b5e458459e653b13d891ccc6db12c242cf 100644 (file)
@@ -349,6 +349,11 @@ main(argc, argv)
     }
 #endif
     confDir = afsconf_Open(AFSDIR_SERVER_ETC_DIRPATH);
+    if (!confDir) {
+       fprintf(stderr, "Unable to open config directory %s\n",
+               AFSDIR_SERVER_ETC_DIRPATH);
+       exit(-1);
+    }
 
     NewParms(1);
 
index 589e84555c273ebf27e9847d4c3f3e7daec03110..faa568c382606f9d6b37ea4ea34d00a052453b9f 100644 (file)
@@ -175,6 +175,14 @@ struct vldstats {
     afs_int32 reserved[5];                             /* for future usage */
 };
 
+/* Volser information/status */
+const VLOP_MOVE        = 0x10;
+const VLOP_RELEASE     = 0x20;
+const VLOP_BACKUP      = 0x40;
+const VLOP_DELETE      = 0x80;
+const VLOP_DUMP        = 0x100;
+
+%#define VLOP_ALLOPERS ( VLOP_MOVE | VLOP_RELEASE | VLOP_BACKUP | VLOP_DELETE | VLOP_DUMP)
 
 /* defines for convenience of vl users */
 %#define       VLF_RWEXISTS        0x1000  /* flags for whole vldb entry */
index ccd81d6cc5a198261893d8a04335a52522719b4d..0a8beb59e0ff4df4c7b4b4adba5b6f503601b259 100644 (file)
@@ -49,14 +49,6 @@ struct vlheader {
 #define        VLLOCKED        4               /* Advisory lock on entry */
 #define        VLCONTBLOCK     8               /* Special continuation block entry */
 
-/* Vlentry's flags also used to stamp type of ongoing operation */
-#define        VLOP_MOVE       0x10
-#define        VLOP_RELEASE    0x20
-#define        VLOP_BACKUP     0x40
-#define        VLOP_DELETE     0x80
-#define        VLOP_DUMP       0x100
-#define        VLOP_ALLOPERS   (VLOP_MOVE | VLOP_RELEASE | VLOP_BACKUP | VLOP_DELETE | VLOP_DUMP)
-
 /* Valid RelaseLock types */
 #define        LOCKREL_TIMESTAMP   1
 #define        LOCKREL_OPCODE      2
index 648147fe1b40059bde0744668104649e52600c24..154e50f13887f949e6080e6c055e171db645b85b 100644 (file)
@@ -2,3 +2,5 @@ AFS_component_version_number.c
 Makefile
 salvager
 volinfo
+gi
+fs_conv_sol26
index be65cf90bdb6c5e4138414c84536682b3f1e328d..c93d917949d7bafa771e1cc57be3f7914f9fe779 100644 (file)
@@ -97,13 +97,13 @@ ${DEST}/lib/afs/vlib.a: vlib.a
 ${DEST}/lib/afs/libvlib.a: vlib.a
        ${INSTALL} $? $@
 
-${DESTDIR}/${afssrvsbindir}/fs_conv_dux40D:  fs_conv_dux40D
+${DESTDIR}${afssrvsbindir}/fs_conv_dux40D:  fs_conv_dux40D
        ${INSTALL} -s $? $@
 
-${DESTDIR}/${afssrvsbindir}/xfs_size_check:  xfs_size_check
+${DESTDIR}${afssrvsbindir}/xfs_size_check:  xfs_size_check
        ${INSTALL} -s $? $@
 
-${DESTDIR}/${afssrvsbindir}/fs_conv_sol26:  fs_conv_sol26
+${DESTDIR}${afssrvsbindir}/fs_conv_sol26:  fs_conv_sol26
        ${INSTALL} -s $? $@
 
 $(DEST)/root.server/usr/afs/bin/fs_conv_dux40D:  fs_conv_dux40D
index f3b82f19398abe70d9a29b36115d05a6e9f2df69..569552b34950f92f41dee61c45135b3cc93fda76 100644 (file)
@@ -448,7 +448,7 @@ StreamHandle_t *stream_fdopen(FD_t fd)
 }
 
 /* Open a file for buffered I/O */
-StreamHandle_t *stream_open(char *filename, char *mode)
+StreamHandle_t *stream_open(const char *filename, const char *mode)
 {
     FD_t fd;
 
index 93fa5b65cba93b8b5d92a742296fe18496d81f0a..a14f2f7f1518190b1dd5e5cc587b47fc35094f7e 100644 (file)
@@ -258,7 +258,7 @@ extern FdHandle_t *ih_open(IHandle_t *ihP);
 extern int fd_close(FdHandle_t *fdP);
 extern int fd_reallyclose(FdHandle_t *fdP);
 extern StreamHandle_t *stream_fdopen(FD_t fd);
-extern StreamHandle_t *stream_open(char *file, char *mode);
+extern StreamHandle_t *stream_open(const char *file, const char *mode);
 extern int stream_read(void *ptr, int size, int nitems,
                       StreamHandle_t *streamP);
 extern int stream_write(void *ptr, int size, int nitems,
index e540587507a11af8fc1ec7072bc89d7614bfb4c5..e1cb1f63d93387996258300ac89a3276260e3b8d 100644 (file)
@@ -204,6 +204,10 @@ int namei_ViceREADME(char *partition)
    char filename[32];
    int fd;
 
+   /* Create the inode directory if we're starting for the first time */
+   sprintf(filename, "%s/%s", partition, INODEDIR);
+   mkdir(filename, 0700);
+
    sprintf(filename, "%s/%s/README", partition, INODEDIR);
    fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0444);
    if (fd >= 0) {
index 2717722581c4a0f4df58918495c5609a4dfbb419..cb16224a5a45fdf4b4ce9bac4594f770e912ed42 100644 (file)
@@ -196,11 +196,13 @@ static void VInitPartition_r(char *path, char *devname, Device dev)
     dp->next = 0;
     strcpy(dp->name, path);
 #if defined(AFS_NAMEI_ENV) && !defined(AFS_NT40_ENV)
-#ifdef AFS_SUN5_ENV
-    strcpy(dp->devName, devname);
-#else /* AFS_SUN5_ENV */
+    /* Create a lockfile for the partition, of the form /vicepa/Lock/vicepa */
     strcpy(dp->devName, path);
-#endif
+    strcat(dp->devName, "/");
+    strcat(dp->devName, "Lock");
+    mkdir(dp->devName, 0700);
+    strcat(dp->devName, path);
+    close(open(dp->devName, O_RDWR | O_CREAT, 0600));
     dp->device = volutil_GetPartitionID(path);
 #else
     strcpy(dp->devName, devname);
@@ -312,6 +314,59 @@ int VCheckPartition(part, devname)
 
     return 0;
 }
+
+/* VIsAlwaysAttach() checks whether a /vicepX directory should always be
+ * attached (return value 1), or only attached when it is a separately
+ * mounted partition (return value 0).  For non-NAMEI environments, it
+ * always returns 0.
+ */
+static int VIsAlwaysAttach(part)
+    char *part;
+{
+#ifdef AFS_NAMEI_ENV
+    struct stat st;
+    char checkfile[256];
+    int ret;
+
+    if (strncmp(part, VICE_PARTITION_PREFIX, VICE_PREFIX_SIZE))
+       return 0;
+
+    strncpy(checkfile, part, 100);
+    strcat(checkfile, "/");
+    strcat(checkfile, VICE_ALWAYSATTACH_FILE);
+
+    ret = stat(checkfile, &st);
+    return (ret < 0) ? 0 : 1;
+#else  /* AFS_NAMEI_ENV */
+    return 0;
+#endif /* AFS_NAMEI_ENV */
+}
+
+/* VAttachPartitions2() looks for and attaches /vicepX partitions
+ * where a special file (VICE_ALWAYSATTACH_FILE) exists.  This is
+ * used to attach /vicepX directories which aren't on dedicated
+ * partitions, in the NAMEI fileserver.
+ */
+void VAttachPartitions2() {
+#ifdef AFS_NAMEI_ENV
+    DIR *dirp;
+    struct dirent *de;
+    char pname[32];
+
+    dirp = opendir("/");
+    while (de = readdir(dirp)) {
+       strcpy(pname, "/");
+       strncat(pname, de->d_name, 20);
+       pname[sizeof(pname)-1] = '\0';
+
+       /* Only keep track of "/vicepx" partitions since automounter
+          may hose us */
+       if (VIsAlwaysAttach(pname))
+           VCheckPartition(pname, "");
+    }
+    closedir(dirp);
+#endif /* AFS_NAMEI_ENV */
+}
 #endif /* AFS_NT40_ENV */
 
 #ifdef AFS_SUN5_ENV
@@ -332,11 +387,18 @@ int VAttachPartitions(void)
            (strncmp(mnt.mnt_mntopts, "ro,ignore",9) ==0)) 
            continue; 
 
+       /* If we're going to always attach this partition, do it later. */
+       if (VIsAlwaysAttach(mnt.mnt_mountp))
+           continue;
+
        if (VCheckPartition(mnt.mnt_mountp, mnt.mnt_special) < 0 )
            errors ++;
     }
 
-   (void) fclose(mntfile);
+    (void) fclose(mntfile);
+
+    /* Process the always-attach partitions, if any. */
+    VAttachPartitions2();
 
     return errors ;
 }
@@ -356,12 +418,19 @@ int VAttachPartitions(void)
     while (mntent = getmntent(mfd)) {
        if (!hasmntopt(mntent, MNTOPT_RW)) continue;
        
+       /* If we're going to always attach this partition, do it later. */
+       if (VIsAlwaysAttach(mntent->mnt_dir))
+           continue;
+
        if (VCheckPartition(mntent->mnt_dir, mntent->mnt_fsname) < 0 )
            errors ++;
     }
 
     endmntent(mfd);
 
+    /* Process the always-attach partitions, if any. */
+    VAttachPartitions2();
+
     return errors ;
 }
 #endif
@@ -449,11 +518,18 @@ int VAttachPartitions(void)
        }
 #endif
 
+       /* If we're going to always attach this partition, do it later. */
+       if (VIsAlwaysAttach(part))
+           continue;
+
        if (VCheckPartition(part, vmt2dataptr(vmountp, VMT_OBJECT)) < 0 )
            errors ++;
     }
-    return errors ;
 
+    /* Process the always-attach partitions, if any. */
+    VAttachPartitions2();
+
+    return errors ;
 }
 #endif
 #if defined(AFS_DUX40_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
@@ -470,11 +546,18 @@ int VAttachPartitions(void)
     while (fsent = getfsent()) {
        if (strcmp(fsent->fs_type, "rw") != 0) continue;
 
+       /* If we're going to always attach this partition, do it later. */
+       if (VIsAlwaysAttach(fsent->fs_file))
+           continue;
+
        if (VCheckPartition(fsent->fs_file, fsent->fs_spec) < 0 )
            errors ++;
     }
     endfsent();
     
+    /* Process the always-attach partitions, if any. */
+    VAttachPartitions2();
+
     return errors ;
 }
 #endif
@@ -644,11 +727,18 @@ int VAttachPartitions(void)
        }
     }
     while (mntent = getmntent(mfd)) {
+       /* If we're going to always attach this partition, do it later. */
+       if (VIsAlwaysAttach(mntent->mnt_dir))
+           continue;
+
        if (VCheckPartition(mntent->mnt_dir, mntent->mnt_fsname) < 0 )
            errors ++;
     }
     endmntent(mfd);
 
+    /* Process the always-attach partitions, if any. */
+    VAttachPartitions2();
+
     return errors ;
 }
 #endif /* AFS_LINUX22_ENV */
@@ -1001,7 +1091,7 @@ void VLockPartition_r(char *name)
        assert (lockf(dp->lock_fd, F_LOCK, 0) != -1); 
 #else
        assert (flock(dp->lock_fd, LOCK_EX) == 0);
-#endif /* defined(AFS_AIX_ENV) */
+#endif /* defined(AFS_AIX_ENV) || defined(AFS_SUN5_ENV) */
 #endif
 }
 
index c6414034512a080d3f92824a8198c7ee9d109178..c583bd0af61fc8c901b306d29e916ece93735232 100644 (file)
 #define VICE_PARTITION_PREFIX  "/vicep"
 #define VICE_PREFIX_SIZE       (sizeof(VICE_PARTITION_PREFIX)-1)
 
+/* If a file by this name exists in a /vicepX directory, it means that
+ * this directory should be used as an AFS partition even if it's not
+ * on a separate partition (for instance if it's part of a large /).
+ * This feature only works with the NAMEI fileserver.
+ */
+#ifdef AFS_NAMEI_ENV
+#define VICE_ALWAYSATTACH_FILE "AlwaysAttach"
+#endif
+
 /* For NT, the roles of "name" and "devName" are reversed. That is, "name"
  * refers to the drive letter name and "devName" refers to the /vicep style
  * or name. The reason for this is that a lot of places assume that "name"
index 93bce59f570f3759bd338cae91bce74308194223..547e99a28e346cecf5e7ffee8b16acadf1c499c3 100644 (file)
@@ -626,6 +626,10 @@ char *newName;
     ClearVolumeStats(&V_disk(newvp));
     V_destroyMe(newvp) = DESTROY_ME;
     V_inService(newvp) = 0;
+    if (newType == backupVolume) {
+       V_backupDate(originalvp) = V_copyDate(newvp);
+       V_backupDate(newvp) = V_copyDate(newvp);
+    }
     V_inUse(newvp) = 0;
     VUpdateVolume(&error, newvp);
     if (error) {
@@ -779,6 +783,10 @@ afs_int32 cloneId;
     ClearVolumeStats(&V_disk(clonevp));
     V_destroyMe(clonevp) = 0;
     V_inService(clonevp) = 0;
+    if (newType == backupVolume) {
+       V_backupDate(originalvp) = V_copyDate(clonevp);
+       V_backupDate(clonevp) = V_copyDate(clonevp);
+    }
     V_inUse(clonevp) = 0;
     VUpdateVolume(&error, clonevp);
     if (error) {
@@ -1585,13 +1593,11 @@ struct rx_call *acid;
 struct pIDs *partIds;
 {   
     char namehead[9];
-    struct stat rbuf, pbuf;
     int code;
     char i;
 
     strcpy(namehead, "/vicep");        /*7 including null terminator*/
 
-#ifdef AFS_NT40_ENV
     /* Just return attached partitions. */
     namehead[7] = '\0';
     for (i=0; i<26; i++) {
@@ -1599,23 +1605,7 @@ struct pIDs *partIds;
        if (VGetPartition(namehead, 0))
            partIds->partIds[i] = VGetPartition(namehead, 0) ? i : -1;
     }
-#else
-    
-    (void) stat("/",&rbuf);    /*interested in buf->st_dev*/
-   
-    for(i = 0 ; i < 26 ; i++){
-       
-       namehead[6] = i + 'a';
-       namehead[7] = '\0';
-       code = stat(namehead,&pbuf);
-       if(!code){
-           if(rbuf.st_dev != pbuf.st_dev) /*the partition is mounted */
-               partIds->partIds[i] = i ;
-           else  partIds->partIds[i ] = -1;
-       }
-       else partIds->partIds[i ] = -1;
-    }
-#endif   
+
     return 0;
 }
 
@@ -1639,10 +1629,12 @@ struct partEntries *pEntries;
     struct stat rbuf, pbuf;
     char namehead[9];
     struct partList partList;
-    int code, i, j=0, k;
+    struct DiskPartition *dp;
+    int i, j=0, k;
 
     strcpy(namehead, "/vicep");        /*7 including null terminator*/
-#ifdef AFS_NT40_ENV
+
+    /* Only report attached partitions */
     for(i = 0 ; i < VOLMAXPARTS; i++){
        if (i < 26) {
            namehead[6] = i + 'a';
@@ -1653,35 +1645,13 @@ struct partEntries *pEntries;
            namehead[7] = 'a' + (k%26);
            namehead[8] = '\0';
        }
-       code = VGetPartition(namehead, 0);
-       if (code)
+       dp = VGetPartition(namehead, 0);
+       if (dp)
            partList.partId[j++] = i;
     }
     pEntries->partEntries_val = (afs_int32 *) malloc(j * sizeof(int));
     memcpy((char *)pEntries->partEntries_val, (char *)&partList, j * sizeof(int));
     pEntries->partEntries_len = j;
-#else
-    code = stat("/",&rbuf);    /*interested in buf->st_dev*/
-    for(i = 0 ; i < VOLMAXPARTS; i++){
-       if (i < 26) {
-           namehead[6] = i + 'a';
-           namehead[7] = '\0';
-       } else {
-           k = i - 26;
-           namehead[6] = 'a' + (k/26);
-           namehead[7] = 'a' + (k%26);
-           namehead[8] = '\0';
-       }
-       code = stat(namehead,&pbuf);
-       if(!code){
-           if(rbuf.st_dev != pbuf.st_dev) /*the partition is mounted */
-               partList.partId[j++] = i;
-       }
-    } 
-    pEntries->partEntries_val = (afs_int32 *) malloc(j * sizeof(int));
-    memcpy((char *)pEntries->partEntries_val, (char *)&partList, j * sizeof(int));
-    pEntries->partEntries_len = j;
-#endif
     return 0;
 
 }
index 4bb13638b11a15de8dca8db1b9361559b70373d1..74f580decb13088ff6a76a7d02719a28c92af1a8 100644 (file)
@@ -152,6 +152,7 @@ struct partList {   /*used by the backup system */
 /* Values for the UV_RestoreVolume flags parameter */
 #define RV_FULLRST 0x1
 #define RV_OFFLINE 0x2
+#define RV_RDONLY  0x10000
 
 #endif /* _VOLSER_ */
 
index 3957954424acbf0c3b163c28477fa86e50ea522a..6f850654623dbb80e79d8613a20dba5bf03b8523 100644 (file)
@@ -67,6 +67,7 @@ cmd_AddParm(ts, "-cell", CMD_SINGLE, CMD_OPTIONAL, "cell name");\
 cmd_AddParm(ts, "-noauth", CMD_FLAG, CMD_OPTIONAL, "don't authenticate");\
 cmd_AddParm(ts, "-localauth",CMD_FLAG,CMD_OPTIONAL,"use server tickets");\
 cmd_AddParm(ts, "-verbose", CMD_FLAG, CMD_OPTIONAL, "verbose");\
+cmd_AddParm(ts, "-crypt", CMD_FLAG, CMD_OPTIONAL, "encrypt commands");\
 
 #define ERROR_EXIT(code) {error=(code); goto error_exit;}
 
@@ -79,6 +80,8 @@ const char *confdir;
 extern struct rx_connection *UV_Bind();
 extern  struct rx_securityClass *rxnull_NewClientSecurityObject();
 extern int UV_SetSecurity();
+extern int UV_SetVolumeInfo();
+extern int vsu_SetCrypt();
 extern VL_SetLock();
 extern VL_ReleaseLock();
 extern VL_DeleteEntry();
@@ -1274,6 +1277,86 @@ register struct cmd_syndesc *as;
     return (error);
 }
 
+/*------------------------------------------------------------------------
+ * PRIVATE SetFields
+ *
+ * Description:
+ *     Routine used to change the status of a single volume.
+ *
+ * Arguments:
+ *     as : Ptr to parsed command line arguments.
+ *
+ * Returns:
+ *     0 for a successful operation,
+ *     Otherwise, one of the ubik or VolServer error values.
+ *
+ * Environment:
+ *     Nothing interesting.
+ *
+ * Side Effects:
+ *     As advertised.
+ *------------------------------------------------------------------------
+ */
+static SetFields(as)
+register struct cmd_syndesc *as;
+{
+    struct nvldbentry entry;
+    afs_int32 vcode = 0;
+    volintInfo info;
+    afs_int32 volid;
+    afs_int32 code, err;
+    afs_int32 aserver, apart;
+    int previdx = -1;
+
+    volid = vsu_GetVolumeID(as->parms[0].items->data, cstruct, &err);    /* -id */
+    if (volid == 0) {
+       if (err) PrintError("", err);
+       else fprintf(STDERR, "Unknown volume ID or name '%s'\n", as->parms[0].items->data);
+       return -1;
+    }
+
+    code = VLDB_GetEntryByID (volid, RWVOL, &entry);
+    if (code) {
+       fprintf(STDERR, "Could not fetch the entry for volume number %u from VLDB \n",volid);
+       return (code);
+    }
+    MapHostToNetwork(&entry);
+
+    GetServerAndPart(&entry, RWVOL, &aserver, &apart, &previdx);
+    if (previdx == -1) {
+       fprintf(STDERR,"Volume %s does not exist in VLDB\n\n", as->parms[0].items->data);
+       return (ENOENT);
+    }
+
+    memset(&info, 0, sizeof(info));
+    info.volid    = volid;
+    info.type     = RWVOL;
+    info.dayUse   = -1;
+    info.maxquota = -1;
+    info.flags    = -1;
+    info.spare0   = -1;
+    info.spare1   = -1;
+    info.spare2   = -1;
+    info.spare3   = -1;
+
+    if (as->parms[1].items) {
+       /* -max <quota> */
+       code = util_GetInt32(as->parms[1].items->data, &info.maxquota);
+       if (code) {
+           fprintf(STDERR,"invalid quota value\n");
+           return code;
+       }
+    }
+    if (as->parms[2].items) {
+       /* -clearuse */
+       info.dayUse = 0;
+    }
+    code = UV_SetVolumeInfo(aserver, apart, volid, &info);
+    if (code)
+       fprintf(STDERR,"Could not update volume info fields for volume number %u\n",volid);
+    return (code);
+}
+
 /*------------------------------------------------------------------------
  * PRIVATE volOnline
  *
@@ -1882,7 +1965,7 @@ register struct cmd_syndesc *as;
 {    
         afs_int32 avolid, aserver, apart, code,vcode, err;
        afs_int32 aoverwrite = ASK;
-       int restoreflags;
+       int restoreflags, readonly = 0, offline = 0, voltype = RWVOL;
        char prompt;
        char afilename[NameLen], avolname[VOLSER_MAXVOLNAME +1],apartName[10];
        char volname[VOLSER_MAXVOLNAME +1];
@@ -1922,6 +2005,11 @@ register struct cmd_syndesc *as;
                exit(1);
            }
        }
+       if (as->parms[6].items) offline = 1;
+       if (as->parms[7].items) {
+           readonly = 1;
+           voltype = ROVOL;
+       }
 
        aserver = GetServer(as->parms[0].items->data);
        if (aserver == 0) {
@@ -1968,17 +2056,19 @@ register struct cmd_syndesc *as;
                fprintf(STDERR,"Volume does not exist; Will perform a full restore\n");
        }
 
-       else if (Lp_GetRwIndex(&entry) == -1) {    /* RW volume does not exist - do a full */
-          restoreflags = RV_FULLRST;
-          if ( (aoverwrite == INC) || (aoverwrite == ABORT) )
-             fprintf(STDERR,"RW Volume does not exist; Will perform a full restore\n");
+       else if ((!readonly && Lp_GetRwIndex(&entry) == -1)        /* RW volume does not exist - do a full */
+            ||  (readonly && !Lp_ROMatch(0, 0, &entry))) {        /* RO volume does not exist - do a full */
+           restoreflags = RV_FULLRST;
+           if ( (aoverwrite == INC) || (aoverwrite == ABORT) )
+               fprintf(STDERR,"%s Volume does not exist; Will perform a full restore\n",
+                       readonly ? "RO" : "RW");
 
-          if (avolid == 0) {
-             avolid = entry.volumeId[RWVOL];
-          }
-          else if (entry.volumeId[RWVOL] != 0  && entry.volumeId[RWVOL] != avolid) {
-             avolid = entry.volumeId[RWVOL];
-          }
+           if (avolid == 0) {
+               avolid = entry.volumeId[voltype];
+           }
+           else if (entry.volumeId[voltype] != 0  && entry.volumeId[voltype] != avolid) {
+               avolid = entry.volumeId[voltype];
+           }
        }
 
        else {                    /* volume exists - do we do a full incremental or abort */
@@ -1987,10 +2077,10 @@ register struct cmd_syndesc *as;
            char   c, dc;
 
            if(avolid == 0) {
-               avolid = entry.volumeId[RWVOL];
+               avolid = entry.volumeId[voltype];
            }
-           else if(entry.volumeId[RWVOL] != 0  && entry.volumeId[RWVOL] != avolid) {
-               avolid = entry.volumeId[RWVOL];
+           else if(entry.volumeId[voltype] != 0  && entry.volumeId[voltype] != avolid) {
+               avolid = entry.volumeId[voltype];
            }
            
            /* A file name was specified  - check if volume is on another partition */
@@ -2014,14 +2104,14 @@ register struct cmd_syndesc *as;
                /* Ask what to do */
                if (vol_elsewhere) {
                    fprintf(STDERR,"The volume %s %u already exists on a different server/part\n",
-                           volname, entry.volumeId[RWVOL]);
+                           volname, entry.volumeId[voltype]);
                    fprintf(STDERR, 
                            "Do you want to do a full restore or abort? [fa](a): ");
                }
                else
                {
                    fprintf(STDERR,"The volume %s %u already exists in the VLDB\n",
-                           volname, entry.volumeId[RWVOL]);
+                           volname, entry.volumeId[voltype]);
                    fprintf(STDERR, 
                            "Do you want to do a full/incremental restore or abort? [fia](a): ");
                }
@@ -2044,12 +2134,14 @@ register struct cmd_syndesc *as;
                restoreflags = 0;
                if (vol_elsewhere) {
                    fprintf(STDERR,
-                           "RW volume %u already exists on a different server/part; not allowed\n",
-                           avolid);
+                           "%s volume %u already exists on a different server/part; not allowed\n",
+                           readonly ? "RO" : "RW", avolid);
                    exit(1);
                }
            }
        }
+       if (offline)  restoreflags |= RV_OFFLINE;
+       if (readonly) restoreflags |= RV_RDONLY;
        code = UV_RestoreVolume(aserver, apart, avolid, avolname,
                                restoreflags, WriteData, afilename);
        if (code) {
@@ -2167,6 +2259,42 @@ register struct cmd_syndesc *as;
        fprintf(STDOUT,"Removed replication site %s %s for volume %s\n",as->parms[0].items->data,apartName,as->parms[2].items->data);
     return 0;
 }
+static ChangeLocation(as)
+register struct cmd_syndesc *as;
+{
+   afs_int32 avolid, aserver, apart,code, err;
+   char apartName[10];
+
+       avolid = vsu_GetVolumeID(as->parms[2].items->data, cstruct, &err);
+       if (avolid == 0) {
+           if (err) PrintError("", err);
+           else fprintf(STDERR, "vos: can't find volume '%s'\n", as->parms[2].items->data);
+           exit(1);
+       }
+       aserver = GetServer(as->parms[0].items->data);
+       if (aserver == 0) {
+           fprintf(STDERR,"vos: server '%s' not found in host table\n", as->parms[0].items->data);
+           exit(1);
+       }
+       apart = volutil_GetPartitionID(as->parms[1].items->data);
+       if (apart < 0) {
+           fprintf(STDERR,"vos: could not interpret partition name '%s'\n",as->parms[1].items->data );
+           exit(1);
+       }
+       if (!IsPartValid(apart,aserver,&code)){/*check for validity of the partition */
+           if(code) PrintError("",code);
+           else fprintf(STDERR,"vos : partition %s does not exist on the server\n",as->parms[1].items->data);
+           exit(1);
+       }
+       code = UV_ChangeLocation(aserver, apart, avolid);
+       if (code) {
+           PrintDiagnostics("addsite", code);
+           exit(1);
+       }
+       MapPartIdIntoName(apart,apartName);
+       fprintf(STDOUT,"Changed location to %s %s for volume %s\n",as->parms[0].items->data, apartName,as->parms[2].items->data);
+   return 0;
+}
 
 static ListPartitions(as)
 register struct cmd_syndesc *as;
@@ -3799,6 +3927,8 @@ char *arock; {
        tcell = as->parms[12].items->data;
     if(as->parms[14].items)    /* -serverauth specified */
        sauth = 1;
+    if(as->parms[16].items)    /* -crypt specified */
+       vsu_SetCrypt(1);
     if (code = vsu_ClientInit((as->parms[13].items != 0), confdir, tcell, sauth,
                              &cstruct, UV_SetSecurity)) {
        fprintf(STDERR,"could not initialize VLDB library (code=%u) \n",code);
@@ -3896,12 +4026,22 @@ char **argv; {
     cmd_AddParm(ts, "-file", CMD_SINGLE,CMD_OPTIONAL, "dump file");
     cmd_AddParm(ts, "-id", CMD_SINGLE,CMD_OPTIONAL,  "volume ID");
     cmd_AddParm(ts, "-overwrite", CMD_SINGLE,CMD_OPTIONAL,  "abort | full | incremental");
+    cmd_AddParm(ts, "-offline", CMD_FLAG, CMD_OPTIONAL,
+               "leave restored volume offline");
+    cmd_AddParm(ts, "-readonly", CMD_FLAG, CMD_OPTIONAL,
+               "make restored volume read-only");
     COMMONPARMS;
 
     ts = cmd_CreateSyntax("unlock", LockReleaseCmd, 0, "release lock on VLDB entry for a volume");
     cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID");
     COMMONPARMS;
 
+    ts = cmd_CreateSyntax("changeloc", ChangeLocation, 0, "change an RW volume's location in the VLDB");
+    cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name for new location");
+    cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name for new location");
+    cmd_AddParm(ts, "-id", CMD_SINGLE, 0, "volume name or ID");
+    COMMONPARMS;
+
     ts = cmd_CreateSyntax("addsite", AddSite, 0, "add a replication site");
     cmd_AddParm(ts, "-server", CMD_SINGLE, 0, "machine name for new site");
     cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name for new site");
@@ -3955,6 +4095,12 @@ char **argv; {
     COMMONPARMS;
     cmd_CreateAlias (ts, "volinfo");
 
+    ts = cmd_CreateSyntax("setfields", SetFields, 0, "change volume info fields");
+    cmd_AddParm(ts, "-id",        CMD_SINGLE, 0, "volume name or ID");
+    cmd_AddParm(ts, "-maxquota", CMD_SINGLE, CMD_OPTIONAL, "quota (KB)");
+    cmd_AddParm(ts, "-clearuse",  CMD_FLAG,   CMD_OPTIONAL, "clear dayUse");
+    COMMONPARMS;
+
     ts = cmd_CreateSyntax("offline", volOffline, 0, (char *) CMD_HIDDEN);
     cmd_AddParm(ts, "-server",    CMD_SINGLE, 0, "server name");
     cmd_AddParm(ts, "-partition", CMD_SINGLE, 0, "partition name");
index 5e5a9c022600d21624a92f4de1a92c4d016ebcbc..5ef020fd7c7a9c40d39af5d45ca6166f5843b580 100644 (file)
@@ -2561,7 +2561,7 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
     int islocked;
     struct restoreCookie cookie;
     int reuseID;
-    afs_int32 newDate, volflag;
+    afs_int32 newDate, volflag, voltype, volsertype;
     int index, same, errcode;
     char apartName[10];
 
@@ -2577,6 +2577,14 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
     totid = 0;
     temptid = 0;
 
+    if (flags & RV_RDONLY) {
+       voltype    = ROVOL;
+       volsertype = volser_RO;
+    } else {
+       voltype    = RWVOL;
+       volsertype = volser_RW;
+    }
+
     pvolid = tovolid;
     toconn = UV_Bind(toserver, AFSCONF_VOLUMEPORT);
     if(pvolid == 0) {/*alot a new id if needed */
@@ -2589,8 +2597,19 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
                goto refail;
            }
            reuseID = 0;
-        }
-       else{
+        } else if (flags & RV_RDONLY) {
+           if (entry.flags & RW_EXISTS) {
+               fprintf(STDERR,"Entry for ReadWrite volume %s already exists!\n",entry.name);
+               error = VOLSERBADOP;
+               goto refail;
+           }
+           if (!entry.volumeId[ROVOL]) {
+               fprintf(STDERR,"Existing entry for volume %s has no ReadOnly ID\n",tovolname);
+               error = VOLSERBADOP;
+               goto refail;
+           }
+           pvolid = entry.volumeId[ROVOL];
+       } else {
            pvolid = entry.volumeId[RWVOL];
        }
     }/* at this point we have a volume id to use/reuse for the volume to be restored */
@@ -2604,9 +2623,7 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
     fprintf(STDOUT,"Restoring volume %s Id %u on server %s partition %s ..", tovolname,
            pvolid, hostutil_GetNameByINet(toserver), partName);
     fflush(STDOUT);
-    /*what should the volume be restored as ? rw or ro or bk ?
-      right now the default is rw always */
-    code = AFSVolCreateVolume(toconn, topart, tovolname, volser_RW, 0,&pvolid, &totid);
+    code = AFSVolCreateVolume(toconn, topart, tovolname, volsertype, 0,&pvolid, &totid);
     if (code){
        if (flags & RV_FULLRST) { /* full restore: delete then create anew */
            if(verbose) {
@@ -2640,7 +2657,7 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
                goto refail;
            }
            if (verbose) fprintf(STDOUT," done\n");
-           code = AFSVolCreateVolume(toconn, topart, tovolname, volser_RW, 0,&pvolid, &totid);
+           code = AFSVolCreateVolume(toconn, topart, tovolname, volsertype, 0,&pvolid, &totid);
            if (code){
                fprintf(STDERR,"Could not create new volume %u\n",pvolid);
                error = code;
@@ -2657,7 +2674,7 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
        }
     }
     cookie.parent = pvolid;
-    cookie.type = RWVOL;
+    cookie.type = voltype;
     cookie.clone = 0;
     strncpy(cookie.name,tovolname,VOLSER_OLDMAXVOLNAME);
 
@@ -2683,11 +2700,11 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
     }
     code = AFSVolGetStatus(toconn,totid, &tstatus);
     if(code) {
-       fprintf(STDERR,"Could not get status information about the volume %u\n",tovolid);
+       fprintf(STDERR,"Could not get status information about the volume %u\n",pvolid);
        error = code;
        goto refail;
     }
-    code = AFSVolSetIdsTypes(toconn,totid, tovolname, RWVOL, pvolid,0,0);
+    code = AFSVolSetIdsTypes(toconn,totid, tovolname, voltype, pvolid,0,0);
     if(code) {
        fprintf(STDERR,"Could not set the right type and ID on %u\n",pvolid); 
        error = code;
@@ -2726,7 +2743,7 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
         /* Volume was restored on the file server, update the 
         * VLDB to reflect the change.
         */
-       vcode = VLDB_GetEntryByID(pvolid,RWVOL, &entry);
+       vcode = VLDB_GetEntryByID(pvolid,voltype, &entry);
        if(vcode && vcode != VL_NOENT && vcode != VL_ENTDELETED) {
            fprintf(STDERR,"Could not fetch the entry for volume number %u from VLDB \n",pvolid);
            error = vcode;
@@ -2740,9 +2757,11 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
            entry.nServers = 1;
            entry.serverNumber[0] = toserver;/*should be indirect */
            entry.serverPartition[0] = topart;
-           entry.serverFlags[0] = ITSRWVOL;
-           entry.flags = RW_EXISTS;
-           if(tstatus.cloneID != 0){
+           entry.serverFlags[0] = (flags & RV_RDONLY) ? ITSROVOL : ITSRWVOL;
+           entry.flags = (flags & RV_RDONLY) ? RO_EXISTS : RW_EXISTS;
+           if (flags & RV_RDONLY)
+               entry.volumeId[ROVOL] = pvolid;
+           else if(tstatus.cloneID != 0){
                entry.volumeId[ROVOL] = tstatus.cloneID;/*this should come from status info on the volume if non zero */
            }
            else
@@ -2772,7 +2791,7 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
                EnumerateEntry(&entry);
                fprintf(STDOUT,"------- New entry -------\n");
            }
-           vcode = ubik_Call(VL_SetLock,cstruct, 0, pvolid, RWVOL, VLOP_RESTORE);
+           vcode = ubik_Call(VL_SetLock,cstruct, 0, pvolid, voltype, VLOP_RESTORE);
            if(vcode) {
                fprintf(STDERR,"Could not lock the entry for volume number %u \n",pvolid);
                error = vcode;
@@ -2782,12 +2801,16 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
            strcpy(entry.name, tovolname);
 
            /* Update the vlentry with the new information */
-           index = Lp_GetRwIndex(&entry);
+           if (flags & RV_RDONLY)
+               index = Lp_ROMatch(toserver, topart, &entry) - 1;
+           else
+               index = Lp_GetRwIndex(&entry);
            if (index == -1) {
-              /* Add the rw site for the volume being restored */
+              /* Add the new site for the volume being restored */
               entry.serverNumber[entry.nServers]    = toserver;
               entry.serverPartition[entry.nServers] = topart;
-              entry.serverFlags[entry.nServers]     = ITSRWVOL;
+              entry.serverFlags[entry.nServers]     =
+                       (flags & RV_RDONLY) ? ITSROVOL : ITSRWVOL;
               entry.nServers++;
            } else {
               /* This volume should be deleted on the old site
@@ -2837,9 +2860,9 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
               entry.serverPartition[index] = topart;
            }
 
-           entry.flags |= RW_EXISTS;
+           entry.flags |= (flags & RV_RDONLY) ? RO_EXISTS : RW_EXISTS;
            MapNetworkToHost(&entry,&storeEntry);
-           vcode = VLDB_ReplaceEntry(pvolid,RWVOL, &storeEntry,LOCKREL_OPCODE | LOCKREL_AFSID | LOCKREL_TIMESTAMP );
+           vcode = VLDB_ReplaceEntry(pvolid,voltype, &storeEntry,LOCKREL_OPCODE | LOCKREL_AFSID | LOCKREL_TIMESTAMP );
            if(vcode) {
                fprintf(STDERR,"Could not update the entry for volume number %u  \n",pvolid);
                error = vcode;
@@ -2857,7 +2880,7 @@ UV_RestoreVolume(toserver, topart, tovolid, tovolname, flags, WriteData, rock)
          if (!error) error = code;
       }
       if(islocked) {
-         vcode = ubik_Call(VL_ReleaseLock,cstruct, 0, pvolid, RWVOL, LOCKREL_OPCODE | LOCKREL_AFSID | LOCKREL_TIMESTAMP);
+         vcode = ubik_Call(VL_ReleaseLock,cstruct, 0, pvolid, voltype, LOCKREL_OPCODE | LOCKREL_AFSID | LOCKREL_TIMESTAMP);
          if(vcode) {
              fprintf(STDERR,"Could not release lock on the VLDB entry for the volume %u\n",pvolid);
              if(!error) error = vcode;
@@ -3062,6 +3085,55 @@ afs_int32 server, part, volid;
     return 0;
 }
 
+/*sets <server> <part> as read/write site for <volid> in the vldb */
+UV_ChangeLocation(server, part, volid)
+afs_int32 server, part, volid;
+{
+    afs_int32 vcode;
+    struct nvldbentry entry,storeEntry;
+    int index;
+
+    vcode = ubik_Call(VL_SetLock,cstruct, 0,volid,RWVOL, VLOP_ADDSITE);
+    if(vcode) {
+       fprintf(STDERR," Could not lock the VLDB entry for volume %u \n", volid);
+       PrintError("",vcode);
+       return(vcode);
+    }
+    vcode = VLDB_GetEntryByID(volid,RWVOL, &entry);
+    if(vcode) {
+       fprintf(STDERR,"Could not fetch the entry for volume number %u from VLDB \n",volid);
+       PrintError("",vcode);
+       return (vcode);
+    }
+    MapHostToNetwork(&entry);
+    index = Lp_GetRwIndex(&entry);
+    if (index < 0) {
+       /* no RW site exists  */
+       fprintf(STDERR,"No existing RW site for volume %u", volid);
+       vcode = ubik_Call(VL_ReleaseLock,cstruct, 0, volid, RWVOL, LOCKREL_OPCODE | LOCKREL_AFSID | LOCKREL_TIMESTAMP);
+       if(vcode) {
+           fprintf(STDERR,"Could not release lock on entry for volume %u \n",volid);
+           PrintError("",vcode);
+           return(vcode);
+       }
+       return VOLSERBADOP;
+    }
+    else { /* change the RW site */
+       entry.serverNumber[index] = server;
+       entry.serverPartition[index] = part;
+       MapNetworkToHost(&entry,&storeEntry);
+       vcode = VLDB_ReplaceEntry(volid,RWVOL,&storeEntry,LOCKREL_OPCODE | LOCKREL_AFSID | LOCKREL_TIMESTAMP);
+       if(vcode){ 
+           fprintf(STDERR,"Could not update entry for volume %u \n",volid);
+           PrintError("",vcode);
+           ubik_Call(VL_ReleaseLock,cstruct, 0, volid, RWVOL, LOCKREL_OPCODE | LOCKREL_AFSID | LOCKREL_TIMESTAMP);
+           return(vcode);
+       }
+       if(verbose) fprintf(STDOUT," done\n");
+    }
+    return 0;
+}
+
 /*list all the partitions on <aserver> */
 UV_ListPartitions(aserver, ptrPartList, cntp)
     afs_int32 aserver;
@@ -4911,7 +4983,7 @@ UV_SetVolume(server, partition, volid, transflag, setflag, sleeptime)
  error_exit:
   if (tid) {
      rcode = 0;
-     code = AFSVolEndTrans(conn, tid, &code);
+     code = AFSVolEndTrans(conn, tid, &rcode);
      if (code || rcode) {
         fprintf(STDERR, "SetVolumeStatus: EndTrans Failed\n");
        if (!error) error = (code ? code : rcode);
@@ -4922,6 +4994,46 @@ UV_SetVolume(server, partition, volid, transflag, setflag, sleeptime)
   return(error);
 }
 
+UV_SetVolumeInfo(server, partition, volid, infop)
+  afs_int32 server, partition, volid;
+  volintInfo *infop;
+{
+  struct rx_connection *conn = 0;
+  afs_int32 tid=0;
+  afs_int32 code, error=0, rcode;
+
+  conn = UV_Bind(server, AFSCONF_VOLUMEPORT);
+  if (!conn) {
+     fprintf(STDERR, "SetVolumeInfo: Bind Failed");
+     ERROR_EXIT(-1);
+  }
+
+  code = AFSVolTransCreate(conn, volid, partition, ITOffline, &tid);
+  if (code) {
+     fprintf(STDERR, "SetVolumeInfo: TransCreate Failed\n");
+     ERROR_EXIT(code);
+  }
+  
+  code = AFSVolSetInfo(conn, tid, infop);
+  if (code) {
+     fprintf(STDERR, "SetVolumeInfo: SetInfo Failed\n");
+     ERROR_EXIT(code);
+  }
+  
+ error_exit:
+  if (tid) {
+     rcode = 0;
+     code = AFSVolEndTrans(conn, tid, &rcode);
+     if (code || rcode) {
+        fprintf(STDERR, "SetVolumeInfo: EndTrans Failed\n");
+       if (!error) error = (code ? code : rcode);
+     }
+  }
+
+  if (conn) rx_DestroyConnection(conn);
+  return(error);
+}
+
 /*maps the host addresses in <old > (present in network byte order) to
  that in< new> (present in host byte order )*/
 void
index 416026734632dda0dad3429f5926236545173612..3a5d1e37eeb24f0ba968a384ce7e7a1382b9f21e 100644 (file)
@@ -45,6 +45,7 @@ RCSID("$Header$");
 #include "lockdata.h"
 
 struct ubik_client *cstruct;
+static rxkad_level vsu_rxkad_level = rxkad_clear;
 extern int VL_CreateEntry(), VL_CreateEntryN();
 extern int VL_GetEntryByID(), VL_GetEntryByIDN();
 extern int VL_GetEntryByNameO(), VL_GetEntryByNameN();
@@ -365,6 +366,23 @@ afs_int32 subik_Call(aproc, aclient, aflags, p1, p2, p3, p4, p5, p6, p7, p8, p9,
 #endif /* notdef */
 
 
+/*
+  Set encryption.  If 'cryptflag' is nonzero, encrpytion is turned on
+  for authenticated connections; if zero, encryption is turned off.
+  Calling this function always results in a level of at least rxkad_auth;
+  to get a rxkad_clear connection, simply don't call this.
+*/
+void vsu_SetCrypt(cryptflag)
+    int cryptflag;
+{
+  if (cryptflag) {
+    vsu_rxkad_level = rxkad_crypt;
+  } else {
+    vsu_rxkad_level = rxkad_auth;
+  }
+}
+
+
 /*
   Get the appropriate type of ubik client structure out from the system.
 */
@@ -463,7 +481,7 @@ afs_int32 vsu_ClientInit(noAuthFlag, confDir, cellName, sauth, uclientp, secproc
             break;
           case 2:
             sc = (struct rx_securityClass *)rxkad_NewClientSecurityObject(
-                 rxkad_clear, &ttoken.sessionKey, ttoken.kvno,
+                 vsu_rxkad_level, &ttoken.sessionKey, ttoken.kvno,
                  ttoken.ticketLen, ttoken.ticket);
             break;
           default: