mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
fileno(3): set errno when returning -1
PR: 283014 (cherry picked from commit 7cd756ff4fe7e65a9a3f588904998bf6f4b37623)
This commit is contained in:
parent
fb0014d04e
commit
9fb5c02356
3 changed files with 38 additions and 11 deletions
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ,
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue