diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2005-11-08 12:57:38 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-11-08 12:57:38 -0500 |
commit | be9d122730c878baafe11e70d1436faac229f2fc (patch) | |
tree | d6644129b56d7cff9fb9781154eebf97746f296b /net/bluetooth/l2cap.c | |
parent | 1ebb92521d0bc2d4ef772730d29333c06b807191 (diff) |
[Bluetooth]: Remove the usage of /proc completely
This patch removes all relics of the /proc usage from the Bluetooth
subsystem core and its upper layers. All the previous information are
now available via /sys/class/bluetooth through appropriate functions.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bluetooth/l2cap.c')
-rw-r--r-- | net/bluetooth/l2cap.c | 98 |
1 files changed, 16 insertions, 82 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 59b2dd36baa..e3bb11ca423 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -38,9 +38,8 @@ | |||
38 | #include <linux/interrupt.h> | 38 | #include <linux/interrupt.h> |
39 | #include <linux/socket.h> | 39 | #include <linux/socket.h> |
40 | #include <linux/skbuff.h> | 40 | #include <linux/skbuff.h> |
41 | #include <linux/proc_fs.h> | ||
42 | #include <linux/seq_file.h> | ||
43 | #include <linux/list.h> | 41 | #include <linux/list.h> |
42 | #include <linux/device.h> | ||
44 | #include <net/sock.h> | 43 | #include <net/sock.h> |
45 | 44 | ||
46 | #include <asm/system.h> | 45 | #include <asm/system.h> |
@@ -56,7 +55,7 @@ | |||
56 | #define BT_DBG(D...) | 55 | #define BT_DBG(D...) |
57 | #endif | 56 | #endif |
58 | 57 | ||
59 | #define VERSION "2.7" | 58 | #define VERSION "2.8" |
60 | 59 | ||
61 | static struct proto_ops l2cap_sock_ops; | 60 | static struct proto_ops l2cap_sock_ops; |
62 | 61 | ||
@@ -2137,94 +2136,29 @@ drop: | |||
2137 | return 0; | 2136 | return 0; |
2138 | } | 2137 | } |
2139 | 2138 | ||
2140 | /* ---- Proc fs support ---- */ | 2139 | static ssize_t l2cap_sysfs_show(struct class *dev, char *buf) |
2141 | #ifdef CONFIG_PROC_FS | ||
2142 | static void *l2cap_seq_start(struct seq_file *seq, loff_t *pos) | ||
2143 | { | 2140 | { |
2144 | struct sock *sk; | 2141 | struct sock *sk; |
2145 | struct hlist_node *node; | 2142 | struct hlist_node *node; |
2146 | loff_t l = *pos; | 2143 | char *str = buf; |
2147 | 2144 | ||
2148 | read_lock_bh(&l2cap_sk_list.lock); | 2145 | read_lock_bh(&l2cap_sk_list.lock); |
2149 | 2146 | ||
2150 | sk_for_each(sk, node, &l2cap_sk_list.head) | 2147 | sk_for_each(sk, node, &l2cap_sk_list.head) { |
2151 | if (!l--) | 2148 | struct l2cap_pinfo *pi = l2cap_pi(sk); |
2152 | goto found; | ||
2153 | sk = NULL; | ||
2154 | found: | ||
2155 | return sk; | ||
2156 | } | ||
2157 | 2149 | ||
2158 | static void *l2cap_seq_next(struct seq_file *seq, void *e, loff_t *pos) | 2150 | str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d 0x%x\n", |
2159 | { | 2151 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), |
2160 | (*pos)++; | 2152 | sk->sk_state, pi->psm, pi->scid, pi->dcid, pi->imtu, |
2161 | return sk_next(e); | 2153 | pi->omtu, pi->link_mode); |
2162 | } | 2154 | } |
2163 | 2155 | ||
2164 | static void l2cap_seq_stop(struct seq_file *seq, void *e) | ||
2165 | { | ||
2166 | read_unlock_bh(&l2cap_sk_list.lock); | 2156 | read_unlock_bh(&l2cap_sk_list.lock); |
2167 | } | ||
2168 | 2157 | ||
2169 | static int l2cap_seq_show(struct seq_file *seq, void *e) | 2158 | return (str - buf); |
2170 | { | ||
2171 | struct sock *sk = e; | ||
2172 | struct l2cap_pinfo *pi = l2cap_pi(sk); | ||
2173 | |||
2174 | seq_printf(seq, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d 0x%x\n", | ||
2175 | batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst), | ||
2176 | sk->sk_state, pi->psm, pi->scid, pi->dcid, pi->imtu, | ||
2177 | pi->omtu, pi->link_mode); | ||
2178 | return 0; | ||
2179 | } | 2159 | } |
2180 | 2160 | ||
2181 | static struct seq_operations l2cap_seq_ops = { | 2161 | static CLASS_ATTR(l2cap, S_IRUGO, l2cap_sysfs_show, NULL); |
2182 | .start = l2cap_seq_start, | ||
2183 | .next = l2cap_seq_next, | ||
2184 | .stop = l2cap_seq_stop, | ||
2185 | .show = l2cap_seq_show | ||
2186 | }; | ||
2187 | |||
2188 | static int l2cap_seq_open(struct inode *inode, struct file *file) | ||
2189 | { | ||
2190 | return seq_open(file, &l2cap_seq_ops); | ||
2191 | } | ||
2192 | |||
2193 | static struct file_operations l2cap_seq_fops = { | ||
2194 | .owner = THIS_MODULE, | ||
2195 | .open = l2cap_seq_open, | ||
2196 | .read = seq_read, | ||
2197 | .llseek = seq_lseek, | ||
2198 | .release = seq_release, | ||
2199 | }; | ||
2200 | |||
2201 | static int __init l2cap_proc_init(void) | ||
2202 | { | ||
2203 | struct proc_dir_entry *p = create_proc_entry("l2cap", S_IRUGO, proc_bt); | ||
2204 | if (!p) | ||
2205 | return -ENOMEM; | ||
2206 | p->owner = THIS_MODULE; | ||
2207 | p->proc_fops = &l2cap_seq_fops; | ||
2208 | return 0; | ||
2209 | } | ||
2210 | |||
2211 | static void __exit l2cap_proc_cleanup(void) | ||
2212 | { | ||
2213 | remove_proc_entry("l2cap", proc_bt); | ||
2214 | } | ||
2215 | |||
2216 | #else /* CONFIG_PROC_FS */ | ||
2217 | |||
2218 | static int __init l2cap_proc_init(void) | ||
2219 | { | ||
2220 | return 0; | ||
2221 | } | ||
2222 | |||
2223 | static void __exit l2cap_proc_cleanup(void) | ||
2224 | { | ||
2225 | return; | ||
2226 | } | ||
2227 | #endif /* CONFIG_PROC_FS */ | ||
2228 | 2162 | ||
2229 | static struct proto_ops l2cap_sock_ops = { | 2163 | static struct proto_ops l2cap_sock_ops = { |
2230 | .family = PF_BLUETOOTH, | 2164 | .family = PF_BLUETOOTH, |
@@ -2266,7 +2200,7 @@ static struct hci_proto l2cap_hci_proto = { | |||
2266 | static int __init l2cap_init(void) | 2200 | static int __init l2cap_init(void) |
2267 | { | 2201 | { |
2268 | int err; | 2202 | int err; |
2269 | 2203 | ||
2270 | err = proto_register(&l2cap_proto, 0); | 2204 | err = proto_register(&l2cap_proto, 0); |
2271 | if (err < 0) | 2205 | if (err < 0) |
2272 | return err; | 2206 | return err; |
@@ -2284,7 +2218,7 @@ static int __init l2cap_init(void) | |||
2284 | goto error; | 2218 | goto error; |
2285 | } | 2219 | } |
2286 | 2220 | ||
2287 | l2cap_proc_init(); | 2221 | class_create_file(&bt_class, &class_attr_l2cap); |
2288 | 2222 | ||
2289 | BT_INFO("L2CAP ver %s", VERSION); | 2223 | BT_INFO("L2CAP ver %s", VERSION); |
2290 | BT_INFO("L2CAP socket layer initialized"); | 2224 | BT_INFO("L2CAP socket layer initialized"); |
@@ -2298,7 +2232,7 @@ error: | |||
2298 | 2232 | ||
2299 | static void __exit l2cap_exit(void) | 2233 | static void __exit l2cap_exit(void) |
2300 | { | 2234 | { |
2301 | l2cap_proc_cleanup(); | 2235 | class_remove_file(&bt_class, &class_attr_l2cap); |
2302 | 2236 | ||
2303 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) | 2237 | if (bt_sock_unregister(BTPROTO_L2CAP) < 0) |
2304 | BT_ERR("L2CAP socket unregistration failed"); | 2238 | BT_ERR("L2CAP socket unregistration failed"); |