diff options
author | Anton Vorontsov <cbouatmailru@gmail.com> | 2008-07-29 18:05:23 -0400 |
---|---|---|
committer | Anton Vorontsov <cbouatmailru@gmail.com> | 2008-07-29 18:05:23 -0400 |
commit | 9fec6060d9e48ed7db0dac0e16d0f0f0e615b7f6 (patch) | |
tree | 74b41f31a08f6500ff3dfcf64ba21e2d9a8e87e5 /net/sysctl_net.c | |
parent | fece418418f51e92dd7e67e17c5e3fe5a28d3279 (diff) | |
parent | 6e86841d05f371b5b9b86ce76c02aaee83352298 (diff) |
Merge branch 'master' of /home/cbou/linux-2.6
Conflicts:
drivers/power/Kconfig
drivers/power/Makefile
Diffstat (limited to 'net/sysctl_net.c')
-rw-r--r-- | net/sysctl_net.c | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/net/sysctl_net.c b/net/sysctl_net.c index b4f0525f91af..972201cd5fa7 100644 --- a/net/sysctl_net.c +++ b/net/sysctl_net.c | |||
@@ -4,7 +4,6 @@ | |||
4 | * Begun April 1, 1996, Mike Shaver. | 4 | * Begun April 1, 1996, Mike Shaver. |
5 | * Added /proc/sys/net directories for each protocol family. [MS] | 5 | * Added /proc/sys/net directories for each protocol family. [MS] |
6 | * | 6 | * |
7 | * $Log: sysctl_net.c,v $ | ||
8 | * Revision 1.2 1996/05/08 20:24:40 shaver | 7 | * Revision 1.2 1996/05/08 20:24:40 shaver |
9 | * Added bits for NET_BRIDGE and the NET_IPV4_ARP stuff and | 8 | * Added bits for NET_BRIDGE and the NET_IPV4_ARP stuff and |
10 | * NET_IPV4_IP_FORWARD. | 9 | * NET_IPV4_IP_FORWARD. |
@@ -30,25 +29,59 @@ | |||
30 | #include <linux/if_tr.h> | 29 | #include <linux/if_tr.h> |
31 | #endif | 30 | #endif |
32 | 31 | ||
33 | static struct list_head * | 32 | static struct ctl_table_set * |
34 | net_ctl_header_lookup(struct ctl_table_root *root, struct nsproxy *namespaces) | 33 | net_ctl_header_lookup(struct ctl_table_root *root, struct nsproxy *namespaces) |
35 | { | 34 | { |
36 | return &namespaces->net_ns->sysctl_table_headers; | 35 | return &namespaces->net_ns->sysctls; |
36 | } | ||
37 | |||
38 | static int is_seen(struct ctl_table_set *set) | ||
39 | { | ||
40 | return ¤t->nsproxy->net_ns->sysctls == set; | ||
41 | } | ||
42 | |||
43 | /* Return standard mode bits for table entry. */ | ||
44 | static int net_ctl_permissions(struct ctl_table_root *root, | ||
45 | struct nsproxy *nsproxy, | ||
46 | struct ctl_table *table) | ||
47 | { | ||
48 | /* Allow network administrator to have same access as root. */ | ||
49 | if (capable(CAP_NET_ADMIN)) { | ||
50 | int mode = (table->mode >> 6) & 7; | ||
51 | return (mode << 6) | (mode << 3) | mode; | ||
52 | } | ||
53 | return table->mode; | ||
37 | } | 54 | } |
38 | 55 | ||
39 | static struct ctl_table_root net_sysctl_root = { | 56 | static struct ctl_table_root net_sysctl_root = { |
40 | .lookup = net_ctl_header_lookup, | 57 | .lookup = net_ctl_header_lookup, |
58 | .permissions = net_ctl_permissions, | ||
59 | }; | ||
60 | |||
61 | static int net_ctl_ro_header_perms(struct ctl_table_root *root, | ||
62 | struct nsproxy *namespaces, struct ctl_table *table) | ||
63 | { | ||
64 | if (namespaces->net_ns == &init_net) | ||
65 | return table->mode; | ||
66 | else | ||
67 | return table->mode & ~0222; | ||
68 | } | ||
69 | |||
70 | static struct ctl_table_root net_sysctl_ro_root = { | ||
71 | .permissions = net_ctl_ro_header_perms, | ||
41 | }; | 72 | }; |
42 | 73 | ||
43 | static int sysctl_net_init(struct net *net) | 74 | static int sysctl_net_init(struct net *net) |
44 | { | 75 | { |
45 | INIT_LIST_HEAD(&net->sysctl_table_headers); | 76 | setup_sysctl_set(&net->sysctls, |
77 | &net_sysctl_ro_root.default_set, | ||
78 | is_seen); | ||
46 | return 0; | 79 | return 0; |
47 | } | 80 | } |
48 | 81 | ||
49 | static void sysctl_net_exit(struct net *net) | 82 | static void sysctl_net_exit(struct net *net) |
50 | { | 83 | { |
51 | WARN_ON(!list_empty(&net->sysctl_table_headers)); | 84 | WARN_ON(!list_empty(&net->sysctls.list)); |
52 | return; | 85 | return; |
53 | } | 86 | } |
54 | 87 | ||
@@ -64,6 +97,8 @@ static __init int sysctl_init(void) | |||
64 | if (ret) | 97 | if (ret) |
65 | goto out; | 98 | goto out; |
66 | register_sysctl_root(&net_sysctl_root); | 99 | register_sysctl_root(&net_sysctl_root); |
100 | setup_sysctl_set(&net_sysctl_ro_root.default_set, NULL, NULL); | ||
101 | register_sysctl_root(&net_sysctl_ro_root); | ||
67 | out: | 102 | out: |
68 | return ret; | 103 | return ret; |
69 | } | 104 | } |
@@ -80,6 +115,14 @@ struct ctl_table_header *register_net_sysctl_table(struct net *net, | |||
80 | } | 115 | } |
81 | EXPORT_SYMBOL_GPL(register_net_sysctl_table); | 116 | EXPORT_SYMBOL_GPL(register_net_sysctl_table); |
82 | 117 | ||
118 | struct ctl_table_header *register_net_sysctl_rotable(const | ||
119 | struct ctl_path *path, struct ctl_table *table) | ||
120 | { | ||
121 | return __register_sysctl_paths(&net_sysctl_ro_root, | ||
122 | &init_nsproxy, path, table); | ||
123 | } | ||
124 | EXPORT_SYMBOL_GPL(register_net_sysctl_rotable); | ||
125 | |||
83 | void unregister_net_sysctl_table(struct ctl_table_header *header) | 126 | void unregister_net_sysctl_table(struct ctl_table_header *header) |
84 | { | 127 | { |
85 | unregister_sysctl_table(header); | 128 | unregister_sysctl_table(header); |