From 7624c0a3af240986fbd614f398c10bb5e025233e Mon Sep 17 00:00:00 2001 From: Sam Hartman Date: Mon, 23 Apr 2001 18:40:59 +0000 Subject: [PATCH] Initial revision --- src/afsd/afs.ppc_darwin.plist | 31 ++ src/afsd/afs.rc.darwin | 123 +++++++ src/afsd/afs.rc.darwin.plist | 11 + src/afsd/afs.rc.fbsd | 123 +++++++ src/config/Makefile.alpha_linux_2216_22 | 48 +++ src/config/Makefile.hp_ux102 | 37 +++ src/config/Makefile.i386_fbsd_42 | 52 +++ src/config/Makefile.ppc_darwin_12 | 46 +++ src/config/Makefile.ppc_darwin_13 | 46 +++ src/config/param.alpha_linux_2216_22.h | 68 ++++ src/config/param.alpha_linux_2216_22_usr.h | 54 +++ src/config/param.hp_ux102.h | 87 +++++ src/config/param.hp_ux102_usr.h | 64 ++++ src/config/param.i386_fbsd_42.h | 136 ++++++++ src/config/param.i386_fbsd_42_usr.h | 61 ++++ src/config/param.ppc_darwin_12.h | 58 ++++ src/config/param.ppc_darwin_12_usr.h | 46 +++ src/config/param.ppc_darwin_13.h | 60 ++++ src/config/param.ppc_darwin_13_usr.h | 48 +++ src/des/conf-alpha-linux.h | 18 + src/des/conf-ppc-darwin.h | 6 + src/libafs/Makefile.extradefs | 8 + src/libafs/MakefileProto.DARWIN | 115 +++++++ src/libafs/MakefileProto.FBSD | 112 +++++++ src/libafs/redhat.sh | 19 ++ src/libuafs/MakefileProto.DARWIN | 82 +++++ src/libuafs/MakefileProto.FBSD | 76 +++++ src/lwp/process.fbsd.s | 90 +++++ src/rx/DARWIN/rx_kmutex.h | 107 ++++++ src/rx/DARWIN/rx_knet.c | 163 ++++++++++ src/rx/FBSD/rx_kmutex.h | 96 ++++++ src/rx/FBSD/rx_knet.c | 361 +++++++++++++++++++++ 32 files changed, 2452 insertions(+) create mode 100644 src/afsd/afs.ppc_darwin.plist create mode 100644 src/afsd/afs.rc.darwin create mode 100644 src/afsd/afs.rc.darwin.plist create mode 100644 src/afsd/afs.rc.fbsd create mode 100644 src/config/Makefile.alpha_linux_2216_22 create mode 100644 src/config/Makefile.hp_ux102 create mode 100644 src/config/Makefile.i386_fbsd_42 create mode 100644 src/config/Makefile.ppc_darwin_12 create mode 100644 src/config/Makefile.ppc_darwin_13 create mode 100644 src/config/param.alpha_linux_2216_22.h create mode 100644 src/config/param.alpha_linux_2216_22_usr.h create mode 100644 src/config/param.hp_ux102.h create mode 100644 src/config/param.hp_ux102_usr.h create mode 100644 src/config/param.i386_fbsd_42.h create mode 100644 src/config/param.i386_fbsd_42_usr.h create mode 100644 src/config/param.ppc_darwin_12.h create mode 100644 src/config/param.ppc_darwin_12_usr.h create mode 100644 src/config/param.ppc_darwin_13.h create mode 100644 src/config/param.ppc_darwin_13_usr.h create mode 100644 src/des/conf-alpha-linux.h create mode 100644 src/des/conf-ppc-darwin.h create mode 100644 src/libafs/Makefile.extradefs create mode 100644 src/libafs/MakefileProto.DARWIN create mode 100644 src/libafs/MakefileProto.FBSD create mode 100755 src/libafs/redhat.sh create mode 100644 src/libuafs/MakefileProto.DARWIN create mode 100644 src/libuafs/MakefileProto.FBSD create mode 100644 src/lwp/process.fbsd.s create mode 100644 src/rx/DARWIN/rx_kmutex.h create mode 100644 src/rx/DARWIN/rx_knet.c create mode 100644 src/rx/FBSD/rx_kmutex.h create mode 100644 src/rx/FBSD/rx_knet.c diff --git a/src/afsd/afs.ppc_darwin.plist b/src/afsd/afs.ppc_darwin.plist new file mode 100644 index 000000000..c29e66421 --- /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.0.3 + CFBundleSignature + ???? + CFBundleVersion + 1.0.3 + OSBundleLibraries + + com.apple.kernel.bsd + 1.0.0b1 + com.apple.kernel.mach + 1.0.0b1 + + + diff --git a/src/afsd/afs.rc.darwin b/src/afsd/afs.rc.darwin new file mode 100644 index 000000000..d82d4efe7 --- /dev/null +++ b/src/afsd/afs.rc.darwin @@ -0,0 +1,123 @@ +#!/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 + +. /etc/rc.common + +CheckForNetwork + +if [ "${NETWORKUP}" = "-NO-" ]; then exit; fi + +if [ -r /var/db/openafs ]; then + VICEETC=/var/db/openafs/etc + AFSD=/usr/sbin/afsd +else + VICEETC=/usr/vice/etc + AFSD=$VICEETC/afsd +fi +CONFIG=$VICEETC/config +AFSDOPT=$CONFIG/afsd.options +PACKAGE=$CONFIG/package.options + +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" + +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 +if kmodstat | grep -q openafs ; then +: +else +if [ -d $VICEETC/afs.kext ]; then + echo "Loading AFS kernel extensions" + kextload $VICEETC/afs.kext +else + echo "$VICEETC/afs.kext does not exist. Skipping AFS startup." + exit 1 +fi +fi +if kmodstat | grep -q openafs ; then +: +else + echo "AFS kernel extensions failed to initialize. Skipping AFS startup." +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 $AFSD $VICEETC/cacheinfo \ + $VICEETC/ThisCell $VICEETC/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}' $VICEETC/cacheinfo` +do + if [ ! -d ${dir} ]; then + echo "${dir} does not exist. Not starting AFS client." + exit 2 + fi +done + +echo "Starting afsd" +$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 + /sbin/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 diff --git a/src/afsd/afs.rc.darwin.plist b/src/afsd/afs.rc.darwin.plist new file mode 100644 index 000000000..4c05dd1f0 --- /dev/null +++ b/src/afsd/afs.rc.darwin.plist @@ -0,0 +1,11 @@ +{ + Description = "OpenAFS network file system"; + Provides = ("AFS"); + Requires = ("Resolver"); + OrderPreference = "None"; + Messages = + { + start = "Starting OpenAFS file system"; + stop = "Stopping OpenAFS file system"; + }; +} diff --git a/src/afsd/afs.rc.fbsd b/src/afsd/afs.rc.fbsd new file mode 100644 index 000000000..c261fc9a9 --- /dev/null +++ b/src/afsd/afs.rc.fbsd @@ -0,0 +1,123 @@ +#!/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 + +. /etc/rc.common + +CheckForNetwork + +if [ "${NETWORKUP}" = "-NO-" ]; then exit; fi + +if [ -r /var/db/openafs ]; then + VICEETC=/var/db/openafs/etc + AFSD=/usr/sbin/afsd +else + VICEETC=/usr/vice/etc + AFSD=$VICEETC/afsd +fi +CONFIG=$VICEETC/config +AFSDOPT=$CONFIG/afsd.options +PACKAGE=$CONFIG/package.options + +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" + +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 +if kmodstat | grep -q openafs ; then +: +else +if [ -d $VICEETC/afs.ko ]; then + echo "Loading AFS kernel extensions" + kldload $VICEETC/afs.ko +else + echo "$VICEETC/afs.ko does not exist. Skipping AFS startup." + exit 1 +fi +fi +if kldstat | grep -q openafs ; then +: +else + echo "AFS kernel extensions failed to initialize. Skipping AFS startup." +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 $AFSD $VICEETC/cacheinfo \ + $VICEETC/ThisCell $VICEETC/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}' $VICEETC/cacheinfo` +do + if [ ! -d ${dir} ]; then + echo "${dir} does not exist. Not starting AFS client." + exit 2 + fi +done + +echo "Starting afsd" +$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 + /sbin/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 diff --git a/src/config/Makefile.alpha_linux_2216_22 b/src/config/Makefile.alpha_linux_2216_22 new file mode 100644 index 000000000..7443d55cc --- /dev/null +++ b/src/config/Makefile.alpha_linux_2216_22 @@ -0,0 +1,48 @@ +# 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= +# +# programs +AR=ar +AS=as +CP=cp +INSTALL=${SRCDIR}bin/install +LD=ld +MT_CC=cc +MV=mv +RANLIB=ranlib +RM=rm +WASHTOOL=${SRCDIR}bin/washtool +# +# Other OS specific requirements +# +YACC = bison -y +LEX = flex -l +# Used in des library. +CRYPT_OBJ = crypt.o diff --git a/src/config/Makefile.hp_ux102 b/src/config/Makefile.hp_ux102 new file mode 100644 index 000000000..583708719 --- /dev/null +++ b/src/config/Makefile.hp_ux102 @@ -0,0 +1,37 @@ +# 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 + +AFS_OSTYPE = HPUX +CC=/opt/ansic/bin/cc -Ae +MT_CC=/opt/ansic/bin/cc -Ae +XCFLAGS0=-ldld -lc -Wp,-H200000 -Wl,-a,archive -DAUTH_DBM_LOG +z -Wl,+k -D_LARGEFILE64_SOURCE +XCFLAGS=${XCFLAGS0} +DA1.0 +XCFLAGS64=${XCFLAGS0} +DA2.0W +MT_CFLAGS=-D_POSIX_C_SOURCE=199506L -DAFS_PTHREAD_ENV ${XCFLAGS} +XLIBS= +XLIBELFA= +TXLIBS=/usr/lib/libHcurses.a +MTLIBS=-L/opt/dce/lib -ldce +SHLIB_SUFFIX=sl +LWP_OPTMZ=-O +OPTMZ=-O +DBG=-g +RANLIB=ranlib +WASHTOOL=${DESTDIR}bin/washtool +INSTALL=${DESTDIR}bin/install +RM=/bin/rm +CP=/bin/cp +AR=/bin/ar +AS=/usr/ccs/bin/as +MV=/bin/mv +LD=/bin/ld +LEX=/opt/langtools/bin/lex +DBM=/lib/libndbm.a +PAM_CFLAGS=+DA1.0 +z -Wl,+k +SHARE_LDFLAGS=-b -Bsymbolic +PAMLIBS=/usr/lib/libpam.1 +YACC=/opt/langtools/bin/yacc diff --git a/src/config/Makefile.i386_fbsd_42 b/src/config/Makefile.i386_fbsd_42 new file mode 100644 index 000000000..942d7c7a6 --- /dev/null +++ b/src/config/Makefile.i386_fbsd_42 @@ -0,0 +1,52 @@ +# Copyright 1998 Transarc Corporation +# +# Keep macros within each section in sorted order for clean diff displays. +# +# AFS_OSTYPE used to indicate suffixes and os specific subdirectories. +AFS_OSTYPE = FBSD +# Pointers to destination and source directories +DESTDIR=DEST/ +SRCDIR=DEST/ +# 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.5-15 2.2.10 2.2.12 2.2.12-20 2.2.13 2.2.14 + +# +# compilation and link editor flags +DBG=-g +OPTMZ=-O2 +PAM_CFLAGS = -O2 -pipe -fPIC +# Put -O2 here to _ensure_ all Makefiles pick it up. +XCFLAGS= -O2 -pipe +MT_CFLAGS=-DAFS_PTHREAD_ENV -pthread -D_REENTRANT ${XCFLAGS} +XLDFLAGS= +SHARE_LDFLAGS = -shared -Xlinker -x +SHLIB_SUFFIX=so +SHLIB_CFLAGS= +# +# libraries +MTLIBS=-pthread +TXLIBS= /usr/lib/libncurses.so +XLIBS=-lcompat +# +# programs +AR=ar +AS=as +CP=cp +INSTALL=${SRCDIR}bin/install +LD=ld +MT_CC=cc +MV=mv +RANLIB=ranlib +RM=rm +WASHTOOL=${SRCDIR}bin/washtool +# +# Other OS specific requirements +# +YACC = bison -y +LEX = flex -l +# Used in des library. +CRYPT_OBJ = crypt.o diff --git a/src/config/Makefile.ppc_darwin_12 b/src/config/Makefile.ppc_darwin_12 new file mode 100644 index 000000000..bdf3d34c0 --- /dev/null +++ b/src/config/Makefile.ppc_darwin_12 @@ -0,0 +1,46 @@ +# Keep macros within each section in sorted order for clean diff displays. +# +# AFS_OSTYPE used to indicate suffixes and os specific subdirectories. +AFS_OSTYPE = DARWIN +# +# Pointers to destination and source directories +DESTDIR=DEST/ +DESTDIR=DEST/ +# +# compilation and link editor flags +XCFLAGS=-traditional-cpp +#MT_CFLAGS=-D_REENTRANT -DAFS_PTHREAD_ENV ${XCFLAGS} +#MT_CC=cc +KROOT= +KINCLUDES=-I$(KROOT)/System/Library/Frameworks/Kernel.framework/Headers +#SHARE_LDFLAGS = +LWP_OPTMZ=-g +OPTMZ=-g +DBG=-g +REGEX_OBJ=regex.o + + +# +# libraries +#XLIBS= +TXLIBS= +#MTLIBS= +#XLIBELFA= +#XLIBKVM= +# +SHLIB_SUFFIX= +SHLIB_CFLAGS= +# +# programs +AR=ar +AS=as +CC=cc +CP=cp +INSTALL=${DESTDIR}bin/pinstall +LEX=lex -l +LD= ld +LORDER = lorder +MV=mv +RANLIB=ranlib +RM=rm +STRIP= strip diff --git a/src/config/Makefile.ppc_darwin_13 b/src/config/Makefile.ppc_darwin_13 new file mode 100644 index 000000000..bdf3d34c0 --- /dev/null +++ b/src/config/Makefile.ppc_darwin_13 @@ -0,0 +1,46 @@ +# Keep macros within each section in sorted order for clean diff displays. +# +# AFS_OSTYPE used to indicate suffixes and os specific subdirectories. +AFS_OSTYPE = DARWIN +# +# Pointers to destination and source directories +DESTDIR=DEST/ +DESTDIR=DEST/ +# +# compilation and link editor flags +XCFLAGS=-traditional-cpp +#MT_CFLAGS=-D_REENTRANT -DAFS_PTHREAD_ENV ${XCFLAGS} +#MT_CC=cc +KROOT= +KINCLUDES=-I$(KROOT)/System/Library/Frameworks/Kernel.framework/Headers +#SHARE_LDFLAGS = +LWP_OPTMZ=-g +OPTMZ=-g +DBG=-g +REGEX_OBJ=regex.o + + +# +# libraries +#XLIBS= +TXLIBS= +#MTLIBS= +#XLIBELFA= +#XLIBKVM= +# +SHLIB_SUFFIX= +SHLIB_CFLAGS= +# +# programs +AR=ar +AS=as +CC=cc +CP=cp +INSTALL=${DESTDIR}bin/pinstall +LEX=lex -l +LD= ld +LORDER = lorder +MV=mv +RANLIB=ranlib +RM=rm +STRIP= strip diff --git a/src/config/param.alpha_linux_2216_22.h b/src/config/param.alpha_linux_2216_22.h new file mode 100644 index 000000000..474e6dbcb --- /dev/null +++ b/src/config/param.alpha_linux_2216_22.h @@ -0,0 +1,68 @@ +#ifndef _PARAM_ALPHA_LINUX2216_22_H_ +#define _PARAM_ALPHA_LINUX2216_22_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_ALPHA_LINUX20_ENV 1 +#define AFS_ALPHA_LINUX22_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. */ + +#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_22" +#define SYS_NAME_ID SYS_NAME_ID_alpha_linux_22 +#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 */ + +#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 +#define __SMP__ +#define AFS_GLOBAL_SUNLOCK +#endif + +#endif /* __KERNEL__ && !DUMP_KERNEL*/ + +#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_LINUX2216_22_H_ */ diff --git a/src/config/param.alpha_linux_2216_22_usr.h b/src/config/param.alpha_linux_2216_22_usr.h new file mode 100644 index 000000000..e1d166751 --- /dev/null +++ b/src/config/param.alpha_linux_2216_22_usr.h @@ -0,0 +1,54 @@ +#ifndef _PARAM_ALPHA_LINUX2216_22_USR_H_ +#define _PARAM_ALPHA_LINUX2216_22_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_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_22" +#define SYS_NAME_ID SYS_NAME_ID_alpha_linux_22 +#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_LINUX2216_22_USR_H_ */ diff --git a/src/config/param.hp_ux102.h b/src/config/param.hp_ux102.h new file mode 100644 index 000000000..ccf75c990 --- /dev/null +++ b/src/config/param.hp_ux102.h @@ -0,0 +1,87 @@ +/* + * 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 + */ + +/* THIS FILE IS AUTOMATICALLY GENERATED; DO NOT EDIT */ + +#ifndef _PARAM_HP_UX10_2_H_ +#define _PARAM_HP_UX10_2_H_ + +#define AFS_HPUX_ENV 1 +#define AFS_HPUX90_ENV 1 +#define AFS_HPUX100_ENV 1 +#define AFS_HPUX101_ENV 1 +#define AFS_HPUX102_ENV 1 + +#include + +#define AFS_SYSCALL 48 /* slot reserved for AFS */ + +/* Machine / Operating system information */ +#define SYS_NAME "hp_ux102" +#define SYS_NAME_ID SYS_NAME_ID_hp_ux102 +#define AFSBIG_ENDIAN 1 +#define AFS_HAVE_FFS 1 +#define AFS_HAVE_STATVFS 1 /* System supports statvfs */ +#define AFS_GLOBAL_SUNLOCK 1 +#define RXK_LISTENER_ENV 1 +#define AFS_USERSPACE_IP_ADDR 1 +#define AFS_GCPAGS 0 /* if nonzero, garbage collect PAGs */ +/* + * #define AFS_VM_RDWR_ENV 1 + */ +#define AFS_TEXT_ENV 1 /* Older kernels use TEXT */ +#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 +#define _KERNEL 1 +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_seg +#define afsio_resid uio_resid +#define AFS_UIOSYS UIOSEG_KERNEL +#define AFS_UIOUSER UIOSEG_USER +#define AFS_CLBYTES CLBYTES +#define AFS_MINCHANGE 2 +#define osi_GetTime(x) do { struct timeval osi_GetTimeVar; uniqtime(&osi_GetTimeVar); (x)->tv_sec = osi_GetTimeVar.tv_sec; (x)->tv_usec = osi_GetTimeVar.tv_usec; } while(0) +#define AFS_KALLOC kmem_alloc +#define AFS_KFREE kmem_free +#define VATTR_NULL vattr_null + +#if defined(__LP64__) +#define AFS_HPUX_64BIT_ENV 1 +#endif + +#ifndef UKERNEL +/* + * On HP-UX, sys/socket.h includes sys/uio.h, and sys/file.h and + * sys/uio.h #include each other, and there's no simple way to avoid a + * warning about the struct uio declaration not being visible outside + * of some prototype or other. So, we put in a tenative declaration to + * supress the warnings. + */ +struct uio; +#endif +#endif /* KERNEL */ +#define AFS_DIRENT +/* Non-standard definitions */ +#ifndef EDQUOT +#define EDQUOT 69 /* Disc quota exceeded */ +#endif + +#endif /* _PARAM_HP_UX10_2_H_ */ diff --git a/src/config/param.hp_ux102_usr.h b/src/config/param.hp_ux102_usr.h new file mode 100644 index 000000000..525ab2415 --- /dev/null +++ b/src/config/param.hp_ux102_usr.h @@ -0,0 +1,64 @@ +/* + * 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 _PARAM_USR_HPUX102_H_ +#define _PARAM_USR_HPUX102_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_HPUX_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 48 /* slot reserved for AFS */ + +/* File system entry (used if mount.h doesn't define MOUNT_AFS */ +#define AFS_MOUNT_AFS 1 + +/* Machine / Operating system information */ +#define SYS_NAME "hp_ux102" +#define SYS_NAME_ID SYS_NAME_ID_hp_ux102 +#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 CLBYTES +#define AFS_MINCHANGE 2 +#define VATTR_NULL usr_vattr_null +#endif /* KERNEL */ +#define AFS_DIRENT +#ifndef CMSERVERPREF +#define CMSERVERPREF +#endif + +#endif /* _PARAM_USR_HPUX102_H_ */ diff --git a/src/config/param.i386_fbsd_42.h b/src/config/param.i386_fbsd_42.h new file mode 100644 index 000000000..217c58afb --- /dev/null +++ b/src/config/param.i386_fbsd_42.h @@ -0,0 +1,136 @@ +#ifndef _PARAM_FBSD_42_H_ +#define _PARAM_FBSD_42_H_ + +#include + +#define AFS_XBSD_ENV 1 /* {Free,Open,Net}BSD */ +#define AFS_X86_XBSD_ENV 1 + +#define AFS_FBSD_ENV 1 +#define AFS_FBSD40_ENV 1 +#define AFS_FBSD42_ENV 1 +#define AFS_X86_FBSD_ENV 1 +#define AFS_X86_FBSD40_ENV 1 +#define AFS_X86_FBSD42_ENV 1 +#define AFS_X86_ENV 1 +#define AFS_NONFSTRANS 1 +#define AFS_KERBEROS_ENV +#define O_SYNC O_FSYNC +#define FTRUNC O_TRUNC + +#define IUPD 0x0010 +#define IACC 0x0020 +#define ICHG 0x0040 +#define IMOD 0x0080 + +#define IN_LOCK(ip) lockmgr(&ip->i_lock, LK_EXCLUSIVE, \ + (struct simplelock *)0, curproc) +#define IN_UNLOCK(ip) lockmgr(&ip->i_lock, LK_RELEASE, \ + (struct simplelock *)0, curproc) + +#include + +#define AFS_VM_RDWR_ENV 1 +#define AFS_VFS_ENV 1 +#define AFS_VFSINCL_ENV 1 +#define AFS_GREEDY43_ENV 1 +#define AFS_ENV 1 +#define AFS_MINPHYS_ENV 1 +#define CMUSTD_ENV 1 + +#define AFS_SYSCALL 210 +#define AFS_MOUNT_AFS "afs" + +#ifndef MOUNT_UFS +#define MOUNT_UFS 1 +#endif + +#ifndef MOUNT_AFS +#define MOUNT_AFS AFS_MOUNT_AFS +#endif +#define SYS_NAME "i386_fbsd_42" +#define SYS_NAME_ID SYS_NAME_ID_i386_fbsd_42 + +#define AFS_HAVE_FFS 1 /* Use system's ffs. */ +#define AFS_HAVE_STATVFS 0 /* System doesn't supports statvfs */ + +#define AFS_GCPAGS 1 /* if nonzero, garbage collect PAGs */ +#define AFS_3DISPARES 1 /* Utilize the 3 available disk inode spares */ +#define AFS_USE_GETTIMEOFDAY 1 /* use gettimeofday to implement rx clock */ + +#if !defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) +#include +#if BYTE_ORDER == BIG_ENDIAN +#define AFSBIG_ENDIAN 1 +#else +#if BYTE_ORDER == LITTLE_ENDIAN +#define AFSLITTLE_ENDIAN 1 +#else +#error machine/endian.h must define BYTE_ORDER! +#endif +#endif +#endif /* ! ASSEMBLER && ! __LANGUAGE_ASSEMBLY__ */ + +#define NEARINODE_HINT 1 /* hint to ufs module to scatter inodes on disk*/ +#define nearInodeHash(volid, hval) { \ + unsigned char* ts = (unsigned char*)&(volid);\ + for ((hval)=0; ts<(unsigned char*)&(volid)+sizeof(volid);ts++){\ + (hval) *= 173; \ + (hval) += *ts; \ + } \ + } + +/* Extra kernel definitions (from kdefs file) */ +#ifdef _KERNEL +#define AFS_GLOBAL_SUNLOCK 1 +#define AFS_VFS34 1 /* What is VFS34??? */ +#define AFS_SHORTGID 1 /* are group id's short? */ +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_resid uio_resid +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE +#define AFS_CLBYTES CLBYTES +#define osi_GetTime(x) microtime(x) +#define AFS_KALLOC(x) kalloc(x) +#define AFS_KFREE(x,y) kfree(x,y) +#define v_count v_usecount +#define v_vfsp v_mount +#define vfs_bsize mnt_stat.f_bsize +#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 + +#ifndef MUTEX_DEFAULT +#define MUTEX_DEFAULT 0 +#endif /* MUTEX_DEFAULT */ + +#ifndef SSYS +#define SSYS 0x00002 +#endif /* SSYS */ + +#define p_rcred p_ucred + +#define VN_RELE(vp) vrele(((struct vnode *)(vp))) +#define VN_HOLD(vp) VREF(((struct vnode *)(vp))) + +#if !defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) +enum vcexcl {NONEXCL, EXCL}; + +#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 /* ! ASSEMBLER & ! __LANGUAGE_ASSEMBLY__ */ +#endif /* _KERNEL */ + +#endif /* _PARAM_FBSD_42_H_ */ diff --git a/src/config/param.i386_fbsd_42_usr.h b/src/config/param.i386_fbsd_42_usr.h new file mode 100644 index 000000000..184418b0b --- /dev/null +++ b/src/config/param.i386_fbsd_42_usr.h @@ -0,0 +1,61 @@ +#ifndef _PARAM_USR_I386_FBSD_42_H_ +#define _PARAM_USR_I386_FBSD_42_H_ + + +#define UKERNEL 1 /* user space kernel */ +#define AFS_ENV 1 +#define AFS_VFSINCL_ENV 1 +#define AFS_USR_FBSD40_ENV 1 +#define AFS_USR_FBSD42_ENV 1 +#define AFS_USR_FBSD_ENV 1 +#define AFS_NONFSTRANS 1 +#define AFS_KERBEROS_ENV + +#define O_SYNC O_FSYNC + +#define AFS_MOUNT_AFS "afs" /* The name of the filesystem type. */ +#define AFS_SYSCALL 210 +#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 "i386_fbsd_42" +#define SYS_NAME_ID SYS_NAME_ID_i386_fbsd_42 +#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 + +#include +#include +#include +#include +#include +#include +#include +#include + +#endif /* _PARAM_USR_I386_FBSD_42_H_ */ diff --git a/src/config/param.ppc_darwin_12.h b/src/config/param.ppc_darwin_12.h new file mode 100644 index 000000000..1640e9ba0 --- /dev/null +++ b/src/config/param.ppc_darwin_12.h @@ -0,0 +1,58 @@ +#ifndef _PARAM_PPC_DARWIN_H_ +#define _PARAM_PPC_DARWIN_H_ + +#define AFS_ENV 1 +#define AFS_64BIT_ENV 1 /* Defines afs_int32 as int, not long. */ +#define AFS_PPC_ENV 1 +#define AFS_VFSINCL_ENV 1 + +#include + +#define AFS_DARWIN_ENV +#define AFS_NONFSTRANS +#define AFS_SYSCALL 230 + +/* File system entry (used if mount.h doesn't define MOUNT_AFS */ +#define AFS_MOUNT_AFS "afs" + +/* Machine / Operating system information */ +#define sys_ppc_darwin_12 1 +#define SYS_NAME "ppc_darwin_12" +#define SYS_NAME_ID SYS_NAME_ID_ppc_darwin_12 +#define AFSBIG_ENDIAN 1 +#define AFS_HAVE_FFS 1 /* Use system's ffs. */ + +#define AFS_GCPAGS 1 /* if nonzero, garbage collect PAGs */ +#define RXK_LISTENER_ENV 1 + +#ifdef KERNEL +#undef MACRO_BEGIN +#undef MACRO_END +#include +#define AFS_GLOBAL_SUNLOCK 1 +#define AFS_VFS34 1 /* What is VFS34??? */ +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_resid uio_resid +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE +#define AFS_CLBYTES CLBYTES +#define osi_GetTime(x) microtime(x) +#define AFS_KALLOC(x) kalloc(x) +#define AFS_KFREE(x,y) kfree(x,y) +#define v_count v_usecount +#define v_vfsp v_mount +#define vfs_bsize mnt_stat.f_bsize +#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 VN_RELE(vp) vrele(((struct vnode *)(vp))) +#define VN_HOLD(vp) VREF(((struct vnode *)(vp))) + +#endif +#endif _PARAM_PPC_DARWIN_H_ diff --git a/src/config/param.ppc_darwin_12_usr.h b/src/config/param.ppc_darwin_12_usr.h new file mode 100644 index 000000000..6402debc3 --- /dev/null +++ b/src/config/param.ppc_darwin_12_usr.h @@ -0,0 +1,46 @@ +#ifndef _PARAM_PPC_DARWIN_H_ +#define _PARAM_PPC_DARWIN_H_ + +#define AFS_VFSINCL_ENV 1 /* NOBODY uses this.... */ +#define AFS_ENV 1 +#define AFS_64BIT_ENV 1 /* Defines afs_int32 as int, not long. */ +#define AFS_PPC_ENV 1 + +#include +#define AFS_USERSPACE_ENV +#define AFS_USR_DARWIN_ENV +#define AFS_NONFSTRANS +#define AFS_SYSCALL 230 + +/* File system entry (used if mount.h doesn't define MOUNT_AFS */ +#define AFS_MOUNT_AFS "afs" + +/* Machine / Operating system information */ +#define sys_ppc_darwin_12 1 +#define SYS_NAME "ppc_darwin_12" +#define SYS_NAME_ID SYS_NAME_ID_ppc_darwin_12 +#define AFSBIG_ENDIAN 1 +#define AFS_HAVE_FFS 1 /* Use system's ffs. */ + +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE + +#define AFS_GCPAGS 0 /* if nonzero, garbage collect PAGs */ +#define RXK_LISTENER_ENV 1 + +#define AFS_VFS34 1 /* What is VFS34??? */ +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_resid uio_resid +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE +#define VATTR_NULL usr_vattr_null + +#define AFS_DIRENT +#ifndef CMSERVERPREF +#define CMSERVERPREF +#endif + +#endif _PARAM_PPC_DARWIN_H_ diff --git a/src/config/param.ppc_darwin_13.h b/src/config/param.ppc_darwin_13.h new file mode 100644 index 000000000..1afb00bd5 --- /dev/null +++ b/src/config/param.ppc_darwin_13.h @@ -0,0 +1,60 @@ +#ifndef _PARAM_PPC_DARWIN_H_ +#define _PARAM_PPC_DARWIN_H_ + +#define AFS_ENV 1 +#define AFS_64BIT_ENV 1 /* Defines afs_int32 as int, not long. */ +#define AFS_PPC_ENV 1 +#define AFS_VFSINCL_ENV 1 + +#include + +#define AFS_DARWIN_ENV +#define AFS_DARWIN13_ENV +#define AFS_NONFSTRANS +#define AFS_SYSCALL 230 + +/* File system entry (used if mount.h doesn't define MOUNT_AFS */ +#define AFS_MOUNT_AFS "afs" + +/* Machine / Operating system information */ +#define sys_ppc_darwin_12 1 +#define sys_ppc_darwin_13 1 +#define SYS_NAME "ppc_darwin_13" +#define SYS_NAME_ID SYS_NAME_ID_ppc_darwin_13 +#define AFSBIG_ENDIAN 1 +#define AFS_HAVE_FFS 1 /* Use system's ffs. */ + +#define AFS_GCPAGS 1 /* if nonzero, garbage collect PAGs */ +#define RXK_LISTENER_ENV 1 + +#ifdef KERNEL +#undef MACRO_BEGIN +#undef MACRO_END +#include +#define AFS_GLOBAL_SUNLOCK 1 +#define AFS_VFS34 1 /* What is VFS34??? */ +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_resid uio_resid +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE +#define AFS_CLBYTES CLBYTES +#define osi_GetTime(x) microtime(x) +#define AFS_KALLOC(x) kalloc(x) +#define AFS_KFREE(x,y) kfree(x,y) +#define v_count v_usecount +#define v_vfsp v_mount +#define vfs_bsize mnt_stat.f_bsize +#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 VN_RELE(vp) vrele(((struct vnode *)(vp))) +#define VN_HOLD(vp) VREF(((struct vnode *)(vp))) + +#endif +#endif _PARAM_PPC_DARWIN_H_ diff --git a/src/config/param.ppc_darwin_13_usr.h b/src/config/param.ppc_darwin_13_usr.h new file mode 100644 index 000000000..ec6f03dfd --- /dev/null +++ b/src/config/param.ppc_darwin_13_usr.h @@ -0,0 +1,48 @@ +#ifndef _PARAM_PPC_DARWIN_H_ +#define _PARAM_PPC_DARWIN_H_ + +#define AFS_VFSINCL_ENV 1 /* NOBODY uses this.... */ +#define AFS_ENV 1 +#define AFS_64BIT_ENV 1 /* Defines afs_int32 as int, not long. */ +#define AFS_PPC_ENV 1 + +#include +#define AFS_USERSPACE_ENV +#define AFS_USR_DARWIN_ENV +#define AFS_USR_DARWIN13_ENV +#define AFS_NONFSTRANS +#define AFS_SYSCALL 230 + +/* File system entry (used if mount.h doesn't define MOUNT_AFS */ +#define AFS_MOUNT_AFS "afs" + +/* Machine / Operating system information */ +#define sys_ppc_darwin_12 1 +#define sys_ppc_darwin_13 1 +#define SYS_NAME "ppc_darwin_13" +#define SYS_NAME_ID SYS_NAME_ID_ppc_darwin_13 +#define AFSBIG_ENDIAN 1 +#define AFS_HAVE_FFS 1 /* Use system's ffs. */ + +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE + +#define AFS_GCPAGS 0 /* if nonzero, garbage collect PAGs */ +#define RXK_LISTENER_ENV 1 + +#define AFS_VFS34 1 /* What is VFS34??? */ +#define afsio_iov uio_iov +#define afsio_iovcnt uio_iovcnt +#define afsio_offset uio_offset +#define afsio_seg uio_segflg +#define afsio_resid uio_resid +#define AFS_UIOSYS UIO_SYSSPACE +#define AFS_UIOUSER UIO_USERSPACE +#define VATTR_NULL usr_vattr_null + +#define AFS_DIRENT +#ifndef CMSERVERPREF +#define CMSERVERPREF +#endif + +#endif _PARAM_PPC_DARWIN_H_ diff --git a/src/des/conf-alpha-linux.h b/src/des/conf-alpha-linux.h new file mode 100644 index 000000000..5246e0d4d --- /dev/null +++ b/src/des/conf-alpha-linux.h @@ -0,0 +1,18 @@ +/* + * Copyright 1988 by the Massachusetts Institute of Technology. + * + * For copying and distribution information, please see the file + * . + * + * Machine-type definitions: Alpha + */ + +#include + +#define ALPHA + +/* 'course this is a joke, but I am not going to rewrite this mess */ +#define BITS32 + +#define BIG +#define LSBFIRST diff --git a/src/des/conf-ppc-darwin.h b/src/des/conf-ppc-darwin.h new file mode 100644 index 000000000..6d30c2ad5 --- /dev/null +++ b/src/des/conf-ppc-darwin.h @@ -0,0 +1,6 @@ +#define BITS32 +#define BIG +#undef BSDUNIX +#define MSBFIRST +#define MUSTALIGN + diff --git a/src/libafs/Makefile.extradefs b/src/libafs/Makefile.extradefs new file mode 100644 index 000000000..1830f80d6 --- /dev/null +++ b/src/libafs/Makefile.extradefs @@ -0,0 +1,8 @@ +# 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 + +#Placeholder for extra definitions diff --git a/src/libafs/MakefileProto.DARWIN b/src/libafs/MakefileProto.DARWIN new file mode 100644 index 000000000..a24eaebd2 --- /dev/null +++ b/src/libafs/MakefileProto.DARWIN @@ -0,0 +1,115 @@ +#/* Copyright (C) 1995, 1989 Transarc Corporation - All rights reserved */ +# $Header: /tmp/cvstemp/openafs/src/libafs/Attic/MakefileProto.DARWIN,v 1.1 2001/04/23 18:43:17 hartmans Exp $ +# +# MakefileProto for Digital Unix systems +# + +DESTDIR=DEST/ +include $(DESTDIR)../obj/config/Makefile.${SYS_NAME} + + +# OS specific object files: +AFS_OS_OBJS = \ + osi_misc.o \ + osi_file.o \ + osi_inode.o \ + osi_groups.o \ + osi_sleep.o \ + osi_vm.o \ + osi_vnodeops.o \ + osi_module.o \ + xdr.o \ + xdr_array.o + + +#AFS_OS_NFSOBJS = osi_vfsops_nfs.o + +AFS_OS_NONFSOBJS = osi_vfsops.o + + +# System specific build commands and flags +KDEFS= +DBUG = -g +DEFINES= -D_KERNEL -DKERNEL -DKERNEL_PRIVATE -DDIAGNOSTIC -DUSE_SELECT -DMACH_USER_API -DMACH_KERNEL +OPTF=${OPT} +OPTF2=${OPT2} +KOPTS=-traditional-cpp -static -fno-common -finline -fno-keep-inline-functions -force_cpusubtype_ALL -msoft-float -mlong-branch +#CFLAGS=-Werror-implicit-function-declaration -I. -I.. ${KINCLUDES} $(DEFINES) $(KDEFS) $(KOPTS) ${DBUG} +#CFLAGS=-framework Kernel -I. -I.. ${KINCLUDES} $(DEFINES) $(KDEFS) $(KOPTS) ${DBUG} +CFLAGS=-I. -I.. ${KINCLUDES} $(DEFINES) $(KDEFS) $(KOPTS) ${DBUG} + + +# Name of directory to hold object files and libraries. +KOBJ = MODLOAD + +# This tells Makefile.common to use it's single directory build target. +COMPDIRS = single_compdir + +include Makefile.common + +setup: + -mkdir $(KOBJ) + -rm $(KOBJ)/Makefile $(KOBJ)/Makefile.common + ln -s ../Makefile $(KOBJ)/Makefile + ln -s ../Makefile.common $(KOBJ)/Makefile.common + -rm -f h net netinet rpc ufs nfs machine sys vm mach kern + -ln -s $(KROOT)/System/Library/Frameworks/Kernel.framework/Headers/net net + -ln -s $(KROOT)/System/Library/Frameworks/Kernel.framework/Headers/machine machine + -ln -s $(KROOT)/System/Library/Frameworks/Kernel.framework/Headers/netinet netinet + -ln -s $(KROOT)/System/Library/Frameworks/Kernel.framework/Headers/nfs nfs + -ln -s /usr/include/rpc rpc + -ln -s $(KROOT)/System/Library/Frameworks/Kernel.framework/Headers/sys sys + -ln -s $(KROOT)/System/Library/Frameworks/Kernel.framework/Headers/ufs ufs + -ln -s $(KROOT)/System/Library/Frameworks/Kernel.framework/Headers/sys h + + +# Below this line are targets when in the COMMON directory: +LIBAFS = libafs.o +LIBAFSNONFS = libafs.nonfs.o + +DEST_LIBAFS = ${DESTDIR}/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs-nfs +DEST_LIBAFSNONFS = ${DESTDIR}/root.client/usr/vice/etc/afs.kext/Contents/MacOS/afs + + +libafs: $(DEST_LIBAFSNONFS) ; + + +$(DEST_LIBAFS): $(LIBAFS) + $(INSTALL) -f $? $@ + +$(DEST_LIBAFSNONFS): $(LIBAFSNONFS) + $(INSTALL) -f $? $@ + +${LIBAFS}: $(AFSAOBJS) $(AFSNFSOBJS) + $(LD) -r -o ${LIBAFS} ${AFSAOBJS} ${AFSNFSOBJS} + +${LIBAFSNONFS}: $(AFSAOBJS) $(AFSNONFSOBJS) + $(LD) -r -o ${LIBAFSNONFS} ${AFSAOBJS} ${AFSNONFSOBJS} + + +# Object build rules: +osi_groups.o: $(AFS)/osi_groups.c + $(CRULE1) +osi_file.o: $(AFS)/osi_file.c + $(CRULE1) +osi_inode.o: $(AFS)/osi_inode.c + $(CRULE1) +osi_misc.o: $(AFS)/osi_misc.c + $(CRULE1) +osi_sleep.o: $(AFS)/osi_sleep.c + $(CRULE1) +osi_vfsops_nfs.o: $(AFS)/osi_vfsops.c + $(CRULE1) -o osi_vfsops_nfs.o +osi_vfsops.o: $(AFS)/osi_vfsops.c + $(CRULE1) -DAFS_NONFSTRANS +osi_vm.o: $(AFS)/osi_vm.c + $(CRULE1) +osi_vnodeops.o: $(AFS)/osi_vnodeops.c + $(CRULE1) +osi_module.o: $(AFS)/osi_module.c + $(CRULE1) +xdr.o: $(RX)/xdr.c + $(CRULE1); +xdr_array.o: $(RX)/xdr_array.c + $(CRULE1); + diff --git a/src/libafs/MakefileProto.FBSD b/src/libafs/MakefileProto.FBSD new file mode 100644 index 000000000..07759f6e4 --- /dev/null +++ b/src/libafs/MakefileProto.FBSD @@ -0,0 +1,112 @@ +#/* Copyright (C) 1995, 1989 Transarc Corporation - All rights reserved */ +# +# MakefileProto for Digital Unix systems +# + +DESTDIR=DEST/ +# include $(DESTDIR)/../obj/config/Makefile.${SYS_NAME} + + +# OS specific object files: +AFS_OS_OBJS = \ + osi_groups.o \ + osi_file.o \ + osi_inode.o \ + osi_misc.o \ + osi_sleep.o \ + osi_vm.o \ + osi_vnodeops.o + +AFS_OS_NFSOBJS = \ + osi_vfsops_nfs.o + +AFS_OS_NONFSOBJS = \ + osi_vfsops.o + + +# System specific build commands and flags +# KDEFS=-DLANGUAGE_C -I/usr/sys/include -I../include \ +# -I/usr/src/sys/${HEADER_RT} -I/usr/src/sys/sys \ +# -DSWAPTYPE=1 -DUERF -DOSF -DCOMPAT_43 -DUFS \ +# -DRT -DKERNEL -D_KERNEL +KDEFS=-Wall -fformat-extensions -ansi -nostdinc -I/usr/include -D_KERNEL \ + -elf -mpreferred-stack-boundary=2 -I/usr/src/sys/sys -I../afs +DBUG = -O2 +DEFINES= -DAFSDEBUG -DKERNEL -DAFS -DVICE -DNFS -DUFS -DINET -DQUOTA -DGETMOUNT +OPTF=${OPT} +OPTF2=${OPT2} +CFLAGS=-I. -I.. ${FSINCLUDES} $(DEFINES) $(KDEFS) $(KOPTS) ${DBUG} + + +# Name of directory to hold object files and libraries. +KOBJ = STATIC + +# This tells Makefile.common to use it's single directory build target. +COMPDIRS = single_compdir + +include Makefile.common + +setup: + -mkdir $(KOBJ) + -rm $(KOBJ)/Makefile $(KOBJ)/Makefile.common + ln -s ../Makefile $(KOBJ)/Makefile + ln -s ../Makefile.common $(KOBJ)/Makefile.common + -rm -f h net netinet rpc ufs nfs machine sys vm + -ln -s /usr/src/sys/net net + -ln -s /usr/src/sys/i386/include machine + -ln -s /usr/src/sys/netinet netinet + -ln -s /usr/src/sys/nfs nfs + -ln -s /usr/include/rpc rpc + -ln -s /usr/src/sys/sys sys + -ln -s /usr/src/sys/ufs/ufs ufs + -ln -s /usr/src/sys/sys h + -ln -s /usr/src/sys/vm vm + -touch $(KOBJ)/sec_net.h + + +# Below this line are targets when in the COMMON directory: +LIBAFS = libafs.o +LIBAFSNONFS = libafs.nonfs.o + +DEST_LIBAFS = ${DESTDIR}/root.client/bin/${LIBAFS} +DEST_LIBAFSNONFS = ${DESTDIR}/root.client/bin/${LIBAFSNONFS} + + +# libafs: $(DEST_LIBAFS) $(DEST_LIBAFSNONFS) +# libafs: $(DEST_LIBAFSNONFS) +libafs: + echo WARNING: No kernel module for ${SYS_NAME} + + +$(DEST_LIBAFS): $(LIBAFS) + $(INSTALL) -f $? $@ + +$(DEST_LIBAFSNONFS): $(LIBAFSNONFS) + $(INSTALL) -f $? $@ + +${LIBAFS}: $(AFSAOBJS) $(AFSNFSOBJS) + $(LD) -r -o ${LIBAFS} ${AFSAOBJS} ${AFSNFSOBJS} + +${LIBAFSNONFS}: $(AFSAOBJS) $(AFSNONFSOBJS) + $(LD) -r -o ${LIBAFSNONFS} ${AFSAOBJS} ${AFSNONFSOBJS} + + +# Object build rules: +osi_groups.o: $(AFS)/osi_groups.c + $(CRULE1) +osi_file.o: $(AFS)/osi_file.c + $(CRULE1) +osi_inode.o: $(AFS)/osi_inode.c + $(CRULE1) +osi_misc.o: $(AFS)/osi_misc.c + $(CRULE1) +osi_sleep.o: $(AFS)/osi_sleep.c + $(CRULE1) +osi_vfsops_nfs.o: $(AFS)/osi_vfsops.c + $(CRULE1) -o osi_vfsops_nfs.o +osi_vfsops.o: $(AFS)/osi_vfsops.c + $(CRULE1) -DAFS_NONFSTRANS +osi_vm.o: $(AFS)/osi_vm.c + $(CRULE1) +osi_vnodeops.o: $(AFS)/osi_vnodeops.c + $(CRULE1) diff --git a/src/libafs/redhat.sh b/src/libafs/redhat.sh new file mode 100755 index 000000000..0d35c2a09 --- /dev/null +++ b/src/libafs/redhat.sh @@ -0,0 +1,19 @@ +#!/bin/sh +# This is a bridge script until we take care of tightly linking Linux inode +# internals to AFS vnode internals + +IBYTES="" +SETATTR="" + +grep i_bytes /lib/modules/$1/build/include/linux/fs.h > /dev/null +if [ $? = 0 ]; then + IBYTES="-DSTRUCT_INODE_HAS_I_BYTES=1" +fi +grep "extern int inode_setattr" /lib/modules/$1/build/include/linux/fs.h > /dev/null +if [ $? = 0 ]; then + SETATTR="-DINODE_SETATTR_NOT_VOID=1" +fi + +/bin/rm $2 +echo "KDEFINES = ${IBYTES} ${SETATTR}" > $2 +exit 0 diff --git a/src/libuafs/MakefileProto.DARWIN b/src/libuafs/MakefileProto.DARWIN new file mode 100644 index 000000000..e11103f0f --- /dev/null +++ b/src/libuafs/MakefileProto.DARWIN @@ -0,0 +1,82 @@ +# 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 + +# MakefileProto for Solaris systems +# + +include ../config/Makefile.${SYS_NAME} + +MKDIR_IF_NEEDED=[ -d $$1 ] || mkdir -p $$1 + +# System specific build commands and flags +CC = cc +DEFINES= -D_REENTRANT -DAFSDEBUG -DKERNEL -DUKERNEL -DAFS -DVICE +KOPTS= +CFLAGS=-I. -I.. ${FSINCLUDES} $(DEFINES) $(KOPTS) ${DBUG} $(XCFLAGS) +OPTF=-O +# WEBOPTS = -I../nsapi -DNETSCAPE_NSAPI -DNET_SSL -DXP_UNIX -DMCC_HTTPD + +TEST_CFLAGS=-D_REENTRANT -DAFS_PTHREAD_ENV +TEST_LDFLAGS= +TEST_LIBS= + +LIBUAFS = libuafs.a +LIBAFSWEB = nsafs.so +LIBAFSWEBKRB = nsafs.krb.so + +include Makefile.common + +setup_common: + -rm -f h net netinet rpc ufs nfs machine sys inet nsapi + -ln -s /usr/include/sys h + -ln -s /usr/include/net net + -ln -s /usr/include/netinet netinet + -ln -s /usr/include/rpc rpc + -ln -s /usr/include/sys sys + -ln -s /usr/include/nfs nfs + -ln -s /usr/include/inet inet + -ln -s /usr/include/ufs ufs + -ln -s $(NS_INCL) nsapi + +setup_uafs: setup_common + set UAFS; $(MKDIR_IF_NEEDED) + -rm -f UAFS/Makefile UAFS/Makefile.common + ln -s ../Makefile UAFS/Makefile + ln -s ../Makefile.common UAFS/Makefile.common + +setup_nsafs: setup_common + set AFSWEB; $(MKDIR_IF_NEEDED) + -rm -f AFSWEB/Makefile AFSWEB/Makefile.common + ln -s ../Makefile AFSWEB/Makefile + ln -s ../Makefile.common AFSWEB/Makefile.common + +UAFS/$(LIBUAFS): setup_uafs + cd UAFS; \ + $(MAKE) $(LIBUAFS) DESTDIR=${DESTDIR}; \ + ranlib $(LIBUAFS) + +AFSWEB/$(LIBAFSWEB): setup_nsafs + cd AFSWEB; \ + $(MAKE) $(LIBAFSWEB) DESTDIR=${DESTDIR} + +AFSWEB/$(LIBAFSWEBKRB): setup_nsafs + cd AFSWEB; \ + $(MAKE) $(LIBAFSWEBKRB) DESTDIR=${DESTDIR} + +# Below this line are targets when in the COMMON directory: + +$(LIBUAFS): $(UAFSOBJ) + -rm -f $(LIBUAFS) + $(AR) $(ARFLAGS) $(LIBUAFS) $(UAFSOBJ) + +$(LIBAFSWEB): $(AFSWEBOBJ) ${DES}/libdes.a + -rm -f $(LIBAFSWEB) + ld -b $(LIBAFSWEB) $(AFSWEBOBJ) ${DES}/libdes.a $(WEBLIBS) + +$(LIBAFSWEBKRB): $(AFSWEBOBJKRB) ${DES}/libdes.a + -rm -f $(LIBAFSWEBKRB) + ld -b $(LIBAFSWEBKRB) $(AFSWEBOBJKRB) ${DES}/libdes.a $(WEBLIBS) diff --git a/src/libuafs/MakefileProto.FBSD b/src/libuafs/MakefileProto.FBSD new file mode 100644 index 000000000..d493755b2 --- /dev/null +++ b/src/libuafs/MakefileProto.FBSD @@ -0,0 +1,76 @@ +#/* Copyright (C) 1995, 1989 Transarc Corporation - All rights reserved */ +# +# MakefileProto for Solaris systems +# + +include ../config/Makefile.${SYS_NAME} + +MKDIR_IF_NEEDED=[ -d $$1 ] || mkdir -p $$1 + +# System specific build commands and flags +CC = gcc +DEFINES= -D_REENTRANT -DAFSDEBUG -DKERNEL -DUKERNEL -DAFS -DVICE +KOPTS= +CFLAGS=-I. -I.. ${FSINCLUDES} $(DEFINES) $(KOPTS) ${DBUG} +OPTF=-O +# WEBOPTS = -I../nsapi -DNETSCAPE_NSAPI -DNET_SSL -DXP_UNIX -DMCC_HTTPD + +TEST_CFLAGS=-pthread -D_REENTRANT -DAFS_PTHREAD_ENV -DAFS_FBSD40_ENV +TEST_LDFLAGS= +TEST_LIBS= + +LIBUAFS = libuafs.a +LIBAFSWEB = nsafs.so +LIBAFSWEBKRB = nsafs.krb.so + +include Makefile.common + +setup_common: + -rm -f h net netinet rpc ufs nfs machine sys inet nsapi + -ln -s /usr/include/sys h + -ln -s /usr/include/net net + -ln -s /usr/include/netinet netinet + -ln -s /usr/include/rpc rpc + -ln -s /usr/include/sys sys + -ln -s /usr/include/nfs nfs + -ln -s /usr/include/inet inet + -ln -s /usr/include/ufs ufs + -ln -s $(NS_INCL) nsapi + +setup_uafs: setup_common + set UAFS; $(MKDIR_IF_NEEDED) + -rm -f UAFS/Makefile UAFS/Makefile.common + ln -s ../Makefile UAFS/Makefile + ln -s ../Makefile.common UAFS/Makefile.common + +setup_nsafs: setup_common + set AFSWEB; $(MKDIR_IF_NEEDED) + -rm -f AFSWEB/Makefile AFSWEB/Makefile.common + ln -s ../Makefile AFSWEB/Makefile + ln -s ../Makefile.common AFSWEB/Makefile.common + +UAFS/$(LIBUAFS): setup_uafs + cd UAFS; \ + $(MAKE) $(LIBUAFS) DESTDIR=${DESTDIR} + +AFSWEB/$(LIBAFSWEB): setup_nsafs +cd AFSWEB; \ + $(MAKE) $(LIBAFSWEB) DESTDIR=${DESTDIR} + +AFSWEB/$(LIBAFSWEBKRB): setup_nsafs + cd AFSWEB; \ + $(MAKE) $(LIBAFSWEBKRB) DESTDIR=${DESTDIR} + +# Below this line are targets when in the COMMON directory: + +$(LIBUAFS): $(UAFSOBJ) + -rm -f $(LIBUAFS) + $(AR) $(ARFLAGS) $(LIBUAFS) $(UAFSOBJ) + +$(LIBAFSWEB): $(AFSWEBOBJ) ${DES}/libdes.a + -rm -f $(LIBAFSWEB) + ld -b $(LIBAFSWEB) $(AFSWEBOBJ) ${DES}/libdes.a $(WEBLIBS) + +$(LIBAFSWEBKRB): $(AFSWEBOBJKRB) ${DES}/libdes.a + -rm -f $(LIBAFSWEBKRB) + ld -b $(LIBAFSWEBKRB) $(AFSWEBOBJKRB) ${DES}/libdes.a $(WEBLIBS) diff --git a/src/lwp/process.fbsd.s b/src/lwp/process.fbsd.s new file mode 100644 index 000000000..18dcacfe6 --- /dev/null +++ b/src/lwp/process.fbsd.s @@ -0,0 +1,90 @@ +/* + * 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 + */ + +#define IGNORE_STDS_H 1 +/* Sun 386i... I hope this does the right thing!!! + * + * Written by Derek Atkins + * (debugging help by Chris Provenzano ) + * 11/1991 + * + * "ojala que es correcto!" + */ + .file "process.s" + + .data + + .text + +/* + * struct savearea { + * char *topstack; + * } + */ + + .set topstack,0 + +/* + * savecontext(f, area1, newsp) + * int (*f)(); struct savearea *area1; char *newsp; + */ + +/* offsets, to make my life easier! */ + .set f,8 + .set area1,12 + .set newsp,16 + + +.globl PRE_Block +.globl savecontext + +savecontext: + pushl %ebp /* New Frame! */ + movl %esp,%ebp + pusha /* Push all registers */ + movl $1,PRE_Block /* Pre-emption code */ + movl area1(%ebp),%eax /* eax = base of savearea */ + movl %esp,(%eax) /* area->topstack = esp */ + movl newsp(%ebp),%eax /* get new sp into eax */ + cmpl $0,%eax + je L1 /* if new sp is 0 then dont change esp */ + movl %eax,%esp /* go ahead. make my day! */ +L1: + jmp *f(%ebp) /* ebx = &f */ + +/* Shouldnt be here....*/ + + call abort + +/* + * returnto(area2) + * struct savearea *area2; + */ + +/* stack offset */ + .set area2,8 + +.globl returnto + +returnto: + pushl %ebp + movl %esp, %ebp /* New frame, to get correct pointer */ + movl area2(%ebp),%eax /* eax = area2 */ + movl (%eax),%esp /* restore esp */ + popa + movl $0,PRE_Block /* clear it up... */ + popl %ebp + ret + +/* I see, said the blind man, as he picked up his hammer and saw! */ + pushl $1234 + call abort + + + diff --git a/src/rx/DARWIN/rx_kmutex.h b/src/rx/DARWIN/rx_kmutex.h new file mode 100644 index 000000000..530b3ceba --- /dev/null +++ b/src/rx/DARWIN/rx_kmutex.h @@ -0,0 +1,107 @@ +/* + * 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 + */ + +/* + * rx_kmutex.h - mutex and condition variable macros for kernel environment. + * + * MACOS implementation. + */ + +#ifndef _RX_KMUTEX_H_ +#define _RX_KMUTEX_H_ + +#include +#include +#include + +#define RX_ENABLE_LOCKS 1 +#define AFS_GLOBAL_RXLOCK_KERNEL + +/* + * Condition variables + * + * In Digital Unix (OSF/1), we use something akin to the ancient sleep/wakeup + * mechanism. The condition variable itself plays no role; we just use its + * address as a convenient unique number. + * + * XXX in darwin, both mach and bsd facilities are available. Should really + * stick to one or the other (but mach locks don't have a _try.....) + */ +#define CV_INIT(cv,a,b,c) +#define CV_DESTROY(cv) +#define CV_WAIT(cv, lck) { \ + int isGlockOwner = ISAFS_GLOCK(); \ + if (isGlockOwner) AFS_GUNLOCK(); \ + assert_wait((event_t)(cv), 0); \ + MUTEX_EXIT(lck); \ + thread_block(0); \ + if (isGlockOwner) AFS_GLOCK(); \ + MUTEX_ENTER(lck); \ + } + +#define CV_TIMEDWAIT(cv,lck,t) { \ + int isGlockOwner = ISAFS_GLOCK(); \ + if (isGlockOwner) AFS_GUNLOCK(); \ + assert_wait((event_t)(cv), 0); \ + thread_set_timer(t, NSEC_PER_SEC/hz); \ + MUTEX_EXIT(lck); \ + thread_block(0); \ + if (isGlockOwner) AFS_GLOCK(); \ + MUTEX_ENTER(lck); \ + +#define CV_SIGNAL(cv) thread_wakeup_one((event_t)(cv)) +#define CV_BROADCAST(cv) thread_wakeup((event_t)(cv)) + +typedef struct { + struct lock__bsd__ lock; + thread_t owner; +} afs_kmutex_t; +typedef int afs_kcondvar_t; + +#define osi_rxWakeup(cv) thread_wakeup((event_t)(cv)) + +#define LOCK_INIT(a,b) \ + do { \ + lockinit(&(a)->lock,PSOCK, "afs rx lock", 0, 0); \ + (a)->owner = (thread_t)0; \ + } while(0); +#define MUTEX_INIT(a,b,c,d) \ + do { \ + lockinit(&(a)->lock,PSOCK, "afs rx mutex", 0, 0); \ + (a)->owner = (thread_t)0; \ + } while(0); +#define MUTEX_DESTROY(a) \ + do { \ + (a)->owner = (thread_t)-1; \ + } while(0); +#define MUTEX_ENTER(a) \ + do { \ + lockmgr(&(a)->lock, LK_EXCLUSIVE, 0, current_proc()); \ + osi_Assert((a)->owner == (thread_t)0); \ + (a)->owner = current_thread(); \ + } while(0); +#define MUTEX_TRYENTER(a) \ + ( lockmgr(&(a)->lock, LK_EXCLUSIVE|LK_NOWAIT, 0, current_proc()) ? 0 : ((a)->owner = current_thread(), 1) ) +#define xMUTEX_TRYENTER(a) \ + ( osi_Assert((a)->owner == (thread_t)0), (a)->owner = current_thread(), 1) +#define MUTEX_EXIT(a) \ + do { \ + osi_Assert((a)->owner == current_thread()); \ + (a)->owner = (thread_t)0; \ + lockmgr(&(a)->lock, LK_RELEASE, 0, current_proc()); \ + } while(0); + +#undef MUTEX_ISMINE +#define MUTEX_ISMINE(a) (((afs_kmutex_t *)(a))->owner == current_thread()) + +#undef osirx_AssertMine +extern void osirx_AssertMine(afs_kmutex_t *lockaddr, char *msg); + +#endif /* _RX_KMUTEX_H_ */ + diff --git a/src/rx/DARWIN/rx_knet.c b/src/rx/DARWIN/rx_knet.c new file mode 100644 index 000000000..dafa3d4e9 --- /dev/null +++ b/src/rx/DARWIN/rx_knet.c @@ -0,0 +1,163 @@ +/* + * 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 "../afs/param.h" +#include "../rx/rx_kcommon.h" + +int osi_NetReceive(asocket, addr, dvec, nvecs, alength) + struct socket *asocket; + struct sockaddr_in *addr; + struct iovec *dvec; + int nvecs; + int *alength; +{ + struct uio u; + int i; + struct iovec iov[RX_MAXIOVECS]; + struct sockaddr *sa; + int code; + + int haveGlock = ISAFS_GLOCK(); + /*AFS_STATCNT(osi_NetReceive);*/ + + if (nvecs > RX_MAXIOVECS) { + osi_Panic("osi_NetReceive: %d: Too many iovecs.\n", nvecs); + } + + for (i = 0 ; i < nvecs ; i++) { + iov[i].iov_base = dvec[i].iov_base; + iov[i].iov_len = dvec[i].iov_len; + } + + u.uio_iov=&iov[0]; + u.uio_iovcnt=nvecs; + u.uio_offset=0; + u.uio_resid=*alength; + u.uio_segflg=UIO_SYSSPACE; + u.uio_rw=UIO_READ; + u.uio_procp=NULL; + + if (haveGlock) { + AFS_GUNLOCK(); + } +#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL) + thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL); +#endif + code = soreceive(asocket, &sa, &u, NULL, NULL, NULL); +#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL) + thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL); +#endif + if (haveGlock) { + AFS_GLOCK(); + } + *alength=*alength-u.uio_resid; + if (sa) { + if (sa->sa_family == AF_INET) { + if (addr) *addr=*(struct sockaddr_in *)sa; + } else { + printf("Unknown socket family %d in NetReceive\n"); + } + } + return code; +} + +extern int rxk_ListenerPid; +void osi_StopListener(void) +{ + struct proc *p; + +#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL) + thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL); +#endif + soclose(rx_socket); +#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL) + thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL); +#endif + p=pfind(rxk_ListenerPid); + if (p) + psignal(p, SIGUSR1); +} + +/* rx_NetSend - send asize bytes at adata from asocket to host at addr. + * + * Now, why do we allocate a new buffer when we could theoretically use the one + * pointed to by adata? Because PRU_SEND returns after queueing the message, + * not after sending it. If the sender changes the data after queueing it, + * we'd see the already-queued data change. One attempt to fix this without + * adding a copy would be to have this function wait until the datagram is + * sent; however this doesn't work well. In particular, if a host is down, and + * an ARP fails to that host, this packet will be queued until the ARP request + * comes back, which could be hours later. We can't block in this routine that + * long, since it prevents RPC timeouts from happening. + */ +/* XXX In the brave new world, steal the data bufs out of the rx_packet iovec, + * and just queue those. XXX + */ + + +int +osi_NetSend(asocket, addr, dvec, nvecs, alength, istack) + register struct socket *asocket; + struct iovec *dvec; + int nvecs; + register afs_int32 alength; + struct sockaddr_in *addr; + int istack; +{ + register afs_int32 code; + int s; + int len; + int i; + struct iovec iov[RX_MAXIOVECS]; + char *tdata; + struct uio u; + struct mbuf *nam; + int haveGlock = ISAFS_GLOCK(); + + AFS_STATCNT(osi_NetSend); + if (nvecs > RX_MAXIOVECS) { + osi_Panic("osi_NetSend: %d: Too many iovecs.\n", nvecs); + } + + for (i = 0 ; i < nvecs ; i++) { + iov[i].iov_base = dvec[i].iov_base; + iov[i].iov_len = dvec[i].iov_len; + } + + u.uio_iov=&iov[0]; + u.uio_iovcnt=nvecs; + u.uio_offset=0; + u.uio_resid=alength; + u.uio_segflg=UIO_SYSSPACE; + u.uio_rw=UIO_WRITE; + u.uio_procp=NULL; + if (haveGlock) { + AFS_GUNLOCK(); + } +#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL) + thread_funnel_switch(KERNEL_FUNNEL, NETWORK_FUNNEL); +#endif + nam=m_get(M_DONTWAIT, MT_SONAME); + if (nam == NULL) { + code=ENOBUFS; + goto bad; + } + nam->m_len=addr->sin_len=sizeof(struct sockaddr_in); + bcopy((caddr_t)addr, mtod(nam, caddr_t), addr->sin_len); + code = sosend(asocket, mtod(nam, struct sockaddr *), &u, NULL, NULL, 0); + m_freem(nam); +bad: +#if defined(AFS_DARWIN_ENV) && defined(KERNEL_FUNNEL) + thread_funnel_switch(NETWORK_FUNNEL, KERNEL_FUNNEL); +#endif + if (haveGlock) { + AFS_GLOCK(); + } + return code; +} diff --git a/src/rx/FBSD/rx_kmutex.h b/src/rx/FBSD/rx_kmutex.h new file mode 100644 index 000000000..924d8c216 --- /dev/null +++ b/src/rx/FBSD/rx_kmutex.h @@ -0,0 +1,96 @@ +/* Copyright Transarc Corporation 1998 - All Rights Reserved + * + * rx_kmutex.h - mutex and condition variable macros for kernel environment. + * + * DUX implementation. + */ + +#ifndef _RX_KMUTEX_H_ +#define _RX_KMUTEX_H_ + +#ifdef AFS_FBSD40_ENV + +#include +/* #include */ +/* #include */ + +#define RX_ENABLE_LOCKS 1 +#define AFS_GLOBAL_RXLOCK_KERNEL + +/* + * Condition variables + * + * In Digital Unix (OSF/1), we use something akin to the ancient sleep/wakeup + * mechanism. The condition variable itself plays no role; we just use its + * address as a convenient unique number. + */ +#define CV_INIT(cv,a,b,c) +#define CV_DESTROY(cv) +#define CV_WAIT(cv, lck) { \ + int isGlockOwner = ISAFS_GLOCK(); \ + if (isGlockOwner) AFS_GUNLOCK(); \ + assert_wait((vm_offset_t)(cv), 0); \ + MUTEX_EXIT(lck); \ + thread_block(); \ + if (isGlockOwner) AFS_GLOCK(); \ + MUTEX_ENTER(lck); \ + } + +#define CV_TIMEDWAIT(cv,lck,t) { \ + int isGlockOwner = ISAFS_GLOCK(); \ + if (isGlockOwner) AFS_GUNLOCK(); \ + assert_wait((vm_offset_t)(cv), 0); \ + thread_set_timeout(t); \ + MUTEX_EXIT(lck); \ + thread_block(); \ + if (isGlockOwner) AFS_GLOCK(); \ + MUTEX_ENTER(lck); \ + +#define CV_SIGNAL(cv) thread_wakeup_one((vm_offset_t)(cv)) +#define CV_BROADCAST(cv) thread_wakeup((vm_offset_t)(cv)) + +typedef struct { + struct simplelock lock; +} afs_kmutex_t; +typedef int afs_kcondvar_t; + +#define osi_rxWakeup(cv) thread_wakeup((vm_offset_t)(cv)) + +#define LOCK_INIT(a,b) \ + do { \ + usimple_lock_init(&(a)->lock); \ + } while(0); +#define MUTEX_INIT(a,b,c,d) \ + do { \ + usimple_lock_init(&(a)->lock); \ + } while(0); +#define MUTEX_DESTROY(a) \ + do { \ + usimple_lock_terminate(&(a)->lock); \ + } while(0); +#define MUTEX_ENTER(a) \ + do { \ + usimple_lock(&(a)->lock); \ + } while(0); +#define MUTEX_TRYENTER(a) \ + usimple_lock(&(a)->lock) +#define MUTEX_EXIT(a) \ + do { \ + usimple_unlock(&(a)->lock); \ + } while(0); + +#undef MUTEX_ISMINE +#define MUTEX_ISMINE(a) 1 +/* + #define MUTEX_ISMINE(a) + (((afs_kmutex_t *)(a))->owner == current_thread()) +*/ + +#undef osirx_AssertMine +extern void osirx_AssertMine(afs_kmutex_t *lockaddr, char *msg); + +#endif /* FBSD40 */ + + +#endif /* _RX_KMUTEX_H_ */ + diff --git a/src/rx/FBSD/rx_knet.c b/src/rx/FBSD/rx_knet.c new file mode 100644 index 000000000..30ae839a9 --- /dev/null +++ b/src/rx/FBSD/rx_knet.c @@ -0,0 +1,361 @@ +/* +**************************************************************************** +* Copyright IBM Corporation 1988, 1989 - All Rights Reserved * +* Copyright Transarc Corporation 1989 - All Rights Reserved * +* * +* Permission to use, copy, modify, and distribute this software and its * +* documentation for any purpose and without fee is hereby granted, * +* provided that the above copyright notice appear in all copies and * +* that both that copyright notice and this permission notice appear in * +* supporting documentation, and that the name of IBM not be used in * +* advertising or publicity pertaining to distribution of the software * +* without specific, written prior permission. * +* * +* IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL IBM * +* BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY * +* DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER * +* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * +* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * +**************************************************************************** +*/ + +#include "../afs/param.h" +#ifdef AFS_FBSD40_ENV +#include "../rx/rx_kcommon.h" + + +static struct protosw parent_proto; /* udp proto switch */ +static void rxk_input (struct mbuf *am, int iphlen); +static void rxk_fasttimo (void); + +/* start intercepting basic calls */ +rxk_init() { + register struct protosw *tpro, *last; + if (rxk_initDone) return 0; + + last = inetdomain.dom_protoswNPROTOSW; + for (tpro = inetdomain.dom_protosw; tpro < last; tpro++) + if (tpro->pr_protocol == IPPROTO_UDP) { + /* force UDP checksumming on for AFS */ + extern int udpcksum; + udpcksum = 1; + bcopy(tpro, &parent_proto, sizeof(parent_proto)); + tpro->pr_input = rxk_input; + tpro->pr_fasttimo = rxk_fasttimo; + /* + * don't bother with pr_drain and pr_ctlinput + * until we have something to do + */ + rxk_initDone = 1; + return 0; + } + osi_Panic("inet:no udp"); +} + + +static void rxk_input (struct mbuf *am, int iphlen) +{ + void (*tproc)(); + register unsigned short *tsp; + int hdr; + struct udphdr *tu; + register struct ip *ti; + struct udpiphdr *tvu; + register int i; + char *phandle; + afs_int32 code; + struct sockaddr_in taddr; + int tlen; + short port; + int data_len, comp_sum; + + SPLVAR; + NETPRI; + + /* make sure we have base ip and udp headers in first mbuf */ + if (iphlen > sizeof (struct ip)) { + ip_stripoptions(am, (struct mbuf *)0); + iphlen = sizeof (struct ip); + } + + if (am->m_len < sizeof(struct udpiphdr)) { + am = m_pullup(am, sizeof(struct udpiphdr)); + if (!am) { + USERPRI; + return; + } + } + + ti = mtod(am, struct ip *); + /* skip basic ip hdr */ + tu = (struct udphdr *)(((char *)ti) + sizeof(struct ip)); + + /* now read the port out */ + port = tu->uh_dport; + + if (port) { + for(tsp=rxk_ports, i=0; iui_ulen); + if ((int)ti->ip_len != tlen) { + if (tlen > (int)ti->ip_len) { + m_free(am); + USERPRI; + return; + } + m_adj(am, tlen - (int)ti->ip_len); + } + /* deliver packet to rx */ + taddr.sin_family = AF_INET; /* compute source address */ + taddr.sin_port = tu->uh_sport; + taddr.sin_addr.s_addr = ti->ip_src.s_addr; + taddr.sin_len = sizeof(taddr); + tvu = (struct udpiphdr *) ti; /* virtual udp structure, for cksum */ + /* handle the checksum. Note that this code damages the actual ip + header (replacing it with the virtual one, which is the same size), + so we must ensure we get everything out we need, first */ + if ( tu->uh_sum != 0) { + /* if the checksum is there, always check it. It's crazy not + * to, unless you can really be sure that your + * underlying network (and interfaces and drivers and + * DMA hardware, etc!) is error-free. First, fill + * in entire virtual ip header. */ + memset(tvu->ui_i.ih_x1, 0, 9); + tvu->ui_len = tvu->ui_ulen; + tlen = ntohs((unsigned short)(tvu->ui_ulen)); + if (in_cksum(am, sizeof(struct ip) + tlen)) { + /* checksum, including cksum field, doesn't come out 0, so + this packet is bad */ + m_freem(am); + USERPRI; + return; + } + } + + /* + * 28 is IP (20) + UDP (8) header. ulen includes + * udp header, and we *don't* tell RX about udp + * header either. So, we remove those 8 as well. + */ + data_len = ntohs(tu->uh_ulen); + data_len -= 8; + AFS_RXGLOCK(); + if (!(*rxk_GetPacketProc)(&phandle, data_len)) { + if (rx_mb_to_packet(am, m_freem, 28, data_len, phandle)) { + /* XXX should just increment counter here.. */ + printf("rx: truncated UDP packet\n"); + rxi_FreePacket(phandle); + } + else + (*rxk_PacketArrivalProc)(phandle, &taddr, + rxk_portRocks[i], data_len); + }else m_freem(am); + AFS_RXGUNLOCK(); + USERPRI; + return; + } + } + } + + /* if we get here, try to deliver packet to udp */ + if (tproc = parent_proto.pr_input) (*tproc)(am,iphlen); + USERPRI; + return; +} + + +/* + * UDP fast timer to raise events for all but Solaris and NCR. + * Called about 5 times per second (at unknown priority?). Must go to + * splnet or obtain global lock before touching anything significant. + */ +static void rxk_fasttimo (void) +{ + void (*tproc)(); + struct clock temp; + + /* do rx fasttimo processing here */ + rxevent_RaiseEvents(&temp); + if (tproc = parent_proto.pr_fasttimo) (*tproc)(); +} + + +/* rx_NetSend - send asize bytes at adata from asocket to host at addr. + * + * Now, why do we allocate a new buffer when we could theoretically use the one + * pointed to by adata? Because PRU_SEND returns after queueing the message, + * not after sending it. If the sender changes the data after queueing it, + * we'd see the already-queued data change. One attempt to fix this without + * adding a copy would be to have this function wait until the datagram is + * sent; however this doesn't work well. In particular, if a host is down, and + * an ARP fails to that host, this packet will be queued until the ARP request + * comes back, which could be hours later. We can't block in this routine that + * long, since it prevents RPC timeouts from happening. + */ +/* XXX In the brave new world, steal the data bufs out of the rx_packet iovec, + * and just queue those. XXX + */ + +/* set lock on sockbuf sb; can't call sblock since we're at interrupt level + * sometimes */ +static trysblock(sb) +register struct sockbuf *sb; { + AFS_STATCNT(trysblock); + if (sb->sb_flags & SB_LOCK){ + return -1; /* can't lock socket */ + } + sb->sb_flags |= SB_LOCK; + return 0; +} + +int +osi_NetSend(asocket, addr, dvec, nvec, asize, istack) + register struct socket *asocket; + struct iovec *dvec; + int nvec; + register afs_int32 asize; + struct sockaddr_in *addr; + int istack; +{ + register struct mbuf *tm, *um; + register afs_int32 code; + int s; + struct mbuf *top = 0; + register struct mbuf *m, **mp; + int len; + char *tdata; + caddr_t tpa; + int i,tl,rlen; + int mlen; + int haveGlock; + + AFS_STATCNT(osi_NetSend); + +/* Actually, the Ultrix way is as good as any for us, so we don't bother with + * special mbufs any more. Used to think we could get away with not copying + * the data to the interface, but there's no way to tell the caller not to + * reuse the buffers after sending, so we lost out on that trick anyway */ + + s = splnet(); + mp = ⊤ + i = 0; + tdata = dvec[i].iov_base; + tl = dvec[i].iov_len; + while (1) { + mlen = MLEN; + if (top == 0) { + MGETHDR(m, M_DONTWAIT, MT_DATA); + if (!m) { + splx(s); + return 1; + } + mlen = MHLEN; + m->m_pkthdr.len = 0; + m->m_pkthdr.rcvif = (struct ifnet *)0; + } else + MGET(m, M_DONTWAIT, MT_DATA); + if (!m) { + /* can't get an mbuf, give up */ + if (top) m_freem(top); /* free mbuf list we're building */ + splx(s); + return 1; + } + /* + * WARNING: the `4 * MLEN' is somewhat dubious. It is better than + * `NBPG', which may have no relation to `CLBYTES'. Also, `CLBYTES' + * may be so large that we never use clusters, resulting in far + * too many mbufs being used. It is often better to briefly use + * a cluster, even if we are only using a portion of it. Since + * we are on the xmit side, it shouldn't end up sitting on a queue + * for a potentially unbounded time (except perhaps if we are talking + * to ourself). + */ + if (asize >= 4 * MLEN) { /* try to get cluster mbuf */ + register struct mbuf *p; + + /* different algorithms for getting cluster mbuf */ + MCLGET(m, M_DONTWAIT); + if ((m->m_flags & M_EXT) == 0) + goto nopages; + mlen = MCLBYTES; + + /* now compute usable size */ + len = MIN(mlen, asize); +/* Should I look at MAPPED_MBUFS??? */ + } else { +nopages: + len = MIN(mlen, asize); + } + m->m_len = 0; + *mp = m; /* XXXX */ + top->m_pkthdr.len += len; + tpa = mtod(m, caddr_t); + while (len) { + rlen = MIN(len, tl); + bcopy(tdata, tpa, rlen); + asize -= rlen; + len -= rlen; + tpa += rlen; + m->m_len += rlen; + tdata += rlen; + tl -= rlen; + if (tl <= 0) { + i++; + if (i > nvec) { + /* shouldn't come here! */ + asize = 0; /* so we make progress toward completion */ + break; + } + tdata = dvec[i].iov_base; + tl = dvec[i].iov_len; + } + } + *mp = m; + mp = &m->m_next; + if (asize <= 0) + break; + } + tm = top; + + tm->m_act = (struct mbuf *) 0; + + /* setup mbuf corresponding to destination address */ + um = m_get(M_DONTWAIT, MT_SONAME); + if (!um) { + if (top) m_freem(top); /* free mbuf chain */ + /* if this were vfs40, we'd do sbunlock(asocket, &asocket->so_snd), but + we don't do the locking at all for vfs40 systems */ + splx(s); + return 1; + } + bcopy(addr, mtod(um, caddr_t), sizeof(*addr)); + um->m_len = sizeof(*addr); + /* note that udp_usrreq frees funny mbuf. We hold onto data, but mbuf + * around it is gone. we free address ourselves. */ + /* haveGlock = ISAFS_GLOCK(); + if (haveGlock) { + AFS_GUNLOCK(); + } */ + /* SOCKET_LOCK(asocket); */ + /* code = (*asocket->so_proto->pr_usrreq)(asocket, PRU_SEND, tm, um, 0); */ + code = (*asocket->so_proto->pr_usrreqs->pru_send)(asocket, 0, tm, + (struct sockaddr *) addr, + um, curproc); + /* SOCKET_UNLOCK(asocket); */ + /* if (haveGlock) { + AFS_GLOCK(); + } */ + splx(s); + m_free(um); + + return code; +} + +#endif /* AFS_FBSD40_ENV */ -- 2.39.5