diff options
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/wext.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/net/wireless/wext.c b/net/wireless/wext.c index fba295e05e7a..a6cf1034e07c 100644 --- a/net/wireless/wext.c +++ b/net/wireless/wext.c | |||
@@ -97,6 +97,7 @@ | |||
97 | #include <linux/wireless.h> /* Pretty obvious */ | 97 | #include <linux/wireless.h> /* Pretty obvious */ |
98 | #include <net/iw_handler.h> /* New driver API */ | 98 | #include <net/iw_handler.h> /* New driver API */ |
99 | #include <net/netlink.h> | 99 | #include <net/netlink.h> |
100 | #include <net/wext.h> | ||
100 | 101 | ||
101 | #include <asm/uaccess.h> /* copy_to_user() */ | 102 | #include <asm/uaccess.h> /* copy_to_user() */ |
102 | 103 | ||
@@ -696,7 +697,7 @@ static const struct file_operations wireless_seq_fops = { | |||
696 | .release = seq_release, | 697 | .release = seq_release, |
697 | }; | 698 | }; |
698 | 699 | ||
699 | int __init wireless_proc_init(void) | 700 | int __init wext_proc_init(void) |
700 | { | 701 | { |
701 | /* Create /proc/net/wireless entry */ | 702 | /* Create /proc/net/wireless entry */ |
702 | if (!proc_net_fops_create("wireless", S_IRUGO, &wireless_seq_fops)) | 703 | if (!proc_net_fops_create("wireless", S_IRUGO, &wireless_seq_fops)) |
@@ -1075,11 +1076,10 @@ static inline int ioctl_private_call(struct net_device * dev, | |||
1075 | 1076 | ||
1076 | /* ---------------------------------------------------------------- */ | 1077 | /* ---------------------------------------------------------------- */ |
1077 | /* | 1078 | /* |
1078 | * Main IOCTl dispatcher. Called from the main networking code | 1079 | * Main IOCTl dispatcher. |
1079 | * (dev_ioctl() in net/core/dev.c). | ||
1080 | * Check the type of IOCTL and call the appropriate wrapper... | 1080 | * Check the type of IOCTL and call the appropriate wrapper... |
1081 | */ | 1081 | */ |
1082 | int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd) | 1082 | static int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd) |
1083 | { | 1083 | { |
1084 | struct net_device *dev; | 1084 | struct net_device *dev; |
1085 | iw_handler handler; | 1085 | iw_handler handler; |
@@ -1143,6 +1143,26 @@ int wireless_process_ioctl(struct ifreq *ifr, unsigned int cmd) | |||
1143 | return -EINVAL; | 1143 | return -EINVAL; |
1144 | } | 1144 | } |
1145 | 1145 | ||
1146 | /* entry point from dev ioctl */ | ||
1147 | int wext_handle_ioctl(struct ifreq *ifr, unsigned int cmd, | ||
1148 | void __user *arg) | ||
1149 | { | ||
1150 | int ret; | ||
1151 | |||
1152 | /* If command is `set a parameter', or | ||
1153 | * `get the encoding parameters', check if | ||
1154 | * the user has the right to do it */ | ||
1155 | if (IW_IS_SET(cmd) || cmd == SIOCGIWENCODE || cmd == SIOCGIWENCODEEXT) | ||
1156 | if (!capable(CAP_NET_ADMIN)) | ||
1157 | return -EPERM; | ||
1158 | dev_load(ifr->ifr_name); | ||
1159 | rtnl_lock(); | ||
1160 | ret = wireless_process_ioctl(ifr, cmd); | ||
1161 | rtnl_unlock(); | ||
1162 | if (IW_IS_GET(cmd) && copy_to_user(arg, ifr, sizeof(struct ifreq))) | ||
1163 | return -EFAULT; | ||
1164 | return ret; | ||
1165 | } | ||
1146 | 1166 | ||
1147 | /************************* EVENT PROCESSING *************************/ | 1167 | /************************* EVENT PROCESSING *************************/ |
1148 | /* | 1168 | /* |