vserver 1.9.3
[linux-2.6.git] / arch / um / drivers / xterm.c
index 59c4ba8..f417b3b 100644 (file)
@@ -8,7 +8,6 @@
 #include <unistd.h>
 #include <string.h>
 #include <errno.h>
-#include <fcntl.h>
 #include <termios.h>
 #include <signal.h>
 #include <sched.h>
@@ -36,7 +35,8 @@ void *xterm_init(char *str, int device, struct chan_opts *opts)
 {
        struct xterm_chan *data;
 
-       if((data = malloc(sizeof(*data))) == NULL) return(NULL);
+       data = malloc(sizeof(*data));
+       if(data == NULL) return(NULL);
        *data = ((struct xterm_chan) { .pid             = -1, 
                                       .helper_pid      = -1,
                                       .device          = device, 
@@ -83,6 +83,7 @@ __uml_setup("xterm=", xterm_setup,
 "    are 'xterm=gnome-terminal,-t,-x'.\n\n"
 );
 
+/* XXX This badly needs some cleaning up in the error paths */
 int xterm_open(int input, int output, int primary, void *d, char **dev_out)
 {
        struct xterm_chan *data = d;
@@ -93,7 +94,7 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
                         "/usr/lib/uml/port-helper", "-uml-socket",
                         file, NULL };
 
-       if(access(argv[4], X_OK))
+       if(os_access(argv[4], OS_ACC_X_OK) < 0)
                argv[4] = "port-helper";
 
        fd = mkstemp(file);
@@ -106,13 +107,13 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
                printk("xterm_open : unlink failed, errno = %d\n", errno);
                return(-errno);
        }
-       close(fd);
+       os_close_file(fd);
 
-       fd = create_unix_socket(file, sizeof(file));
+       fd = os_create_unix_socket(file, sizeof(file), 1);
        if(fd < 0){
                printk("xterm_open : create_unix_socket failed, errno = %d\n", 
                       -fd);
-               return(-fd);
+               return(fd);
        }
 
        sprintf(title, data->title, data->device);
@@ -128,20 +129,32 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
        if(data->direct_rcv)
                new = os_rcv_fd(fd, &data->helper_pid);
        else {
-               if((err = os_set_fd_block(fd, 0)) != 0){
+               err = os_set_fd_block(fd, 0);
+               if(err < 0){
                        printk("xterm_open : failed to set descriptor "
-                              "non-blocking, errno = %d\n", err);
+                              "non-blocking, err = %d\n", -err);
                        return(err);
                }
                new = xterm_fd(fd, &data->helper_pid);
        }
        if(new < 0){
-               printk("xterm_open : os_rcv_fd failed, errno = %d\n", -new);
+               printk("xterm_open : os_rcv_fd failed, err = %d\n", -new);
                goto out;
        }
 
-       tcgetattr(new, &data->tt);
-       if(data->raw) raw(new, 0);
+       CATCH_EINTR(err = tcgetattr(new, &data->tt));
+       if(err){
+               new = err;
+               goto out;
+       }
+
+       if(data->raw){
+               err = raw(new);
+               if(err){
+                       new = err;
+                       goto out;
+               }
+       }
 
        data->pid = pid;
        *dev_out = NULL;
@@ -160,7 +173,7 @@ void xterm_close(int fd, void *d)
        if(data->helper_pid != -1) 
                os_kill_process(data->helper_pid, 0);
        data->helper_pid = -1;
-       close(fd);
+       os_close_file(fd);
 }
 
 void xterm_free(void *d)