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