06a7c5a7f2c445f6f80c1d2bddf585167bb7b000
[openafs.git] / src / afs / DARWIN / osi_module.c
1 #include <afsconfig.h>
2 #include "afs/param.h"
3
4 RCSID
5     ("$Header$");
6
7 #include "afs/sysincludes.h"
8 #include "afsincludes.h"
9 #ifdef AFS_DARWIN80_ENV
10 static vfstable_t afs_vfstable;
11 static struct vfs_fsentry afs_vfsentry;
12 extern struct vnodeopv_desc afs_vnodeop_opv_desc;
13 extern struct vnodeopv_desc afs_dead_vnodeop_opv_desc;
14 static struct vnodeopv_desc *afs_vnodeop_opv_desc_list[2] =
15    { &afs_vnodeop_opv_desc, &afs_dead_vnodeop_opv_desc };
16
17
18 #include <sys/conf.h>
19 #include <miscfs/devfs/devfs.h>
20 #define seltrue eno_select
21 struct cdevsw afs_cdev = NO_CDEVICE;
22 #undef seltrue
23 static int afs_cdev_major;
24 extern open_close_fcn_t afs_cdev_nop_openclose;
25 extern ioctl_fcn_t afs_cdev_ioctl;
26 static void *afs_cdev_devfs_handle;
27 #else
28 #ifdef AFS_DARWIN60_ENV         /* not in Kernel.framework anymore !?! */
29 #include <sys/syscall.h>
30 #else
31 #include "sys/syscall.h"
32 #endif
33 struct vfsconf afs_vfsconf;
34 #endif
35 #include <mach/kmod.h>
36
37 extern struct vfsops afs_vfsops;
38 extern struct mount *afs_globalVFS;
39 extern int Afs_xsetgroups();
40 extern int afs_xioctl();
41 extern int afs3_syscall();
42
43 extern int ioctl();
44 extern int setgroups();
45 extern int maxvfsconf;
46 kern_return_t
47 afs_modload(struct kmod_info *ki, void *data)
48 {
49     osi_Init();
50 #ifdef AFS_DARWIN80_ENV
51     memset(&afs_vfsentry, 0, sizeof(struct vfs_fsentry));
52     strcpy(afs_vfsentry.vfe_fsname, "afs");
53     afs_vfsentry.vfe_vfsops = &afs_vfsops;
54     afs_vfsentry.vfe_vopcnt = 2;
55     afs_vfsentry.vfe_opvdescs = afs_vnodeop_opv_desc_list;
56     /* We may be 64bit ready too (VFS_TBL64BITREADY) */
57     afs_vfsentry.vfe_flags = VFS_TBLTHREADSAFE|VFS_TBLNOTYPENUM;
58     if (vfs_fsadd(&afs_vfsentry, &afs_vfstable)) {
59         printf("AFS: vfs_fsadd failed. aborting\n");
60         return KERN_FAILURE;
61     }
62     afs_cdev.d_open = &afs_cdev_nop_openclose;
63     afs_cdev.d_close = &afs_cdev_nop_openclose;
64     afs_cdev.d_ioctl = &afs_cdev_ioctl;
65     afs_cdev_major = cdevsw_add(-1, &afs_cdev);
66     if (afs_cdev_major == -1) {
67         printf("AFS: cdevsw_add failed. aborting\n");
68         vfs_fsremove(afs_vfstable);
69         return KERN_FAILURE;
70     }
71     afs_cdev_devfs_handle = devfs_make_node(makedev(afs_cdev_major, 0),
72                                             DEVFS_CHAR, UID_ROOT, GID_WHEEL,
73                                             0666, "openafs_ioctl", 0);
74 #else
75     memset(&afs_vfsconf, 0, sizeof(struct vfsconf));
76     strcpy(afs_vfsconf.vfc_name, "afs");
77     afs_vfsconf.vfc_vfsops = &afs_vfsops;
78     afs_vfsconf.vfc_typenum = maxvfsconf++;     /* oddly not VT_AFS */
79     afs_vfsconf.vfc_flags = MNT_NODEV;
80     if (vfsconf_add(&afs_vfsconf)) {
81         printf("AFS: vfsconf_add failed. aborting\n");
82         return KERN_FAILURE;
83     }
84     if (sysent[AFS_SYSCALL].sy_call != nosys) {
85         printf("AFS_SYSCALL in use. aborting\n");
86         return KERN_FAILURE;
87     }
88     sysent[SYS_setgroups].sy_call = Afs_xsetgroups;
89 #if 0
90     sysent[SYS_ioctl].sy_call = afs_xioctl;
91 #endif
92     sysent[AFS_SYSCALL].sy_call = afs3_syscall;
93     sysent[AFS_SYSCALL].sy_narg = 5;
94     sysent[AFS_SYSCALL].sy_parallel = 0;
95 #ifdef KERNEL_FUNNEL
96     sysent[AFS_SYSCALL].sy_funnel = KERNEL_FUNNEL;
97 #endif
98 #endif
99 #ifdef AFS_DARWIN80_ENV
100     MUTEX_SETUP();
101     afs_global_lock = lck_mtx_alloc_init(openafs_lck_grp, 0);
102 #endif
103     return KERN_SUCCESS;
104 }
105
106 kern_return_t
107 afs_modunload(struct kmod_info * ki, void *data)
108 {
109     if (afs_globalVFS)
110         return KERN_FAILURE;
111 #ifdef AFS_DARWIN80_ENV
112     if (vfs_fsremove(afs_vfstable))
113         return KERN_FAILURE;
114     devfs_remove(afs_cdev_devfs_handle);
115     cdevsw_remove(afs_cdev_major, &afs_cdev);
116 #else
117     if (vfsconf_del("afs"))
118         return KERN_FAILURE;
119     /* give up syscall entries for ioctl & setgroups, which we've stolen */
120 #if 0
121     sysent[SYS_ioctl].sy_call = ioctl;
122 #endif
123 #ifndef AFS_DARWIN80_ENV
124     sysent[SYS_setgroups].sy_call = setgroups;
125 #endif
126     /* give up the stolen syscall entry */
127     sysent[AFS_SYSCALL].sy_narg = 0;
128     sysent[AFS_SYSCALL].sy_call = nosys;
129 #endif
130 #ifdef AFS_DARWIN80_ENV
131     MUTEX_FINISH();
132     lck_mtx_free(afs_global_lock, openafs_lck_grp);
133 #endif
134     return KERN_SUCCESS;
135 }
136
137 KMOD_EXPLICIT_DECL(org.openafs.filesystems.afs, VERSION, afs_modload,
138                    afs_modunload)