]> git.hungrycats.org Git - linux/commitdiff
[PATCH] uml: clean up terminal state handling
authorJeff Dike <jdike@addtoit.com>
Fri, 17 Sep 2004 05:13:41 +0000 (22:13 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 17 Sep 2004 05:13:41 +0000 (22:13 -0700)
This patch cleans up UML's handling of terminal state with better error
handling, interface cleanup, and some code tidying.

Signed-off-by: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
arch/um/drivers/fd.c
arch/um/drivers/port_user.c
arch/um/drivers/pty.c
arch/um/drivers/tty.c
arch/um/drivers/xterm.c
arch/um/include/user_util.h
arch/um/kernel/sigio_user.c
arch/um/kernel/user_util.c

index 33c6c7868ce250c7dd2ddbee1d212fc7506e2ff6..1c6daad921a24b3c7a3353ea4c6036338d5ed5ae 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <termios.h>
+#include <errno.h>
 #include "user.h"
 #include "user_util.h"
 #include "chan_user.h"
@@ -45,10 +46,16 @@ void *fd_init(char *str, int device, struct chan_opts *opts)
 int fd_open(int input, int output, int primary, void *d, char **dev_out)
 {
        struct fd_chan *data = d;
+       int err;
 
        if(data->raw && isatty(data->fd)){
-               tcgetattr(data->fd, &data->tt);
-               raw(data->fd, 0);
+               CATCH_EINTR(err = tcgetattr(data->fd, &data->tt));
+               if(err)
+                       return(err);
+
+               err = raw(data->fd);
+               if(err)
+                       return(err);
        }
        sprintf(data->str, "%d", data->fd);
        *dev_out = data->str;
@@ -58,9 +65,13 @@ int fd_open(int input, int output, int primary, void *d, char **dev_out)
 void fd_close(int fd, void *d)
 {
        struct fd_chan *data = d;
+       int err;
 
        if(data->raw && isatty(fd)){
-               tcsetattr(fd, TCSAFLUSH, &data->tt);
+               CATCH_EINTR(err = tcsetattr(fd, TCSAFLUSH, &data->tt));
+               if(err)
+                       printk("Failed to restore terminal state - "
+                              "errno = %d\n", -err);
                data->raw = 0;
        }
 }
index e0588cbe3720aba023e1aba063a94a7409572530..1e8592ec1158fa64cd8d03ec7954696d8b4095f7 100644 (file)
@@ -76,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);
index bfa08d812604644fdea0fbb298a5d8de5b9858bc..c4634b50035250943bd8f655c2a671110dd4806e 100644 (file)
@@ -38,7 +38,7 @@ int pts_open(int input, int output, int primary, void *d, char **dev_out)
 {
        struct pty_chan *data = d;
        char *dev;
-       int fd;
+       int fd, err;
 
        fd = get_pty();
        if(fd < 0){
@@ -46,8 +46,13 @@ int pts_open(int input, int output, int primary, void *d, char **dev_out)
                return(-errno);
        }
        if(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 = ptsname(fd);
@@ -89,13 +94,19 @@ int getmaster(char *line)
 int pty_open(int input, int output, int primary, void *d, char **dev_out)
 {
        struct pty_chan *data = d;
-       int fd;
+       int fd, err;
        char dev[sizeof("/dev/ptyxx\0")] = "/dev/ptyxx";
 
        fd = getmaster(dev);
-       if(fd < 0) return(-errno);
+       if(fd < 0)
+               return(-errno);
+
+       if(data->raw){
+               err = raw(fd);
+               if(err)
+                       return(err);
+       }
        
-       if(data->raw) raw(fd, 0);
        if(data->announce) (*data->announce)(dev, data->dev);
 
        sprintf(data->dev_name, "%s", dev);
index 20a7e45a9ebbe3d5bc8deb8fe8ad833985aec58e..dd008aa8f5dd029bc1313f1f4b6cae27d498b9e5 100644 (file)
@@ -41,13 +41,18 @@ void *tty_chan_init(char *str, int device, struct chan_opts *opts)
 int tty_open(int input, int output, int primary, void *d, char **dev_out)
 {
        struct tty_chan *data = d;
-       int fd;
+       int fd, err;
 
        fd = os_open_file(data->dev, of_set_rw(OPENFLAGS(), input, output), 0);
        if(fd < 0) return(fd);
        if(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;
index f429a35dbba6d12900a69d87ed84309d3b638cd9..f417b3b668ade33eede3fa2de6a2f5fceec3c86b 100644 (file)
@@ -142,8 +142,19 @@ int xterm_open(int input, int output, int primary, void *d, char **dev_out)
                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;
index 0ba8eb056deb1bdfb0840551a00b527cce7f772b..fbb569095ec05484dc9d23f53d1d504c228c6fd2 100644 (file)
@@ -8,6 +8,8 @@
 
 #include "sysdep/ptrace.h"
 
+#define CATCH_EINTR(expr) while (((expr) < 0) && (errno == EINTR))
+
 extern int mode_tt;
 
 extern int grantpt(int __fd);
@@ -89,11 +91,8 @@ extern void forward_pending_sigio(int target);
 extern int can_do_skas(void);
 extern void arch_init_thread(void);
 extern int setjmp_wrapper(void (*proc)(void *, void *), ...);
+extern int raw(int fd);
 
-extern int __raw(int fd, int complain, int now);
-#define raw(fd, complain) __raw((fd), (complain), 1)
-
-#define CATCH_EINTR(expr) while ( ((expr) < 0) && errno == EINTR)
 #endif
 
 /*
index de4fcb279d6e19386a3ea13bd063fd142d9e3546..82d19b451d5eaedea9420cfc67ac35f0f8efcc70 100644 (file)
@@ -68,7 +68,8 @@ void __init check_one_sigio(void (*proc)(int, int))
                return;
        }
 
-       err = __raw(master, 1, 0); //Not now, but complain so we now where we failed.
+       /* Not now, but complain so we now where we failed. */
+       err = raw(master);
        if (err < 0)
                panic("check_sigio : __raw failed, errno = %d\n", -err);
 
index a366c189c638fadc6baf7d66d222342a8a4526ef..8eabe637720fdefd06a53a0a75ec0eb8a31c3152 100644 (file)
@@ -118,35 +118,26 @@ int wait_for_stop(int pid, int sig, int cont_type, void *relay)
        }
 }
 
-int __raw(int fd, int complain, int now)
+int raw(int fd)
 {
        struct termios tt;
        int err;
-       int when;
 
        CATCH_EINTR(err = tcgetattr(fd, &tt));
-
        if (err < 0) {
-               if (complain)
                        printk("tcgetattr failed, errno = %d\n", errno);
                return(-errno);
        }
 
        cfmakeraw(&tt);
 
-       if (now)
-               when = TCSANOW;
-       else
-               when = TCSADRAIN;
-
-       CATCH_EINTR(err = tcsetattr(fd, when, &tt));
-
+       CATCH_EINTR(err = tcsetattr(fd, TCSADRAIN, &tt));
        if (err < 0) {
-               if (complain)
                        printk("tcsetattr failed, errno = %d\n", errno);
                return(-errno);
        }
-       /*XXX: tcsetattr could have applied only some changes
+
+       /* XXX tcsetattr could have applied only some changes
         * (and cfmakeraw() is a set of changes) */
        return(0);
 }