projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix inconsistent signature of __libc_start_main
[musl]
/
src
/
ipc
/
shmctl.c
diff --git
a/src/ipc/shmctl.c
b/src/ipc/shmctl.c
index
c2b2bb0
..
1c9f78c
100644
(file)
--- a/
src/ipc/shmctl.c
+++ b/
src/ipc/shmctl.c
@@
-9,6
+9,14
@@
int shmctl(int id, int cmd, struct shmid_ds *buf)
{
int shmctl(int id, int cmd, struct shmid_ds *buf)
{
+#if IPC_TIME64
+ struct shmid_ds out, *orig;
+ if (cmd&IPC_TIME64) {
+ out = (struct shmid_ds){0};
+ orig = buf;
+ buf = &out;
+ }
+#endif
#ifdef SYSCALL_IPC_BROKEN_MODE
struct shmid_ds tmp;
if (cmd == IPC_SET) {
#ifdef SYSCALL_IPC_BROKEN_MODE
struct shmid_ds tmp;
if (cmd == IPC_SET) {
@@
-18,17
+26,26
@@
int shmctl(int id, int cmd, struct shmid_ds *buf)
}
#endif
#ifndef SYS_ipc
}
#endif
#ifndef SYS_ipc
- int r = __syscall(SYS_shmctl, id,
cmd | IPC_64
, buf);
+ int r = __syscall(SYS_shmctl, id,
IPC_CMD(cmd)
, buf);
#else
#else
- int r = __syscall(SYS_ipc, IPCOP_shmctl, id,
cmd | IPC_64
, 0, buf, 0);
+ int r = __syscall(SYS_ipc, IPCOP_shmctl, id,
IPC_CMD(cmd)
, 0, buf, 0);
#endif
#ifdef SYSCALL_IPC_BROKEN_MODE
#endif
#ifdef SYSCALL_IPC_BROKEN_MODE
- if (r >= 0) switch (cmd) {
+ if (r >= 0) switch (cmd
| IPC_TIME64
) {
case IPC_STAT:
case SHM_STAT:
case SHM_STAT_ANY:
buf->shm_perm.mode >>= 16;
}
case IPC_STAT:
case SHM_STAT:
case SHM_STAT_ANY:
buf->shm_perm.mode >>= 16;
}
+#endif
+#if IPC_TIME64
+ if (r >= 0 && (cmd&IPC_TIME64)) {
+ buf = orig;
+ *buf = out;
+ IPC_HILO(buf, shm_atime);
+ IPC_HILO(buf, shm_dtime);
+ IPC_HILO(buf, shm_ctime);
+ }
#endif
return __syscall_ret(r);
}
#endif
return __syscall_ret(r);
}