1 #include "stdio_impl.h"
5 /* The basic idea of this implementation is to open a new FILE,
6 * hack the necessary parts of the new FILE into the old one, then
7 * close the new FILE. */
9 /* Locking IS necessary because another thread may provably hold the
10 * lock, via flockfile or otherwise, when freopen is called, and in that
11 * case, freopen cannot act until the lock is released. */
13 FILE *freopen(const char *restrict filename
, const char *restrict mode
, FILE *restrict f
)
15 int fl
= __fmodeflags(mode
);
24 __syscall(SYS_fcntl
, f
->fd
, F_SETFD
, FD_CLOEXEC
);
25 fl
&= ~(O_CREAT
|O_EXCL
|O_CLOEXEC
);
26 if (syscall(SYS_fcntl
, f
->fd
, F_SETFL
, fl
) < 0)
29 f2
= fopen(filename
, mode
);
31 if (f2
->fd
== f
->fd
) f2
->fd
= -1; /* avoid closing in fclose */
32 else if (__dup3(f2
->fd
, f
->fd
, fl
&O_CLOEXEC
)<0) goto fail2
;
34 f
->flags
= (f
->flags
& F_PERM
) | f2
->flags
;