From 17b361b8c2e634cca48c0c622e57a6a082b7c8b4 Mon Sep 17 00:00:00 2001 From: Sam Hartman Date: Thu, 26 Sep 2002 18:58:08 +0000 Subject: [PATCH] Initial revision --- src/afs/FBSD/osi_module.c | 91 +++++++++++++++++++++++++++++++++++ src/afs/FBSD/osi_prototypes.h | 20 ++++++++ src/afs/SUNOS/osi_inode.h | 1 + 3 files changed, 112 insertions(+) create mode 100644 src/afs/FBSD/osi_module.c create mode 100644 src/afs/FBSD/osi_prototypes.h create mode 100644 src/afs/SUNOS/osi_inode.h diff --git a/src/afs/FBSD/osi_module.c b/src/afs/FBSD/osi_module.c new file mode 100644 index 000000000..1b8fbd9da --- /dev/null +++ b/src/afs/FBSD/osi_module.c @@ -0,0 +1,91 @@ + + +#include +#include +#include +#include +#include +#include +#include + +extern struct vfsops afs_vfsops; +extern struct vnodeopv_desc afs_vnodeop_opv_desc; +extern struct mount *afs_globalVFS; +static struct vfsconf afs_vfsconf; + +MALLOC_DEFINE(M_AFS, "afsmisc", "memory used by the AFS filesystem"); + +extern int afs3_syscall(); +extern int Afs_xsetgroups(); +extern int afs_xioctl(); + +int afs_module_handler(module_t mod, int what, void *arg) { + static sy_call_t *old_handler; + static int inited=0; + int error; + error=0; + switch (what) { + case MOD_LOAD: + if (inited) { + printf ("afs cannot be MOD_LOAD'd more than once\n"); + error=-1; + break; + } + if (sysent[AFS_SYSCALL].sy_call != nosys && + sysent[AFS_SYSCALL].sy_call != lkmnosys) { + printf("AFS_SYSCALL in use. aborting\n"); + error=-1; + break; + } + memset(&afs_vfsconf, 0, sizeof(struct vfsconf)); + strcpy(afs_vfsconf.vfc_name, "AFS"); + afs_vfsconf.vfc_vfsops=&afs_vfsops; + afs_vfsconf.vfc_typenum=-1; /* set by vfs_register */ + afs_vfsconf.vfc_flags=VFCF_NETWORK; + vfs_register(&afs_vfsconf); /* doesn't fail */ + vfs_add_vnodeops(&afs_vnodeop_opv_desc); + osi_Init(); + sysent[SYS_setgroups].sy_call=Afs_xsetgroups; + sysent[SYS_ioctl].sy_call=afs_xioctl; + old_handler=sysent[AFS_SYSCALL].sy_call; + sysent[AFS_SYSCALL].sy_call=afs3_syscall; + sysent[AFS_SYSCALL].sy_narg = 5; + inited=1; + break; + case MOD_UNLOAD: +#ifndef RXK_LISTENER_ENV + /* shutdown is incomplete unless RXK_LISTENER_ENV */ + printf("afs: I can't be unloaded yet\n"); + return -1; +#endif + if (! inited) { + error=0; + break; + } + if (afs_globalVFS) { + error=-1; + break; + } + if (vfs_unregister(&afs_vfsconf)) { + error=-1; + break; + } + vfs_rm_vnodeops(&afs_vnodeop_opv_desc); + sysent[SYS_ioctl].sy_call = ioctl; + sysent[SYS_setgroups].sy_call = setgroups; + sysent[AFS_SYSCALL].sy_narg = 0; + sysent[AFS_SYSCALL].sy_call = old_handler; + break; + } + + return (error); +} + + +static moduledata_t afs_mod = { + "afs", + afs_module_handler, + &afs_mod +}; +DECLARE_MODULE(afs, afs_mod, SI_SUB_VFS, SI_ORDER_MIDDLE); + diff --git a/src/afs/FBSD/osi_prototypes.h b/src/afs/FBSD/osi_prototypes.h new file mode 100644 index 000000000..b6bac7919 --- /dev/null +++ b/src/afs/FBSD/osi_prototypes.h @@ -0,0 +1,20 @@ +/* + * 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 + */ +/* + * osi_prototypes.h + * + * Exported macos support routines. + */ +#ifndef _OSI_PROTO_H_ +#define _OSI_PROTO_H_ + +/* osi_misc.c */ +extern int osi_lookupname(char *aname, enum uio_seg seg, int followlink, + struct vnode **dirvpp, struct vnode **vpp); +#endif /* _OSI_PROTO_H_ */ diff --git a/src/afs/SUNOS/osi_inode.h b/src/afs/SUNOS/osi_inode.h new file mode 100644 index 000000000..a55f44dba --- /dev/null +++ b/src/afs/SUNOS/osi_inode.h @@ -0,0 +1 @@ +#error kernel code not supported on SunOS 4 -- 2.39.5