mirror of
https://sourceware.org/git/glibc.git
synced 2025-10-23 02:12:24 +03:00
To provide a y2038 safe interface a new symbol __msgctl64 is added
and __msgctl is change to call it instead (it adds some extra buffer
coping for the 32 bit time_t implementation).
Two new structures are added:
1. kernel_msqid64_ds: used internally only on 32-bit architectures
to issue the syscall. A handful of architectures (hppa, i386, mips,
powerpc32, and sparc32) require specific implementations due to
their kernel ABI.
2. msqid_ds64: this is only for __TIMESIZE != 64 to use along with
the 64-bit msgctl. It is different than the kernel struct because
the exported 64-bit time_t might require different alignment
depending on the architecture ABI.
So the resulting implementation does:
1. For 64-bit architectures it assumes msqid_ds already contains
64-bit time_t fields and will result in just the __msgctl symbol
using the __msgctl64 code. The msgid_ds argument is passed as-is
to the syscall.
2. For 32-bit architectures with default 64-bit time_t (newer ABIs
such riscv32 or arc), it will also result in only one exported
symbol but with the required high/low time handling.
3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t
support we follow the already set way to provide one symbol with
64-bit time_t support and implement the 32-bit time_t support using
the 64-bit time_t.
The default 32-bit symbol will allocate and copy the msqid_ds
over multiple buffers, but this should be deprecated in favor
of the __msgctl64 anyway.
Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff
tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and
sparc64.
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Tested-by: Alistair Francis <alistair.francis@wdc.com>
34 lines
880 B
C
34 lines
880 B
C
/* Analogous to kernel struct msqid64_ds used on msgctl. */
|
|
struct kernel_msqid64_ds
|
|
{
|
|
struct ipc_perm msg_perm;
|
|
#if __TIMESIZE == 32
|
|
# ifdef __MIPSEL__
|
|
unsigned long int msg_stime;
|
|
unsigned long int msg_stime_high;
|
|
unsigned long int msg_rtime;
|
|
unsigned long int msg_rtime_high;
|
|
unsigned long int msg_ctime;
|
|
unsigned long int msg_ctime_high;
|
|
# else
|
|
unsigned long int msg_stime_high;
|
|
unsigned long int msg_stime;
|
|
unsigned long int msg_rtime_high;
|
|
unsigned long int msg_rtime;
|
|
unsigned long int msg_ctime_high;
|
|
unsigned long int msg_ctime;
|
|
# endif
|
|
#else
|
|
unsigned long int msg_stime;
|
|
unsigned long int msg_rtime;
|
|
unsigned long int msg_ctime;
|
|
#endif
|
|
unsigned long int msg_cbytes;
|
|
unsigned long int msg_qnum;
|
|
unsigned long int msg_qbytes;
|
|
__pid_t msg_lspid;
|
|
__pid_t msg_lrpid;
|
|
unsigned long int __unused1;
|
|
unsigned long int __unused2;
|
|
};
|