linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / um / drivers / net_user.c
index 75a83e9..0e2f061 100644 (file)
@@ -16,7 +16,6 @@
 #include "user_util.h"
 #include "kern_util.h"
 #include "net_user.h"
-#include "helper.h"
 #include "os.h"
 
 int tap_open_common(void *dev, char *gate_addr)
@@ -26,14 +25,13 @@ int tap_open_common(void *dev, char *gate_addr)
        if(gate_addr == NULL) return(0);
        if(sscanf(gate_addr, "%d.%d.%d.%d", &tap_addr[0], 
                  &tap_addr[1], &tap_addr[2], &tap_addr[3]) != 4){
-               printk("Invalid tap IP address - '%s'\n", 
-                      gate_addr);
+               printk("Invalid tap IP address - '%s'\n", gate_addr);
                return(-EINVAL);
        }
        return(0);
 }
 
-void tap_check_ips(char *gate_addr, char *eth_addr)
+void tap_check_ips(char *gate_addr, unsigned char *eth_addr)
 {
        int tap_addr[4];
 
@@ -49,10 +47,12 @@ void tap_check_ips(char *gate_addr, char *eth_addr)
        }
 }
 
+/* Do reliable error handling as this fails frequently enough. */
 void read_output(int fd, char *output, int len)
 {
-       int remain, n, actual;
+       int remain, ret, expected;
        char c;
+       char *str;
 
        if(output == NULL){
                output = &c;
@@ -60,36 +60,43 @@ void read_output(int fd, char *output, int len)
        }
                
        *output = '\0';
-       if(read(fd, &remain, sizeof(remain)) != sizeof(remain)){
-               printk("read_output - read of length failed, errno = %d\n",
-                      errno);
-               return;
+       ret = os_read_file(fd, &remain, sizeof(remain));
+
+       if (ret != sizeof(remain)) {
+               expected = sizeof(remain);
+               str = "length";
+               goto err;
        }
 
        while(remain != 0){
-               n = (remain < len) ? remain : len;
-               actual = read(fd, output, n);
-               if(actual != n){
-                       printk("read_output - read of data failed, "
-                              "errno = %d\n", errno);
-                       return;
+               expected = (remain < len) ? remain : len;
+               ret = os_read_file(fd, output, expected);
+               if (ret != expected) {
+                       str = "data";
+                       goto err;
                }
-               remain -= actual;
+               remain -= ret;
        }
+
        return;
+
+err:
+       if (ret < 0)
+               printk("read_output - read of %s failed, errno = %d\n", str, -ret);
+       else
+               printk("read_output - read of %s failed, read only %d of %d bytes\n", str, ret, expected);
 }
 
 int net_read(int fd, void *buf, int len)
 {
        int n;
 
-       while(((n = read(fd,  buf,  len)) < 0) && (errno == EINTR)) ;
+       n = os_read_file(fd,  buf,  len);
 
-       if(n < 0){
-               if(errno == EAGAIN) return(0);
-               return(-errno);
-       }
-       else if(n == 0) return(-ENOTCONN);
+       if(n == -EAGAIN)
+               return(0);
+       else if(n == 0)
+               return(-ENOTCONN);
        return(n);
 }
 
@@ -112,13 +119,13 @@ int net_write(int fd, void *buf, int len)
 {
        int n;
 
-       while(((n = write(fd, buf, len)) < 0) && (errno == EINTR)) ;
-       if(n < 0){
-               if(errno == EAGAIN) return(0);
-               return(-errno);
-       }
-       else if(n == 0) return(-ENOTCONN);
-       return(n);      
+       n = os_write_file(fd, buf, len);
+
+       if(n == -EAGAIN)
+               return(0);
+       else if(n == 0)
+               return(-ENOTCONN);
+       return(n);
 }
 
 int net_send(int fd, void *buf, int len)
@@ -157,7 +164,7 @@ static void change_pre_exec(void *arg)
 {
        struct change_pre_exec_data *data = arg;
 
-       close(data->close_me);
+       os_close_file(data->close_me);
        dup2(data->stdout, 1);
 }
 
@@ -167,17 +174,20 @@ static int change_tramp(char **argv, char *output, int output_len)
        struct change_pre_exec_data pe_data;
 
        err = os_pipe(fds, 1, 0);
-       if(err){
-               printk("change_tramp - pipe failed, errno = %d\n", -err);
+       if(err < 0){
+               printk("change_tramp - pipe failed, err = %d\n", -err);
                return(err);
        }
        pe_data.close_me = fds[0];
        pe_data.stdout = fds[1];
        pid = run_helper(change_pre_exec, &pe_data, argv, NULL);
 
-       close(fds[1]);
        read_output(fds[0], output, output_len);
-       waitpid(pid, NULL, 0);  
+       os_close_file(fds[0]);
+       os_close_file(fds[1]);
+
+       if (pid > 0)
+               CATCH_EINTR(err = waitpid(pid, NULL, 0));
        return(pid);
 }