2008-06-17 14:13:45

by palani saravanan

[permalink] [raw]
Subject: Behavior of lseek() on a fd opened with 'RDONLY' flag, when seeking goes beyond file size.

Hi,

[Forgive me if this is not correct alias for this question.
(Behavior of lseek() on a fd opened with 'RDONLY' flag, when seeking goes beyond file size.)]

In linux, I see that it just goes beyond the file size and returns the resulting offset.
For example, 'rc = lseek(fd, 4L, SEEK_END);' on a file which has 5 byte contents,
it returns rc as 9.
I expect that it would return size of the file, i.e.) 5.

I am not finding any posix documentation for this either.

May I know the rational behind this behavior?
Does the file pointer internally really points to the new location.?

Thanks,
Saravanan



Meet people who discuss and share your passions. Go to http://in.promos.yahoo.com/groups/bestofyahoo/


2008-06-17 14:30:26

by David Newall

[permalink] [raw]
Subject: Re: Behavior of lseek() on a fd opened with 'RDONLY' flag, when seeking goes beyond file size.

palani saravanan wrote:
> In linux, I see that it just goes beyond the file size and returns the resulting offset.
> For example, 'rc = lseek(fd, 4L, SEEK_END);' on a file which has 5 byte contents,
> it returns rc as 9.
>

Sounds right. It's documented that way, too:

"The lseek() function allows the file offset to be set beyond the
end of the file (but this
does not change the size of the file)."
-- man 2 lseek
> I expect that it would return size of the file, i.e.) 5.
>

Only if you pass (0,SEEK_END).

> Does the file pointer internally really points to the new location.?
>

So the documentation promises.

2008-06-21 15:50:06

by palani saravanan

[permalink] [raw]
Subject: Re: Behavior of lseek() on a fd opened with 'RDONLY' flag, when seeking goes beyond file size.

Thanks David !

I have one more question, Does lseek() permits -ve value as offset, with SEEK_SET mode?
When I execute a simple c program to check that it doesn't return any error.

errno = 0;
rd_rc = lseek(rd_fd, -10, SEEK_SET);
returns rd_rc = -10 and errno remains 0.

>From the linux code, I am expecting the return value of -EINVAL,
when SEEK_SET is passed with negative offset (generic_file_llseek).
http://lxr.linux.no/linux/fs/read_write.c#L34
What is the expected behavior as per posix and linux?

Thanks,
Saravanan
----- Original Message ----
From: David Newall <[email protected]>
To: palani saravanan <[email protected]>
Cc: [email protected]
Sent: Tuesday, 17 June, 2008 8:00:09 PM
Subject: Re: Behavior of lseek() on a fd opened with 'RDONLY' flag, when seeking goes beyond file size.

palani saravanan wrote:
> In linux, I see that it just goes beyond the file size and returns the resulting offset.
> For example, 'rc = lseek(fd, 4L, SEEK_END);' on a file which has 5 byte contents,
> it returns rc as 9.
>

Sounds right. It's documented that way, too:

"The lseek() function allows the file offset to be set beyond the
end of the file (but this
does not change the size of the file)."
-- man 2 lseek
> I expect that it would return size of the file, i.e.) 5.
>

Only if you pass (0,SEEK_END).

> Does the file pointer internally really points to the new location.?
>

So the documentation promises.



Download prohibited? No problem. CHAT from any browser, without download. Go to http://in.messenger.yahoo.com/webmessengerpromo.php/

2008-06-22 02:06:41

by David Newall

[permalink] [raw]
Subject: Re: Behavior of lseek() on a fd opened with 'RDONLY' flag, when seeking goes beyond file size.

palani saravanan wrote:
> Does lseek() permits -ve value as offset, with SEEK_SET mode? ...
> errno = 0;
> rd_rc = lseek(rd_fd, -10, SEEK_SET);
> returns rd_rc = -10 and errno remains 0.
>

No, lseek does not permit negative file offsets, and should return
EINVAL in your example. You may have discovered a bug. For reference,
on my system lseek returns -1 and sets errno to EINVAL, as it should.

If you're running a recent kernel it might be worth looking closer into
this; for older kernels it's probably not worth the effort.

2008-06-23 08:39:03

by palani saravanan

[permalink] [raw]
Subject: Re: Behavior of lseek() on a fd opened with 'RDONLY' flag, when seeking goes beyond file size.

Thanks David for clarification !

I ran this program in the kernel version, 'Linux 2.6.9-42.7.ELsmp'.
However, In a recent kernel version, 'Linux 2.6.24-19 ', the error EINVAL is returned as you mentioned.

Thanks,
Saravanan
----- Original Message ----
From: David Newall <[email protected]>
To: palani saravanan <[email protected]>
Cc: [email protected]
Sent: Sunday, 22 June, 2008 7:36:12 AM
Subject: Re: Behavior of lseek() on a fd opened with 'RDONLY' flag, when seeking goes beyond file size.

palani saravanan wrote:
> Does lseek() permits -ve value as offset, with SEEK_SET mode? ...
> errno = 0;
> rd_rc = lseek(rd_fd, -10, SEEK_SET);
> returns rd_rc = -10 and errno remains 0.
>

No, lseek does not permit negative file offsets, and should return
EINVAL in your example. You may have discovered a bug. For reference,
on my system lseek returns -1 and sets errno to EINVAL, as it should.

If you're running a recent kernel it might be worth looking closer into
this; for older kernels it's probably not worth the effort.



Save all your chat conversations. Find them online at http://in.messenger.yahoo.com/webmessengerpromo.php