]> git.ipfire.org Git - thirdparty/glibc.git/blame - libio/freopen64.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / libio / freopen64.c
CommitLineData
f7a9f785 1/* Copyright (C) 1993-2016 Free Software Foundation, Inc.
41bdb6e2 2 This file is part of the GNU C Library.
dfd2257a 3
41bdb6e2
AJ
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
dfd2257a 8
41bdb6e2
AJ
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
dfd2257a 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
dfd2257a 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6
PE
15 License along with the GNU C Library; if not, see
16 <http://www.gnu.org/licenses/>.
dfd2257a 17
41bdb6e2
AJ
18 As a special exception, if you link the code in this file with
19 files compiled with a GNU compiler to produce an executable,
20 that does not cause the resulting executable to be covered by
21 the GNU Lesser General Public License. This exception does not
22 however invalidate any other reasons why the executable file
23 might be covered by the GNU Lesser General Public License.
24 This exception applies to code released by its copyright holders
25 in files containing the exception. */
dfd2257a
UD
26
27#include "libioP.h"
28#include "stdio.h"
94b7cc37 29#include <fcntl.h>
1a35b7fd 30#include <stdlib.h>
94b7cc37 31#include <unistd.h>
dfd2257a 32
c44a663d
UD
33#include <fd_to_filename.h>
34
37233df9
TS
35#include <kernel-features.h>
36
dfd2257a 37FILE *
9d46370c 38freopen64 (const char *filename, const char *mode, FILE *fp)
dfd2257a 39{
dfd2257a
UD
40 FILE *result;
41 CHECK_FILE (fp, NULL);
42 if (!(fp->_flags & _IO_IS_FILEBUF))
43 return NULL;
0261d33f 44 _IO_acquire_lock (fp);
94b7cc37
UD
45 int fd = _IO_fileno (fp);
46 const char *gfilename = (filename == NULL && fd >= 0
47 ? fd_to_filename (fd) : filename);
48 fp->_flags2 |= _IO_FLAGS2_NOCLOSE;
d18ea0c5 49 _IO_file_close_it (fp);
e69dcccb 50 _IO_JUMPS_FILE_plus (fp) = &_IO_file_jumps;
bbdef797 51 if (_IO_vtable_offset (fp) == 0 && fp->_wide_data != NULL)
15a686af 52 fp->_wide_data->_wide_vtable = &_IO_wfile_jumps;
d18ea0c5 53 result = _IO_file_fopen (fp, gfilename, mode, 0);
94b7cc37 54 fp->_flags2 &= ~_IO_FLAGS2_NOCLOSE;
81c64d40
UD
55 if (result != NULL)
56 result = __fopen_maybe_mmap (result);
3b1de3ba 57 if (result != NULL)
c44a663d 58 {
94b7cc37
UD
59 /* unbound stream orientation */
60 result->_mode = 0;
61
62 if (fd != -1)
63 {
64#ifdef O_CLOEXEC
65# ifndef __ASSUME_DUP3
66 int newfd;
67 if (__have_dup3 < 0)
68 newfd = -1;
69 else
70 newfd =
71# endif
dc70356c
TS
72 __dup3 (_IO_fileno (result), fd,
73 (result->_flags2 & _IO_FLAGS2_CLOEXEC) != 0
74 ? O_CLOEXEC : 0);
94b7cc37
UD
75#else
76# define newfd 1
77#endif
78
79#ifndef __ASSUME_DUP3
80 if (newfd < 0)
81 {
82 if (errno == ENOSYS)
83 __have_dup3 = -1;
84
ed690b2f 85 __dup2 (_IO_fileno (result), fd);
94b7cc37
UD
86 if ((result->_flags2 & _IO_FLAGS2_CLOEXEC) != 0)
87 __fcntl (fd, F_SETFD, FD_CLOEXEC);
88 }
89#endif
90 __close (_IO_fileno (result));
91 _IO_fileno (result) = fd;
92 }
c44a663d 93 }
94b7cc37
UD
94 else if (fd != -1)
95 __close (fd);
96 if (filename == NULL)
97 free ((char *) gfilename);
0261d33f 98 _IO_release_lock (fp);
dfd2257a 99 return result;
dfd2257a 100}