2 * Copyright 2000, International Business Machines Corporation and others.
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
10 #ifndef __AFS_SYSINCLUDESH__
11 #define __AFS_SYSINCLUDESH__ 1
16 #if !defined(AFS_USR_DARWIN_ENV) && !defined(AFS_USR_FBSD_ENV) && !defined(AFS_USR_DFBSD_ENV) /* must be included after KERNEL undef'd */
25 #if !defined(AFS_USR_DARWIN_ENV) && !defined(AFS_USR_FBSD_ENV) && !defined(AFS_USR_DFBSD_ENV) /* must be included after KERNEL undef'd */
28 #include <sys/types.h>
33 #ifdef AFS_USR_SUN5_ENV
35 #include <sys/param.h>
36 #include <sys/socket.h>
38 #include <sys/sockio.h>
41 #include <sys/fcntl.h>
42 #include <netinet/in.h>
44 #include <arpa/inet.h>
45 #endif /* AFS_USR_SUN5_ENV */
48 #ifdef AFS_USR_AIX_ENV
49 #include <sys/param.h>
50 #include <sys/socket.h>
53 #include <netinet/in.h>
54 #include <sys/stropts.h>
56 #include <sys/timers.h>
57 #include <arpa/inet.h>
58 #endif /* AFS_USR_AIX_ENV */
60 #ifdef AFS_USR_SGI_ENV
61 #include <sys/param.h>
62 #include <sys/socket.h>
64 #include <sys/sockio.h>
67 #include <sys/fcntl.h>
68 #include <netinet/in.h>
70 #include <arpa/inet.h>
71 #endif /* AFS_USR_SGI_ENV */
73 #ifdef AFS_USR_HPUX_ENV
74 #include <sys/param.h>
75 #include <sys/socket.h>
79 #include <sys/fcntl.h>
80 #include <netinet/in.h>
82 #include <arpa/inet.h>
83 #endif /* AFS_USR_HPUX_ENV */
85 #ifdef AFS_USR_LINUX_ENV
86 #include <sys/ioctl.h> /* _IOW() */
87 #include <sys/uio.h> /* struct iovec */
88 #include <sys/time.h> /* struct timeval */
89 #include <sys/param.h>
90 #include <sys/types.h>
91 #include <sys/socket.h>
95 #include <sys/fcntl.h>
96 #include <netinet/in.h>
98 #include <arpa/inet.h>
100 #endif /* AFS_USR_LINUX_ENV */
102 #if defined(AFS_USR_DARWIN_ENV) || defined(AFS_USR_FBSD_ENV) || defined(AFS_USR_DFBSD_ENV)
108 #define AFS_USR_UNDEF_KERNEL_ENV 1
112 #include <sys/param.h>
113 #include <sys/types.h>
114 #include <sys/socket.h>
116 #include <sys/file.h>
117 #include <sys/ioctl.h>
118 #include <sys/stat.h>
119 #include <sys/fcntl.h>
121 #include <netinet/in.h>
123 #include <arpa/inet.h>
128 #define O_SYNC O_FSYNC
130 #endif /* AFS_USR_DARWIN_ENV || AFS_USR_FBSD_ENV */
132 #ifdef HAVE_SYS_BITYPES_H
133 #include <sys/bitypes.h>
135 #ifdef HAVE_SYS_STATFS_H
136 #include <sys/statfs.h>
138 #ifdef HAVE_SYS_STATVFS_H
139 #include <sys/statvfs.h>
142 #ifndef HAVE_FSBLKCNT_T
143 typedef unsigned int fsblkcnt_t;
146 #include <arpa/nameser.h>
147 #ifdef HAVE_ARPA_NAMESER_COMPAT_H
148 #include <arpa/nameser_compat.h>
152 /* glibc 2.2 has pthread_attr_setstacksize */
153 #if (defined(AFS_LINUX_ENV) && !defined(AFS_USR_LINUX_ENV)) || (defined(AFS_USR_LINUX_ENV) && (__GLIBC_MINOR__ < 2))
154 #define pthread_attr_setstacksize(a,b) 0
157 #include <sys/stat.h> /* afs_usrops.h uses struct stat in prototypes */
161 #ifdef AFS_USR_UNDEF_KERNEL_ENV
162 #undef AFS_USR_UNDEF_KERNEL_ENV
167 * User space versions of kernel data structures.
171 #define MAXNAMLEN 512
175 * This file contains data types and definitions for running
176 * the AFS client in user space. Kernel data structures
177 * are renamed from XXXX to usr_XXXX.
184 #if defined(AFS_USR_DARWIN_ENV) || defined(AFS_USR_FBSD_ENV)
189 #define mount usr_mount
192 #define fileops usr_fileops
193 #define vnodeops usr_vnodeops
194 #define vnode usr_vnode
195 #define inode usr_inode
196 #define whymountroot_t usr_whymountroot_t
197 #define vfsops usr_vfsops
199 #define vattr usr_vattr
201 #define statfs usr_statfs
202 #define file usr_file
203 #define dirent usr_dirent
205 #define sysent usr_sysent
206 #define ifaddr usr_ifaddr
207 #define ifnet usr_ifnet
208 #define in_ifaddr usr_in_ifaddr
209 #define crget usr_crget
210 #define crcopy usr_crcopy
211 #define crhold usr_crhold
212 #define crfree usr_crfree
213 #define vtype_t usr_vtype_t
214 #define vcexcl usr_vcexcl
215 #define m_free usr_m_free
216 #define m_freem usr_m_freem
217 #define m_adj usr_m_adj
218 #define m_pullup usr_m_pullup
219 #define uiomove usr_uiomove
220 #define EXCL usr_EXCL
221 #define NONEXCL usr_NONEXCL
222 #define uio_rw usr_uio_rw
226 #define ino_t usr_ino_t
227 #define offset_t usr_offset_t
228 #define getpid() usr_getpid()
229 #define setpag(A,B,C,D) usr_setpag((A),(B),(C),(D))
230 #define osi_getpid() afs_pointer_to_int(usr_thread_self())
236 enum usr_vcexcl { usr_NONEXCL, usr_EXCL };
237 typedef long offset_t;
238 typedef long usr_ino_t;
240 #if defined(AFS_USR_AIX_ENV) || defined(AFS_USR_SGI_ENV)
241 #define SYS_setgroups 101
244 #define ioctl() usr_ioctl()
246 #define label_t jmp_buf
252 #define VFSTOM(VP) ((struct usr_mount *)(VP)->vfs_mount)
282 #define VINACT 0x0001
284 #define VNOMAP 0x0004
286 #define VSHARE 0x0010
289 #define VWASMAP 0x0080
290 #define VXLOCK 0x0100
323 #define VSOCK S_IFSOCK
324 #define VFIFO S_IFIFO
326 typedef int usr_vtype_t;
332 #define VOP_RDWR afs_osi_VOP_RDWR
348 #define DTYPE_VNODE 1
397 #define INOACC 0x0010
398 #define IMODTIME 0x0020
401 #define IFASTSYMLNK 0x0100
402 #define IMODACC 0x0200
403 #define IATTCHG 0x0400
404 #define IBDWRITE 0x0800
437 #define IFIFO 0010000
438 #define IFCHR 0020000
439 #define IFDIR 0040000
440 #define IFBLK 0060000
441 #define IFREG 0100000
442 #define IFLNK 0120000
443 #define IFSHAD 0130000
444 #define IFSOCK 0140000
505 #define I_FREE 0x00000001
506 #define I_DIR 0x00000002
507 #define I_IBLK 0x00000004
508 #define I_CHEAP 0x00000008
509 #define I_SHAD 0x00000010
510 #define I_QUOTA 0x00000020
519 #define VTOI(VP) ((struct usr_inode *)(VP)->v_data)
520 #define ITOV(IP) ((struct usr_vnode *)&(IP)->i_vnode)
538 #ifdef ROOT_FRONTMOUNT
539 #undef ROOT_FRONTMOUNT
541 #ifdef ROOT_BACKMOUNT
542 #undef ROOT_BACKMOUNT
545 #define ROOT_INIT 0x0001
546 #define ROOT_REMOUNT 0X0002
547 #define ROOT_UNMOUNT 0x0003
548 #define ROOT_FRONTMOUNT 0x0004
549 #define ROOT_BACKMOUNT 0x0005
591 #define VFS_STATFS(vfsp, sp) ((sp)->f_bsize=4096, 0)
612 #define FAPPEND 0x0100
613 #define IO_APPEND FAPPEND
615 #define IO_SYNC FSYNC
616 #define FTRUNC 0x0400
617 #define FWRITE 0x0800
638 #define F_GETLK 0x0001
639 #define F_RDLCK 0x0002
640 #define F_SETLK 0x0003
641 #define F_SETLKW 0x0004
642 #define F_UNLCK 0x0005
643 #define F_WRLCK 0x0006
658 #define LOCK_SH F_RDLCK
659 #define LOCK_UN F_UNLCK
660 #define LOCK_EX F_WRLCK
661 #define LOCK_NB 0x0007
670 #define FEXLOCK F_WRLCK
671 #define FSHLOCK F_RDLCK
679 enum usr_uio_rw { USR_UIO_READ, USR_UIO_WRITE };
688 #define UIO_READ 0x0000
689 #define UIO_WRITE 0x0001
698 #define UIO_USERSPACE 0x0000
699 #define UIO_SYSSPACE 0x0001
742 #define B_ASYNC 0x0002
743 #define B_DELWRI 0x0004
744 #define B_DIRTY 0x0008
745 #define B_DONE 0x0010
746 #define B_ERROR 0x0020
747 #define B_FREE 0x0040
748 #define B_NOCACHE 0x0080
749 #define B_PFSTORE 0x0100
750 #define B_READ 0x0200
752 #define B_WANTED 0x0800
753 #define B_WRITE 0x1000
781 #define MMAXOFF 16384
787 #define IA_SIN(IA) (&(IA)->ia_addr)
799 #define mtod(m,t) ((t)((m)->m_data))
806 static_inline void panic(const char *format, ...) AFS_NORETURN;
807 static_inline void panic(const char *format, ...)
810 va_start(ap, format);
811 vfprintf(stderr, format, ap);
815 #define abort() assert(0)
816 #define usr_assert(A) assert(A)
820 * Mutex and condition variable used to implement sleep
822 extern pthread_mutex_t usr_sleep_mutex;
823 extern pthread_cond_t usr_sleep_cond;
825 #define usr_cond_t pthread_cond_t
826 #define usr_mutex_t pthread_mutex_t
827 #define usr_thread_t pthread_t
828 #define usr_key_t pthread_key_t
830 #define usr_mutex_init(A) opr_Verify(pthread_mutex_init(A,NULL) == 0)
831 #define usr_mutex_destroy(A) opr_Verify(pthread_mutex_destroy(A) == 0)
832 #define usr_mutex_lock(A) opr_Verify(pthread_mutex_lock(A) == 0)
833 #define usr_mutex_trylock(A) ((pthread_mutex_trylock(A)==0)?1:0)
834 #define usr_mutex_unlock(A) opr_Verify(pthread_mutex_unlock(A) == 0)
835 #define usr_cond_init(A) opr_Verify(pthread_cond_init(A,NULL) == 0)
836 #define usr_cond_destroy(A) opr_Verify(pthread_cond_destroy(A) == 0)
837 #define usr_cond_signal(A) opr_Verify(pthread_cond_signal(A) == 0)
838 #define usr_cond_broadcast(A) opr_Verify(pthread_cond_broadcast(A) == 0)
839 #define usr_cond_wait(A,B) pthread_cond_wait(A,B)
840 #define usr_cond_timedwait(A,B,C) pthread_cond_timedwait(A,B,C)
842 #define usr_thread_create(A,B,C) \
844 pthread_attr_t attr; \
845 opr_Verify(pthread_attr_init(&attr) == 0); \
846 opr_Verify(pthread_attr_setstacksize(&attr, 122880) == 0); \
847 opr_Verify(pthread_create((A), &attr, (B), (void *)(C)) == 0); \
848 opr_Verify(pthread_attr_destroy(&attr) == 0); \
850 #define usr_thread_join(A,B) pthread_join(A, B)
851 #define usr_thread_detach(A) pthread_detach(A)
852 #define usr_keycreate(A,B) opr_Verify(pthread_key_create(A,B) == 0)
853 #define usr_setspecific(A,B) pthread_setspecific(A,B)
854 #define usr_getspecific(A,B) (*(B)=pthread_getspecific(A),0)
855 #define usr_thread_self() pthread_self()
856 #define usr_thread_sleep(A) \
858 struct timespec _sleep_ts; \
859 struct timeval _sleep_tv; \
860 gettimeofday(&_sleep_tv, NULL); \
862 _sleep_ts.tv_sec += _sleep_tv.tv_sec; \
863 _sleep_ts.tv_nsec += _sleep_tv.tv_usec * 1000; \
864 if (_sleep_ts.tv_nsec >= 1000000000) { \
865 _sleep_ts.tv_sec += 1; \
866 _sleep_ts.tv_nsec -= 1000000000; \
868 opr_Verify(pthread_mutex_lock(&usr_sleep_mutex) == 0); \
869 pthread_cond_timedwait(&usr_sleep_cond, &usr_sleep_mutex, &_sleep_ts); \
870 opr_Verify(pthread_mutex_unlock(&usr_sleep_mutex) == 0); \
873 #define uprintf printf
875 #define usr_getpid() (int)(usr_thread_self())
879 #define ISAFS_GLOCK() (usr_thread_self() == afs_global_owner)
881 #define copyin(A,B,C) (memcpy((void *)B,(void *)A,C), 0)
882 #define copyout(A,B,C) (memcpy((void *)B,(void *)A,C), 0)
883 #define copyinstr(A,B,C,D) (strncpy(B,A,C),(*D)=strlen(B), 0)
884 #define copyoutstr(A,B,C,D) (strncpy(B,A,C),(*D)=strlen(B), 0)
886 #define vattr_null(A) usr_vattr_null(A)
888 #define VN_HOLD(vp) \
893 #define VN_RELE(vp) \
895 AFS_ASSERT_GLOCK(); \
896 usr_assert((vp)->v_count > 0); \
897 if (--((vp)->v_count) == 0) \
898 afs_inactive(VTOAFS(vp), get_user_struct()->u_cred); \
902 unsigned long f_type;
903 unsigned long f_bsize;
904 unsigned long f_frsize;
905 unsigned long f_ffree;
906 unsigned long f_favail;
908 unsigned long val[2];
910 char f_basetype[FSTYPSZ];
911 unsigned long f_flag;
912 unsigned long f_namemax;
913 unsigned long f_blocks;
914 unsigned long f_bfree;
915 unsigned long f_bavail;
916 unsigned long f_files;
919 #define ATTR_MODE (1 << 0)
920 #define ATTR_UID (1 << 1)
921 #define ATTR_GID (1 << 2)
922 #define ATTR_MTIME (1 << 3)
923 #define ATTR_SIZE (1 << 4)
926 int va_mask; /* bitmask of ATTR_* values above */
935 struct timeval va_atime;
936 struct timeval va_mtime;
937 struct timeval va_ctime;
939 unsigned long va_blocksize;
940 fsblkcnt_t va_blocks;
941 unsigned long va_vcode;
972 unsigned short v_flag;
973 unsigned long v_count;
974 struct usr_vnodeops *v_op;
975 struct usr_vfs *v_vfsp;
977 unsigned long v_rdev;
982 daddr_t i_db[NDADDR];
983 struct usr_vnode *i_devvp;
986 struct usr_inode *i_freef;
987 struct usr_inode **i_freeb;
989 daddr_t i_ib[NIADDR];
990 unsigned short i_mode;
992 unsigned long i_number;
995 struct usr_vnode i_vnode;
997 unsigned long ic_spare[4];
1001 struct usr_fileops {
1002 int (*vno_rw) (void);
1003 int (*vno_ioctl) (void);
1004 int (*vno_select) (void);
1005 int (*vno_closex) (void);
1009 unsigned short f_flag;
1011 struct usr_ucred *f_cred;
1012 struct usr_fileops *f_ops;
1017 extern struct usr_file *getf(int);
1027 unsigned short fid_len;
1028 unsigned short fid_reserved;
1029 char fid_data[MAXFIDSZ];
1041 extern struct usr_ucred *usr_crget(void);
1042 extern struct usr_ucred *usr_crcopy(struct usr_ucred *);
1043 extern int usr_crhold(struct usr_ucred *);
1044 extern int usr_crfree(struct usr_ucred *);
1047 unsigned long p_flag;
1050 struct usr_ucred *p_ucred;
1070 struct iovec *uio_iov;
1091 struct usr_fs *b_fs;
1094 unsigned int b_resid;
1095 struct usr_vnode *b_vp;
1098 #define NDIRSIZ_LEN(len) \
1099 ((sizeof (struct usr_dirent)+4 - (MAXNAMLEN+1)) + (((len)+1 + 3) &~ 3))
1102 #define afs_ucred_t struct usr_ucred
1105 struct usr_vnodeops {
1106 int (*vn_open) (struct vcache **, afs_int32, afs_ucred_t *);
1107 int (*vn_close) (struct vcache *, afs_int32, afs_ucred_t *);
1108 int (*vn_rdwr) (struct usr_vnode *avc, struct usr_uio *uio,
1109 int rw, int io, struct usr_ucred *cred);
1110 int (*vn_ioctl) (void);
1111 int (*vn_select) (void);
1112 int (*vn_getattr) (struct vcache *avc, struct vattr *, afs_ucred_t *);
1113 int (*vn_setattr) (struct vcache *avc, struct vattr *, afs_ucred_t *);
1114 int (*vn_access) (struct vcache *avc, afs_int32, afs_ucred_t *);
1115 int (*vn_lookup) (struct vcache *adp, char *, struct vcache **,
1116 afs_ucred_t *, int);
1117 int (*vn_create) (struct vcache *adp, char *, struct vattr *,
1118 enum vcexcl, int, struct vcache **, afs_ucred_t *);
1119 int (*vn_remove) (struct vcache *adp, char *, afs_ucred_t *);
1120 int (*vn_link) (struct vcache *avc, struct vcache *adp, char *,
1122 int (*vn_rename) (struct vcache *aodp, char *, struct vcache *, char *,
1124 int (*vn_mkdir) (struct vcache *adp, char *, struct vattr *,
1125 struct vcache **, afs_ucred_t *);
1126 int (*vn_rmdir) (struct vcache *adp, char *, afs_ucred_t *);
1127 int (*vn_readdir) (struct vcache *avc, struct uio *, afs_ucred_t *);
1128 int (*vn_symlink) (struct vcache *adp, char *, struct vattr *, char *,
1129 struct vcache **pvc, afs_ucred_t *);
1130 int (*vn_readlink) (struct vcache *avc, struct uio *, afs_ucred_t *);
1131 int (*vn_fsync) (struct vcache *avc, afs_ucred_t *);
1132 int (*vn_inactive) (struct vcache *avc, afs_ucred_t *acred);
1133 int (*vn_bmap) (void);
1134 int (*vn_strategy) (void);
1135 int (*vn_bread) (void);
1136 int (*vn_brelse) (void);
1137 int (*vn_lockctl) (struct vcache *, struct usr_flock *, int,
1139 int (*vn_fid) (struct vcache *avc, struct fid **);
1148 unsigned long m_dev;
1149 struct usr_inode *m_inodp;
1150 struct usr_buf *m_bufp;
1151 struct usr_vnode *m_mount;
1153 extern struct usr_mount *getmp(unsigned long);
1155 typedef long usr_whymountroot_t;
1158 int (*vfs_mount) (struct vfs *, char *, void *);
1159 int (*vfs_unmount) (struct vfs *);
1160 int (*vfs_root) (struct vfs *, struct vnode **);
1161 int (*vfs_statfs) (struct vfs *, struct statfs *);
1162 int (*vfs_mountroot) (struct vfs *);
1163 int (*vfs_swapvp) (void);
1167 struct usr_vnode *vfs_vnodecovered;
1169 unsigned long val[2];
1172 unsigned long vfs_bsize;
1173 struct usr_mount *vfs_mount;
1174 struct usr_vfsops *vfs_op;
1178 struct usr_ifnet *if_next;
1182 struct usr_ifaddr *if_addrlist;
1184 extern struct usr_ifnet *usr_ifnet;
1187 struct usr_ifaddr *ifa_next;
1188 struct usr_ifnet *ifa_ifp;
1189 struct sockaddr ifa_addr;
1199 struct usr_in_ifaddr {
1200 struct usr_in_ifaddr *ia_next;
1201 struct usr_ifnet *ia_ifp;
1202 struct sockaddr_in ia_addr;
1203 unsigned long ia_net;
1204 unsigned long ia_netmask;
1205 unsigned long ia_subnet;
1206 unsigned long ia_subnetmask;
1207 struct in_addr ia_netbroadcast;
1209 extern struct usr_in_ifaddr *usr_in_ifaddr;
1211 #endif /* UKERNEL */
1214 unsigned long d_fileno;
1215 unsigned short d_reclen;
1216 unsigned short d_namlen;
1220 #define NGROUPS NGROUPS_MAX
1223 #define NOGROUP (-1)
1230 unsigned long cr_ref;
1238 gid_t cr_groups[NGROUPS];
1251 unsigned long u_expiration;
1252 struct usr_proc *u_procp;
1253 struct usr_ucred *u_cred;
1258 #define u_rval1 u_r.r_val1
1260 extern struct usr_user *get_user_struct(void);
1262 #define USR_DIRSIZE 2048
1265 unsigned long d_ino;
1266 unsigned long d_off;
1267 unsigned short d_reclen;
1268 char d_name[MAXNAMLEN + 1];
1279 extern unsigned short usr_rx_port;
1281 #define AFS_LOOKUP_NOEVAL 1
1283 #endif /* __AFS_SYSINCLUDESH__ so idempotent */