From 8a2a957d49728a10acd4b0e7d172cb85eeaf0115 Mon Sep 17 00:00:00 2001 From: Philip Homburg Date: Wed, 6 Dec 2006 15:21:27 +0000 Subject: [PATCH] Some 64-bit file offset changes that were left out accidentally in the first commit. --- drivers/random/main.c | 29 ++++++++++++++++++++++------- include/minix/callnr.h | 1 + include/unistd.h | 2 ++ lib/other/Makefile.in | 1 + lib/syscall/Makefile.in | 1 + servers/vfs/param.h | 1 + servers/vfs/table.c | 2 +- 7 files changed, 29 insertions(+), 8 deletions(-) diff --git a/drivers/random/main.c b/drivers/random/main.c index 5d79dc1f2..78f571310 100644 --- a/drivers/random/main.c +++ b/drivers/random/main.c @@ -25,7 +25,7 @@ extern int errno; /* error number for PM calls */ FORWARD _PROTOTYPE( char *r_name, (void) ); FORWARD _PROTOTYPE( struct device *r_prepare, (int device) ); -FORWARD _PROTOTYPE( int r_transfer, (int proc_nr, int opcode, off_t position, +FORWARD _PROTOTYPE( int r_transfer, (int proc_nr, int opcode, u64_t position, iovec_t *iov, unsigned nr_req, int safe) ); FORWARD _PROTOTYPE( int r_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( void r_init, (void) ); @@ -95,7 +95,7 @@ int device; PRIVATE int r_transfer(proc_nr, opcode, position, iov, nr_req, safe) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ -off_t position; /* offset on device to read or write */ +u64_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ int safe; /* safe copies? */ @@ -105,6 +105,7 @@ int safe; /* safe copies? */ vir_bytes user_vir; struct device *dv; unsigned long dv_size; + int r; size_t vir_offset = 0; /* Get minor device number and check for /dev/null. */ @@ -129,16 +130,30 @@ int safe; /* safe copies? */ if (opcode == DEV_GATHER) { random_getbytes(random_buf, chunk); if(safe) { - sys_safecopyto(proc_nr, user_vir, vir_offset, - (vir_bytes) random_buf, chunk, D); + r= sys_safecopyto(proc_nr, user_vir, vir_offset, + (vir_bytes) random_buf, chunk, D); + if (r != OK) + { + printf( + "random: sys_safecopyto failed for proc %d, grant %d\n", + proc_nr, user_vir); + return r; + } } else { sys_vircopy(SELF, D, (vir_bytes) random_buf, proc_nr, D, user_vir + vir_offset, chunk); } } else if (opcode == DEV_SCATTER) { if(safe) { - sys_safecopyfrom(proc_nr, user_vir, vir_offset, - (vir_bytes) random_buf, chunk, D); + r= sys_safecopyfrom(proc_nr, user_vir, vir_offset, + (vir_bytes) random_buf, chunk, D); + if (r != OK) + { + printf( + "random: sys_safecopyfrom failed for proc %d, grant %d\n", + proc_nr, user_vir); + return r; + } } else { sys_vircopy(proc_nr, D, user_vir + vir_offset, SELF, D, (vir_bytes) random_buf, chunk); @@ -156,7 +171,7 @@ int safe; /* safe copies? */ } /* Book the number of bytes transferred. */ - position += count; + position= add64u(position, count); if ((iov->iov_size -= count) == 0) { iov++; nr_req--; vir_offset = 0; } } diff --git a/include/minix/callnr.h b/include/minix/callnr.h index b776a46bf..20930bc02 100755 --- a/include/minix/callnr.h +++ b/include/minix/callnr.h @@ -65,6 +65,7 @@ #define SYSUNAME 78 #define GETSYSINFO 79 /* to PM or FS */ #define GETDENTS 80 /* to FS */ +#define LLSEEK 81 /* to FS */ #define FSTATFS 82 /* to FS */ #define SELECT 85 /* to FS */ #define FCHDIR 86 /* to FS */ diff --git a/include/unistd.h b/include/unistd.h index 2b1baafd7..c8790f270 100755 --- a/include/unistd.h +++ b/include/unistd.h @@ -165,6 +165,8 @@ extern int optreset; /* Reset getopt state */ _PROTOTYPE( int brk, (char *_addr) ); _PROTOTYPE( int chroot, (const char *_name) ); +_PROTOTYPE( int lseek64, (int _fd, u64_t _offset, int _whence, + u64_t *_newpos) ); _PROTOTYPE( int mknod, (const char *_name, _mnx_Mode_t _mode, Dev_t _addr) ); _PROTOTYPE( int mknod4, (const char *_name, _mnx_Mode_t _mode, Dev_t _addr, long _size) ); diff --git a/lib/other/Makefile.in b/lib/other/Makefile.in index 2a16f371c..56a9b9668 100644 --- a/lib/other/Makefile.in +++ b/lib/other/Makefile.in @@ -17,6 +17,7 @@ libc_FILES=" \ _getpprocnr.c \ _getprocnr.c \ _getsysinfo.c \ + _lseek64.c \ _reboot.c \ _seekdir.c \ _sysuname.c \ diff --git a/lib/syscall/Makefile.in b/lib/syscall/Makefile.in index 306e03e6b..ed583db84 100644 --- a/lib/syscall/Makefile.in +++ b/lib/syscall/Makefile.in @@ -58,6 +58,7 @@ libc_FILES=" \ killpg.s \ link.s \ lseek.s \ + lseek64.s \ lstat.s \ mkdir.s \ mkfifo.s \ diff --git a/servers/vfs/param.h b/servers/vfs/param.h index 2ea84d819..a64ecab43 100644 --- a/servers/vfs/param.h +++ b/servers/vfs/param.h @@ -56,6 +56,7 @@ /* The following names are synonyms for the variables in the output message. */ #define reply_type m_type #define reply_l1 m2_l1 +#define reply_l2 m2_l2 #define reply_i1 m1_i1 #define reply_i2 m1_i2 #define reply_t1 m4_l1 diff --git a/servers/vfs/table.c b/servers/vfs/table.c index 09d96bfa0..5b27eefc7 100644 --- a/servers/vfs/table.c +++ b/servers/vfs/table.c @@ -99,7 +99,7 @@ PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = { no_sys, /* 78 = (sysuname) */ do_getsysinfo, /* 79 = getsysinfo */ do_getdents, /* 80 = getdents */ - no_sys, /* 81 = unused */ + do_llseek, /* 81 = llseek */ do_fstatfs, /* 82 = fstatfs */ no_sys, /* 83 = unused */ no_sys, /* 84 = unused */