Pull thinkpad-2.6.24 into release branch
[sfrench/cifs-2.6.git] / arch / um / os-Linux / file.c
index 371b4335f46dd2985fa852ef4a97abccc03080e5..f834627586272b80c4702b499553ac24c296c9dd 100644 (file)
@@ -18,7 +18,6 @@
 #include "os.h"
 #include "user.h"
 #include "kern_util.h"
-#include "user_util.h"
 
 static void copy_stat(struct uml_stat *dst, struct stat64 *src)
 {
@@ -83,13 +82,6 @@ int os_access(const char* file, int mode)
        return 0;
 }
 
-void os_print_error(int error, const char* str)
-{
-       errno = error < 0 ? -error : error;
-
-       perror(str);
-}
-
 /* FIXME? required only by hostaudio (because it passes ioctls verbatim) */
 int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg)
 {
@@ -102,30 +94,6 @@ int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg)
        return err;
 }
 
-int os_window_size(int fd, int *rows, int *cols)
-{
-       struct winsize size;
-
-       if(ioctl(fd, TIOCGWINSZ, &size) < 0)
-               return -errno;
-
-       *rows = size.ws_row;
-       *cols = size.ws_col;
-
-       return 0;
-}
-
-int os_new_tty_pgrp(int fd, int pid)
-{
-       if(ioctl(fd, TIOCSCTTY, 0) < 0)
-               return -errno;
-
-       if(tcsetpgrp(fd, pid) < 0)
-               return -errno;
-
-       return 0;
-}
-
 /* FIXME: ensure namebuf in os_get_if_name is big enough */
 int os_get_ifname(int fd, char* namebuf)
 {
@@ -206,19 +174,19 @@ int os_file_mode(char *file, struct openflags *mode_out)
 
        *mode_out = OPENFLAGS();
 
-       err = os_access(file, OS_ACC_W_OK);
-       if((err < 0) && (err != -EACCES))
-               return(err);
-
-       *mode_out = of_write(*mode_out);
-
-       err = os_access(file, OS_ACC_R_OK);
-       if((err < 0) && (err != -EACCES))
-               return(err);
+       err = access(file, W_OK);
+       if(err && (errno != EACCES))
+               return -errno;
+       else if(!err)
+               *mode_out = of_write(*mode_out);
 
-       *mode_out = of_read(*mode_out);
+       err = access(file, R_OK);
+       if(err && (errno != EACCES))
+               return -errno;
+       else if(!err)
+               *mode_out = of_read(*mode_out);
 
-       return(0);
+       return err;
 }
 
 int os_open_file(char *file, struct openflags flags, int mode)
@@ -237,15 +205,15 @@ int os_open_file(char *file, struct openflags flags, int mode)
 
        fd = open64(file, f, mode);
        if(fd < 0)
-               return(-errno);
+               return -errno;
 
        if(flags.cl && fcntl(fd, F_SETFD, 1)){
                err = -errno;
-               os_close_file(fd);
+               close(fd);
                return err;
        }
 
-       return(fd);
+       return fd;
 }
 
 int os_connect_socket(char *name)
@@ -281,9 +249,9 @@ void os_close_file(int fd)
        close(fd);
 }
 
-int os_seek_file(int fd, __u64 offset)
+int os_seek_file(int fd, unsigned long long offset)
 {
-       __u64 actual;
+       unsigned long long actual;
 
        actual = lseek64(fd, offset, SEEK_SET);
        if(actual != offset)
@@ -291,54 +259,22 @@ int os_seek_file(int fd, __u64 offset)
        return 0;
 }
 
-static int fault_buffer(void *start, int len,
-                       int (*copy_proc)(void *addr, void *buf, int len))
-{
-       int page = getpagesize(), i;
-       char c;
-
-       for(i = 0; i < len; i += page){
-               if((*copy_proc)(start + i, &c, sizeof(c)))
-                       return -EFAULT;
-       }
-       if((len % page) != 0){
-               if((*copy_proc)(start + len - 1, &c, sizeof(c)))
-                       return -EFAULT;
-       }
-       return 0;
-}
-
-static int file_io(int fd, void *buf, int len,
-                  int (*io_proc)(int fd, void *buf, int len),
-                  int (*copy_user_proc)(void *addr, void *buf, int len))
+int os_read_file(int fd, void *buf, int len)
 {
-       int n, err;
-
-       do {
-               n = (*io_proc)(fd, buf, len);
-               if((n < 0) && (errno == EFAULT)){
-                       err = fault_buffer(buf, len, copy_user_proc);
-                       if(err)
-                               return err;
-                       n = (*io_proc)(fd, buf, len);
-               }
-       } while((n < 0) && (errno == EINTR));
+       int n = read(fd, buf, len);
 
        if(n < 0)
                return -errno;
        return n;
 }
 
-int os_read_file(int fd, void *buf, int len)
-{
-       return file_io(fd, buf, len, (int (*)(int, void *, int)) read,
-                      copy_from_user_proc);
-}
-
 int os_write_file(int fd, const void *buf, int len)
 {
-       return file_io(fd, (void *) buf, len,
-                      (int (*)(int, void *, int)) write, copy_to_user_proc);
+       int n = write(fd, (void *) buf, len);
+
+       if(n < 0)
+               return -errno;
+       return n;
 }
 
 int os_file_size(char *file, unsigned long long *size_out)
@@ -349,30 +285,33 @@ int os_file_size(char *file, unsigned long long *size_out)
        err = os_stat_file(file, &buf);
        if(err < 0){
                printk("Couldn't stat \"%s\" : err = %d\n", file, -err);
-               return(err);
+               return err;
        }
 
        if(S_ISBLK(buf.ust_mode)){
-               int fd, blocks;
+               int fd;
+               long blocks;
 
-               fd = os_open_file(file, of_read(OPENFLAGS()), 0);
-               if(fd < 0){
-                       printk("Couldn't open \"%s\", errno = %d\n", file, -fd);
-                       return(fd);
+               fd = open(file, O_RDONLY, 0);
+               if(fd < 0) {
+                       err = -errno;
+                       printk("Couldn't open \"%s\", errno = %d\n", file,
+                              errno);
+                       return err;
                }
                if(ioctl(fd, BLKGETSIZE, &blocks) < 0){
                        err = -errno;
                        printk("Couldn't get the block size of \"%s\", "
                               "errno = %d\n", file, errno);
-                       os_close_file(fd);
-                       return(err);
+                       close(fd);
+                       return err;
                }
                *size_out = ((long long) blocks) * 512;
-               os_close_file(fd);
-               return(0);
+               close(fd);
        }
-       *size_out = buf.ust_size;
-       return(0);
+       else *size_out = buf.ust_size;
+
+       return 0;
 }
 
 int os_file_modtime(char *file, unsigned long *modtime)
@@ -390,35 +329,28 @@ int os_file_modtime(char *file, unsigned long *modtime)
        return 0;
 }
 
-int os_get_exec_close(int fd, intclose_on_exec)
+int os_get_exec_close(int fd, int *close_on_exec)
 {
        int ret;
 
-       do {
-               ret = fcntl(fd, F_GETFD);
-       } while((ret < 0) && (errno == EINTR)) ;
+       CATCH_EINTR(ret = fcntl(fd, F_GETFD));
 
        if(ret < 0)
-               return(-errno);
+               return -errno;
 
-       *close_on_exec = (ret&FD_CLOEXEC) ? 1 : 0;
-       return(ret);
+       *close_on_exec = (ret & FD_CLOEXEC) ? 1 : 0;
+       return ret;
 }
 
-int os_set_exec_close(int fd, int close_on_exec)
+int os_set_exec_close(int fd)
 {
-       int flag, err;
+       int err;
 
-       if(close_on_exec) flag = FD_CLOEXEC;
-       else flag = 0;
-
-       do {
-               err = fcntl(fd, F_SETFD, flag);
-       } while((err < 0) && (errno == EINTR)) ;
+       CATCH_EINTR(err = fcntl(fd, F_SETFD, FD_CLOEXEC));
 
        if(err < 0)
-               return(-errno);
-       return(err);
+               return -errno;
+       return err;
 }
 
 int os_pipe(int *fds, int stream, int close_on_exec)
@@ -427,16 +359,16 @@ int os_pipe(int *fds, int stream, int close_on_exec)
 
        err = socketpair(AF_UNIX, type, 0, fds);
        if(err < 0)
-               return(-errno);
+               return -errno;
 
        if(!close_on_exec)
-               return(0);
+               return 0;
 
-       err = os_set_exec_close(fds[0], 1);
+       err = os_set_exec_close(fds[0]);
        if(err < 0)
                goto error;
 
-       err = os_set_exec_close(fds[1], 1);
+       err = os_set_exec_close(fds[1]);
        if(err < 0)
                goto error;
 
@@ -444,9 +376,9 @@ int os_pipe(int *fds, int stream, int close_on_exec)
 
  error:
        printk("os_pipe : Setting FD_CLOEXEC failed, err = %d\n", -err);
-       os_close_file(fds[1]);
-       os_close_file(fds[0]);
-       return(err);
+       close(fds[1]);
+       close(fds[0]);
+       return err;
 }
 
 int os_set_fd_async(int fd, int owner)
@@ -564,8 +496,7 @@ int os_rcv_fd(int fd, int *helper_pid_out)
        n = recvmsg(fd, &msg, 0);
        if(n < 0)
                return -errno;
-
-       else if(n != sizeof(iov.iov_len))
+       else if(n != iov.iov_len)
                *helper_pid_out = -1;
 
        cmsg = CMSG_FIRSTHDR(&msg);
@@ -593,7 +524,7 @@ int os_create_unix_socket(char *file, int len, int close_on_exec)
                return -errno;
 
        if(close_on_exec) {
-               err = os_set_exec_close(sock, 1);
+               err = os_set_exec_close(sock);
                if(err < 0)
                        printk("create_unix_socket : close_on_exec failed, "
                       "err = %d", -err);