diff options
Diffstat (limited to 'arch/um/os-Linux/file.c')
-rw-r--r-- | arch/um/os-Linux/file.c | 47 |
1 files changed, 7 insertions, 40 deletions
diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c index 371b4335f46d..6f92f732d253 100644 --- a/arch/um/os-Linux/file.c +++ b/arch/um/os-Linux/file.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include "os.h" | 18 | #include "os.h" |
19 | #include "user.h" | 19 | #include "user.h" |
20 | #include "kern_util.h" | 20 | #include "kern_util.h" |
21 | #include "user_util.h" | ||
22 | 21 | ||
23 | static void copy_stat(struct uml_stat *dst, struct stat64 *src) | 22 | static void copy_stat(struct uml_stat *dst, struct stat64 *src) |
24 | { | 23 | { |
@@ -291,54 +290,22 @@ int os_seek_file(int fd, __u64 offset) | |||
291 | return 0; | 290 | return 0; |
292 | } | 291 | } |
293 | 292 | ||
294 | static int fault_buffer(void *start, int len, | 293 | int os_read_file(int fd, void *buf, int len) |
295 | int (*copy_proc)(void *addr, void *buf, int len)) | ||
296 | { | ||
297 | int page = getpagesize(), i; | ||
298 | char c; | ||
299 | |||
300 | for(i = 0; i < len; i += page){ | ||
301 | if((*copy_proc)(start + i, &c, sizeof(c))) | ||
302 | return -EFAULT; | ||
303 | } | ||
304 | if((len % page) != 0){ | ||
305 | if((*copy_proc)(start + len - 1, &c, sizeof(c))) | ||
306 | return -EFAULT; | ||
307 | } | ||
308 | return 0; | ||
309 | } | ||
310 | |||
311 | static int file_io(int fd, void *buf, int len, | ||
312 | int (*io_proc)(int fd, void *buf, int len), | ||
313 | int (*copy_user_proc)(void *addr, void *buf, int len)) | ||
314 | { | 294 | { |
315 | int n, err; | 295 | int n = read(fd, buf, len); |
316 | |||
317 | do { | ||
318 | n = (*io_proc)(fd, buf, len); | ||
319 | if((n < 0) && (errno == EFAULT)){ | ||
320 | err = fault_buffer(buf, len, copy_user_proc); | ||
321 | if(err) | ||
322 | return err; | ||
323 | n = (*io_proc)(fd, buf, len); | ||
324 | } | ||
325 | } while((n < 0) && (errno == EINTR)); | ||
326 | 296 | ||
327 | if(n < 0) | 297 | if(n < 0) |
328 | return -errno; | 298 | return -errno; |
329 | return n; | 299 | return n; |
330 | } | 300 | } |
331 | 301 | ||
332 | int os_read_file(int fd, void *buf, int len) | ||
333 | { | ||
334 | return file_io(fd, buf, len, (int (*)(int, void *, int)) read, | ||
335 | copy_from_user_proc); | ||
336 | } | ||
337 | |||
338 | int os_write_file(int fd, const void *buf, int len) | 302 | int os_write_file(int fd, const void *buf, int len) |
339 | { | 303 | { |
340 | return file_io(fd, (void *) buf, len, | 304 | int n = write(fd, (void *) buf, len); |
341 | (int (*)(int, void *, int)) write, copy_to_user_proc); | 305 | |
306 | if(n < 0) | ||
307 | return -errno; | ||
308 | return n; | ||
342 | } | 309 | } |
343 | 310 | ||
344 | int os_file_size(char *file, unsigned long long *size_out) | 311 | int os_file_size(char *file, unsigned long long *size_out) |