aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/os-Linux/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/os-Linux/file.c')
-rw-r--r--arch/um/os-Linux/file.c47
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
23static void copy_stat(struct uml_stat *dst, struct stat64 *src) 22static 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
294static int fault_buffer(void *start, int len, 293int 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
311static 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
332int 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
338int os_write_file(int fd, const void *buf, int len) 302int 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
344int os_file_size(char *file, unsigned long long *size_out) 311int os_file_size(char *file, unsigned long long *size_out)