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