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
24 #ifdef AFS_USR_SUN5_ENV
26 #include <sys/param.h>
27 #include <sys/types.h>
28 #include <sys/socket.h>
30 #include <sys/sockio.h>
33 #include <sys/fcntl.h>
34 #include <netinet/in.h>
36 #include <arpa/inet.h>
37 #endif /* AFS_USR_SUN5_ENV */
40 #ifdef AFS_USR_AIX_ENV
41 #include <sys/param.h>
42 #include <sys/types.h>
43 #include <sys/socket.h>
46 #include <netinet/in.h>
47 #include <sys/stropts.h>
49 #include <sys/timers.h>
50 #include <arpa/inet.h>
51 #endif /* AFS_USR_AIX_ENV */
53 #ifdef AFS_USR_SGI_ENV
54 #include <sys/param.h>
55 #include <sys/types.h>
56 #include <sys/socket.h>
58 #include <sys/sockio.h>
61 #include <sys/fcntl.h>
62 #include <netinet/in.h>
64 #include <arpa/inet.h>
65 #endif /* AFS_USR_SGI_ENV */
67 #ifdef AFS_USR_HPUX_ENV
68 #include <sys/param.h>
69 #include <sys/types.h>
70 #include <sys/socket.h>
74 #include <sys/fcntl.h>
75 #include <netinet/in.h>
77 #include <arpa/inet.h>
78 #endif /* AFS_USR_HPUX_ENV */
80 #ifdef AFS_USR_OSF_ENV
83 #define AFS_USR_UNDEF_KERNEL_ENV 1
85 #include <sys/param.h>
86 #include <sys/types.h>
87 #include <sys/socket.h>
90 #include <sys/ioctl.h>
92 #include <sys/fcntl.h>
93 #include <netinet/in.h>
95 #include <arpa/inet.h>
96 #endif /* AFS_USR_OSF_ENV */
98 #ifdef AFS_USR_LINUX22_ENV
99 #include <sys/ioctl.h> /* _IOW() */
100 #include <sys/uio.h> /* struct iovec */
101 #include <sys/time.h> /* struct timeval */
102 #include <sys/param.h>
103 #include <sys/types.h>
104 #include <sys/socket.h>
106 #include <sys/file.h>
107 #include <sys/stat.h>
108 #include <sys/fcntl.h>
109 #include <netinet/in.h>
111 #include <arpa/inet.h>
113 #endif /* AFS_USR_LINUX22_ENV */
115 /* this is necessary for client programs as well as the library itself */
116 #if defined(AFS_LINUX22_ENV) || defined(AFS_USR_LINUX22_ENV)
117 #define pthread_attr_setstacksize(a,b) 0
120 #include <sys/stat.h> /* afs_usrops.h uses struct stat in prototypes */
122 #ifdef NETSCAPE_NSAPI
126 #else /* NETSCAPE_NSAPI */
130 #endif /* NETSCAPE_NSAPI */
132 #ifdef AFS_USR_UNDEF_KERNEL_ENV
133 #undef AFS_USR_UNDEF_KERNEL_ENV
138 * User space versions of kernel data structures.
142 #define MAXNAMLEN 512
146 #define PAGESIZE 4096
150 * This file contains data types and definitions for running
151 * the AFS client in user space. Kernel data structures
152 * are renamed from XXXX to usr_XXXX.
157 #ifdef AFS_USR_SGI_ENV
159 #endif /* AFS_USR_SGI_ENV */
161 #define mount usr_mount
164 #define fileops usr_fileops
165 #define vnodeops usr_vnodeops
166 #define vnode usr_vnode
167 #define inode usr_inode
168 #define whymountroot_t usr_whymountroot_t
169 #define vfsops usr_vfsops
171 #define vattr usr_vattr
173 #define statfs usr_statfs
174 #define ucred usr_ucred
175 #define user usr_user
176 #define proc usr_proc
177 #define file usr_file
178 #define dirent usr_dirent
179 #define flock usr_flock
181 #define sysent usr_sysent
182 #define in_ifaddr usr_in_ifaddr
183 #define ifaddr usr_ifaddr
184 #define ifnet usr_ifnet
185 #define socket usr_socket
186 #define crget usr_crget
187 #define crcopy usr_crcopy
188 #define crhold usr_crhold
189 #define crfree usr_crfree
190 #define vtype_t usr_vtype_t
191 #define vcexcl usr_vcexcl
192 #define m_free usr_m_free
193 #define m_freem usr_m_freem
194 #define m_adj usr_m_adj
195 #define m_pullup usr_m_pullup
196 #define uiomove usr_uiomove
197 #define EXCL usr_EXCL
198 #define NONEXCL usr_NONEXCL
199 #define uio_rw usr_uio_rw
200 #define ino_t usr_ino_t
201 #define offset_t usr_offset_t
202 #define getpid() usr_getpid()
203 #define setpag(A,B,C,D) usr_setpag((A),(B),(C),(D))
206 enum usr_vcexcl { usr_NONEXCL, usr_EXCL };
207 typedef long offset_t;
208 #ifdef AFS_USR_OSF_ENV
209 typedef int usr_ino_t;
210 #else /* AFS_USR_OSF_ENV */
211 typedef long usr_ino_t;
212 #endif /* AFS_USR_OSF_ENV */
214 #if defined(AFS_USR_AIX_ENV) || defined(AFS_USR_SGI_ENV)
215 #define SYS_setgroups 101
218 #define ioctl() usr_ioctl()
220 #define label_t jmp_buf
226 #define VFSTOM(VP) ((struct usr_mount *)(VP)->vfs_mount)
256 #define VINACT 0x0001
258 #define VNOMAP 0x0004
260 #define VSHARE 0x0010
263 #define VWASMAP 0x0080
264 #define VXLOCK 0x0100
308 typedef int usr_vtype_t;
314 #define VOP_RDWR afs_osi_VOP_RDWR
330 #define DTYPE_VNODE 1
379 #define INOACC 0x0010
380 #define IMODTIME 0x0020
383 #define IFASTSYMLNK 0x0100
384 #define IMODACC 0x0200
385 #define IATTCHG 0x0400
386 #define IBDWRITE 0x0800
419 #define IFIFO 0010000
420 #define IFCHR 0020000
421 #define IFDIR 0040000
422 #define IFBLK 0060000
423 #define IFREG 0100000
424 #define IFLNK 0120000
425 #define IFSHAD 0130000
426 #define IFSOCK 0140000
487 #define I_FREE 0x00000001
488 #define I_DIR 0x00000002
489 #define I_IBLK 0x00000004
490 #define I_CHEAP 0x00000008
491 #define I_SHAD 0x00000010
492 #define I_QUOTA 0x00000020
501 #define VTOI(VP) ((struct usr_inode *)(VP)->v_data)
502 #define ITOV(IP) ((struct usr_vnode *)&(IP)->i_vnode)
520 #ifdef ROOT_FRONTMOUNT
521 #undef ROOT_FRONTMOUNT
523 #ifdef ROOT_BACKMOUNT
524 #undef ROOT_BACKMOUNT
527 #define ROOT_INIT 0x0001
528 #define ROOT_REMOUNT 0X0002
529 #define ROOT_UNMOUNT 0x0003
530 #define ROOT_FRONTMOUNT 0x0004
531 #define ROOT_BACKMOUNT 0x0005
573 #define VFS_STATFS(vfsp, sp) ((sp)->f_bsize=4096, 0)
594 #define FAPPEND 0x0100
595 #define IO_APPEND FAPPEND
597 #define IO_SYNC FSYNC
598 #define FTRUNC 0x0400
599 #define FWRITE 0x0800
620 #define F_GETLK 0x0001
621 #define F_RDLCK 0x0002
622 #define F_SETLK 0x0003
623 #define F_SETLKW 0x0004
624 #define F_UNLCK 0x0005
625 #define F_WRLCK 0x0006
640 #define LOCK_SH F_RDLCK
641 #define LOCK_UN F_UNLCK
642 #define LOCK_EX F_WRLCK
643 #define LOCK_NB 0x0007
652 #define FEXLOCK F_WRLCK
653 #define FSHLOCK F_RDLCK
661 enum usr_uio_rw { USR_UIO_READ, USR_UIO_WRITE };
670 #define UIO_READ 0x0000
671 #define UIO_WRITE 0x0001
680 #define UIO_USERSPACE 0x0000
681 #define UIO_SYSSPACE 0x0001
724 #define B_ASYNC 0x0002
725 #define B_DELWRI 0x0004
726 #define B_DIRTY 0x0008
727 #define B_DONE 0x0010
728 #define B_ERROR 0x0020
729 #define B_FREE 0x0040
730 #define B_NOCACHE 0x0080
731 #define B_PFSTORE 0x0100
732 #define B_READ 0x0200
734 #define B_WANTED 0x0800
735 #define B_WRITE 0x1000
763 #define MMAXOFF 16384
769 #define IA_SIN(IA) (&(IA)->ia_addr)
781 #define mtod(m,t) ((t)((m)->m_data))
788 #define panic(S) do{fprintf(stderr, S);assert(0);}while(0)
789 #define abort() assert(0)
790 #define usr_assert(A) assert(A)
792 #ifdef NETSCAPE_NSAPI
795 * All CONDVARs created with the same CRITICAL end up being the
796 * same CONDVAR, not a new one. If we want to use more than
797 * one usr_cond_t with the same usr_mutex_t, then we need a CRITICAL
798 * for each CONDVAR, otherwise we cannot know which thread we are
799 * waking when we do the signal.
807 #define usr_mutex_t CRITICAL
808 #define usr_thread_t SYS_THREAD
809 #define usr_key_t int
811 #define usr_mutex_init(A) (*(A)=crit_init(), 0)
812 #define usr_mutex_destroy(A) (crit_terminate(*(A)), 0)
813 #define usr_mutex_lock(A) crit_enter(*(A))
814 #define usr_mutex_trylock(A) (crit_enter(*(A)),1)
815 #define usr_mutex_unlock(A) crit_exit(*(A))
817 #define usr_cond_init(A) \
819 (A)->lock = crit_init(), \
820 (A)->cond = condvar_init((A)->lock), 0)
822 #define usr_cond_destroy(A) \
823 (condvar_terminate((A)->cond), \
824 crit_terminate((A)->lock), 0)
826 #define usr_cond_signal(A) \
828 crit_enter((A)->lock); \
829 if ((A)->waiters != 0) { \
830 condvar_notify((A)->cond);\
833 crit_exit((A)->lock); \
836 #define usr_cond_broadcast(A) \
838 crit_enter((A)->lock); \
839 while ((A)->waiters != 0) { \
840 condvar_notify((A)->cond); \
843 crit_exit((A)->lock); \
846 #define usr_cond_wait(A,B) \
847 (crit_enter((A)->lock), \
850 condvar_wait((A)->cond), \
851 crit_exit((A)->lock), \
854 #define usr_thread_create(A,B,C) \
855 ((*(A)=systhread_start(SYSTHREAD_DEFAULT_PRIORITY, \
856 0,B,C))==SYS_THREAD_ERROR)
857 #define usr_thread_detach(A) 0
858 #define usr_keycreate(A,B) (*(A)=systhread_newkey(),0)
859 #define usr_setspecific(A,B) (systhread_setdata(A,B),0)
860 #define usr_getspecific(A,B) (*(B)=systhread_getdata(A),0)
861 #define usr_thread_self() systhread_current()
862 #ifdef AFS_USR_SUN5_ENV
863 #define usr_thread_sleep(A) \
864 poll(0, 0, (A)->tv_sec*1000+(A)->tv_nsec/1000000)
865 #else /* AFS_USR_SUN5_ENV */
866 #define usr_thread_sleep(A) \
867 systhread_sleep((A)->tv_sec*1000+(A)->tv_nsec/1000000)
868 #endif /* AFS_USR_SUN5_ENV */
870 #define uprintf printf
872 #define usr_getpid() (int)(usr_thread_self())
874 #define ISAFS_GLOCK() (usr_thread_self() == afs_global_owner)
876 #else /* NETSCAPE_NSAPI */
879 * Mutex and condition variable used to implement sleep
881 extern pthread_mutex_t usr_sleep_mutex;
882 extern pthread_cond_t usr_sleep_cond;
884 #define usr_cond_t pthread_cond_t
885 #define usr_mutex_t pthread_mutex_t
886 #define usr_thread_t pthread_t
887 #define usr_key_t pthread_key_t
889 #define usr_mutex_init(A) assert(pthread_mutex_init(A,NULL) == 0)
890 #define usr_mutex_destroy(A) assert(pthread_mutex_destroy(A) == 0)
891 #define usr_mutex_lock(A) assert(pthread_mutex_lock(A) == 0)
892 #define usr_mutex_trylock(A) ((pthread_mutex_trylock(A)==0)?1:0)
893 #define usr_mutex_unlock(A) assert(pthread_mutex_unlock(A) == 0)
894 #define usr_cond_init(A) assert(pthread_cond_init(A,NULL) == 0)
895 #define usr_cond_destroy(A) assert(pthread_cond_destroy(A) == 0)
896 #define usr_cond_signal(A) assert(pthread_cond_signal(A) == 0)
897 #define usr_cond_broadcast(A) assert(pthread_cond_broadcast(A) == 0)
898 #define usr_cond_wait(A,B) pthread_cond_wait(A,B)
899 #define usr_thread_create(A,B,C) \
901 pthread_attr_t attr; \
902 assert(pthread_attr_init(&attr) == 0); \
903 assert(pthread_attr_setstacksize(&attr, 124288) == 0); \
904 assert(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == 0); \
905 assert(pthread_create((A), &attr, (B), (void *)(C)) == 0); \
906 assert(pthread_attr_destroy(&attr) == 0); \
908 #define usr_thread_detach(A) pthread_detach(A)
909 #define usr_keycreate(A,B) assert(pthread_key_create(A,B) == 0)
910 #define usr_setspecific(A,B) pthread_setspecific(A,B)
911 #define usr_getspecific(A,B) (*(B)=pthread_getspecific(A),0)
912 #define usr_thread_self() pthread_self()
913 #define usr_thread_sleep(A) \
915 struct timespec _sleep_ts; \
916 struct timeval _sleep_tv; \
917 gettimeofday(&_sleep_tv, NULL); \
919 _sleep_ts.tv_sec += _sleep_tv.tv_sec; \
920 _sleep_ts.tv_nsec += _sleep_tv.tv_usec * 1000; \
921 if (_sleep_ts.tv_nsec >= 1000000000) { \
922 _sleep_ts.tv_sec += 1; \
923 _sleep_ts.tv_nsec -= 1000000000; \
925 assert(pthread_mutex_lock(&usr_sleep_mutex) == 0); \
926 pthread_cond_timedwait(&usr_sleep_cond, &usr_sleep_mutex, &_sleep_ts); \
927 assert(pthread_mutex_unlock(&usr_sleep_mutex) == 0); \
930 #define uprintf printf
932 #define usr_getpid() (int)(usr_thread_self())
933 #define ISAFS_GLOCK() (usr_thread_self() == afs_global_owner)
935 #endif /* NETSCAPE_NSAPI */
937 #define copyin(A,B,C) (memcpy((void *)B,(void *)A,C), 0)
938 #define copyout(A,B,C) (memcpy((void *)B,(void *)A,C), 0)
939 #define copyinstr(A,B,C,D) (strncpy(B,A,C),(*D)=strlen(B), 0)
940 #define copyoutstr(A,B,C,D) (strncpy(B,A,C),(*D)=strlen(B), 0)
942 #define vattr_null(A) usr_vattr_null(A)
944 #define VN_HOLD(vp) \
949 #define VN_RELE(vp) \
951 AFS_ASSERT_GLOCK(); \
952 usr_assert((vp)->v_count > 0); \
953 if (--((vp)->v_count) == 0) \
954 afs_inactive(vp, u.u_cred); \
958 unsigned long f_type;
959 unsigned long f_bsize;
960 unsigned long f_frsize;
961 unsigned long f_ffree;
962 unsigned long f_favail;
964 unsigned long val[2];
966 char f_basetype[FSTYPSZ];
967 unsigned long f_flag;
968 unsigned long f_namemax;
969 unsigned long f_blocks;
970 unsigned long f_bfree;
971 unsigned long f_bavail;
972 unsigned long f_files;
978 unsigned short va_mode;
981 unsigned long va_fsid;
982 unsigned long va_nodeid;
983 unsigned long va_nlink;
984 unsigned long va_size;
985 struct timeval va_atime;
986 struct timeval va_mtime;
987 struct timeval va_ctime;
988 unsigned long va_rdev;
989 unsigned long va_blocksize;
990 unsigned long va_blocks;
991 unsigned long va_vcode;
1017 #define VWRITE 00200
1022 unsigned short v_flag;
1023 unsigned long v_count;
1024 struct usr_vnodeops *v_op;
1025 struct usr_vfs * v_vfsp;
1027 unsigned long v_rdev;
1032 daddr_t i_db[NDADDR];
1033 struct usr_vnode *i_devvp;
1034 unsigned long i_dev;
1036 struct usr_inode *i_freef;
1037 struct usr_inode **i_freeb;
1039 daddr_t i_ib[NIADDR];
1040 unsigned short i_mode;
1042 unsigned long i_number;
1045 struct usr_vnode i_vnode;
1047 unsigned long ic_spare[4];
1050 extern struct usr_inode *iget();
1052 struct usr_fileops {
1055 int (*vno_select)();
1056 int (*vno_closex)();
1060 unsigned short f_flag;
1062 struct usr_ucred *f_cred;
1063 struct usr_fileops *f_ops;
1067 extern struct usr_file *falloc();
1068 extern struct usr_file *getf(int);
1078 unsigned short fid_len;
1079 unsigned short fid_reserved;
1080 char fid_data[MAXFIDSZ];
1092 extern struct usr_ucred *usr_crget();
1093 extern struct usr_ucred *usr_crcopy(struct usr_ucred *);
1094 extern int usr_crhold(struct usr_ucred *);
1095 extern int usr_crfree(struct usr_ucred *);
1096 extern struct usr_ucred *afs_global_ucredp;
1099 unsigned long p_flag;
1102 struct usr_ucred *p_ucred;
1122 struct iovec *uio_iov;
1143 struct usr_fs *b_fs;
1146 unsigned int b_resid;
1147 struct usr_vnode *b_vp;
1155 #define NDIRSIZ_LEN(len) \
1156 ((sizeof (struct usr_dirent)+4 - (MAXNAMLEN+1)) + (((len)+1 + 3) &~ 3))
1158 struct usr_vnodeops {
1164 int (*vn_getattr)();
1165 int (*vn_setattr)();
1174 int (*vn_readdir)();
1175 int (*vn_symlink)();
1176 int (*vn_readlink)();
1178 int (*vn_inactive)();
1180 int (*vn_strategy)();
1183 int (*vn_lockctl)();
1194 unsigned long m_dev;
1195 struct usr_inode *m_inodp;
1196 struct usr_buf *m_bufp;
1197 struct usr_vnode *m_mount;
1199 extern struct usr_mount *getmp(unsigned long);
1201 typedef long usr_whymountroot_t;
1205 int (*vfs_unmount)();
1207 int (*vfs_statfs)();
1208 int (*vfs_mountroot)();
1209 int (*vfs_swapvp)();
1213 struct usr_vnode *vfs_vnodecovered;
1215 unsigned long val[2];
1218 unsigned long vfs_bsize;
1219 struct usr_mount *vfs_mount;
1220 struct usr_vfsops *vfs_op;
1227 extern struct usr_sysent usr_sysent[];
1230 struct usr_ifnet *if_next;
1234 struct usr_ifaddr *if_addrlist;
1236 extern struct usr_ifnet *usr_ifnet;
1239 struct usr_ifaddr *ifa_next;
1240 struct usr_ifnet *ifa_ifp;
1241 struct sockaddr ifa_addr;
1251 struct usr_in_ifaddr {
1252 struct usr_in_ifaddr *ia_next;
1253 struct usr_ifnet *ia_ifp;
1254 struct sockaddr_in ia_addr;
1255 unsigned long ia_net;
1256 unsigned long ia_netmask;
1257 unsigned long ia_subnet;
1258 unsigned long ia_subnetmask;
1259 struct in_addr ia_netbroadcast;
1261 extern struct usr_in_ifaddr *usr_in_ifaddr;
1263 extern usr_key_t afs_global_u_key; /* for per thread authentication */
1265 #if defined(AFS_USR_OSF_ENV)
1271 #endif /* UKERNEL */
1274 #if defined(AFS_OFS_ENV) || defined(AFS_USR_OSF_ENV)
1275 unsigned int d_fileno;
1276 #else /* AFS_OFS_ENV || AFS_USR_OSF_ENV */
1277 unsigned long d_fileno;
1278 #endif /* AFS_OFS_ENV || AFS_USR_OSF_ENV */
1279 unsigned short d_reclen;
1280 unsigned short d_namlen;
1284 #define NGROUPS NGROUPS_MAX
1287 #define NOGROUP (-1)
1291 unsigned long cr_ref;
1299 gid_t cr_groups[NGROUPS];
1312 unsigned long u_expiration;
1313 struct usr_proc *u_procp;
1314 struct usr_ucred *u_cred;
1319 #define u_rval1 u_r.r_val1
1320 #define u (*(get_user_struct()))
1322 extern struct usr_user *get_user_struct();
1324 #define USR_DIRSIZE 2048
1327 unsigned long d_ino;
1328 unsigned long d_off;
1329 unsigned short d_reclen;
1330 char d_name[MAXNAMLEN+1];
1341 extern unsigned short usr_rx_port;
1343 #endif /* __AFS_SYSINCLUDESH__ so idempotent */