4 #include "afs/sysincludes.h"
5 #include "afsincludes.h"
7 #define MYBUNDLEID "org.openafs.filesystems.afs"
8 #ifdef AFS_DARWIN80_ENV
9 static vfstable_t afs_vfstable;
10 static struct vfs_fsentry afs_vfsentry;
11 extern struct vnodeopv_desc afs_vnodeop_opv_desc;
12 extern struct vnodeopv_desc afs_dead_vnodeop_opv_desc;
13 static struct vnodeopv_desc *afs_vnodeop_opv_desc_list[2] =
14 { &afs_vnodeop_opv_desc, &afs_dead_vnodeop_opv_desc };
17 #include <miscfs/devfs/devfs.h>
18 #define seltrue eno_select
19 struct cdevsw afs_cdev = NO_CDEVICE;
21 static int afs_cdev_major;
22 extern open_close_fcn_t afs_cdev_nop_openclose;
23 extern ioctl_fcn_t afs_cdev_ioctl;
24 static void *afs_cdev_devfs_handle;
26 #ifdef AFS_DARWIN60_ENV /* not in Kernel.framework anymore !?! */
27 #include <sys/syscall.h>
29 #include "sys/syscall.h"
31 struct vfsconf afs_vfsconf;
33 #include <mach/kmod.h>
35 extern struct vfsops afs_vfsops;
36 extern struct mount *afs_globalVFS;
37 extern int Afs_xsetgroups();
40 extern int setgroups();
41 extern int maxvfsconf;
43 afs_modload(struct kmod_info *ki, void *data)
46 #ifdef AFS_DARWIN80_ENV
48 afs_global_lock = lck_mtx_alloc_init(openafs_lck_grp, 0);
49 memset(&afs_vfsentry, 0, sizeof(struct vfs_fsentry));
50 strcpy(afs_vfsentry.vfe_fsname, "afs");
51 afs_vfsentry.vfe_vfsops = &afs_vfsops;
52 afs_vfsentry.vfe_vopcnt = 2;
53 afs_vfsentry.vfe_opvdescs = afs_vnodeop_opv_desc_list;
54 afs_vfsentry.vfe_flags = VFS_TBLTHREADSAFE|VFS_TBLNOTYPENUM|VFS_TBL64BITREADY;
55 if (vfs_fsadd(&afs_vfsentry, &afs_vfstable)) {
56 printf("AFS: vfs_fsadd failed. aborting\n");
59 afs_cdev.d_open = &afs_cdev_nop_openclose;
60 afs_cdev.d_close = &afs_cdev_nop_openclose;
61 afs_cdev.d_ioctl = &afs_cdev_ioctl;
62 afs_cdev_major = cdevsw_add(-1, &afs_cdev);
63 if (afs_cdev_major == -1) {
64 printf("AFS: cdevsw_add failed. aborting\n");
67 afs_cdev_devfs_handle = devfs_make_node(makedev(afs_cdev_major, 0),
68 DEVFS_CHAR, UID_ROOT, GID_WHEEL,
69 0666, "openafs_ioctl", 0);
70 if (!afs_cdev_devfs_handle) {
71 printf("AFS: devfs_make_node failed. aborting\n");
72 cdevsw_remove(afs_cdev_major, &afs_cdev);
74 vfs_fsremove(afs_vfstable);
77 lck_mtx_free(afs_global_lock, openafs_lck_grp);
81 memset(&afs_vfsconf, 0, sizeof(struct vfsconf));
82 strcpy(afs_vfsconf.vfc_name, "afs");
83 afs_vfsconf.vfc_vfsops = &afs_vfsops;
84 afs_vfsconf.vfc_typenum = maxvfsconf++; /* oddly not VT_AFS */
85 afs_vfsconf.vfc_flags = MNT_NODEV;
86 if (vfsconf_add(&afs_vfsconf)) {
87 printf("AFS: vfsconf_add failed. aborting\n");
90 if (sysent[AFS_SYSCALL].sy_call != nosys) {
91 printf("AFS_SYSCALL in use. aborting\n");
94 sysent[SYS_setgroups].sy_call = Afs_xsetgroups;
95 sysent[AFS_SYSCALL].sy_call = afs3_syscall;
96 sysent[AFS_SYSCALL].sy_narg = 5;
97 sysent[AFS_SYSCALL].sy_parallel = 0;
99 sysent[AFS_SYSCALL].sy_funnel = KERNEL_FUNNEL;
106 afs_modunload(struct kmod_info * ki, void *data)
110 #ifdef AFS_DARWIN80_ENV
111 if (vfs_fsremove(afs_vfstable))
113 devfs_remove(afs_cdev_devfs_handle);
114 cdevsw_remove(afs_cdev_major, &afs_cdev);
116 if (vfsconf_del("afs"))
118 /* give up syscall entries for ioctl & setgroups, which we've stolen */
119 sysent[SYS_setgroups].sy_call = setgroups;
120 /* give up the stolen syscall entry */
121 sysent[AFS_SYSCALL].sy_narg = 0;
122 sysent[AFS_SYSCALL].sy_call = nosys;
124 #ifdef AFS_DARWIN80_ENV
126 lck_mtx_free(afs_global_lock, openafs_lck_grp);
131 KMOD_EXPLICIT_DECL(MYBUNDLEID, VERSION, afs_modload,