]> git.ipfire.org Git - thirdparty/glibc.git/blame - libio/freopen64.c
Update copyright notices with scripts/update-copyrights
[thirdparty/glibc.git] / libio / freopen64.c
CommitLineData
d4697bc9 1/* Copyright (C) 1993-2014 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
UD
37FILE *
38freopen64 (filename, mode, fp)
39 const char* filename;
40 const char* mode;
41 FILE *fp;
42{
dfd2257a
UD
43 FILE *result;
44 CHECK_FILE (fp, NULL);
45 if (!(fp->_flags & _IO_IS_FILEBUF))
46 return NULL;
0261d33f 47 _IO_acquire_lock (fp);
94b7cc37
UD
48 int fd = _IO_fileno (fp);
49 const char *gfilename = (filename == NULL && fd >= 0
50 ? fd_to_filename (fd) : filename);
51 fp->_flags2 |= _IO_FLAGS2_NOCLOSE;
d18ea0c5 52 _IO_file_close_it (fp);
15a686af 53 _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps;
bbdef797 54 if (_IO_vtable_offset (fp) == 0 && fp->_wide_data != NULL)
15a686af 55 fp->_wide_data->_wide_vtable = &_IO_wfile_jumps;
d18ea0c5 56 result = _IO_file_fopen (fp, gfilename, mode, 0);
94b7cc37 57 fp->_flags2 &= ~_IO_FLAGS2_NOCLOSE;
81c64d40
UD
58 if (result != NULL)
59 result = __fopen_maybe_mmap (result);
3b1de3ba 60 if (result != NULL)
c44a663d 61 {
94b7cc37
UD
62 /* unbound stream orientation */
63 result->_mode = 0;
64
65 if (fd != -1)
66 {
67#ifdef O_CLOEXEC
68# ifndef __ASSUME_DUP3
69 int newfd;
70 if (__have_dup3 < 0)
71 newfd = -1;
72 else
73 newfd =
74# endif
dc70356c
TS
75 __dup3 (_IO_fileno (result), fd,
76 (result->_flags2 & _IO_FLAGS2_CLOEXEC) != 0
77 ? O_CLOEXEC : 0);
94b7cc37
UD
78#else
79# define newfd 1
80#endif
81
82#ifndef __ASSUME_DUP3
83 if (newfd < 0)
84 {
85 if (errno == ENOSYS)
86 __have_dup3 = -1;
87
ed690b2f 88 __dup2 (_IO_fileno (result), fd);
94b7cc37
UD
89 if ((result->_flags2 & _IO_FLAGS2_CLOEXEC) != 0)
90 __fcntl (fd, F_SETFD, FD_CLOEXEC);
91 }
92#endif
93 __close (_IO_fileno (result));
94 _IO_fileno (result) = fd;
95 }
c44a663d 96 }
94b7cc37
UD
97 else if (fd != -1)
98 __close (fd);
99 if (filename == NULL)
100 free ((char *) gfilename);
0261d33f 101 _IO_release_lock (fp);
dfd2257a 102 return result;
dfd2257a 103}