f7c53f2736a8d892ecb443c72a06c67fc9982e94
[openafs.git] / src / afs / DARWIN / osi_machdep.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9 /*
10  *
11  * MACOS OSI header file. Extends afs_osi.h.
12  *
13  * afs_osi.h includes this file, which is the only way this file should
14  * be included in a source file. This file can redefine macros declared in
15  * afs_osi.h.
16  */
17
18 #ifndef _OSI_MACHDEP_H_
19 #define _OSI_MACHDEP_H_
20
21 #ifdef XAFS_DARWIN_ENV
22 #ifndef _MACH_ETAP_H_
23 #define _MACH_ETAP_H_
24 typedef unsigned short etap_event_t;
25 #endif
26 #endif
27
28 #ifdef AFS_DARWIN80_ENV
29 #include <kern/locks.h>
30 #include <sys/mount.h>
31 #include <h/vnode.h>
32 #else
33 #include <sys/lock.h>
34 #include <sys/user.h>
35 #include <sys/vnode.h>
36 #endif
37 #include <sys/kauth.h>
38 #include <kern/thread.h>
39
40 #ifdef AFS_DARWIN80_ENV
41 #define vop_proc vfs_context_proc(ap->a_context)
42 #define vop_cred vfs_context_ucred(ap->a_context)
43 #define cn_proc(cnp) vfs_context_proc(ap->a_context)
44 #define cn_cred(cnp) vfs_context_ucred(ap->a_context)
45 #define vop_cn_proc vfs_context_proc(ap->a_context)
46 #define vop_cn_cred vfs_context_ucred(ap->a_context)
47 #define getpid()                proc_selfpid()
48 #define getppid()               proc_selfppid()
49 #else
50 #define vop_proc ap->a_p
51 #define vop_cred ap->a_cred
52 #define cn_proc(cnp) (cnp)->cn_proc
53 #define cn_cred(cnp) (cnp)->cn_cred
54 #define vop_cn_proc cn_proc(ap->a_cnp)
55 #define vop_cn_cred cn_cred(ap->a_cnp)
56 #define getpid()                current_proc()->p_pid
57 #define getppid()               current_proc()->p_pptr->p_pid
58 #endif
59 #undef gop_lookupname
60 #define gop_lookupname osi_lookupname
61 #undef gop_lookupname_user
62 #define gop_lookupname_user osi_lookupname_user
63
64 #define FTRUNC 0
65
66 /* vcexcl - used only by afs_create */
67 enum vcexcl { EXCL, NONEXCL };
68
69 #ifndef AFS_DARWIN80_ENV
70 #define vnode_clearfsnode(x) ((x)->v_data = 0)
71 #define vnode_fsnode(x) (x)->v_data
72 #define vnode_lock(x) vn_lock(x, LK_EXCLUSIVE | LK_RETRY, current_proc())
73 #define vnode_isvroot(x) (((x)->v_flag & VROOT)?1:0)
74 #define vnode_vtype(x) (x)->v_type
75 #define vnode_isdir(x) ((x)->v_type == VDIR)
76
77 #define vfs_flags(x) (x)->v_flags
78 #define vfs_setflags(x, y) (x)->mnt_flag |= (y)
79 #define vfs_clearflags(x, y) (x)->mnt_flag &= (~(y))
80 #define vfs_isupdate(x) ((x)->mnt_flag & MNT_UPDATE)
81 #define vfs_fsprivate(x) (x)->mnt_data
82 #define vfs_setfsprivate(x,y) (x)->mnt_data = (y)
83 #define vfs_typenum(x) (x)->mnt_vfc->vfc_typenum
84 #endif
85
86 #ifdef AFS_DARWIN80_ENV
87 #define vrele vnode_rele
88 #define vput vnode_rele
89 #define vref vnode_ref
90 #define vattr vnode_attr
91
92 #define va_size va_data_size
93 #define va_atime va_access_time
94 #define va_mtime va_modify_time
95 #define va_ctime va_change_time
96 #define va_bytes va_total_alloc
97 #define va_blocksize va_iosize
98 #define va_nodeid va_fileid
99
100 #define crref kauth_cred_get_with_ref
101 #define crhold kauth_cred_ref
102 #ifdef AFS_DARWIN100_ENV
103 #define crfree(X) kauth_cred_unref(&X)
104 #else
105 #define crfree kauth_cred_rele
106 #endif
107 #define crdup kauth_cred_dup
108 #ifdef AFS_DARWIN100_ENV
109 #define ubc_msync_range(X,Y,Z,A) ubc_msync(X,Y,Z,NULL,A)
110 #else
111 #define ubc_msync_range(X,Y,Z,A) ubc_sync_range(X,Y,Z,A)
112 #endif
113 extern vfs_context_t afs_osi_ctxtp;
114 extern int afs_osi_ctxtp_initialized;
115 #endif
116 extern u_int32_t afs_darwin_realmodes;
117 extern u_int32_t afs_darwin_fsevents;
118
119 /*
120  * Time related macros
121  */
122 #ifdef AFS_DARWIN80_ENV
123 static inline time_t osi_Time(void) {
124     struct timeval _now;
125     microtime(&_now);
126     return _now.tv_sec;
127 }
128 #else
129 #define osi_Time() (time.tv_sec)
130 #endif
131 #define afs_hz      hz
132 #ifdef AFS_DARWIN80_ENV
133 extern int hz;
134 #endif
135
136 typedef struct ucred afs_ucred_t;
137 typedef struct proc afs_proc_t;
138
139 #define VN_HOLD(vp) darwin_vn_hold(vp)
140 #define VN_RELE(vp) vrele(vp)
141
142 void darwin_vn_hold(struct vnode *vp);
143
144 #define gop_rdwr(rw,gp,base,len,offset,segflg,unit,cred,aresid) \
145   vn_rdwr((rw),(gp),(base),(len),(offset),(segflg),(unit),(cred),(aresid),current_proc())
146
147 #undef afs_suser
148
149 extern thread_t afs_global_owner;
150 /* simple locks cannot be used since sleep can happen at any time */
151 #ifdef AFS_DARWIN80_ENV
152 /* mach locks still don't have an exported try, but we are forced to use them */
153 extern lck_mtx_t  *afs_global_lock;
154 #define AFS_GLOCK() \
155     do { \
156         osi_Assert(afs_global_owner != current_thread()); \
157         lck_mtx_lock(afs_global_lock); \
158         osi_Assert(afs_global_owner == 0); \
159         afs_global_owner = current_thread(); \
160     } while (0)
161 #define AFS_GUNLOCK() \
162     do { \
163         osi_Assert(afs_global_owner == current_thread()); \
164         afs_global_owner = 0; \
165         lck_mtx_unlock(afs_global_lock); \
166     } while(0)
167 #define osi_InitGlock() \
168     do { \
169         afs_global_owner = 0; \
170     } while (0)
171 #else
172 /* Should probably use mach locks rather than bsd locks, since we use the
173    mach thread control api's elsewhere (mach locks not used for consistency
174    with rx, since rx needs lock_write_try() in order to use mach locks
175  */
176 extern struct lock__bsd__ afs_global_lock;
177 #define AFS_GLOCK() \
178     do { \
179         lockmgr(&afs_global_lock, LK_EXCLUSIVE, 0, current_proc()); \
180         osi_Assert(afs_global_owner == 0); \
181         afs_global_owner = current_thread(); \
182     } while (0)
183 #define AFS_GUNLOCK() \
184     do { \
185         osi_Assert(afs_global_owner == current_thread()); \
186         afs_global_owner = 0; \
187         lockmgr(&afs_global_lock, LK_RELEASE, 0, current_proc()); \
188     } while(0)
189 #define osi_InitGlock() \
190     do { \
191         lockinit(&afs_global_lock, PLOCK, "afs global lock", 0, 0); \
192         afs_global_owner = 0; \
193     } while (0)
194 #endif
195 #define ISAFS_GLOCK() (afs_global_owner == current_thread())
196
197 #define SPLVAR
198 #define NETPRI
199 #define USERPRI
200 #define AFS_APPL_UFS_CACHE 1
201 #define AFS_APPL_HFS_CACHE 2
202 #define AFS_APPL_APFS_CACHE 3
203
204 extern ino_t VnodeToIno(vnode_t avp);
205 extern dev_t VnodeToDev(vnode_t vp);
206 extern int igetinode(mount_t vfsp, dev_t dev , ino_t inode, vnode_t *vpp,
207               struct vattr *va, int *perror);
208
209 #define osi_curproc() current_proc()
210
211 /* FIXME */
212 #define osi_curcred() &afs_osi_cred
213
214 #ifdef AFS_DARWIN80_ENV
215 # define afsio_free(X) uio_free(X)
216 # define afsio_setoffset(X, Y) uio_setoffset(X, Y)
217 # define uprintf printf
218 #endif
219
220 /* Vnode related macros */
221
222 #if defined(AFS_DARWIN80_ENV)
223 extern int afs_vfs_typenum;
224 # define vType(vc)               vnode_vtype(AFSTOV(vc))
225 # define vSetVfsp(vc, vfsp)
226 # define vSetType(vc, type)      (vc)->f.m.Type = (type)
227 # define SetAfsVnode(vn)         /* nothing; done in getnewvnode() */
228 # define IsAfsVnode(v) (vfs_typenum(vnode_mount((v))) == afs_vfs_typenum)
229 #else
230 extern int (**afs_vnodeop_p) ();
231 # define vType(vc)               AFSTOV(vc)->v_type
232 # define vSetVfsp(vc, vfsp)      AFSTOV(vc)->v_mount = (vfsp)
233 # define vSetType(vc, type)      AFSTOV(vc)->v_type = (type)
234 # define IsAfsVnode(v)      ((v)->v_op == afs_vnodeop_p)
235 # define SetAfsVnode(v)     /* nothing; done in getnewvnode() */
236 #endif
237
238 #ifdef AFS_DARWIN80_ENV
239 #define osi_procname(procname, size) proc_selfname(procname, size)
240 #else
241 #define osi_procname(procname, size) strncpy(procname, curproc->p_comm, size)
242 #endif
243
244 #endif /* _OSI_MACHDEP_H_ */