Bug 215848 - fopen(3): Incorrect good practice suggestion
Summary: fopen(3): Incorrect good practice suggestion
Status: RESOLVED CODE_FIX
Alias: None
Product: Documentation
Classification: Unclassified
Component: man-pages (show other bugs)
Hardware: All Linux
: P1 normal
Assignee: documentation_man-pages@kernel-bugs.osdl.org
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-04-17 17:05 UTC by Avinash Sonawane
Modified: 2022-05-14 12:37 UTC (History)
1 user (show)

See Also:
Kernel Version:
Subsystem:
Regression: No
Bisected commit-id:


Attachments

Description Avinash Sonawane 2022-04-17 17:05:16 UTC
Hello!

From fopen(3):
"Therefore it is good practice (and indeed sometimes necessary under Linux) to put an fseek(3) or fgetpos(3) operation between write and read operations on such a stream."

I am not sure about the origin of this good practice but fgetpos(3) seems wrong. It has to be fsetpos(3) if I'm reading the C standard and POSIX[0] correctly.

BTW, calling fsetpos(3) will require a call to fgetpos(3) first. So why is it being advised as a good practice to call two functions (`fgetpos` and then `fsetpos`)? Maybe just i) mention fseek(3) only OR ii) mention fseek(3) and fflush(3) (instead of fsetpos(3))?

[0] https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/functions/fopen.html

Thanks!

Regards,
Avinash Sonawane (rootKea)
https://www.rootkea.me
Comment 1 Avinash Sonawane 2022-04-18 03:32:14 UTC
I think we should only mention using `fseek` as a good practice between read and write operations since:
a. fflush can't be used on input stream i.e. if last operation was read while fseek() can be used between read-write or write-read.

b. fsetpos needs fgetpos to be called first. So let's drop `fgetpos+fsetpos` from the good practice suggestion

So I suggest this small change:
diff --git a/man3/fopen.3 b/man3/fopen.3
index a1d781706..fb289a537 100644
--- a/man3/fopen.3
+++ b/man3/fopen.3
@@ -138,8 +138,6 @@ result of writes other than the most recent.)
 Therefore it is good practice (and indeed sometimes necessary
 under Linux) to put an
 .BR fseek (3)
-or
-.BR fgetpos (3)
 operation between write and read operations on such a stream.
 This operation may be an apparent no-op
 (as in \fIfseek(..., 0L, SEEK_CUR)\fP

Thanks!
Comment 2 Alejandro Colomar 2022-05-14 12:37:07 UTC
Hi Avinash,

I decided to keep fsetpos(3) to not lose the info, so I applied the following patch:


    fopen.3: tfix
    
    Reported-by: Avinash Sonawane <rootkea@gmail.com>
    Signed-off-by: Alejandro Colomar <alx.manpages@gmail.com>

diff --git a/man3/fopen.3 b/man3/fopen.3
index b9bbc4704..465031167 100644
--- a/man3/fopen.3
+++ b/man3/fopen.3
@@ -114,7 +114,7 @@ Therefore it is good practice (and indeed sometimes necessary
 under Linux) to put an
 .BR fseek (3)
 or
-.BR fgetpos (3)
+.BR fsetpos (3)
 operation between write and read operations on such a stream.
 This operation may be an apparent no-op
 (as in \fIfseek(..., 0L, SEEK_CUR)\fP

Note You need to log in before you can comment on or make changes to this bug.