On Wed Feb 23 11, Garrett Cooper wrote:
> On Wed, Feb 23, 2011 at 3:36 PM, Alexander Best <[email protected]> wrote:
> > On Wed Feb 23 11, Garrett Cooper wrote:
> >> On Feb 22, 2011, at 9:51 AM, John Baldwin wrote:
> >>
> >> > On Tuesday, February 22, 2011 11:46:05 am Garrett Cooper wrote:
> >> >> (Please bottom post)
> >> >>
> >> >> On Tue, Feb 22, 2011 at 8:31 AM, Andrew Duane <[email protected]>
> >> >> wrote:
> >> >>> I thought seeking past EOF was valid; writing something creates a file
> >> > with a hole in it. I always assumed that was standard semantics.
> >> >>
> >> >> That's with SET_HOLE/SET_DATA though, correct? If so, outside of
> >> >> that functionality I would assume relatively standard POSIX semantics.
> >> >
> >> > Err, no, you can always seek past EOF and then call write(2) to extend a
> >> > file
> >> > (it does an implicit ftruncate(2)). SEEK_HOLE and SEEK_DATA are
> >> > different,
> >> > they are just used to discover sparse regions within a file.
> >> >
> >> > From the manpage:
> >> >
> >> > The lseek() system call allows the file offset to be set beyond the
> >> > end
> >> > of the existing end-of-file of the file. If data is later written at
> >> > this point, subsequent reads of the data in the gap return bytes of
> >> > zeros
> >> > (until data is actually written into the gap).
> >>
> >> You're correct. Linux (Fedora 13) isn't POSIX compliant (this is
> >> from the official POSIX text):
> >>
> >> The lseek ( ) function shall allow the file offset to be set beyond the
> >> end of the existing data in the file. If data is later written at this
> >> point, subsequent reads of data in the gap shall return bytes with the
> >> value 0 until data is actually written into the gap.
> >
> > so except for reading from /dev/zero freebsd also isn't posix compliant,
> > right?
>
> Huh...? Please better explain what you mean here.
this patch should make things a bit clearer.
cheers.
alex
> Thanks,
> -Garrett
--
a13x
diff --git a/sys/dev/null/null.c b/sys/dev/null/null.c
index 3005c19..a83be6f 100644
--- a/sys/dev/null/null.c
+++ b/sys/dev/null/null.c
@@ -47,11 +47,12 @@ static struct cdev *zero_dev;
static d_write_t null_write;
static d_ioctl_t null_ioctl;
+static d_read_t null_read;
static d_read_t zero_read;
static struct cdevsw null_cdevsw = {
.d_version = D_VERSION,
- .d_read = (d_read_t *)nullop,
+ .d_read = null_read,
.d_write = null_write,
.d_ioctl = null_ioctl,
.d_name = "null",
@@ -71,6 +72,19 @@ static void *zbuf;
static int
null_write(struct cdev *dev __unused, struct uio *uio, int flags __unused)
{
+
+ uio->uio_offset += uio->uio_resid;
+ uio->uio_resid = 0;
+
+ return (0);
+}
+
+/* ARGSUSED */
+static int
+null_read(struct cdev *dev __unused, struct uio *uio, int flags __unused)
+{
+
+ uio->uio_offset += uio->uio_resid;
uio->uio_resid = 0;
return (0);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[email protected]"