From d3de060487e8ebca42a8ed82922829c0ef7b8d1f Mon Sep 17 00:00:00 2001 From: Derrick Brashear Date: Sat, 13 Oct 2001 05:36:14 +0000 Subject: [PATCH] STABLE12-resync-stable-with-head-20011013 cheat and pull everything as one delta --- Makefile.in | 9 +- NEWS | 26 +- README | 1 + acconfig.h | 6 - acinclude.m4 | 482 ++++++++++++++ config.sub | 257 +++++--- configure-libafs.in | 470 +------------- configure.in | 469 +------------- src/Makefile.djgpp | 3 + src/NTMake9x | 8 +- src/NTMakefile | 9 +- src/WINNT/afsd/Makefile.djgpp | 5 +- src/WINNT/afsd/NTMakefile | 14 +- src/WINNT/afsd/afsd.h | 29 +- src/WINNT/afsd/afsd95.c | 2 + src/WINNT/afsd/afsd_init.c | 103 ++- src/WINNT/afsd/afsd_init95.c | 78 ++- src/WINNT/afsd/cm_callback.c | 94 ++- src/WINNT/afsd/cm_cell.c | 51 +- src/WINNT/afsd/cm_cell.h | 2 + src/WINNT/afsd/cm_config.c | 62 ++ src/WINNT/afsd/cm_config.h | 3 + src/WINNT/afsd/cm_dcache.c | 84 +++ src/WINNT/afsd/cm_dns.c | 687 ++++++++++++++++++++ src/WINNT/afsd/cm_dns.h | 27 + src/WINNT/afsd/cm_dns_private.h | 217 +++++++ src/WINNT/afsd/cm_freelance.c | 525 ++++++++++++++++ src/WINNT/afsd/cm_freelance.h | 19 + src/WINNT/afsd/cm_ioctl.c | 22 +- src/WINNT/afsd/cm_ioctl.h | 3 + src/WINNT/afsd/cm_scache.c | 154 ++++- src/WINNT/afsd/cm_vnodeops.c | 23 + src/WINNT/afsd/libafsconf.def | 4 + src/WINNT/client_osi/osisleep.h | 2 + src/afs/LINUX/osi_module.c | 2 +- src/afs/LINUX/osi_vfs.h | 228 ------- src/afs/LINUX/osi_vfs.hin | 114 ++++ src/afs/LINUX/osi_vfsops.c | 6 +- src/afs/LINUX/osi_vm.c | 2 +- src/afs/SOLARIS/osi_file.c | 5 + src/afs/SOLARIS/osi_vfsops.c | 2 +- src/afs/SOLARIS/osi_vnodeops.c | 22 +- src/afs/VNOPS/afs_vnop_flock.c | 2 +- src/afs/VNOPS/afs_vnop_lookup.c | 100 ++- src/afs/VNOPS/afs_vnop_remove.c | 8 +- src/afs/VNOPS/afs_vnop_strategy.c | 4 + src/afs/VNOPS/afs_vnop_write.c | 2 +- src/afs/afs.h | 40 +- src/afs/afs_buffer.c | 9 +- src/afs/afs_call.c | 23 +- src/afs/afs_callback.c | 2 +- src/afs/afs_cell.c | 144 ++++- src/afs/afs_daemons.c | 42 +- src/afs/afs_dcache.c | 71 ++- src/afs/afs_dynroot.c | 461 ++++++++++++++ src/afs/afs_nfsdisp.c | 863 ++++++++++++++++++++++++++ src/afs/afs_pioctl.c | 6 +- src/afs/afs_server.c | 15 +- src/afs/afs_util.c | 4 +- src/afs/afs_vcache.c | 37 +- src/afs/afs_volume.c | 32 +- src/afs/lock.h | 2 +- src/afsd/Makefile.in | 2 + src/afsd/afs.conf.linux | 20 +- src/afsd/afs.ppc_darwin.plist | 31 + src/afsd/afs.rc.linux | 142 ++++- src/afsd/afs.rc.solaris.2.9 | 188 ++++++ src/afsd/afsd.c | 43 ++ src/afsd/vsys.c | 14 + src/audit/audit.h | 1 + src/auth/NTMakefile | 3 +- src/auth/cellconfig.c | 111 +++- src/auth/ktc.c | 10 + src/auth/writeconfig.c | 16 +- src/bozo/bnode.c | 19 + src/bozo/bos.c | 11 +- src/cf/linux-test2.m4 | 11 + src/cf/linux-test4.m4 | 16 + src/comerr/compile_et.c | 4 +- src/config/.cvsignore | 8 +- src/config/Makefile.alpha_linux_24.in | 45 ++ src/config/Makefile.i386_djgpp | 2 +- src/config/Makefile.parisc_linux24.in | 43 ++ src/config/Makefile.rs_aix42.in | 4 - src/config/Makefile.sun4x_56.in | 4 - src/config/Makefile.sun4x_57.in | 4 - src/config/Makefile.sun4x_58.in | 4 - src/config/Makefile.sun4x_59.in | 48 ++ src/config/NTMakefile.i386_nt40 | 4 +- src/config/NTMakefile.i386_win95 | 4 +- src/config/afs_args.h | 2 + src/config/afs_sysnames.h | 7 + src/config/afsconfig-windows.h | 5 +- src/config/make_vnode.pl | 113 ++++ src/config/mkvers.c | 4 +- src/config/param.alpha_linux_24.h | 75 +++ src/config/param.alpha_linux_24_usr.h | 55 ++ src/config/param.i386_obsd29.h | 2 +- src/config/param.parisc_linux24.h | 68 ++ src/config/param.parisc_linux24_usr.h | 54 ++ src/config/param.sgi_62.h | 5 + src/config/param.sgi_63.h | 4 + src/config/param.sgi_64.h | 4 + src/config/param.sgi_65.h | 4 + src/config/param.sun4x_59.h | 113 ++++ src/config/param.sun4x_59_usr.h | 62 ++ src/des/andrew-conf.h | 6 +- src/des/conf-parisc-linux.h | 4 + src/des/main.c | 10 + src/des/make_ip.c | 1 + src/dir/dir.h | 4 +- src/fsint/afsint.xg | 11 +- src/kauth/NTMakefile | 3 +- src/kauth/admin_tools.c | 2 +- src/kauth/authclient.c | 7 + src/kauth/client.c | 7 + src/kauth/kaauxdb.c | 12 +- src/kauth/kadatabase.c | 7 + src/kauth/kalocalcell.c | 7 + src/kauth/kalog.c | 8 +- src/kauth/kas.c | 7 + src/kauth/kaserver.c | 11 +- src/kauth/kautils.c | 7 + src/kauth/klog.c | 7 + src/kauth/kpasswd.c | 17 + src/kauth/kpwvalid.c | 7 + src/kauth/krb_tf.c | 11 +- src/kauth/krb_udp.c | 7 + src/kauth/rebuild.c | 7 + src/kauth/token.c | 7 + src/kauth/user.c | 7 + src/kauth/user_nt.c | 18 +- src/libafs/.cvsignore | 13 +- src/libafs/Makefile.common | 3 + src/libafs/MakefileProto.FBSD.in | 2 +- src/libafs/MakefileProto.LINUX.in | 5 + src/libafs/MakefileProto.SOLARIS.in | 16 +- src/libafsauthent/NTMakefile | 3 +- src/libuafs/Makefile.common | 7 + src/login/Makefile.in | 2 +- src/ntp/.cvsignore | 1 + src/pam/afs_util.c | 3 +- src/pinstall/install.c | 1 + src/ptserver/.cvsignore | 1 + src/ptserver/NTMakefile | 6 +- src/ptserver/db_verify.c | 7 + src/ptserver/ptclient.c | 29 + src/ptserver/ptprocs.c | 29 +- src/ptserver/pts.c | 7 + src/ptserver/ptserver.c | 7 + src/ptserver/ptuser.c | 7 + src/ptserver/ptutils.c | 17 +- src/ptserver/readgroup.c | 11 +- src/ptserver/readpwd.c | 11 +- src/ptserver/testpt.c | 16 + src/ptserver/utils.c | 7 + src/rx/IRIX/rx_knet.c | 11 +- src/rx/SOLARIS/rx_knet.c | 137 +++- src/rx/rx.c | 2 +- src/rx/rx.h | 5 +- src/rx/rx_clock.c | 1 + src/rx/rx_getaddr.c | 8 +- src/rx/rx_kcommon.c | 25 + src/rx/rx_kcommon.h | 1 + src/rx/rx_misc.h | 6 +- src/rx/rx_packet.c | 35 +- src/rx/rx_trace.c | 10 +- src/rxdebug/rxdebug.c | 12 + src/rxkad/rxkad_client.c | 10 +- src/rxkad/rxkad_common.c | 7 + src/rxkad/rxkad_server.c | 7 + src/rxkad/ticket.c | 7 + src/sys/rmtsysnet.c | 7 + src/tbutc/Makefile.in | 254 ++------ src/ubik/beacon.c | 12 +- src/ubik/disk.c | 7 + src/ubik/phys.c | 7 + src/ubik/recovery.c | 9 +- src/ubik/remote.c | 31 +- src/ubik/ubik.c | 7 + src/ubik/ubikcmd.c | 7 + src/ubik/utst_client.c | 7 + src/ubik/utst_server.c | 7 + src/ubik/vote.c | 7 + src/update/client.c | 5 +- src/util/Makefile.in | 4 +- src/util/assert.c | 13 +- src/util/casestrcpy.c | 7 + src/util/fileutil.c | 13 +- src/util/kreltime.c | 12 +- src/util/ktime.c | 51 +- src/util/uuid.c | 11 + src/venus/.cvsignore | 4 +- src/venus/Makefile.in | 16 +- src/venus/kdump.sh.linux | 13 + src/venus/livesys.c | 78 +++ src/vfsck/.cvsignore | 2 + src/viced/afsfileprocs.c | 193 +++++- src/viced/callback.c | 13 +- src/viced/host.c | 38 +- src/viced/viced.c | 5 + src/vlserver/vldbint.xg | 8 + src/vlserver/vlserver.p.h | 8 - src/vol/.cvsignore | 2 + src/vol/Makefile.in | 6 +- src/vol/ihandle.c | 2 +- src/vol/ihandle.h | 2 +- src/vol/namei_ops.c | 4 + src/vol/partition.c | 104 +++- src/vol/partition.h | 9 + src/volser/volprocs.c | 60 +- src/volser/volser.p.h | 1 + src/volser/vos.c | 182 +++++- src/volser/vsprocs.c | 156 ++++- src/volser/vsutils.c | 20 +- 215 files changed, 7676 insertions(+), 2012 deletions(-) create mode 100644 acinclude.m4 create mode 100644 src/WINNT/afsd/cm_dns.c create mode 100644 src/WINNT/afsd/cm_dns.h create mode 100644 src/WINNT/afsd/cm_dns_private.h create mode 100644 src/WINNT/afsd/cm_freelance.c create mode 100644 src/WINNT/afsd/cm_freelance.h delete mode 100644 src/afs/LINUX/osi_vfs.h create mode 100644 src/afs/LINUX/osi_vfs.hin create mode 100644 src/afs/afs_dynroot.c create mode 100644 src/afs/afs_nfsdisp.c create mode 100644 src/afsd/afs.ppc_darwin.plist create mode 100644 src/afsd/afs.rc.solaris.2.9 create mode 100644 src/config/Makefile.alpha_linux_24.in create mode 100644 src/config/Makefile.parisc_linux24.in create mode 100644 src/config/Makefile.sun4x_59.in create mode 100644 src/config/make_vnode.pl create mode 100644 src/config/param.alpha_linux_24.h create mode 100644 src/config/param.alpha_linux_24_usr.h create mode 100644 src/config/param.parisc_linux24.h create mode 100644 src/config/param.parisc_linux24_usr.h create mode 100644 src/config/param.sun4x_59.h create mode 100644 src/config/param.sun4x_59_usr.h create mode 100644 src/des/conf-parisc-linux.h create mode 100644 src/venus/kdump.sh.linux create mode 100644 src/venus/livesys.c diff --git a/Makefile.in b/Makefile.in index 37ddfb1bc..3297bdb43 100644 --- a/Makefile.in +++ b/Makefile.in @@ -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 da8a0eea7..bc0af8ffe 100644 --- 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 9d20c5a0d..44ed3d5e9 100644 --- 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 diff --git a/acconfig.h b/acconfig.h index 12ef98bd8..e02e143df 100644 --- a/acconfig.h +++ b/acconfig.h @@ -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 index 000000000..505148178 --- /dev/null +++ b/acinclude.m4 @@ -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) + +]) diff --git a/config.sub b/config.sub index 42fc991d0..791bcded7 100644 --- a/config.sub +++ b/config.sub @@ -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 . +# Please send patches to . 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 ." + +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: diff --git a/configure-libafs.in b/configure-libafs.in index af5bb9d3a..8aee6cf17 100644 --- a/configure-libafs.in +++ b/configure-libafs.in @@ -1,475 +1,23 @@ 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} \ diff --git a/configure.in b/configure.in index bfe164be1..919ac5c77 100644 --- a/configure.in +++ b/configure.in @@ -1,475 +1,22 @@ 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 \ diff --git a/src/Makefile.djgpp b/src/Makefile.djgpp index e0316f8d4..23f2dceb1 100644 --- a/src/Makefile.djgpp +++ b/src/Makefile.djgpp @@ -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 diff --git a/src/NTMake9x b/src/NTMake9x index 2e766745d..8fb98427d 100644 --- a/src/NTMake9x +++ b/src/NTMake9x @@ -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) diff --git a/src/NTMakefile b/src/NTMakefile index 268119af6..07cc29a8f 100644 --- a/src/NTMakefile +++ b/src/NTMakefile @@ -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) diff --git a/src/WINNT/afsd/Makefile.djgpp b/src/WINNT/afsd/Makefile.djgpp index 678857356..88488749b 100644 --- a/src/WINNT/afsd/Makefile.djgpp +++ b/src/WINNT/afsd/Makefile.djgpp @@ -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 \ diff --git a/src/WINNT/afsd/NTMakefile b/src/WINNT/afsd/NTMakefile index e8e33daaa..4e5af5afc 100644 --- a/src/WINNT/afsd/NTMakefile +++ b/src/WINNT/afsd/NTMakefile @@ -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) \ diff --git a/src/WINNT/afsd/afsd.h b/src/WINNT/afsd/afsd.h index 0c6f59fde..6456c7139 100644 --- a/src/WINNT/afsd/afsd.h +++ b/src/WINNT/afsd/afsd.h @@ -35,7 +35,7 @@ BOOL APIENTRY About(HWND, unsigned int, unsigned int, long); #include "krb.h" #include "krb_prot.h" -#include +/*#include */ #include #include @@ -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 */ diff --git a/src/WINNT/afsd/afsd95.c b/src/WINNT/afsd/afsd95.c index 3aa6bc7d0..75cd53ae1 100644 --- a/src/WINNT/afsd/afsd95.c +++ b/src/WINNT/afsd/afsd95.c @@ -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)); } diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index 48cecb4af..a09e4c144 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -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 ? "" : 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; } + diff --git a/src/WINNT/afsd/afsd_init95.c b/src/WINNT/afsd/afsd_init95.c index 602255fa6..cdd9ffeb5 100644 --- a/src/WINNT/afsd/afsd_init95.c +++ b/src/WINNT/afsd/afsd_init95.c @@ -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 ? "" : 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; } + diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index f00938a4b..959b35ade 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -28,6 +28,16 @@ /* 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) { diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index b8317ebed..5ef16bc9a 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -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; diff --git a/src/WINNT/afsd/cm_cell.h b/src/WINNT/afsd/cm_cell.h index ca0ae38f4..a642d04d2 100644 --- a/src/WINNT/afsd/cm_cell.h +++ b/src/WINNT/afsd/cm_cell.h @@ -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); diff --git a/src/WINNT/afsd/cm_config.c b/src/WINNT/afsd/cm_config.c index a3ef82f3f..10a0d44f6 100644 --- a/src/WINNT/afsd/cm_config.c +++ b/src/WINNT/afsd/cm_config.c @@ -22,6 +22,10 @@ #include #include "cm_config.h" +#ifdef AFS_AFSDB_ENV +#include "cm_dns.h" +#include +#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); +} diff --git a/src/WINNT/afsd/cm_config.h b/src/WINNT/afsd/cm_config.h index 19ab23660..11996e55c 100644 --- a/src/WINNT/afsd/cm_config.h +++ b/src/WINNT/afsd/cm_config.h @@ -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); diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index 69a08cdf7..6a7a3ac96 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -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 index 000000000..b0e1da0e2 --- /dev/null +++ b/src/WINNT/afsd/cm_dns.c @@ -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 +#include +#ifndef DJGPP +#include +#include +#endif +#include "cm_dns_private.h" +#include "cm_dns.h" +#include +#include + +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= '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; irr_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; irr_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 index 000000000..1e5d28c8a --- /dev/null +++ b/src/WINNT/afsd/cm_dns.h @@ -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 index 000000000..1344fe0dc --- /dev/null +++ b/src/WINNT/afsd/cm_dns_private.h @@ -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 +#include +#include +#include +/*#else + #include */ +#endif + +#ifdef KERNEL +#define SOCKET struct osi_socket * +#else +#define SOCKET int +#endif + +#define SOCKADDR_IN struct sockaddr_in + +#include +#include + + +#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 */ + 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 index 000000000..1da7f857d --- /dev/null +++ b/src/WINNT/afsd/cm_freelance.c @@ -0,0 +1,525 @@ +#include +#include + +#ifndef DJGPP +#include +#include +#else +#include +#endif /* !DJGPP */ +#include +#include +#include + +#include + +#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; inamep, 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; icell = 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; inextp) { + 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; inamep=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; iinDatap, 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 */ + diff --git a/src/WINNT/afsd/cm_ioctl.h b/src/WINNT/afsd/cm_ioctl.h index ee5b338ac..04ba13bfa 100644 --- a/src/WINNT/afsd/cm_ioctl.h +++ b/src/WINNT/afsd/cm_ioctl.h @@ -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__ */ diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 759a31f34..d3add6009 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -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; diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 440d34de7..e29d89dd1 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -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; diff --git a/src/WINNT/afsd/libafsconf.def b/src/WINNT/afsd/libafsconf.def index b0b7bc91c..08c2d1e65 100644 --- a/src/WINNT/afsd/libafsconf.def +++ b/src/WINNT/afsd/libafsconf.def @@ -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 diff --git a/src/WINNT/client_osi/osisleep.h b/src/WINNT/client_osi/osisleep.h index aaf0c8f96..efeb5ebee 100644 --- a/src/WINNT/client_osi/osisleep.h +++ b/src/WINNT/client_osi/osisleep.h @@ -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 *); diff --git a/src/afs/LINUX/osi_module.c b/src/afs/LINUX/osi_module.c index c3e0194ab..928e20c8d 100644 --- a/src/afs/LINUX/osi_module.c +++ b/src/afs/LINUX/osi_module.c @@ -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 index b5f92e125..000000000 --- a/src/afs/LINUX/osi_vfs.h +++ /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 index 000000000..ee0588b91 --- /dev/null +++ b/src/afs/LINUX/osi_vfs.hin @@ -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_ */ diff --git a/src/afs/LINUX/osi_vfsops.c b/src/afs/LINUX/osi_vfsops.c index f43367f49..6c3f8ce9f 100644 --- a/src/afs/LINUX/osi_vfsops.c +++ b/src/afs/LINUX/osi_vfsops.c @@ -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 diff --git a/src/afs/LINUX/osi_vm.c b/src/afs/LINUX/osi_vm.c index bf487a7a0..71831dfae 100644 --- a/src/afs/LINUX/osi_vm.c +++ b/src/afs/LINUX/osi_vm.c @@ -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) diff --git a/src/afs/SOLARIS/osi_file.c b/src/afs/SOLARIS/osi_file.c index 068c1a70f..c7709cd96 100644 --- a/src/afs/SOLARIS/osi_file.c +++ b/src/afs/SOLARIS/osi_file.c @@ -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; diff --git a/src/afs/SOLARIS/osi_vfsops.c b/src/afs/SOLARIS/osi_vfsops.c index 7da976e8f..1a9279315 100644 --- a/src/afs/SOLARIS/osi_vfsops.c +++ b/src/afs/SOLARIS/osi_vfsops.c @@ -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"); diff --git a/src/afs/SOLARIS/osi_vnodeops.c b/src/afs/SOLARIS/osi_vnodeops.c index 19cebd06c..a005ec193 100644 --- a/src/afs/SOLARIS/osi_vnodeops.c +++ b/src/afs/SOLARIS/osi_vnodeops.c @@ -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; diff --git a/src/afs/VNOPS/afs_vnop_flock.c b/src/afs/VNOPS/afs_vnop_flock.c index 2549905d4..250905298 100644 --- a/src/afs/VNOPS/afs_vnop_flock.c +++ b/src/afs/VNOPS/afs_vnop_flock.c @@ -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 diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c index 4ee681d61..1d73d09d7 100644 --- a/src/afs/VNOPS/afs_vnop_lookup.c +++ b/src/afs/VNOPS/afs_vnop_lookup.c @@ -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; ierrorCode) + 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. diff --git a/src/afs/VNOPS/afs_vnop_remove.c b/src/afs/VNOPS/afs_vnop_remove.c index 0ad500cd5..c3df294f8 100644 --- a/src/afs/VNOPS/afs_vnop_remove.c +++ b/src/afs/VNOPS/afs_vnop_remove.c @@ -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(); diff --git a/src/afs/VNOPS/afs_vnop_strategy.c b/src/afs/VNOPS/afs_vnop_strategy.c index 53ab95983..ab1ecaae0 100644 --- a/src/afs/VNOPS/afs_vnop_strategy.c +++ b/src/afs/VNOPS/afs_vnop_strategy.c @@ -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 diff --git a/src/afs/VNOPS/afs_vnop_write.c b/src/afs/VNOPS/afs_vnop_write.c index 55ad6f1fd..8f8c59898 100644 --- a/src/afs/VNOPS/afs_vnop_write.c +++ b/src/afs/VNOPS/afs_vnop_write.c @@ -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 diff --git a/src/afs/afs.h b/src/afs/afs.h index 9ed8343a3..d1918d536 100644 --- a/src/afs/afs.h +++ b/src/afs/afs.h @@ -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 */ diff --git a/src/afs/afs_buffer.c b/src/afs/afs_buffer.c index 8f019ba24..3fc6e4f22 100644 --- a/src/afs/afs_buffer.c +++ b/src/afs/afs_buffer.c @@ -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); diff --git a/src/afs/afs_call.c b/src/afs/afs_call.c index 1ac95bf80..72d5b4d50 100644 --- a/src/afs/afs_call.c +++ b/src/afs/afs_call.c @@ -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 */ diff --git a/src/afs/afs_callback.c b/src/afs/afs_callback.c index c43d92c50..193c64274 100644 --- a/src/afs/afs_callback.c +++ b/src/afs/afs_callback.c @@ -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; diff --git a/src/afs/afs_cell.c b/src/afs/afs_cell.c index 82bf5a26d..add7e6045 100644 --- a/src/afs/afs_cell.c +++ b/src/afs/afs_cell.c @@ -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= 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; icellHosts, MAXCELLHOSTS); /* randomize servers */ +done: ReleaseWriteLock(&afs_xcell); return 0; bad: diff --git a/src/afs/afs_daemons.c b/src/afs/afs_daemons.c index 18cda8fd1..5ee44eb41 100644 --- a/src/afs/afs_daemons.c +++ b/src/afs/afs_daemons.c @@ -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); diff --git a/src/afs/afs_dcache.c b/src/afs/afs_dcache.c index f2c0459b9..f1839c31e 100644 --- a/src/afs/afs_dcache.c +++ b/src/afs/afs_dcache.c @@ -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 index 000000000..6e42e2b23 --- /dev/null +++ b/src/afs/afs_dynroot.c @@ -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 +#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 index 000000000..3bafeff3b --- /dev/null +++ b/src/afs/afs_nfsdisp.c @@ -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 +#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) diff --git a/src/afs/afs_pioctl.c b/src/afs/afs_pioctl.c index fce1b4b0c..c0fcb12f2 100644 --- a/src/afs/afs_pioctl.c +++ b/src/afs/afs_pioctl.c @@ -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); diff --git a/src/afs/afs_server.c b/src/afs/afs_server.c index c148ee4b6..21a8898ef 100644 --- a/src/afs/afs_server.c +++ b/src/afs/afs_server.c @@ -801,10 +801,13 @@ void afs_SortServers(struct server *aservers[], int count) for (i=0; iaddr->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; diff --git a/src/afs/afs_util.c b/src/afs/afs_util.c index aa0478266..cbdca631b 100644 --- a/src/afs/afs_util.c +++ b/src/afs/afs_util.c @@ -180,9 +180,9 @@ void afs_CheckLocks() for(i=0;ihnext) { #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)) diff --git a/src/afs/afs_vcache.c b/src/afs/afs_vcache.c index 923dc6ecd..53ed8aa17 100644 --- a/src/afs/afs_vcache.c +++ b/src/afs/afs_vcache.c @@ -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); diff --git a/src/afs/afs_volume.c b/src/afs/afs_volume.c index 46bc9ba8a..53da1b47f 100644 --- a/src/afs/afs_volume.c +++ b/src/afs/afs_volume.c @@ -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) diff --git a/src/afs/lock.h b/src/afs/lock.h index fb5c2e95c..343776412 100644 --- a/src/afs/lock.h +++ b/src/afs/lock.h @@ -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) diff --git a/src/afsd/Makefile.in b/src/afsd/Makefile.in index cc5b65b98..67bf2fee0 100644 --- a/src/afsd/Makefile.in +++ b/src/afsd/Makefile.in @@ -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* ) \ diff --git a/src/afsd/afs.conf.linux b/src/afsd/afs.conf.linux index 693dc4941..f299203e7 100644 --- a/src/afsd/afs.conf.linux +++ b/src/afsd/afs.conf.linux @@ -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 diff --git a/src/afsd/afs.ppc_darwin.plist b/src/afsd/afs.ppc_darwin.plist new file mode 100644 index 000000000..d802e7a90 --- /dev/null +++ b/src/afsd/afs.ppc_darwin.plist @@ -0,0 +1,31 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + afs + CFBundleIdentifier + org.openafs.filesystems.afs + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + afs + CFBundlePackageType + KEXT + CFBundleShortVersionString + 1.1.1 + CFBundleSignature + ???? + CFBundleVersion + 1.1.1 + OSBundleLibraries + + com.apple.kernel.bsd + 1.0.0b1 + com.apple.kernel.mach + 1.0.0b1 + + + diff --git a/src/afsd/afs.rc.linux b/src/afsd/afs.rc.linux index a55abbb74..72d184463 100644 --- a/src/afsd/afs.rc.linux +++ b/src/afsd/afs.rc.linux @@ -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 ' + echo Usage: 'afs ' 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 index 000000000..00967eb9b --- /dev/null +++ b/src/afsd/afs.rc.solaris.2.9 @@ -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 diff --git a/src/afsd/afsd.c b/src/afsd/afsd.c index 3edd97e83..74023d1df 100644 --- a/src/afsd/afsd.c +++ b/src/afsd/afsd.c @@ -113,6 +113,14 @@ RCSID("$Header$"); #include #endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_FCNTL_H +#include +#endif + #include #include #include @@ -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; iparms[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); diff --git a/src/afsd/vsys.c b/src/afsd/vsys.c index 9235f5175..791b85ce8 100644 --- a/src/afsd/vsys.c +++ b/src/afsd/vsys.c @@ -9,6 +9,19 @@ #include #include +#include +#include +#include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_UNISTD_H +#include +#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; } diff --git a/src/audit/audit.h b/src/audit/audit.h index 2e6a1654c..fe6bb2f24 100644 --- a/src/audit/audit.h +++ b/src/audit/audit.h @@ -173,6 +173,7 @@ #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 */ diff --git a/src/auth/NTMakefile b/src/auth/NTMakefile index 5d9cb48d8..5ff836ac2 100644 --- a/src/auth/NTMakefile +++ b/src/auth/NTMakefile @@ -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) diff --git a/src/auth/cellconfig.c b/src/auth/cellconfig.c index cd4c38d1d..a9d89598c 100644 --- a/src/auth/cellconfig.c +++ b/src/auth/cellconfig.c @@ -24,12 +24,16 @@ RCSID("$Header$"); #include #include #include +#ifdef AFS_AFSDB_ENV +#include +#endif /* AFS_AFSDB_ENV */ #else #include #include #include #include #include +#include #ifdef AFS_AFSDB_ENV #include #include @@ -39,8 +43,19 @@ RCSID("$Header$"); #include #include #include +#include #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_UNISTD_H +#include +#endif #endif /* UKERNEL */ #include #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) diff --git a/src/auth/ktc.c b/src/auth/ktc.c index a4ad0bb72..e208ac8e3 100644 --- a/src/auth/ktc.c +++ b/src/auth/ktc.c @@ -48,10 +48,20 @@ RCSID("$Header$"); #include #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #ifdef AFS_AIX_ENV #include #endif +#ifdef HAVE_UNISTD_H +#include +#endif #include "auth.h" #include #include diff --git a/src/auth/writeconfig.c b/src/auth/writeconfig.c index e5b08b054..aafb8fedd 100644 --- a/src/auth/writeconfig.c +++ b/src/auth/writeconfig.c @@ -15,9 +15,6 @@ RCSID("$Header$"); #include #include #include -#ifdef AFS_SUN5_ENV -#include -#endif #ifdef AFS_NT40_ENV #include #include @@ -30,6 +27,19 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif #include "cellconfig.h" #include "keys.h" diff --git a/src/bozo/bnode.c b/src/bozo/bnode.c index b52f5667b..255edb968 100644 --- a/src/bozo/bnode.c +++ b/src/bozo/bnode.c @@ -34,6 +34,11 @@ RCSID("$Header$"); #include #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(); diff --git a/src/bozo/bos.c b/src/bozo/bos.c index 12b30692f..d6cc0f50c 100644 --- a/src/bozo/bos.c +++ b/src/bozo/bos.c @@ -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; } diff --git a/src/cf/linux-test2.m4 b/src/cf/linux-test2.m4 index beefbae3f..8e0753b11 100644 --- a/src/cf/linux-test2.m4 +++ b/src/cf/linux-test2.m4 @@ -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 +]) diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index ae22e138e..98ad56999 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -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 ], +[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"]) + diff --git a/src/comerr/compile_et.c b/src/comerr/compile_et.c index b2915f4b0..9cbbf641c 100644 --- a/src/comerr/compile_et.c +++ b/src/comerr/compile_et.c @@ -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 */ diff --git a/src/config/.cvsignore b/src/config/.cvsignore index 7aa3fd843..57fc9707d 100644 --- a/src/config/.cvsignore +++ b/src/config/.cvsignore @@ -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 index 000000000..83fba93d4 --- /dev/null +++ b/src/config/Makefile.alpha_linux_24.in @@ -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 diff --git a/src/config/Makefile.i386_djgpp b/src/config/Makefile.i386_djgpp index 7206ea95f..ddbacc308 100644 --- a/src/config/Makefile.i386_djgpp +++ b/src/config/Makefile.i386_djgpp @@ -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 index 000000000..9635c318e --- /dev/null +++ b/src/config/Makefile.parisc_linux24.in @@ -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 diff --git a/src/config/Makefile.rs_aix42.in b/src/config/Makefile.rs_aix42.in index 797477171..7ad11f211 100644 --- a/src/config/Makefile.rs_aix42.in +++ b/src/config/Makefile.rs_aix42.in @@ -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 diff --git a/src/config/Makefile.sun4x_56.in b/src/config/Makefile.sun4x_56.in index add178865..8055c01a4 100644 --- a/src/config/Makefile.sun4x_56.in +++ b/src/config/Makefile.sun4x_56.in @@ -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 diff --git a/src/config/Makefile.sun4x_57.in b/src/config/Makefile.sun4x_57.in index 3f5e0c07b..5b8a3ea42 100644 --- a/src/config/Makefile.sun4x_57.in +++ b/src/config/Makefile.sun4x_57.in @@ -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 diff --git a/src/config/Makefile.sun4x_58.in b/src/config/Makefile.sun4x_58.in index 945a14282..e1fb1301a 100644 --- a/src/config/Makefile.sun4x_58.in +++ b/src/config/Makefile.sun4x_58.in @@ -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 index 000000000..e1fb1301a --- /dev/null +++ b/src/config/Makefile.sun4x_59.in @@ -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 diff --git a/src/config/NTMakefile.i386_nt40 b/src/config/NTMakefile.i386_nt40 index 83cce8977..2d48de1d5 100644 --- a/src/config/NTMakefile.i386_nt40 +++ b/src/config/NTMakefile.i386_nt40 @@ -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) diff --git a/src/config/NTMakefile.i386_win95 b/src/config/NTMakefile.i386_win95 index 2c314157a..176015c36 100644 --- a/src/config/NTMakefile.i386_win95 +++ b/src/config/NTMakefile.i386_win95 @@ -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) \ diff --git a/src/config/afs_args.h b/src/config/afs_args.h index 51427adee..93a50a907 100644 --- a/src/config/afs_args.h +++ b/src/config/afs_args.h @@ -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 @@ -105,6 +106,7 @@ /* #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 diff --git a/src/config/afs_sysnames.h b/src/config/afs_sysnames.h index 0323ea6ed..8fdc667fb 100644 --- a/src/config/afs_sysnames.h +++ b/src/config/afs_sysnames.h @@ -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. */ @@ -143,6 +144,12 @@ #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) diff --git a/src/config/afsconfig-windows.h b/src/config/afsconfig-windows.h index 9237e5643..6168147e6 100644 --- a/src/config/afsconfig-windows.h +++ b/src/config/afsconfig-windows.h @@ -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 # include @@ -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 index 000000000..c02086155 --- /dev/null +++ b/src/config/make_vnode.pl @@ -0,0 +1,113 @@ +#!/usr/bin/perl +# +# Make VNODE structure from INODE structure +# +# Created By: Derek Atkins +# + +$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 () { + print OUT; + if ($_ eq $sepline) { + $seplinefound = 1; + last; + } + } + + print OUT $sepline if !$seplinefound; + + my ($state) = 0; + while () { + + # 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 () { 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; diff --git a/src/config/mkvers.c b/src/config/mkvers.c index 0eb60b043..f6cac44b9 100644 --- a/src/config/mkvers.c +++ b/src/config/mkvers.c @@ -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 index 000000000..ebb4e2e9b --- /dev/null +++ b/src/config/param.alpha_linux_24.h @@ -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 +#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 +#endif +#endif /* __KERNEL__ && !DUMP_KERNEL*/ + +#include + +#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 index 000000000..3795484b3 --- /dev/null +++ b/src/config/param.alpha_linux_24_usr.h @@ -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 + +#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_ */ diff --git a/src/config/param.i386_obsd29.h b/src/config/param.i386_obsd29.h index 405bfb300..e8e04c637 100644 --- a/src/config/param.i386_obsd29.h +++ b/src/config/param.i386_obsd29.h @@ -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 index 000000000..af619cc79 --- /dev/null +++ b/src/config/param.parisc_linux24.h @@ -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 +#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 +#endif +#endif /* __KERNEL__ && !DUMP_KERNEL*/ + +#include + +#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 index 000000000..56b37eb49 --- /dev/null +++ b/src/config/param.parisc_linux24_usr.h @@ -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 + +#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 */ diff --git a/src/config/param.sgi_62.h b/src/config/param.sgi_62.h index 88749e23c..30557129a 100644 --- a/src/config/param.sgi_62.h +++ b/src/config/param.sgi_62.h @@ -92,6 +92,11 @@ #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 diff --git a/src/config/param.sgi_63.h b/src/config/param.sgi_63.h index 1163011ec..0cecc287c 100644 --- a/src/config/param.sgi_63.h +++ b/src/config/param.sgi_63.h @@ -86,6 +86,10 @@ #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.sgi_64.h b/src/config/param.sgi_64.h index 2650bfa6f..9e2b2d8aa 100644 --- a/src/config/param.sgi_64.h +++ b/src/config/param.sgi_64.h @@ -102,6 +102,10 @@ #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.sgi_65.h b/src/config/param.sgi_65.h index de7e67418..63afdd23e 100644 --- a/src/config/param.sgi_65.h +++ b/src/config/param.sgi_65.h @@ -110,6 +110,10 @@ #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 index 000000000..60a07e57d --- /dev/null +++ b/src/config/param.sun4x_59.h @@ -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 + +#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 index 000000000..3ce9e7d56 --- /dev/null +++ b/src/config/param.sun4x_59_usr.h @@ -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 + +/*#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 */ diff --git a/src/des/andrew-conf.h b/src/des/andrew-conf.h index edf8d0e1e..f1be8c1a5 100644 --- a/src/des/andrew-conf.h +++ b/src/des/andrew-conf.h @@ -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 index 000000000..3d2937292 --- /dev/null +++ b/src/des/conf-parisc-linux.h @@ -0,0 +1,4 @@ +#define BITS32 +#define BIG +#define MSBFIRST +#define MUSTALIGN diff --git a/src/des/main.c b/src/des/main.c index b0b7c4ef9..79fa2b43b 100644 --- a/src/des/main.c +++ b/src/des/main.c @@ -17,6 +17,16 @@ RCSID("$Header$"); #include #include +#include + +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif + #include "des_internal.h" extern void gen PROTOTYPE((FILE * stream)); diff --git a/src/des/make_ip.c b/src/des/make_ip.c index e84d8ac48..5c9afd6de 100644 --- a/src/des/make_ip.c +++ b/src/des/make_ip.c @@ -15,6 +15,7 @@ RCSID("$Header$"); #include #include +#include #include "des_internal.h" #define WANT_IP_TABLE diff --git a/src/dir/dir.h b/src/dir/dir.h index 369b25069..97aaede32 100644 --- a/src/dir/dir.h +++ b/src/dir/dir.h @@ -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]; }; diff --git a/src/fsint/afsint.xg b/src/fsint/afsint.xg index bb3e5166e..aa210a8b1 100644 --- a/src/fsint/afsint.xg +++ b/src/fsint/afsint.xg @@ -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; diff --git a/src/kauth/NTMakefile b/src/kauth/NTMakefile index def0154fe..02577f9a8 100644 --- a/src/kauth/NTMakefile +++ b/src/kauth/NTMakefile @@ -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 diff --git a/src/kauth/admin_tools.c b/src/kauth/admin_tools.c index b250875c3..72483fd8d 100644 --- a/src/kauth/admin_tools.c +++ b/src/kauth/admin_tools.c @@ -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; diff --git a/src/kauth/authclient.c b/src/kauth/authclient.c index 704595aaf..82d7ecd5e 100644 --- a/src/kauth/authclient.c +++ b/src/kauth/authclient.c @@ -45,6 +45,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/client.c b/src/kauth/client.c index c16c3d54b..8678c579c 100644 --- a/src/kauth/client.c +++ b/src/kauth/client.c @@ -37,6 +37,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/kaauxdb.c b/src/kauth/kaauxdb.c index d1275e3ca..280f29598 100644 --- a/src/kauth/kaauxdb.c +++ b/src/kauth/kaauxdb.c @@ -16,13 +16,21 @@ RCSID("$Header$"); -#include #ifdef AFS_NT40_ENV -#include #include #else #include #endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include "ubik_int.h" #include "kauth.h" diff --git a/src/kauth/kadatabase.c b/src/kauth/kadatabase.c index e70b30d69..d0a96ffae 100644 --- a/src/kauth/kadatabase.c +++ b/src/kauth/kadatabase.c @@ -18,6 +18,13 @@ RCSID("$Header$"); #else #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/kalocalcell.c b/src/kauth/kalocalcell.c index 9047d12eb..8b0126203 100644 --- a/src/kauth/kalocalcell.c +++ b/src/kauth/kalocalcell.c @@ -36,6 +36,13 @@ RCSID("$Header$"); #else #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/kalog.c b/src/kauth/kalog.c index e95ab32fd..c48b679ae 100644 --- a/src/kauth/kalog.c +++ b/src/kauth/kalog.c @@ -23,10 +23,16 @@ RCSID("$Header$"); #include #include -#ifndef AFS_NT40_ENV +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H #include #endif +#endif +#ifdef HAVE_FCNTL_H #include +#endif #include #include #include diff --git a/src/kauth/kas.c b/src/kauth/kas.c index b7694199f..1de47739f 100644 --- a/src/kauth/kas.c +++ b/src/kauth/kas.c @@ -28,6 +28,13 @@ RCSID("$Header$"); #else #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include diff --git a/src/kauth/kaserver.c b/src/kauth/kaserver.c index c8a83d323..7a62c2821 100644 --- a/src/kauth/kaserver.c +++ b/src/kauth/kaserver.c @@ -15,7 +15,6 @@ RCSID("$Header$"); #include #include #ifdef AFS_NT40_ENV -#include #include #include #else @@ -26,6 +25,16 @@ RCSID("$Header$"); #include "kalog.h" /* for OpenLog() */ #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_FCNTL_H +#include +#endif #ifdef AFS_AIX32_ENV #include #endif diff --git a/src/kauth/kautils.c b/src/kauth/kautils.c index a240d938b..397bdd787 100644 --- a/src/kauth/kautils.c +++ b/src/kauth/kautils.c @@ -21,6 +21,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/klog.c b/src/kauth/klog.c index 485c59a1a..b07094a81 100644 --- a/src/kauth/klog.c +++ b/src/kauth/klog.c @@ -18,6 +18,13 @@ RCSID("$Header$"); #ifdef AFS_AIX32_ENV #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include diff --git a/src/kauth/kpasswd.c b/src/kauth/kpasswd.c index 0db876f43..a61547062 100644 --- a/src/kauth/kpasswd.c +++ b/src/kauth/kpasswd.c @@ -28,6 +28,13 @@ RCSID("$Header$"); #ifndef AFS_NT40_ENV #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include @@ -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); diff --git a/src/kauth/kpwvalid.c b/src/kauth/kpwvalid.c index 07f26c34a..8653f9c71 100644 --- a/src/kauth/kpwvalid.c +++ b/src/kauth/kpwvalid.c @@ -13,6 +13,13 @@ RCSID("$Header$"); #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #ifdef AFS_NT40_ENV #include #endif diff --git a/src/kauth/krb_tf.c b/src/kauth/krb_tf.c index 2afb5464d..41cf8d1cb 100644 --- a/src/kauth/krb_tf.c +++ b/src/kauth/krb_tf.c @@ -49,12 +49,21 @@ RCSID("$Header$"); -#ifdef AFS_NT40_ENV +#ifdef HAVE_FCNTL_H #include +#endif +#ifdef AFS_NT40_ENV #include #else #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/krb_udp.c b/src/kauth/krb_udp.c index 816ebd416..79dbf777d 100644 --- a/src/kauth/krb_udp.c +++ b/src/kauth/krb_udp.c @@ -27,6 +27,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/rebuild.c b/src/kauth/rebuild.c index e25f2a616..b3e6a94f5 100644 --- a/src/kauth/rebuild.c +++ b/src/kauth/rebuild.c @@ -22,6 +22,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/token.c b/src/kauth/token.c index 0de5a103b..646cc9e51 100644 --- a/src/kauth/token.c +++ b/src/kauth/token.c @@ -43,6 +43,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif /* netinet/in.h and cellconfig.h are needed together */ #include /* these are needed together */ diff --git a/src/kauth/user.c b/src/kauth/user.c index 00509706d..20ed0d962 100644 --- a/src/kauth/user.c +++ b/src/kauth/user.c @@ -44,6 +44,13 @@ RCSID("$Header$"); #else #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/kauth/user_nt.c b/src/kauth/user_nt.c index a62e37862..c37c66dac 100644 --- a/src/kauth/user_nt.c +++ b/src/kauth/user_nt.c @@ -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 */ /* diff --git a/src/libafs/.cvsignore b/src/libafs/.cvsignore index f63a8840c..282329d4a 100644 --- a/src/libafs/.cvsignore +++ b/src/libafs/.cvsignore @@ -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 diff --git a/src/libafs/Makefile.common b/src/libafs/Makefile.common index dc869c28d..9f1afd2ac 100644 --- a/src/libafs/Makefile.common +++ b/src/libafs/Makefile.common @@ -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 diff --git a/src/libafs/MakefileProto.FBSD.in b/src/libafs/MakefileProto.FBSD.in index 67e3c3908..ef84b2263 100644 --- a/src/libafs/MakefileProto.FBSD.in +++ b/src/libafs/MakefileProto.FBSD.in @@ -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} diff --git a/src/libafs/MakefileProto.LINUX.in b/src/libafs/MakefileProto.LINUX.in index 81226b458..8ee1512b1 100644 --- a/src/libafs/MakefileProto.LINUX.in +++ b/src/libafs/MakefileProto.LINUX.in @@ -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} + +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} CCFLAGS = -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe \ -ffixed-r13 -mfixed-range=f10-f15,f32-f127 -falign-functions=32 -mb-step diff --git a/src/libafs/MakefileProto.SOLARIS.in b/src/libafs/MakefileProto.SOLARIS.in index 33864289d..afc4dbb59 100644 --- a/src/libafs/MakefileProto.SOLARIS.in +++ b/src/libafs/MakefileProto.SOLARIS.in @@ -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} - + 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. - + KOBJ = MODLOAD - + KOBJ = MODLOAD32 MODLOAD64 # This tells Makefile.common to use it's single directory build target. - + COMPDIRS = single_compdir INSTDIRS = single_instdir DESTDIRS = single_destdir - + 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 - + ${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 - + INST_LIBAFS = ${DESTDIR}${afskerneldir}/${LIBAFS} INST_LIBAFSNONFS = ${DESTDIR}${afskerneldir}/${LIBAFSNONFS} @@ -169,7 +169,7 @@ ${LIBAFSNONFS}: $(AFSAOBJS) $(AFSNONFSOBJS) $(RM) -f $@ $(LD) -r -o $@ $(AFSAOBJS) ${AFSNONFSOBJS} - + libafs: ${LIBAFSNONFS} diff --git a/src/libafsauthent/NTMakefile b/src/libafsauthent/NTMakefile index 4182a212b..c739b8754 100644 --- a/src/libafsauthent/NTMakefile +++ b/src/libafsauthent/NTMakefile @@ -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) diff --git a/src/libuafs/Makefile.common b/src/libuafs/Makefile.common index bb8fe04cc..00a930380 100644 --- a/src/libuafs/Makefile.common +++ b/src/libuafs/Makefile.common @@ -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 diff --git a/src/login/Makefile.in b/src/login/Makefile.in index 967267fe5..be2903a9e 100644 --- a/src/login/Makefile.in +++ b/src/login/Makefile.in @@ -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 \ diff --git a/src/ntp/.cvsignore b/src/ntp/.cvsignore index f3c7a7c5d..c6c769e38 100644 --- a/src/ntp/.cvsignore +++ b/src/ntp/.cvsignore @@ -1 +1,2 @@ +AFS_component_version_number.c Makefile diff --git a/src/pam/afs_util.c b/src/pam/afs_util.c index e0a8daed1..67a9fd353 100644 --- a/src/pam/afs_util.c +++ b/src/pam/afs_util.c @@ -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 */ diff --git a/src/pinstall/install.c b/src/pinstall/install.c index dd8b9de4e..f2c0b0fea 100644 --- a/src/pinstall/install.c +++ b/src/pinstall/install.c @@ -81,6 +81,7 @@ RCSID("$Header$"); #include #include #include +#include struct stat istat, ostat; diff --git a/src/ptserver/.cvsignore b/src/ptserver/.cvsignore index f476a0aae..6ae1e7874 100644 --- a/src/ptserver/.cvsignore +++ b/src/ptserver/.cvsignore @@ -16,3 +16,4 @@ ptserver readgroup readpwd testpt +ptclient diff --git a/src/ptserver/NTMakefile b/src/ptserver/NTMakefile index 02ea65629..1e277f057 100644 --- a/src/ptserver/NTMakefile +++ b/src/ptserver/NTMakefile @@ -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) diff --git a/src/ptserver/db_verify.c b/src/ptserver/db_verify.c index 3bddbe67a..f41b03f6f 100644 --- a/src/ptserver/db_verify.c +++ b/src/ptserver/db_verify.c @@ -26,6 +26,13 @@ RCSID("$Header$"); #include #endif #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/ptserver/ptclient.c b/src/ptserver/ptclient.c index 7311c2d2a..8fa312ff0 100644 --- a/src/ptserver/ptclient.c +++ b/src/ptserver/ptclient.c @@ -22,6 +22,7 @@ RCSID("$Header$"); #else #include #endif +#include #include #include #include @@ -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 #else -#include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#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] = ""; diff --git a/src/ptserver/pts.c b/src/ptserver/pts.c index 7546c9ff6..b6dce8ac6 100644 --- a/src/ptserver/pts.c +++ b/src/ptserver/pts.c @@ -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 diff --git a/src/ptserver/ptserver.c b/src/ptserver/ptserver.c index b05ff9ab2..6195610c7 100644 --- a/src/ptserver/ptserver.c +++ b/src/ptserver/ptserver.c @@ -25,6 +25,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/ptserver/ptuser.c b/src/ptserver/ptuser.c index cea872b55..70b483977 100644 --- a/src/ptserver/ptuser.c +++ b/src/ptserver/ptuser.c @@ -39,6 +39,13 @@ RCSID("$Header$"); #include #endif #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/ptserver/ptutils.c b/src/ptserver/ptutils.c index 1b78fe4f5..6b9d52f09 100644 --- a/src/ptserver/ptutils.c +++ b/src/ptserver/ptutils.c @@ -19,8 +19,14 @@ RCSID("$Header$"); #include #else #include +#endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H #include #endif +#endif #include #include #include @@ -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; diff --git a/src/ptserver/readgroup.c b/src/ptserver/readgroup.c index 4129c87c9..230863602 100644 --- a/src/ptserver/readgroup.c +++ b/src/ptserver/readgroup.c @@ -13,12 +13,17 @@ RCSID("$Header$"); #include -#ifndef AFS_NT40_ENV -#include -#else +#ifdef AFS_NT40_ENV #include #endif #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/ptserver/readpwd.c b/src/ptserver/readpwd.c index 7548ea461..19f2de3a5 100644 --- a/src/ptserver/readpwd.c +++ b/src/ptserver/readpwd.c @@ -13,11 +13,16 @@ RCSID("$Header$"); #include -#ifndef AFS_NT40_ENV -#include -#else +#ifdef AFS_NT40_ENV #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/ptserver/testpt.c b/src/ptserver/testpt.c index 1ba7e8d44..ad94f8f07 100644 --- a/src/ptserver/testpt.c +++ b/src/ptserver/testpt.c @@ -23,6 +23,22 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif #include #include #include diff --git a/src/ptserver/utils.c b/src/ptserver/utils.c index 50464d86f..048ff54a7 100644 --- a/src/ptserver/utils.c +++ b/src/ptserver/utils.c @@ -22,6 +22,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include "ptserver.h" #include "pterror.h" diff --git a/src/rx/IRIX/rx_knet.c b/src/rx/IRIX/rx_knet.c index 4e02690a8..4128f9e87 100644 --- a/src/rx/IRIX/rx_knet.c +++ b/src/rx/IRIX/rx_knet.c @@ -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, diff --git a/src/rx/SOLARIS/rx_knet.c b/src/rx/SOLARIS/rx_knet.c index 9598b9179..d884bfc52 100644 --- a/src/rx/SOLARIS/rx_knet.c +++ b/src/rx/SOLARIS/rx_knet.c @@ -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 diff --git a/src/rx/rx.c b/src/rx/rx.c index c74472db3..1ecacf6c0 100644 --- a/src/rx/rx.c +++ b/src/rx/rx.c @@ -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 diff --git a/src/rx/rx.h b/src/rx/rx.h index 79ab60835..d05cae904 100644 --- a/src/rx/rx.h +++ b/src/rx/rx.h @@ -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)) diff --git a/src/rx/rx_clock.c b/src/rx/rx_clock.c index e27c62626..5d94973a6 100644 --- a/src/rx/rx_clock.c +++ b/src/rx/rx_clock.c @@ -33,6 +33,7 @@ RCSID("$Header$"); #include #include #include +#include #include "rx_clock.h" #endif diff --git a/src/rx/rx_getaddr.c b/src/rx/rx_getaddr.c index 6c19b3e42..4bef1ec2a 100644 --- a/src/rx/rx_getaddr.c +++ b/src/rx/rx_getaddr.c @@ -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 */ diff --git a/src/rx/rx_kcommon.c b/src/rx/rx_kcommon.c index 53a57c573..8755fb31f 100644 --- a/src/rx/rx_kcommon.c +++ b/src/rx/rx_kcommon.c @@ -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; diff --git a/src/rx/rx_kcommon.h b/src/rx/rx_kcommon.h index a11c14537..92b2bc332 100644 --- a/src/rx/rx_kcommon.h +++ b/src/rx/rx_kcommon.h @@ -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; diff --git a/src/rx/rx_misc.h b/src/rx/rx_misc.h index 743a44a22..1f66c25c8 100644 --- a/src/rx/rx_misc.h +++ b/src/rx/rx_misc.h @@ -14,14 +14,10 @@ #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 #include #endif diff --git a/src/rx/rx_packet.c b/src/rx/rx_packet.c index b248117ff..8b7051eca 100644 --- a/src/rx/rx_packet.c +++ b/src/rx/rx_packet.c @@ -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 */ diff --git a/src/rx/rx_trace.c b/src/rx/rx_trace.c index 05f0589ac..f3885207c 100644 --- a/src/rx/rx_trace.c +++ b/src/rx/rx_trace.c @@ -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); } diff --git a/src/rxdebug/rxdebug.c b/src/rxdebug/rxdebug.c index 67d9d1866..92c2747e1 100644 --- a/src/rxdebug/rxdebug.c +++ b/src/rxdebug/rxdebug.c @@ -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); diff --git a/src/rxkad/rxkad_client.c b/src/rxkad/rxkad_client.c index 12dd07946..f12d5315c 100644 --- a/src/rxkad/rxkad_client.c +++ b/src/rxkad/rxkad_client.c @@ -41,6 +41,13 @@ RCSID("$Header$"); #include #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #ifdef AFS_NT40_ENV #include #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)" */ diff --git a/src/rxkad/rxkad_common.c b/src/rxkad/rxkad_common.c index 1ce045d48..361f21c89 100644 --- a/src/rxkad/rxkad_common.c +++ b/src/rxkad/rxkad_common.c @@ -51,6 +51,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #endif /* KERNEL */ diff --git a/src/rxkad/rxkad_server.c b/src/rxkad/rxkad_server.c index 84b949b8c..c027f031d 100644 --- a/src/rxkad/rxkad_server.c +++ b/src/rxkad/rxkad_server.c @@ -24,6 +24,13 @@ RCSID("$Header$"); #else #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/rxkad/ticket.c b/src/rxkad/ticket.c index 32576c157..15c63cb85 100644 --- a/src/rxkad/ticket.c +++ b/src/rxkad/ticket.c @@ -33,6 +33,13 @@ RCSID("$Header$"); #else #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/sys/rmtsysnet.c b/src/sys/rmtsysnet.c index e28ea9b77..399b818b0 100644 --- a/src/sys/rmtsysnet.c +++ b/src/sys/rmtsysnet.c @@ -25,6 +25,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/tbutc/Makefile.in b/src/tbutc/Makefile.in index d52a873a8..338ce9c90 100644 --- a/src/tbutc/Makefile.in +++ b/src/tbutc/Makefile.in @@ -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="" 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 diff --git a/src/ubik/beacon.c b/src/ubik/beacon.c index 3fc756c62..f039557c4 100644 --- a/src/ubik/beacon.c +++ b/src/ubik/beacon.c @@ -25,6 +25,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include @@ -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)); diff --git a/src/ubik/disk.c b/src/ubik/disk.c index bf9785b9f..a41aef44b 100644 --- a/src/ubik/disk.c +++ b/src/ubik/disk.c @@ -20,6 +20,13 @@ RCSID("$Header$"); #include #endif #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include diff --git a/src/ubik/phys.c b/src/ubik/phys.c index 70f31c46b..0fcaf8f56 100644 --- a/src/ubik/phys.c +++ b/src/ubik/phys.c @@ -25,6 +25,13 @@ RCSID("$Header$"); #include #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #define UBIK_INTERNALS 1 #include "ubik.h" diff --git a/src/ubik/recovery.c b/src/ubik/recovery.c index b5d6409bd..f4b0a40f2 100644 --- a/src/ubik/recovery.c +++ b/src/ubik/recovery.c @@ -23,6 +23,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include @@ -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; diff --git a/src/ubik/remote.c b/src/ubik/remote.c index 6f0d9438e..bb5354a7b 100644 --- a/src/ubik/remote.c +++ b/src/ubik/remote.c @@ -19,6 +19,13 @@ RCSID("$Header$"); #include #include #endif +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include @@ -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); } diff --git a/src/ubik/ubik.c b/src/ubik/ubik.c index a413ba3e9..12772caa2 100644 --- a/src/ubik/ubik.c +++ b/src/ubik/ubik.c @@ -22,6 +22,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/ubik/ubikcmd.c b/src/ubik/ubikcmd.c index 0aad08a85..8a0c119e4 100644 --- a/src/ubik/ubikcmd.c +++ b/src/ubik/ubikcmd.c @@ -23,6 +23,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include diff --git a/src/ubik/utst_client.c b/src/ubik/utst_client.c index 2f9e832f0..88a407310 100644 --- a/src/ubik/utst_client.c +++ b/src/ubik/utst_client.c @@ -23,6 +23,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/ubik/utst_server.c b/src/ubik/utst_server.c index 038e02767..49d05123e 100644 --- a/src/ubik/utst_server.c +++ b/src/ubik/utst_server.c @@ -24,6 +24,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/ubik/vote.c b/src/ubik/vote.c index 28e75e2f1..e850aa877 100644 --- a/src/ubik/vote.c +++ b/src/ubik/vote.c @@ -21,6 +21,13 @@ RCSID("$Header$"); #endif #include #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/update/client.c b/src/update/client.c index abd021583..9ec65f340 100644 --- a/src/update/client.c +++ b/src/update/client.c @@ -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; + } } } diff --git a/src/util/Makefile.in b/src/util/Makefile.in index 8604d2aa2..6d4474f6d 100644 --- a/src/util/Makefile.in +++ b/src/util/Makefile.in @@ -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 \ diff --git a/src/util/assert.c b/src/util/assert.c index 6363e67ed..4f5267544 100644 --- a/src/util/assert.c +++ b/src/util/assert.c @@ -10,6 +10,10 @@ /* ReallyAbort: called from assert. May/85 */ #include #include +#include +#ifdef HAVE_SYS_TIME_H +#include +#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(); diff --git a/src/util/casestrcpy.c b/src/util/casestrcpy.c index 7f7dbdfb1..ae44a1db2 100644 --- a/src/util/casestrcpy.c +++ b/src/util/casestrcpy.c @@ -12,6 +12,13 @@ RCSID("$Header$"); +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include diff --git a/src/util/fileutil.c b/src/util/fileutil.c index 1f0cb1c30..d17cf765d 100644 --- a/src/util/fileutil.c +++ b/src/util/fileutil.c @@ -24,13 +24,24 @@ RCSID("$Header$"); #include #include #include "errmap_nt.h" -#else +#endif + +#ifdef HAVE_UNISTD_H #include #endif +#ifdef HAVE_STRING_H #include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif #include #include #include +#ifdef HAVE_FCNTL_H +#include +#endif #include "fileutil.h" diff --git a/src/util/kreltime.c b/src/util/kreltime.c index 2e953218a..60ee5a39c 100644 --- a/src/util/kreltime.c +++ b/src/util/kreltime.c @@ -18,11 +18,13 @@ RCSID("$Header$"); #include "ktime.h" #include #include -#if defined(AFS_SUN5_ENV) || defined(AFS_NT40_ENV) +#ifdef HAVE_STRING_H #include #else +#ifdef HAVE_STRINGS_H #include #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 diff --git a/src/util/ktime.c b/src/util/ktime.c index b2b2207d8..663a383b7 100644 --- a/src/util/ktime.c +++ b/src/util/ktime.c @@ -19,11 +19,14 @@ RCSID("$Header$"); #ifdef AFS_NT40_ENV #include #endif -#if defined(AFS_SUN5_ENV) || defined(AFS_NT40_ENV) +#ifdef HAVE_STRING_H #include #else +#ifdef HAVE_STRINGS_H #include #endif +#endif +#include #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) diff --git a/src/util/uuid.c b/src/util/uuid.c index 79b99f241..f4629c39a 100644 --- a/src/util/uuid.c +++ b/src/util/uuid.c @@ -37,6 +37,17 @@ RCSID("$Header$"); #include #endif /* ITIMER_REAL */ #include +#ifdef HAVE_STRING_H +#include +#else +#ifdef HAVE_STRINGS_H +#include +#endif +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#include #endif #include #include diff --git a/src/venus/.cvsignore b/src/venus/.cvsignore index 8d28180c7..41aaea35b 100644 --- a/src/venus/.cvsignore +++ b/src/venus/.cvsignore @@ -3,5 +3,7 @@ Makefile cmdebug fs fstrace -kdump-2.4.7-ac3 +kdump-* up +kdump +kdump64 diff --git a/src/venus/Makefile.in b/src/venus/Makefile.in index 8075bfaff..1d6cdf268 100644 --- a/src/venus/Makefile.in +++ b/src/venus/Makefile.in @@ -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 index 000000000..af40a2216 --- /dev/null +++ b/src/venus/kdump.sh.linux @@ -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 index 000000000..f736bb1fd --- /dev/null +++ b/src/venus/livesys.c @@ -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 +#include + +RCSID("$Header$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef AFS_AIX32_ENV +#include +#endif +#include + +#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; +} diff --git a/src/vfsck/.cvsignore b/src/vfsck/.cvsignore index f3c7a7c5d..932b9cc9d 100644 --- a/src/vfsck/.cvsignore +++ b/src/vfsck/.cvsignore @@ -1 +1,3 @@ +AFS_component_version_number.c Makefile +vfsck diff --git a/src/viced/afsfileprocs.c b/src/viced/afsfileprocs.c index b5cc861b1..69b880bf1 100644 --- a/src/viced/afsfileprocs.c +++ b/src/viced/afsfileprocs.c @@ -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; iAFSBulkStats_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*/ diff --git a/src/viced/callback.c b/src/viced/callback.c index 0d943aafd..78ea70131 100644 --- a/src/viced/callback.c +++ b/src/viced/callback.c @@ -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*/ diff --git a/src/viced/host.c b/src/viced/host.c index 0cda0be6c..31c044d67 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -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; diff --git a/src/viced/viced.c b/src/viced/viced.c index 4d7fef136..0280e7b5e 100644 --- a/src/viced/viced.c +++ b/src/viced/viced.c @@ -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); diff --git a/src/vlserver/vldbint.xg b/src/vlserver/vldbint.xg index 589e84555..faa568c38 100644 --- a/src/vlserver/vldbint.xg +++ b/src/vlserver/vldbint.xg @@ -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 */ diff --git a/src/vlserver/vlserver.p.h b/src/vlserver/vlserver.p.h index ccd81d6cc..0a8beb59e 100644 --- a/src/vlserver/vlserver.p.h +++ b/src/vlserver/vlserver.p.h @@ -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 diff --git a/src/vol/.cvsignore b/src/vol/.cvsignore index 648147fe1..154e50f13 100644 --- a/src/vol/.cvsignore +++ b/src/vol/.cvsignore @@ -2,3 +2,5 @@ AFS_component_version_number.c Makefile salvager volinfo +gi +fs_conv_sol26 diff --git a/src/vol/Makefile.in b/src/vol/Makefile.in index be65cf90b..c93d91794 100644 --- a/src/vol/Makefile.in +++ b/src/vol/Makefile.in @@ -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 diff --git a/src/vol/ihandle.c b/src/vol/ihandle.c index f3b82f193..569552b34 100644 --- a/src/vol/ihandle.c +++ b/src/vol/ihandle.c @@ -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; diff --git a/src/vol/ihandle.h b/src/vol/ihandle.h index 93fa5b65c..a14f2f7f1 100644 --- a/src/vol/ihandle.h +++ b/src/vol/ihandle.h @@ -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, diff --git a/src/vol/namei_ops.c b/src/vol/namei_ops.c index e54058750..e1cb1f63d 100644 --- a/src/vol/namei_ops.c +++ b/src/vol/namei_ops.c @@ -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) { diff --git a/src/vol/partition.c b/src/vol/partition.c index 271772258..cb16224a5 100644 --- a/src/vol/partition.c +++ b/src/vol/partition.c @@ -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 } diff --git a/src/vol/partition.h b/src/vol/partition.h index c64140345..c583bd0af 100644 --- a/src/vol/partition.h +++ b/src/vol/partition.h @@ -31,6 +31,15 @@ #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" diff --git a/src/volser/volprocs.c b/src/volser/volprocs.c index 93bce59f5..547e99a28 100644 --- a/src/volser/volprocs.c +++ b/src/volser/volprocs.c @@ -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; } diff --git a/src/volser/volser.p.h b/src/volser/volser.p.h index 4bb13638b..74f580dec 100644 --- a/src/volser/volser.p.h +++ b/src/volser/volser.p.h @@ -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_ */ diff --git a/src/volser/vos.c b/src/volser/vos.c index 395795442..6f8506546 100644 --- a/src/volser/vos.c +++ b/src/volser/vos.c @@ -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 */ + 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"); diff --git a/src/volser/vsprocs.c b/src/volser/vsprocs.c index 5e5a9c022..5ef020fd7 100644 --- a/src/volser/vsprocs.c +++ b/src/volser/vsprocs.c @@ -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 as read/write site for 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 */ 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 (present in network byte order) to that in< new> (present in host byte order )*/ void diff --git a/src/volser/vsutils.c b/src/volser/vsutils.c index 416026734..3a5d1e37e 100644 --- a/src/volser/vsutils.c +++ b/src/volser/vsutils.c @@ -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: -- 2.39.5