1*1da177e4SLinus Torvalds #ifndef __LINUX_NET_AFUNIX_H 2*1da177e4SLinus Torvalds #define __LINUX_NET_AFUNIX_H 3*1da177e4SLinus Torvalds extern void unix_inflight(struct file *fp); 4*1da177e4SLinus Torvalds extern void unix_notinflight(struct file *fp); 5*1da177e4SLinus Torvalds extern void unix_gc(void); 6*1da177e4SLinus Torvalds 7*1da177e4SLinus Torvalds #define UNIX_HASH_SIZE 256 8*1da177e4SLinus Torvalds 9*1da177e4SLinus Torvalds extern struct hlist_head unix_socket_table[UNIX_HASH_SIZE + 1]; 10*1da177e4SLinus Torvalds extern rwlock_t unix_table_lock; 11*1da177e4SLinus Torvalds 12*1da177e4SLinus Torvalds extern atomic_t unix_tot_inflight; 13*1da177e4SLinus Torvalds 14*1da177e4SLinus Torvalds static inline struct sock *first_unix_socket(int *i) 15*1da177e4SLinus Torvalds { 16*1da177e4SLinus Torvalds for (*i = 0; *i <= UNIX_HASH_SIZE; (*i)++) { 17*1da177e4SLinus Torvalds if (!hlist_empty(&unix_socket_table[*i])) 18*1da177e4SLinus Torvalds return __sk_head(&unix_socket_table[*i]); 19*1da177e4SLinus Torvalds } 20*1da177e4SLinus Torvalds return NULL; 21*1da177e4SLinus Torvalds } 22*1da177e4SLinus Torvalds 23*1da177e4SLinus Torvalds static inline struct sock *next_unix_socket(int *i, struct sock *s) 24*1da177e4SLinus Torvalds { 25*1da177e4SLinus Torvalds struct sock *next = sk_next(s); 26*1da177e4SLinus Torvalds /* More in this chain? */ 27*1da177e4SLinus Torvalds if (next) 28*1da177e4SLinus Torvalds return next; 29*1da177e4SLinus Torvalds /* Look for next non-empty chain. */ 30*1da177e4SLinus Torvalds for ((*i)++; *i <= UNIX_HASH_SIZE; (*i)++) { 31*1da177e4SLinus Torvalds if (!hlist_empty(&unix_socket_table[*i])) 32*1da177e4SLinus Torvalds return __sk_head(&unix_socket_table[*i]); 33*1da177e4SLinus Torvalds } 34*1da177e4SLinus Torvalds return NULL; 35*1da177e4SLinus Torvalds } 36*1da177e4SLinus Torvalds 37*1da177e4SLinus Torvalds #define forall_unix_sockets(i, s) \ 38*1da177e4SLinus Torvalds for (s = first_unix_socket(&(i)); s; s = next_unix_socket(&(i),(s))) 39*1da177e4SLinus Torvalds 40*1da177e4SLinus Torvalds struct unix_address { 41*1da177e4SLinus Torvalds atomic_t refcnt; 42*1da177e4SLinus Torvalds int len; 43*1da177e4SLinus Torvalds unsigned hash; 44*1da177e4SLinus Torvalds struct sockaddr_un name[0]; 45*1da177e4SLinus Torvalds }; 46*1da177e4SLinus Torvalds 47*1da177e4SLinus Torvalds struct unix_skb_parms { 48*1da177e4SLinus Torvalds struct ucred creds; /* Skb credentials */ 49*1da177e4SLinus Torvalds struct scm_fp_list *fp; /* Passed files */ 50*1da177e4SLinus Torvalds }; 51*1da177e4SLinus Torvalds 52*1da177e4SLinus Torvalds #define UNIXCB(skb) (*(struct unix_skb_parms*)&((skb)->cb)) 53*1da177e4SLinus Torvalds #define UNIXCREDS(skb) (&UNIXCB((skb)).creds) 54*1da177e4SLinus Torvalds 55*1da177e4SLinus Torvalds #define unix_state_rlock(s) read_lock(&unix_sk(s)->lock) 56*1da177e4SLinus Torvalds #define unix_state_runlock(s) read_unlock(&unix_sk(s)->lock) 57*1da177e4SLinus Torvalds #define unix_state_wlock(s) write_lock(&unix_sk(s)->lock) 58*1da177e4SLinus Torvalds #define unix_state_wunlock(s) write_unlock(&unix_sk(s)->lock) 59*1da177e4SLinus Torvalds 60*1da177e4SLinus Torvalds #ifdef __KERNEL__ 61*1da177e4SLinus Torvalds /* The AF_UNIX socket */ 62*1da177e4SLinus Torvalds struct unix_sock { 63*1da177e4SLinus Torvalds /* WARNING: sk has to be the first member */ 64*1da177e4SLinus Torvalds struct sock sk; 65*1da177e4SLinus Torvalds struct unix_address *addr; 66*1da177e4SLinus Torvalds struct dentry *dentry; 67*1da177e4SLinus Torvalds struct vfsmount *mnt; 68*1da177e4SLinus Torvalds struct semaphore readsem; 69*1da177e4SLinus Torvalds struct sock *peer; 70*1da177e4SLinus Torvalds struct sock *other; 71*1da177e4SLinus Torvalds struct sock *gc_tree; 72*1da177e4SLinus Torvalds atomic_t inflight; 73*1da177e4SLinus Torvalds rwlock_t lock; 74*1da177e4SLinus Torvalds wait_queue_head_t peer_wait; 75*1da177e4SLinus Torvalds }; 76*1da177e4SLinus Torvalds #define unix_sk(__sk) ((struct unix_sock *)__sk) 77*1da177e4SLinus Torvalds #endif 78*1da177e4SLinus Torvalds #endif 79