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