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