vserver 1.9.3
[linux-2.6.git] / arch / um / drivers / port_user.c
index 7a37cf6..1e8592e 100644 (file)
@@ -47,10 +47,12 @@ void *port_init(char *str, int device, struct chan_opts *opts)
                return(NULL);
        }
 
-       if((kern_data = port_data(port)) == NULL) 
+       kern_data = port_data(port);
+       if(kern_data == NULL)
                return(NULL);
 
-       if((data = um_kmalloc(sizeof(*data))) == NULL) 
+       data = um_kmalloc(sizeof(*data));
+       if(data == NULL)
                goto err;
 
        *data = ((struct port_chan) { .raw              = opts->raw,
@@ -74,12 +76,17 @@ void port_free(void *d)
 int port_open(int input, int output, int primary, void *d, char **dev_out)
 {
        struct port_chan *data = d;
-       int fd;
+       int fd, err;
 
        fd = port_wait(data->kernel_data);
        if((fd >= 0) && data->raw){
-               tcgetattr(fd, &data->tt);
-               raw(fd, 0);
+               CATCH_EINTR(err = tcgetattr(fd, &data->tt));
+               if(err)
+                       return(err);
+
+               err = raw(fd);
+               if(err)
+                       return(err);
        }
        *dev_out = data->dev;
        return(fd);
@@ -90,7 +97,7 @@ void port_close(int fd, void *d)
        struct port_chan *data = d;
 
        port_remove_dev(data->kernel_data);
-       close(fd);
+       os_close_file(fd);
 }
 
 int port_console_write(int fd, const char *buf, int n, void *d)
@@ -130,11 +137,15 @@ int port_listen_fd(int port)
                goto out;
        }
   
-       if((listen(fd, 1) < 0) || (os_set_fd_block(fd, 0))){
+       if(listen(fd, 1) < 0){
                err = -errno;
                goto out;
        }
 
+       err = os_set_fd_block(fd, 0);
+       if(err < 0)
+               goto out;
+
        return(fd);
  out:
        os_close_file(fd);
@@ -153,10 +164,10 @@ void port_pre_exec(void *arg)
        dup2(data->sock_fd, 0);
        dup2(data->sock_fd, 1);
        dup2(data->sock_fd, 2);
-       close(data->sock_fd);
+       os_close_file(data->sock_fd);
        dup2(data->pipe_fd, 3);
        os_shutdown_socket(3, 1, 0);
-       close(data->pipe_fd);
+       os_close_file(data->pipe_fd);
 }
 
 int port_connection(int fd, int *socket, int *pid_out)
@@ -166,11 +177,12 @@ int port_connection(int fd, int *socket, int *pid_out)
                         "/usr/lib/uml/port-helper", NULL };
        struct port_pre_exec_data data;
 
-       if((new = os_accept_connection(fd)) < 0)
-               return(-errno);
+       new = os_accept_connection(fd);
+       if(new < 0)
+               return(new);
 
        err = os_pipe(socket, 0, 0);
-       if(err
+       if(err < 0)
                goto out_close;
 
        data = ((struct port_pre_exec_data)
@@ -186,11 +198,11 @@ int port_connection(int fd, int *socket, int *pid_out)
 
  out_shutdown:
        os_shutdown_socket(socket[0], 1, 1);
-       close(socket[0]);
+       os_close_file(socket[0]);
        os_shutdown_socket(socket[1], 1, 1);    
-       close(socket[1]);
+       os_close_file(socket[1]);
  out_close:
-       close(new);
+       os_close_file(new);
        return(err);
 }