return 0;
}
+static int atmtcp_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
+{
+ int err = 0;
+ struct atm_vcc *vcc = ATM_SD(sock);
+
+ if (cmd != SIOCSIFATMTCP && cmd != ATMTCP_CREATE && cmd != ATMTCP_REMOVE)
+ return -ENOIOCTLCMD;
+
+ if (!capable(CAP_NET_ADMIN))
+ return -EPERM;
+
+ switch (cmd) {
+ case SIOCSIFATMTCP:
+ err = atmtcp_attach(vcc, (int) arg);
+ if (err >= 0) {
+ sock->state = SS_CONNECTED;
+ __module_get(THIS_MODULE);
+ }
+ break;
+ case ATMTCP_CREATE:
+ err = atmtcp_create_persistent((int) arg);
+ break;
+ case ATMTCP_REMOVE:
+ err = atmtcp_remove_persistent((int) arg);
+ break;
+ }
+ return err;
+}
-#ifdef MODULE
+static struct atm_ioctl atmtcp_ioctl_ops = {
+ .owner = THIS_MODULE,
+ .ioctl = atmtcp_ioctl,
+};
-int init_module(void)
+static __init int atmtcp_init(void)
{
- atm_tcp_ops.attach = atmtcp_attach;
- atm_tcp_ops.create_persistent = atmtcp_create_persistent;
- atm_tcp_ops.remove_persistent = atmtcp_remove_persistent;
+ register_atm_ioctl(&atmtcp_ioctl_ops);
return 0;
}
-void cleanup_module(void)
+static void __exit atmtcp_exit(void)
{
- atm_tcp_ops.attach = NULL;
- atm_tcp_ops.create_persistent = NULL;
- atm_tcp_ops.remove_persistent = NULL;
+ deregister_atm_ioctl(&atmtcp_ioctl_ops);
}
MODULE_LICENSE("GPL");
-#else
-
-struct atm_tcp_ops atm_tcp_ops = {
- atmtcp_attach, /* attach */
- atmtcp_create_persistent, /* create_persistent */
- atmtcp_remove_persistent /* remove_persistent */
-};
-
-#endif
+module_init(atmtcp_init);
+module_exit(atmtcp_exit);
#endif
#endif
-#if defined(CONFIG_ATM_TCP) || defined(CONFIG_ATM_TCP_MODULE)
-#include <linux/atm_tcp.h>
-#ifdef CONFIG_ATM_TCP_MODULE
-struct atm_tcp_ops atm_tcp_ops;
-EXPORT_SYMBOL(atm_tcp_ops);
-#endif
-#endif
-
static DECLARE_MUTEX(ioctl_mutex);
static LIST_HEAD(ioctl_list);
} else
error = -ENOSYS;
goto done;
-#endif
-#if defined(CONFIG_ATM_TCP) || defined(CONFIG_ATM_TCP_MODULE)
- case SIOCSIFATMTCP:
- if (!capable(CAP_NET_ADMIN)) {
- error = -EPERM;
- goto done;
- }
- if (!atm_tcp_ops.attach) {
- error = -ENOPKG;
- goto done;
- }
- fops_get(&atm_tcp_ops);
- error = atm_tcp_ops.attach(vcc, (int) arg);
- if (error >= 0)
- sock->state = SS_CONNECTED;
- else
- fops_put (&atm_tcp_ops);
- goto done;
- case ATMTCP_CREATE:
- if (!capable(CAP_NET_ADMIN)) {
- error = -EPERM;
- goto done;
- }
- if (!atm_tcp_ops.create_persistent) {
- error = -ENOPKG;
- goto done;
- }
- error = atm_tcp_ops.create_persistent((int) arg);
- if (error < 0)
- fops_put (&atm_tcp_ops);
- goto done;
- case ATMTCP_REMOVE:
- if (!capable(CAP_NET_ADMIN)) {
- error = -EPERM;
- goto done;
- }
- if (!atm_tcp_ops.remove_persistent) {
- error = -ENOPKG;
- goto done;
- }
- error = atm_tcp_ops.remove_persistent((int) arg);
- fops_put(&atm_tcp_ops);
- goto done;
#endif
default:
break;