6b87a5642c
* sysdeps/mach/hurd/chown.c: Use INTDEF for __chown. * sysdeps/unix/sysv/aix/chown.c: Likewise. * sysdeps/unix/grantpt.c: Use INTUSE for __chown calls. * sysdeps/unix/sysv/linux/m68k/chown.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/chown.c: Likewise. * sysdeps/unix/sysv/linux/i386/chown.c: Use INTDEF2 to define __chown_internal. * sysdeps/unix/sysv/linux/s390/s390-32//chown.c: Likewise. * intl/dcngettext.c [_LIBC]: Use INTUSE for __dcngettext. * intl/dngettext.c [_LIBC] (DCNGETTEXT): Use INTUSE. * intl/ngettext.c: Likewise. * include/sys/socket.h: Declare __connect_internal and define __connect macro if not NOT_IN_libc. * sysdeps/mach/hurd/connect.c: Use INTDEF for __connect. * sysdeps/unix/sysv/aix/connect.c: Likewise. * sysdeps/unix/sysv/linux/connect.S: Add __connect_internal alias. * include/unistd.h: Declare __close_internal and define __close macro if not NOT_IN_libc. * libio/libioP.h (JUMO0, JUMP1, JUMP2, JUMP3, WJUMP0, WJUMP1, WJUMP2, WJUMP3): Add extra parenthesis to avoid expanding element names with macors like __close. * sysdeps/unix/syscalls.list: Add __close_internal alias. * include/unistd.h: Declare __dup2_internal and define __dup2 macro if not NOT_IN_libc. * sysdeps/mach/hurd/dup2.c: Use INTDEF for __dup2. * sysdeps/posix/dup2.c: Use INTDEF for __dup2. * sysdeps/unix/syscalls.list: Add __dup2_internal alias. * include/unistd.h: Declare __fork_internal and define __fork macro if not NOT_IN_libc. * sysdeps/mach/hurd/fork.c: Use INTDEF for __fork. * sysdeps/unix/sysv/aix/fork.c: Likewise. * sysdeps/unix/sysv/linux/syscalls.list: Add __fork_internal alias. * include/stdio_ext.h: Declare __fsetlocking_internal and define __fsetlocking macro to use it if not NOT_IN_libc. * libio/__fsetlocking.c: Use INTDEF for __fsetlocking. * libio/__fbufsize.c: Correct copyright. * libio/__flbf.c: Likewise. * libio/__fpending.c: Likewise. * libio/__fpurge.c: Likewise. * libio/__freadable.c: Likewise. * libio/__freading.c: Likewise. * libio/__fsetlocking.c: Likewise. * libio/__fwritable.c: Likewise. * libio/__fwriting.c: Likewise. * include/stdio.h: Declare __asprintf_internal and define __asprintf macro to use it if not NOT_IN_libc. * stdio-common/asprintf.c: Use INTDEF for __asprintf. * include/mntent.h: Declare __setmntent_internal, __getmntent_r_internal, __endmntent_internal. Define __setmntent, __getmntent_r, and __endmntent macros to use these functions if not NOT_IN_libc. * misc/mntent_r.c: Use INTDEF for __setmntent, __getmntent_r, and __endmntent. * include/math.h: Declare __finite_internal, __finitef_internal, and __finitel_internal. Redefine isfinite macro if in libc or libm using these functions. * sysdeps/generic/s_ldexp.c: Use INTUSE for __finite calls. * sysdeps/generic/s_ldexpf.c: Use INTUSE for __finitef calls. * sysdeps/generic/s_ldexpl.c: Use INTUSE for __finitel calls. * sysdeps/i386/fpu/s_finite.S: Define _internal alias. * sysdeps/i386/fpu/s_finitef.S: Likewise. * sysdeps/i386/fpu/s_finitel.S: Likewise. * sysdeps/ieee754/dbl-64/s_finite.c: Likewise. * sysdeps/ieee754/flt-32/s_finitef.c: Likewise. * sysdeps/ieee754/ldbl-128/s_finitel.c: Likewise. * sysdeps/ieee754/ldbl-96/s_finitel.c: Likewise. * include/fcntl.h: Declare __fcntl_internal. Define __fcntl macro to use this function if not NOT_IN_libc. * libio/iofdopen.c (_IO_fcntl): Use INTUSE. * sysdeps/generic/fcntl.c: Use INTDEF for __fcntl. * sysdeps/mach/hurd/fcntl.c: Likewise. * sysdeps/unix/sysv/aix/fcntl.c: Likewise. * sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise. * include/argz.h: Declare __argz_count_internal and __argz_stringify_internal. * intl/l10nflist.c [_LIBC]: Use INTUSE for __argz_count and __argz_stringify. * string/argz-count.c: Use INTDEF for __argz_count. * string/argz-stringify.c: Use INTDEF for __argz_stringify. * include/stdlib.h: Declare __cxa_atexit_internal and define __cxa_atexit macro if not NOT_IN_libc. * stdlib/cxa_atexit.c: Use INTDEF for __cxa_atexit. * dlfcn/Makefile: Define NOT_IN_libc when compiling modcxaatexit.c. * assert/assert.c: Use INTDEF for __assert_fail. * assert/__assert.c: Use INTUSE for call to __assert_fail. * include/assert.h: Declare __assert_fail_internal.
153 lines
4.5 KiB
C
153 lines
4.5 KiB
C
/* Copyright (C) 1993,1994,1997-1999,2000,2002 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, write to the Free
|
|
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307 USA.
|
|
|
|
As a special exception, if you link the code in this file with
|
|
files compiled with a GNU compiler to produce an executable,
|
|
that does not cause the resulting executable to be covered by
|
|
the GNU Lesser General Public License. This exception does not
|
|
however invalidate any other reasons why the executable file
|
|
might be covered by the GNU Lesser General Public License.
|
|
This exception applies to code released by its copyright holders
|
|
in files containing the exception. */
|
|
|
|
#ifdef __STDC__
|
|
# include <stdlib.h>
|
|
#endif
|
|
#include "libioP.h"
|
|
#include <fcntl.h>
|
|
|
|
#ifdef _LIBC
|
|
# include <shlib-compat.h>
|
|
#endif
|
|
|
|
#ifndef _IO_fcntl
|
|
#ifdef _LIBC
|
|
#define _IO_fcntl INTUSE(__fcntl)
|
|
#else
|
|
#define _IO_fcntl fcntl
|
|
#endif
|
|
#endif
|
|
|
|
_IO_FILE *
|
|
_IO_new_fdopen (fd, mode)
|
|
int fd;
|
|
const char *mode;
|
|
{
|
|
int read_write;
|
|
int posix_mode = 0;
|
|
struct locked_FILE
|
|
{
|
|
struct _IO_FILE_plus fp;
|
|
#ifdef _IO_MTSAFE_IO
|
|
_IO_lock_t lock;
|
|
#endif
|
|
struct _IO_wide_data wd;
|
|
} *new_f;
|
|
int fd_flags;
|
|
|
|
switch (*mode++)
|
|
{
|
|
case 'r':
|
|
read_write = _IO_NO_WRITES;
|
|
break;
|
|
case 'w':
|
|
read_write = _IO_NO_READS;
|
|
break;
|
|
case 'a':
|
|
posix_mode = O_APPEND;
|
|
read_write = _IO_NO_READS|_IO_IS_APPENDING;
|
|
break;
|
|
default:
|
|
MAYBE_SET_EINVAL;
|
|
return NULL;
|
|
}
|
|
if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+'))
|
|
read_write &= _IO_IS_APPENDING;
|
|
#ifdef F_GETFL
|
|
fd_flags = _IO_fcntl (fd, F_GETFL);
|
|
#ifndef O_ACCMODE
|
|
#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR)
|
|
#endif
|
|
if (fd_flags == -1)
|
|
return NULL;
|
|
|
|
if (((fd_flags & O_ACCMODE) == O_RDONLY && !(read_write & _IO_NO_WRITES))
|
|
|| ((fd_flags & O_ACCMODE) == O_WRONLY && !(read_write & _IO_NO_READS)))
|
|
{
|
|
MAYBE_SET_EINVAL;
|
|
return NULL;
|
|
}
|
|
|
|
/* The May 93 draft of P1003.4/D14.1 (redesignated as 1003.1b)
|
|
[System Application Program Interface (API) Amendment 1:
|
|
Realtime Extensions], Rationale B.8.3.3
|
|
Open a Stream on a File Descriptor says:
|
|
|
|
Although not explicitly required by POSIX.1, a good
|
|
implementation of append ("a") mode would cause the
|
|
O_APPEND flag to be set.
|
|
|
|
(Historical implementations [such as Solaris2] do a one-time
|
|
seek in fdopen.)
|
|
|
|
However, we do not turn O_APPEND off if the mode is "w" (even
|
|
though that would seem consistent) because that would be more
|
|
likely to break historical programs.
|
|
*/
|
|
if ((posix_mode & O_APPEND) && !(fd_flags & O_APPEND))
|
|
{
|
|
#ifdef F_SETFL
|
|
if (_IO_fcntl (fd, F_SETFL, fd_flags | O_APPEND) == -1)
|
|
#endif
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
|
|
if (new_f == NULL)
|
|
return NULL;
|
|
#ifdef _IO_MTSAFE_IO
|
|
new_f->fp.file._lock = &new_f->lock;
|
|
#endif
|
|
_IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, &INTUSE(_IO_wfile_jumps));
|
|
_IO_JUMPS (&new_f->fp) = &INTUSE(_IO_file_jumps);
|
|
INTUSE(_IO_file_init) (&new_f->fp);
|
|
#if !_IO_UNIFIED_JUMPTABLES
|
|
new_f->fp.vtable = NULL;
|
|
#endif
|
|
if (INTUSE(_IO_file_attach) ((_IO_FILE *) &new_f->fp, fd) == NULL)
|
|
{
|
|
INTUSE(_IO_setb) (&new_f->fp.file, NULL, NULL, 0);
|
|
INTUSE(_IO_un_link) (&new_f->fp);
|
|
free (new_f);
|
|
return NULL;
|
|
}
|
|
new_f->fp.file._flags &= ~_IO_DELETE_DONT_CLOSE;
|
|
|
|
new_f->fp.file._IO_file_flags =
|
|
_IO_mask_flags (&new_f->fp.file, read_write,
|
|
_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
|
|
|
|
return __fopen_maybe_mmap (&new_f->fp.file);
|
|
}
|
|
INTDEF2(_IO_new_fdopen, _IO_fdopen)
|
|
|
|
strong_alias (_IO_new_fdopen, __new_fdopen)
|
|
versioned_symbol (libc, _IO_new_fdopen, _IO_fdopen, GLIBC_2_1);
|
|
versioned_symbol (libc, __new_fdopen, fdopen, GLIBC_2_1);
|