tracing/kprobes: Make Kconfig dependencies generic
[safe/jmp/linux-2.6] / arch / um / os-Linux / drivers / tuntap_user.c
index e846b23..2448be0 100644 (file)
@@ -1,34 +1,30 @@
 /* 
- * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com)
+ * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
  * Licensed under the GPL
  */
 
 #include <stdio.h>
-#include <stddef.h>
-#include <stdlib.h>
 #include <unistd.h>
 #include <errno.h>
-#include <sys/wait.h>
+#include <string.h>
+#include <linux/if_tun.h>
+#include <net/if.h>
+#include <sys/ioctl.h>
 #include <sys/socket.h>
-#include <sys/un.h>
+#include <sys/wait.h>
 #include <sys/uio.h>
-#include <sys/ioctl.h>
-#include <net/if.h>
-#include <linux/if_tun.h>
-#include "net_user.h"
-#include "tuntap.h"
+#include "kern_constants.h"
 #include "kern_util.h"
-#include "user_util.h"
-#include "user.h"
 #include "os.h"
+#include "tuntap.h"
+#include "user.h"
 
-#define MAX_PACKET ETH_MAX_PACKET
-
-void tuntap_user_init(void *data, void *dev)
+static int tuntap_user_init(void *data, void *dev)
 {
        struct tuntap_data *pri = data;
 
        pri->dev = dev;
+       return 0;
 }
 
 static void tuntap_add_addr(unsigned char *addr, unsigned char *netmask,
@@ -37,7 +33,8 @@ static void tuntap_add_addr(unsigned char *addr, unsigned char *netmask,
        struct tuntap_data *pri = data;
 
        tap_check_ips(pri->gate_addr, addr);
-       if((pri->fd == -1) || pri->fixed_config) return;
+       if ((pri->fd == -1) || pri->fixed_config)
+               return;
        open_addr(addr, netmask, pri->dev_name);
 }
 
@@ -46,7 +43,8 @@ static void tuntap_del_addr(unsigned char *addr, unsigned char *netmask,
 {
        struct tuntap_data *pri = data;
 
-       if((pri->fd == -1) || pri->fixed_config) return;
+       if ((pri->fd == -1) || pri->fixed_config)
+               return;
        close_addr(addr, netmask, pri->dev_name);
 }
 
@@ -58,9 +56,9 @@ struct tuntap_pre_exec_data {
 static void tuntap_pre_exec(void *arg)
 {
        struct tuntap_pre_exec_data *data = arg;
-       
+
        dup2(data->stdout, 1);
-       os_close_file(data->close_me);
+       close(data->close_me);
 }
 
 static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
@@ -81,15 +79,16 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
        data.stdout = remote;
        data.close_me = me;
 
-       pid = run_helper(tuntap_pre_exec, &data, argv, NULL);
+       pid = run_helper(tuntap_pre_exec, &data, argv);
 
-       if(pid < 0) return(-pid);
+       if (pid < 0)
+               return -pid;
 
-       os_close_file(remote);
+       close(remote);
 
        msg.msg_name = NULL;
        msg.msg_namelen = 0;
-       if(buffer != NULL){
+       if (buffer != NULL) {
                iov = ((struct iovec) { buffer, buffer_len });
                msg.msg_iov = &iov;
                msg.msg_iovlen = 1;
@@ -103,27 +102,29 @@ static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
        msg.msg_flags = 0;
        n = recvmsg(me, &msg, 0);
        *used_out = n;
-       if(n < 0){
+       if (n < 0) {
                err = -errno;
-               printk("tuntap_open_tramp : recvmsg failed - errno = %d\n", 
-                      errno);
+               printk(UM_KERN_ERR "tuntap_open_tramp : recvmsg failed - "
+                      "errno = %d\n", errno);
                return err;
        }
-       CATCH_EINTR(waitpid(pid, NULL, 0));
+       helper_wait(pid);
 
        cmsg = CMSG_FIRSTHDR(&msg);
-       if(cmsg == NULL){
-               printk("tuntap_open_tramp : didn't receive a message\n");
-               return(-EINVAL);
+       if (cmsg == NULL) {
+               printk(UM_KERN_ERR "tuntap_open_tramp : didn't receive a "
+                      "message\n");
+               return -EINVAL;
        }
-       if((cmsg->cmsg_level != SOL_SOCKET) || 
-          (cmsg->cmsg_type != SCM_RIGHTS)){
-               printk("tuntap_open_tramp : didn't receive a descriptor\n");
-               return(-EINVAL);
+       if ((cmsg->cmsg_level != SOL_SOCKET) ||
+          (cmsg->cmsg_type != SCM_RIGHTS)) {
+               printk(UM_KERN_ERR "tuntap_open_tramp : didn't receive a "
+                      "descriptor\n");
+               return -EINVAL;
        }
        *fd_out = ((int *) CMSG_DATA(cmsg))[0];
-       os_set_exec_close(*fd_out, 1);
-       return(0);
+       os_set_exec_close(*fd_out);
+       return 0;
 }
 
 static int tuntap_open(void *data)
@@ -134,48 +135,52 @@ static int tuntap_open(void *data)
        int err, fds[2], len, used;
 
        err = tap_open_common(pri->dev, pri->gate_addr);
-       if(err < 0)
-               return(err);
+       if (err < 0)
+               return err;
 
-       if(pri->fixed_config){
+       if (pri->fixed_config) {
                pri->fd = os_open_file("/dev/net/tun",
                                       of_cloexec(of_rdwr(OPENFLAGS())), 0);
-               if(pri->fd < 0){
-                       printk("Failed to open /dev/net/tun, err = %d\n",
-                              -pri->fd);
-                       return(pri->fd);
+               if (pri->fd < 0) {
+                       printk(UM_KERN_ERR "Failed to open /dev/net/tun, "
+                              "err = %d\n", -pri->fd);
+                       return pri->fd;
                }
                memset(&ifr, 0, sizeof(ifr));
                ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
                strlcpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name));
-               if(ioctl(pri->fd, TUNSETIFF, (void *) &ifr) < 0){
+               if (ioctl(pri->fd, TUNSETIFF, &ifr) < 0) {
                        err = -errno;
-                       printk("TUNSETIFF failed, errno = %d\n", errno);
-                       os_close_file(pri->fd);
+                       printk(UM_KERN_ERR "TUNSETIFF failed, errno = %d\n",
+                              errno);
+                       close(pri->fd);
                        return err;
                }
        }
        else {
-               err = os_pipe(fds, 0, 0);
-               if(err < 0){
-                       printk("tuntap_open : os_pipe failed - err = %d\n",
-                              -err);
-                       return(err);
+               err = socketpair(AF_UNIX, SOCK_DGRAM, 0, fds);
+               if (err) {
+                       err = -errno;
+                       printk(UM_KERN_ERR "tuntap_open : socketpair failed - "
+                              "errno = %d\n", errno);
+                       return err;
                }
 
                buffer = get_output_buffer(&len);
-               if(buffer != NULL) len--;
+               if (buffer != NULL)
+                       len--;
                used = 0;
 
                err = tuntap_open_tramp(pri->gate_addr, &pri->fd, fds[0],
                                        fds[1], buffer, len, &used);
 
                output = buffer;
-               if(err < 0) {
+               if (err < 0) {
                        printk("%s", output);
                        free_output_buffer(buffer);
-                       printk("tuntap_open_tramp failed - err = %d\n", -err);
-                       return(err);
+                       printk(UM_KERN_ERR "tuntap_open_tramp failed - "
+                              "err = %d\n", -err);
+                       return err;
                }
 
                pri->dev_name = uml_strdup(buffer);
@@ -183,46 +188,30 @@ static int tuntap_open(void *data)
                printk("%s", output);
                free_output_buffer(buffer);
 
-               os_close_file(fds[0]);
+               close(fds[0]);
                iter_addresses(pri->dev, open_addr, pri->dev_name);
        }
 
-       return(pri->fd);
+       return pri->fd;
 }
 
 static void tuntap_close(int fd, void *data)
 {
        struct tuntap_data *pri = data;
 
-       if(!pri->fixed_config) 
+       if (!pri->fixed_config)
                iter_addresses(pri->dev, close_addr, pri->dev_name);
-       os_close_file(fd);
+       close(fd);
        pri->fd = -1;
 }
 
-static int tuntap_set_mtu(int mtu, void *data)
-{
-       return(mtu);
-}
-
 const struct net_user_info tuntap_user_info = {
        .init           = tuntap_user_init,
        .open           = tuntap_open,
        .close          = tuntap_close,
        .remove         = NULL,
-       .set_mtu        = tuntap_set_mtu,
        .add_address    = tuntap_add_addr,
        .delete_address = tuntap_del_addr,
-       .max_packet     = MAX_PACKET
+       .mtu            = ETH_MAX_PACKET,
+       .max_packet     = ETH_MAX_PACKET + ETH_HEADER_OTHER,
 };
-
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-file-style: "linux"
- * End:
- */