fileno(3): set errno when returning -1

PR:	283014

(cherry picked from commit 7cd756ff4fe7e65a9a3f588904998bf6f4b37623)
This commit is contained in:
Konstantin Belousov 2024-11-29 00:12:29 +02:00
parent fb0014d04e
commit 9fb5c02356
3 changed files with 38 additions and 11 deletions

View file

@ -497,10 +497,6 @@ extern int __isthreaded;
#define ferror(p) (!__isthreaded ? __sferror(p) : (ferror)(p))
#define clearerr(p) (!__isthreaded ? __sclearerr(p) : (clearerr)(p))
#if __POSIX_VISIBLE
#define fileno(p) (!__isthreaded ? __sfileno(p) : (fileno)(p))
#endif
#define getc(fp) (!__isthreaded ? __sgetc(fp) : (getc)(fp))
#define putc(x, fp) (!__isthreaded ? __sputc(x, fp) : (putc)(x, fp))

View file

@ -112,9 +112,25 @@ before calling them.
These functions may be used to avoid the overhead of locking the stream
and to prevent races when multiple threads are operating on the same stream.
.Sh ERRORS
These functions should not fail and do not set the external
variable
These functions, except
.Fn fileno ,
should not fail and do not set the external variable
.Va errno .
.Pp
On error,
.Fn fileno
returns \-1 and sets
.Va errno
to one of the following values:
.Bl -tag -width Er
.It Bq Er EBADF
The stream is not associated with a file.
.It Bq Er EBADF
The file descriptor underlying stream is not a valid file descriptor.
.Pp
Note that detection of this condition is not reliable, the error might
be not reported.
.El
.Sh SEE ALSO
.Xr open 2 ,
.Xr fdopen 3 ,

View file

@ -36,6 +36,7 @@
static char sccsid[] = "@(#)fileno.c 8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#include "namespace.h"
#include <errno.h>
#include <stdio.h>
#include "un-namespace.h"
#include "libc_private.h"
@ -43,14 +44,29 @@ static char sccsid[] = "@(#)fileno.c 8.1 (Berkeley) 6/4/93";
#undef fileno
#undef fileno_unlocked
static int
__fileno_impl(FILE *fp)
{
int fd;
fd = fp->_file;
if (fd == -1)
errno = EBADF;
return (fd);
}
int
fileno(FILE *fp)
{
int fd;
FLOCKFILE(fp);
fd = __sfileno(fp);
FUNLOCKFILE(fp);
if (__isthreaded) {
FLOCKFILE(fp);
fd = __fileno_impl(fp);
FUNLOCKFILE(fp);
} else {
fd = __fileno_impl(fp);
}
return (fd);
}
@ -58,6 +74,5 @@ fileno(FILE *fp)
int
fileno_unlocked(FILE *fp)
{
return (__sfileno(fp));
return (__fileno_impl(fp));
}