1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00

linux: Move xmknod{at} to compat symbols

It also decouple mknod{at} from xmknod{at}.  The riscv32 ABI was added
on 2.33, so it is safe to remove the old __xmknot{at} symbols and just
provide the newer mknod{at} ones.

Checked with a build for all affected ABIs. I also checked on x86_64,
i686, powerpc, powerpc64le, sparcv9, sparc64, s390, and s390x.

Reviewed-by: Lukasz Majewski <lukma@denx.de>
This commit is contained in:
Adhemerval Zanella
2020-07-21 15:53:53 -03:00
parent aa03f722f3
commit 81b83ff61f
8 changed files with 101 additions and 40 deletions

View File

@ -80,10 +80,8 @@ libc_hidden_proto (__mknod);
extern int __xmknod (int __ver, const char *__path, __mode_t __mode, extern int __xmknod (int __ver, const char *__path, __mode_t __mode,
__dev_t *__dev); __dev_t *__dev);
libc_hidden_proto (__xmknod)
extern int __xmknodat (int __ver, int __fd, const char *__path, extern int __xmknodat (int __ver, int __fd, const char *__path,
__mode_t __mode, __dev_t *__dev); __mode_t __mode, __dev_t *__dev);
libc_hidden_proto (__xmknodat)
int __fxstat (int __ver, int __fildes, struct stat *__stat_buf); int __fxstat (int __ver, int __fildes, struct stat *__stat_buf);
int __xstat (int __ver, const char *__filename, int __xstat (int __ver, const char *__filename,
@ -109,6 +107,8 @@ hidden_proto (__xstat64);
hidden_proto (__lxstat64); hidden_proto (__lxstat64);
hidden_proto (__fxstatat64); hidden_proto (__fxstatat64);
# endif # endif
libc_hidden_proto (__xmknod)
libc_hidden_proto (__xmknodat)
# define stat(fname, buf) __xstat (_STAT_VER, fname, buf) # define stat(fname, buf) __xstat (_STAT_VER, fname, buf)
# define lstat(fname, buf) __lxstat (_STAT_VER, fname, buf) # define lstat(fname, buf) __lxstat (_STAT_VER, fname, buf)
# define __lstat(fname, buf) __lxstat (_STAT_VER, fname, buf) # define __lstat(fname, buf) __lxstat (_STAT_VER, fname, buf)

View File

@ -15,12 +15,9 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */ <https://www.gnu.org/licenses/>. */
#include <errno.h>
#include <fcntl.h>
#include <stddef.h>
#include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h>
#include <shlib-compat.h>
/* Create a device file named FILE_NAME, with permission and special bits MODE /* Create a device file named FILE_NAME, with permission and special bits MODE
and device number DEV (which can be constructed from major and minor and device number DEV (which can be constructed from major and minor
@ -31,3 +28,13 @@ __xmknod (int vers, const char *file_name, mode_t mode, dev_t *dev)
return __xmknodat (vers, AT_FDCWD, file_name, mode, dev); return __xmknodat (vers, AT_FDCWD, file_name, mode, dev);
} }
libc_hidden_def (__xmknod) libc_hidden_def (__xmknod)
#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
int
__xmknod_compat (int vers, const char *file_name, mode_t mode, dev_t *dev)
{
return __xmknod (vers, file_name, mode, dev);
}
compat_symbol (libc, __xmknod_compat, __xmknod, GLIBC_2_0);
#endif

View File

@ -26,6 +26,7 @@
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#include <shlib-compat.h>
/* Create a device file named PATH relative to FD, with permission and /* Create a device file named PATH relative to FD, with permission and
special bits MODE and device number DEV (which can be constructed special bits MODE and device number DEV (which can be constructed
@ -116,5 +117,14 @@ __xmknodat (int vers, int fd, const char *path, mode_t mode, dev_t *dev)
return __hurd_fail (err); return __hurd_fail (err);
return 0; return 0;
} }
libc_hidden_def (__xmknodat) libc_hidden_def (__xmknodat)
#if SHLIB_COMPAT(libc, GLIBC_2_4, GLIBC_2_33)
int
__xmknodat_compat (int vers, int fd, const char *path, mode_t mode, dev_t *dev)
{
return __xmknodat (vers, fd, path, mode, dev);
}
compat_symbol (libc, __xmknodat_compat, __xmknodat, GLIBC_2_4);
#endif

View File

@ -0,0 +1,28 @@
/* Create a special or ordinary file. Linux version.
Copyright (C) 2020 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, see
<https://www.gnu.org/licenses/>. */
#include <sys/stat.h>
#include <fcntl.h>
int
__mknod (const char *path, mode_t mode, dev_t dev)
{
return __mknodat (AT_FDCWD, path, mode, dev);
}
libc_hidden_def (__mknod)
weak_alias (__mknod, mknod)

View File

@ -0,0 +1,35 @@
/* Create a special or ordinary file. Linux version.
Copyright (C) 2020 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, see
<https://www.gnu.org/licenses/>. */
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int
__mknodat (int fd, const char *path, mode_t mode, dev_t dev)
{
/* The user-exported dev_t is 64-bit while the kernel interface is
32-bit. */
unsigned int k_dev = dev;
if (k_dev != dev)
return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
return INLINE_SYSCALL_CALL (mknodat, fd, path, mode, k_dev);
}
libc_hidden_def (__mknodat)
weak_alias (__mknodat, mknodat)

View File

@ -478,8 +478,6 @@ GLIBC_2.33 __wprintf_chk F
GLIBC_2.33 __write F GLIBC_2.33 __write F
GLIBC_2.33 __wuflow F GLIBC_2.33 __wuflow F
GLIBC_2.33 __wunderflow F GLIBC_2.33 __wunderflow F
GLIBC_2.33 __xmknod F
GLIBC_2.33 __xmknodat F
GLIBC_2.33 __xpg_basename F GLIBC_2.33 __xpg_basename F
GLIBC_2.33 __xpg_sigpause F GLIBC_2.33 __xpg_sigpause F
GLIBC_2.33 __xpg_strerror_r F GLIBC_2.33 __xpg_strerror_r F

View File

@ -17,29 +17,23 @@
<https://www.gnu.org/licenses/>. */ <https://www.gnu.org/licenses/>. */
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/sysmacros.h>
#include <fcntl.h> #include <fcntl.h>
#include <sysdep.h> #include <errno.h>
#include <shlib-compat.h>
#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_33)
/* Create a device file named PATH, with permission and special bits MODE /* Create a device file named PATH, with permission and special bits MODE
and device number DEV (which can be constructed from major and minor and device number DEV (which can be constructed from major and minor
device numbers with the `makedev' macro above). */ device numbers with the `makedev' macro above). */
int int
attribute_compat_text_section
__xmknod (int vers, const char *path, mode_t mode, dev_t *dev) __xmknod (int vers, const char *path, mode_t mode, dev_t *dev)
{ {
unsigned long long int k_dev;
if (vers != _MKNOD_VER) if (vers != _MKNOD_VER)
return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL); return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
/* We must convert the value to dev_t type used by the kernel. */ return __mknodat (AT_FDCWD, path, mode, *dev);
k_dev = (*dev) & ((1ULL << 32) - 1);
if (k_dev != *dev)
return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
return INLINE_SYSCALL_CALL (mknodat, AT_FDCWD, path, mode,
(unsigned int) k_dev);
} }
weak_alias (__xmknod, _xmknod) compat_symbol (libc, __xmknod, __xmknod, GLIBC_2_0);
libc_hidden_def (__xmknod) #endif

View File

@ -15,18 +15,11 @@
License along with the GNU C Library; if not, see License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */ <https://www.gnu.org/licenses/>. */
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/sysmacros.h> #include <errno.h>
#include <shlib-compat.h>
#include <sysdep.h>
#include <sys/syscall.h>
#if SHLIB_COMPAT(libc, GLIBC_2_4, GLIBC_2_33)
/* Create a device file named PATH relative to FD, with permission and /* Create a device file named PATH relative to FD, with permission and
special bits MODE and device number DEV (which can be constructed special bits MODE and device number DEV (which can be constructed
from major and minor device numbers with the `makedev' macro above). */ from major and minor device numbers with the `makedev' macro above). */
@ -36,12 +29,8 @@ __xmknodat (int vers, int fd, const char *file, mode_t mode, dev_t *dev)
if (vers != _MKNOD_VER) if (vers != _MKNOD_VER)
return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL); return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
/* We must convert the value to dev_t type used by the kernel. */ return __mknodat (fd, file, mode, *dev);
unsigned long long int k_dev = (*dev) & ((1ULL << 32) - 1);
if (k_dev != *dev)
return INLINE_SYSCALL_ERROR_RETURN_VALUE (EINVAL);
return INLINE_SYSCALL (mknodat, 4, fd, file, mode, (unsigned int) k_dev);
} }
libc_hidden_def (__xmknodat) compat_symbol (libc, __xmknodat, __xmknodat, GLIBC_2_4);
#endif