Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/djbw/async_tx
[linux-2.6-block.git] / arch / um / drivers / tty.c
index a9f87e19c5bf9f283faf134f52ad9f0de4b5fdd1..495858a090e4f49e50d4a79db016173ea4b3a6df 100644 (file)
@@ -1,16 +1,16 @@
 /*
- * Copyright (C) 2001 Jeff Dike (jdike@karaya.com)
+ * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{linux.intel,addtoit}.com)
  * Licensed under the GPL
  */
 
-#include <stdio.h>
-#include <termios.h>
 #include <errno.h>
-#include <unistd.h>
+#include <fcntl.h>
+#include <termios.h>
 #include "chan_user.h"
-#include "user.h"
+#include "kern_constants.h"
 #include "os.h"
 #include "um_malloc.h"
+#include "user.h"
 
 struct tty_chan {
        char *dev;
@@ -22,15 +22,15 @@ static void *tty_chan_init(char *str, int device, const struct chan_opts *opts)
 {
        struct tty_chan *data;
 
-       if(*str != ':'){
-               printk("tty_init : channel type 'tty' must specify "
+       if (*str != ':') {
+               printk(UM_KERN_ERR "tty_init : channel type 'tty' must specify "
                       "a device\n");
                return NULL;
        }
        str++;
 
-       data = kmalloc(sizeof(*data), UM_GFP_KERNEL);
-       if(data == NULL)
+       data = uml_kmalloc(sizeof(*data), UM_GFP_KERNEL);
+       if (data == NULL)
                return NULL;
        *data = ((struct tty_chan) { .dev       = str,
                                     .raw       = opts->raw });
@@ -42,19 +42,26 @@ static int tty_open(int input, int output, int primary, void *d,
                    char **dev_out)
 {
        struct tty_chan *data = d;
-       int fd, err;
+       int fd, err, mode = 0;
+
+       if (input && output)
+               mode = O_RDWR;
+       else if (input)
+               mode = O_RDONLY;
+       else if (output)
+               mode = O_WRONLY;
 
-       fd = os_open_file(data->dev, of_set_rw(OPENFLAGS(), input, output), 0);
-       if(fd < 0)
-               return fd;
+       fd = open(data->dev, mode);
+       if (fd < 0)
+               return -errno;
 
-       if(data->raw){
+       if (data->raw) {
                CATCH_EINTR(err = tcgetattr(fd, &data->tt));
-               if(err)
+               if (err)
                        return err;
 
                err = raw(fd);
-               if(err)
+               if (err)
                        return err;
        }