diff options
| -rw-r--r-- | src/ipc/ipc.h | 6 | ||||
| -rw-r--r-- | src/ipc/msgctl.c | 13 | ||||
| -rw-r--r-- | src/ipc/semctl.c | 21 | ||||
| -rw-r--r-- | src/ipc/shmctl.c | 13 | 
4 files changed, 41 insertions, 12 deletions
| diff --git a/src/ipc/ipc.h b/src/ipc/ipc.h index 36f3e213..746a905c 100644 --- a/src/ipc/ipc.h +++ b/src/ipc/ipc.h @@ -16,3 +16,9 @@  #ifndef IPC_64  #define IPC_64 0x100  #endif + +#define IPC_TIME64 (IPC_STAT & 0x100) + +#define IPC_CMD(cmd) (((cmd) & ~IPC_TIME64) | IPC_64) + +#define IPC_HILO(b,t) ((b)->t = (b)->__##t##_lo | 0LL+(b)->__##t##_hi<<32) diff --git a/src/ipc/msgctl.c b/src/ipc/msgctl.c index 868197f6..b043041a 100644 --- a/src/ipc/msgctl.c +++ b/src/ipc/msgctl.c @@ -18,17 +18,24 @@ int msgctl(int q, int cmd, struct msqid_ds *buf)  	}  #endif  #ifndef SYS_ipc -	int r = __syscall(SYS_msgctl, q, cmd | IPC_64, buf); +	int r = __syscall(SYS_msgctl, q, IPC_CMD(cmd), buf);  #else -	int r = __syscall(SYS_ipc, IPCOP_msgctl, q, cmd | IPC_64, 0, buf, 0); +	int r = __syscall(SYS_ipc, IPCOP_msgctl, q, IPC_CMD(cmd), 0, buf, 0);  #endif  #ifdef SYSCALL_IPC_BROKEN_MODE -	if (r >= 0) switch (cmd) { +	if (r >= 0) switch (cmd | IPC_TIME64) {  	case IPC_STAT:  	case MSG_STAT:  	case MSG_STAT_ANY:  		buf->msg_perm.mode >>= 16;  	}  #endif +#if IPC_TIME64 +	if (r >= 0 && (cmd&IPC_TIME64)) { +		IPC_HILO(buf, msg_stime); +		IPC_HILO(buf, msg_rtime); +		IPC_HILO(buf, msg_ctime); +	} +#endif  	return __syscall_ret(r);  } diff --git a/src/ipc/semctl.c b/src/ipc/semctl.c index e5dd5359..ed982747 100644 --- a/src/ipc/semctl.c +++ b/src/ipc/semctl.c @@ -18,9 +18,12 @@ int semctl(int id, int num, int cmd, ...)  {  	union semun arg = {0};  	va_list ap; -	switch (cmd) { -	case SETVAL: case GETALL: case SETALL: case IPC_STAT: case IPC_SET: -	case IPC_INFO: case SEM_INFO: case SEM_STAT: case SEM_STAT_ANY: +	switch (cmd & ~IPC_TIME64) { +	case SETVAL: case GETALL: case SETALL: case IPC_SET: +	case IPC_INFO: case SEM_INFO: +	case IPC_STAT & ~IPC_TIME64: +	case SEM_STAT & ~IPC_TIME64: +	case SEM_STAT_ANY & ~IPC_TIME64:  		va_start(ap, cmd);  		arg = va_arg(ap, union semun);  		va_end(ap); @@ -34,17 +37,23 @@ int semctl(int id, int num, int cmd, ...)  	}  #endif  #ifndef SYS_ipc -	int r = __syscall(SYS_semctl, id, num, cmd | IPC_64, arg.buf); +	int r = __syscall(SYS_semctl, id, num, IPC_CMD(cmd), arg.buf);  #else -	int r = __syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | IPC_64, &arg.buf); +	int r = __syscall(SYS_ipc, IPCOP_semctl, id, num, IPC_CMD(cmd), &arg.buf);  #endif  #ifdef SYSCALL_IPC_BROKEN_MODE -	if (r >= 0) switch (cmd) { +	if (r >= 0) switch (cmd | IPC_TIME64) {  	case IPC_STAT:  	case SEM_STAT:  	case SEM_STAT_ANY:  		arg.buf->sem_perm.mode >>= 16;  	}  #endif +#if IPC_TIME64 +	if (r >= 0 && (cmd&IPC_TIME64)) { +		IPC_HILO(arg.buf, sem_otime); +		IPC_HILO(arg.buf, sem_ctime); +	} +#endif  	return __syscall_ret(r);  } diff --git a/src/ipc/shmctl.c b/src/ipc/shmctl.c index c2b2bb0d..de3ce9d4 100644 --- a/src/ipc/shmctl.c +++ b/src/ipc/shmctl.c @@ -18,17 +18,24 @@ int shmctl(int id, int cmd, struct shmid_ds *buf)  	}  #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 -	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 -	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;  	}  #endif +#if IPC_TIME64 +	if (r >= 0 && (cmd&IPC_TIME64)) { +		IPC_HILO(buf, shm_atime); +		IPC_HILO(buf, shm_dtime); +		IPC_HILO(buf, shm_ctime); +	} +#endif  	return __syscall_ret(r);  } | 
