Merge to kernel-2.6.20-1.2949.fc6.vs2.2.0.1
[linux-2.6.git] / arch / um / drivers / fd.c
index 33c6c78..218aa0e 100644 (file)
@@ -7,9 +7,12 @@
 #include <stdlib.h>
 #include <unistd.h>
 #include <termios.h>
+#include <errno.h>
 #include "user.h"
 #include "user_util.h"
 #include "chan_user.h"
+#include "os.h"
+#include "um_malloc.h"
 
 struct fd_chan {
        int fd;
@@ -18,7 +21,7 @@ struct fd_chan {
        char str[sizeof("1234567890\0")];
 };
 
-void *fd_init(char *str, int device, struct chan_opts *opts)
+static void *fd_init(char *str, int device, const struct chan_opts *opts)
 {
        struct fd_chan *data;
        char *end;
@@ -42,44 +45,47 @@ void *fd_init(char *str, int device, struct chan_opts *opts)
        return(data);
 }
 
-int fd_open(int input, int output, int primary, void *d, char **dev_out)
+static 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;
        return(data->fd);
 }
 
-void fd_close(int fd, void *d)
+static 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;
        }
 }
 
-int fd_console_write(int fd, const char *buf, int n, void *d)
-{
-       struct fd_chan *data = d;
-
-       return(generic_console_write(fd, buf, n, &data->tt));
-}
-
-struct chan_ops fd_ops = {
+const struct chan_ops fd_ops = {
        .type           = "fd",
        .init           = fd_init,
        .open           = fd_open,
        .close          = fd_close,
        .read           = generic_read,
        .write          = generic_write,
-       .console_write  = fd_console_write,
+       .console_write  = generic_console_write,
        .window_size    = generic_window_size,
        .free           = generic_free,
        .winch          = 1,