mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-06 03:30:06 +00:00
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.
168 lines
5.1 KiB
C
168 lines
5.1 KiB
C
/* Copyright (C) 1998, 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. */
|
|
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
|
|
#include <sysdep.h>
|
|
#include <sys/syscall.h>
|
|
#include <shlib-compat.h>
|
|
#include <bp-checks.h>
|
|
|
|
#include <linux/posix_types.h>
|
|
#include "kernel-features.h"
|
|
|
|
/*
|
|
In Linux 2.1.x the chown functions have been changed. A new function lchown
|
|
was introduced. The new chown now follows symlinks - the old chown and the
|
|
new lchown do not follow symlinks.
|
|
The new lchown function has the same number as the old chown had and the
|
|
new chown has a new number. When compiling with headers from Linux > 2.1.8x
|
|
it's impossible to run this libc with older kernels. In these cases libc
|
|
has therefore to route calls to chown to the old chown function.
|
|
*/
|
|
|
|
extern int __syscall_chown (const char *__file,
|
|
__kernel_uid_t __owner, __kernel_gid_t __group);
|
|
|
|
extern int __chown_is_lchown (const char *__file, uid_t __owner,
|
|
gid_t __group);
|
|
extern int __real_chown (const char *__file, uid_t __owner, gid_t __group);
|
|
|
|
|
|
#if defined __NR_lchown || __ASSUME_LCHOWN_SYSCALL > 0
|
|
/* Running under Linux > 2.1.80. */
|
|
|
|
# ifdef __NR_chown32
|
|
extern int __syscall_chown32 (const char *__file,
|
|
__kernel_uid32_t owner, __kernel_gid32_t group);
|
|
# if __ASSUME_32BITUIDS == 0
|
|
/* This variable is shared with all files that need to check for 32bit
|
|
uids. */
|
|
extern int __libc_missing_32bit_uids;
|
|
# endif
|
|
# endif /* __NR_chown32 */
|
|
|
|
int
|
|
__real_chown (const char *file, uid_t owner, gid_t group)
|
|
{
|
|
# if __ASSUME_LCHOWN_SYSCALL == 0
|
|
static int __libc_old_chown;
|
|
int result;
|
|
|
|
if (!__libc_old_chown)
|
|
{
|
|
int saved_errno = errno;
|
|
# ifdef __NR_chown32
|
|
if (__libc_missing_32bit_uids <= 0)
|
|
{
|
|
int result;
|
|
int saved_errno = errno;
|
|
|
|
result = INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
|
if (result == 0 || errno != ENOSYS)
|
|
return result;
|
|
|
|
__set_errno (saved_errno);
|
|
__libc_missing_32bit_uids = 1;
|
|
}
|
|
# endif /* __NR_chown32 */
|
|
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
{
|
|
__set_errno (EINVAL);
|
|
return -1;
|
|
}
|
|
|
|
result = INLINE_SYSCALL (chown, 3, CHECK_STRING (file), owner, group);
|
|
|
|
if (result >= 0 || errno != ENOSYS)
|
|
return result;
|
|
|
|
__set_errno (saved_errno);
|
|
__libc_old_chown = 1;
|
|
}
|
|
|
|
return __lchown (file, owner, group);
|
|
# elif __ASSUME_32BITUIDS
|
|
/* This implies __ASSUME_LCHOWN_SYSCALL. */
|
|
return INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
|
# else
|
|
/* !__ASSUME_32BITUIDS && ASSUME_LCHOWN_SYSCALL */
|
|
# ifdef __NR_chown32
|
|
if (__libc_missing_32bit_uids <= 0)
|
|
{
|
|
int result;
|
|
int saved_errno = errno;
|
|
|
|
result = INLINE_SYSCALL (chown32, 3, CHECK_STRING (file), owner, group);
|
|
if (result == 0 || errno != ENOSYS)
|
|
return result;
|
|
|
|
__set_errno (saved_errno);
|
|
__libc_missing_32bit_uids = 1;
|
|
}
|
|
# endif /* __NR_chown32 */
|
|
if (((owner + 1) > (uid_t) ((__kernel_uid_t) -1U))
|
|
|| ((group + 1) > (gid_t) ((__kernel_gid_t) -1U)))
|
|
{
|
|
__set_errno (EINVAL);
|
|
return -1;
|
|
}
|
|
|
|
return INLINE_SYSCALL (chown, 3, CHECK_STRING (file), owner, group);
|
|
# endif
|
|
}
|
|
#endif
|
|
|
|
|
|
#if !defined __NR_lchown && __ASSUME_LCHOWN_SYSCALL == 0
|
|
/* Compiling under older kernels. */
|
|
int
|
|
__chown_is_lchown (const char *file, uid_t owner, gid_t group)
|
|
{
|
|
return INLINE_SYSCALL (chown, 3, CHECK_STRING (file), owner, group);
|
|
}
|
|
#elif SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
|
|
/* Compiling for compatibiity. */
|
|
int
|
|
__chown_is_lchown (const char *file, uid_t owner, gid_t group)
|
|
{
|
|
return __lchown (file, owner, group);
|
|
}
|
|
#endif
|
|
|
|
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
|
|
strong_alias (__chown_is_lchown, _chown_is_lchown)
|
|
compat_symbol (libc, __chown_is_lchown, __chown, GLIBC_2_0);
|
|
compat_symbol (libc, _chown_is_lchown, chown, GLIBC_2_0);
|
|
#endif
|
|
|
|
#ifdef __NR_lchown
|
|
INTDEF2(__real_chown, __chown)
|
|
strong_alias (__real_chown, _real_chown)
|
|
versioned_symbol (libc, __real_chown, __chown, GLIBC_2_1);
|
|
versioned_symbol (libc, _real_chown, chown, GLIBC_2_1);
|
|
#else
|
|
INTDEF2(__chown_is_lchown, __chown)
|
|
strong_alias (__chown_is_lchown, __chown_is_lchown21)
|
|
strong_alias (__chown_is_lchown, _chown_is_lchown21)
|
|
versioned_symbol (libc, __chown_is_lchown21, __chown, GLIBC_2_1);
|
|
versioned_symbol (libc, _chown_is_lchown21, chown, GLIBC_2_1);
|
|
#endif
|