ipc.c: use printaddr and umove_or_printaddr
* ipc.c (sys_msgctl): Use printaddr. (tprint_msgbuf): New function. (tprint_msgsnd, tprint_msgrcv): Use it. (sys_msgrcv): Use umove_or_printaddr. (tprint_sembuf): Rename to tprint_sembuf_array. (tprint_sembuf): New function. (tprint_sembuf_array): Use it. (sys_semop, sys_semtimedop): Update callers. (sys_shmctl, sys_shmat, sys_shmdt): Use printaddr. (sys_mq_open, printmqattr): Use printaddr and umove_or_printaddr. * tests/ipc_msg.c (main): Update msgctl IPC_RMID regexp. * tests/ipc_shm.c (main): Update shmctl IPC_RMID regexp.
This commit is contained in:
parent
2f444dc871
commit
2370d53281
160
ipc.c
160
ipc.c
@ -102,24 +102,29 @@ SYS_FUNC(msgctl)
|
||||
{
|
||||
tprintf("%lu, ", tcp->u_arg[0]);
|
||||
PRINTCTL(msgctl_flags, tcp->u_arg[1], "MSG_???");
|
||||
tprintf(", %#lx", tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
|
||||
tprints(", ");
|
||||
printaddr(tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
|
||||
return RVAL_DECODED;
|
||||
}
|
||||
|
||||
static void
|
||||
tprint_msgsnd(struct tcb *tcp, long addr, unsigned long count,
|
||||
unsigned long flags)
|
||||
tprint_msgbuf(struct tcb *tcp, const long addr, const unsigned long count)
|
||||
{
|
||||
long mtype;
|
||||
|
||||
if (umove(tcp, addr, &mtype) < 0) {
|
||||
tprintf("%#lx", addr);
|
||||
} else {
|
||||
if (!umove_or_printaddr(tcp, addr, &mtype)) {
|
||||
tprintf("{%lu, ", mtype);
|
||||
printstr(tcp, addr + sizeof(mtype), count);
|
||||
tprints("}");
|
||||
}
|
||||
tprintf(", %lu, ", count);
|
||||
}
|
||||
|
||||
static void
|
||||
tprint_msgsnd(struct tcb *tcp, const long addr, const unsigned long count,
|
||||
const unsigned long flags)
|
||||
{
|
||||
tprint_msgbuf(tcp, addr, count);
|
||||
printflags(ipc_msg_flags, flags, "MSG_???");
|
||||
}
|
||||
|
||||
@ -137,18 +142,11 @@ SYS_FUNC(msgsnd)
|
||||
}
|
||||
|
||||
static void
|
||||
tprint_msgrcv(struct tcb *tcp, long addr, unsigned long count, long msgtyp)
|
||||
tprint_msgrcv(struct tcb *tcp, const long addr, const unsigned long count,
|
||||
const long msgtyp)
|
||||
{
|
||||
long mtype;
|
||||
|
||||
if (syserror(tcp) || umove(tcp, addr, &mtype) < 0) {
|
||||
tprintf("%#lx", addr);
|
||||
} else {
|
||||
tprintf("{%lu, ", mtype);
|
||||
printstr(tcp, addr + sizeof(mtype), count);
|
||||
tprints("}");
|
||||
}
|
||||
tprintf(", %lu, %ld, ", count, msgtyp);
|
||||
tprint_msgbuf(tcp, addr, count);
|
||||
tprintf("%ld, ", msgtyp);
|
||||
}
|
||||
|
||||
SYS_FUNC(msgrcv)
|
||||
@ -162,13 +160,11 @@ SYS_FUNC(msgrcv)
|
||||
long msgtyp;
|
||||
} tmp;
|
||||
|
||||
if (umove(tcp, tcp->u_arg[3], &tmp) < 0) {
|
||||
tprintf("%#lx, %lu, ",
|
||||
tcp->u_arg[3], tcp->u_arg[1]);
|
||||
} else {
|
||||
if (umove_or_printaddr(tcp, tcp->u_arg[3], &tmp))
|
||||
tprintf(", %lu, ", tcp->u_arg[1]);
|
||||
else
|
||||
tprint_msgrcv(tcp, (long) tmp.msgp,
|
||||
tcp->u_arg[1], tmp.msgtyp);
|
||||
}
|
||||
printflags(ipc_msg_flags, tcp->u_arg[2], "MSG_???");
|
||||
} else {
|
||||
tprint_msgrcv(tcp, tcp->u_arg[1],
|
||||
@ -180,54 +176,55 @@ SYS_FUNC(msgrcv)
|
||||
}
|
||||
|
||||
static void
|
||||
tprint_sembuf(struct tcb *tcp, long addr, unsigned long count)
|
||||
tprint_sembuf(const struct sembuf *sb)
|
||||
{
|
||||
unsigned long i, max_count;
|
||||
tprintf("{%u, %d, ", sb->sem_num, sb->sem_op);
|
||||
printflags(semop_flags, sb->sem_flg, "SEM_???");
|
||||
tprints("}");
|
||||
}
|
||||
|
||||
static void
|
||||
tprint_sembuf_array(struct tcb *tcp, const long addr, const unsigned long count)
|
||||
{
|
||||
unsigned long max_count;
|
||||
struct sembuf sb;
|
||||
|
||||
if (abbrev(tcp))
|
||||
max_count = (max_strlen < count) ? max_strlen : count;
|
||||
else
|
||||
max_count = count;
|
||||
|
||||
if (!max_count) {
|
||||
tprintf("%#lx, %lu", addr, count);
|
||||
return;
|
||||
}
|
||||
if (!max_count)
|
||||
printaddr(addr);
|
||||
else if (!umove_or_printaddr(tcp, addr, &sb)) {
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < max_count; ++i) {
|
||||
struct sembuf sb;
|
||||
if (i)
|
||||
tprints("[");
|
||||
tprint_sembuf(&sb);
|
||||
|
||||
for (i = 1; i < max_count; ++i) {
|
||||
tprints(", ");
|
||||
if (umove(tcp, addr + i * sizeof(struct sembuf), &sb) < 0) {
|
||||
if (i) {
|
||||
tprints("{???}");
|
||||
if (umove_or_printaddr(tcp, addr + i * sizeof(sb), &sb))
|
||||
break;
|
||||
} else {
|
||||
tprintf("%#lx, %lu", addr, count);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (!i)
|
||||
tprints("{");
|
||||
tprintf("{%u, %d, ", sb.sem_num, sb.sem_op);
|
||||
printflags(semop_flags, sb.sem_flg, "SEM_???");
|
||||
tprints("}");
|
||||
else
|
||||
tprint_sembuf(&sb);
|
||||
}
|
||||
|
||||
if (i < max_count || max_count < count)
|
||||
tprints(", ...");
|
||||
|
||||
tprints("]");
|
||||
}
|
||||
|
||||
if (i < max_count || max_count < count)
|
||||
tprints(", ...");
|
||||
|
||||
tprintf("}, %lu", count);
|
||||
tprintf(", %lu", count);
|
||||
}
|
||||
|
||||
SYS_FUNC(semop)
|
||||
{
|
||||
tprintf("%lu, ", tcp->u_arg[0]);
|
||||
if (indirect_ipccall(tcp)) {
|
||||
tprint_sembuf(tcp, tcp->u_arg[3], tcp->u_arg[1]);
|
||||
tprint_sembuf_array(tcp, tcp->u_arg[3], tcp->u_arg[1]);
|
||||
} else {
|
||||
tprint_sembuf(tcp, tcp->u_arg[1], tcp->u_arg[2]);
|
||||
tprint_sembuf_array(tcp, tcp->u_arg[1], tcp->u_arg[2]);
|
||||
}
|
||||
return RVAL_DECODED;
|
||||
}
|
||||
@ -236,7 +233,7 @@ SYS_FUNC(semtimedop)
|
||||
{
|
||||
tprintf("%lu, ", tcp->u_arg[0]);
|
||||
if (indirect_ipccall(tcp)) {
|
||||
tprint_sembuf(tcp, tcp->u_arg[3], tcp->u_arg[1]);
|
||||
tprint_sembuf_array(tcp, tcp->u_arg[3], tcp->u_arg[1]);
|
||||
tprints(", ");
|
||||
#if defined(S390) || defined(S390X)
|
||||
printtv(tcp, tcp->u_arg[2]);
|
||||
@ -244,7 +241,7 @@ SYS_FUNC(semtimedop)
|
||||
printtv(tcp, tcp->u_arg[4]);
|
||||
#endif
|
||||
} else {
|
||||
tprint_sembuf(tcp, tcp->u_arg[1], tcp->u_arg[2]);
|
||||
tprint_sembuf_array(tcp, tcp->u_arg[1], tcp->u_arg[2]);
|
||||
tprints(", ");
|
||||
printtv(tcp, tcp->u_arg[3]);
|
||||
}
|
||||
@ -270,11 +267,10 @@ SYS_FUNC(semctl)
|
||||
PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???");
|
||||
tprints(", ");
|
||||
if (indirect_ipccall(tcp)) {
|
||||
if (current_wordsize == sizeof(int)) {
|
||||
if (current_wordsize == sizeof(int))
|
||||
printnum_int(tcp, tcp->u_arg[3], "%#x");
|
||||
} else {
|
||||
else
|
||||
printnum_long(tcp, tcp->u_arg[3], "%#lx");
|
||||
}
|
||||
} else {
|
||||
tprintf("%#lx", tcp->u_arg[3]);
|
||||
}
|
||||
@ -298,19 +294,22 @@ SYS_FUNC(shmctl)
|
||||
{
|
||||
tprintf("%lu, ", tcp->u_arg[0]);
|
||||
PRINTCTL(shmctl_flags, tcp->u_arg[1], "SHM_???");
|
||||
tprintf(", %#lx", tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
|
||||
tprints(", ");
|
||||
printaddr(tcp->u_arg[indirect_ipccall(tcp) ? 3 : 2]);
|
||||
return RVAL_DECODED;
|
||||
}
|
||||
|
||||
SYS_FUNC(shmat)
|
||||
{
|
||||
if (entering(tcp)) {
|
||||
tprintf("%lu", tcp->u_arg[0]);
|
||||
tprintf("%lu, ", tcp->u_arg[0]);
|
||||
if (indirect_ipccall(tcp)) {
|
||||
tprintf(", %#lx, ", tcp->u_arg[3]);
|
||||
printaddr(tcp->u_arg[3]);
|
||||
tprints(", ");
|
||||
printflags(shm_flags, tcp->u_arg[1], "SHM_???");
|
||||
} else {
|
||||
tprintf(", %#lx, ", tcp->u_arg[1]);
|
||||
printaddr(tcp->u_arg[1]);
|
||||
tprints(", ");
|
||||
printflags(shm_flags, tcp->u_arg[2], "SHM_???");
|
||||
}
|
||||
return 0;
|
||||
@ -329,7 +328,7 @@ SYS_FUNC(shmat)
|
||||
|
||||
SYS_FUNC(shmdt)
|
||||
{
|
||||
tprintf("%#lx", tcp->u_arg[indirect_ipccall(tcp) ? 3 : 0]);
|
||||
printaddr(tcp->u_arg[indirect_ipccall(tcp) ? 3 : 0]);
|
||||
return RVAL_DECODED;
|
||||
}
|
||||
|
||||
@ -340,15 +339,14 @@ SYS_FUNC(mq_open)
|
||||
/* flags */
|
||||
tprint_open_modes(tcp->u_arg[1]);
|
||||
if (tcp->u_arg[1] & O_CREAT) {
|
||||
# ifndef HAVE_MQUEUE_H
|
||||
tprintf(", %lx", tcp->u_arg[2]);
|
||||
# else
|
||||
struct mq_attr attr;
|
||||
/* mode */
|
||||
tprintf(", %#lo, ", tcp->u_arg[2]);
|
||||
if (umove(tcp, tcp->u_arg[3], &attr) < 0)
|
||||
tprints("{???}");
|
||||
else
|
||||
# ifndef HAVE_MQUEUE_H
|
||||
printaddr(tcp, tcp->u_arg[3]);
|
||||
# else
|
||||
struct mq_attr attr;
|
||||
|
||||
if (!umove_or_printaddr(tcp, tcp->u_arg[3], &attr))
|
||||
tprintf("{mq_maxmsg=%ld, mq_msgsize=%ld}",
|
||||
(long) attr.mq_maxmsg,
|
||||
(long) attr.mq_msgsize);
|
||||
@ -386,26 +384,20 @@ SYS_FUNC(mq_notify)
|
||||
}
|
||||
|
||||
static void
|
||||
printmqattr(struct tcb *tcp, long addr)
|
||||
printmqattr(struct tcb *tcp, const long addr)
|
||||
{
|
||||
if (addr == 0)
|
||||
tprints("NULL");
|
||||
else {
|
||||
# ifndef HAVE_MQUEUE_H
|
||||
tprintf("%#lx", addr);
|
||||
printaddr(addr);
|
||||
# else
|
||||
struct mq_attr attr;
|
||||
if (umove(tcp, addr, &attr) < 0) {
|
||||
tprints("{...}");
|
||||
return;
|
||||
}
|
||||
tprints("{mq_flags=");
|
||||
tprint_open_modes(attr.mq_flags);
|
||||
tprintf(", mq_maxmsg=%ld, mq_msgsize=%ld, mq_curmsg=%ld}",
|
||||
(long) attr.mq_maxmsg, (long) attr.mq_msgsize,
|
||||
(long) attr.mq_curmsgs);
|
||||
struct mq_attr attr;
|
||||
if (umove_or_printaddr(tcp, addr, &attr))
|
||||
return;
|
||||
tprints("{mq_flags=");
|
||||
tprint_open_modes(attr.mq_flags);
|
||||
tprintf(", mq_maxmsg=%ld, mq_msgsize=%ld, mq_curmsg=%ld}",
|
||||
(long) attr.mq_maxmsg, (long) attr.mq_msgsize,
|
||||
(long) attr.mq_curmsgs);
|
||||
# endif
|
||||
}
|
||||
}
|
||||
|
||||
SYS_FUNC(mq_getsetattr)
|
||||
|
@ -37,9 +37,9 @@ main(void)
|
||||
|
||||
rc = 0;
|
||||
done:
|
||||
if (msgctl(id, IPC_RMID, 0) < 0)
|
||||
if (msgctl(id, IPC_RMID, NULL) < 0)
|
||||
return 1;
|
||||
printf("msgctl\\(%d, (IPC_64\\|)?IPC_RMID, 0\\) += 0\n", id);
|
||||
printf("msgctl\\(%d, (IPC_64\\|)?IPC_RMID, NULL\\) += 0\n", id);
|
||||
return rc;
|
||||
|
||||
fail:
|
||||
|
@ -37,9 +37,9 @@ main(void)
|
||||
|
||||
rc = 0;
|
||||
done:
|
||||
if (shmctl(id, IPC_RMID, 0) < 0)
|
||||
if (shmctl(id, IPC_RMID, NULL) < 0)
|
||||
return 1;
|
||||
printf("shmctl\\(%d, (IPC_64\\|)?IPC_RMID, 0\\) += 0\n", id);
|
||||
printf("shmctl\\(%d, (IPC_64\\|)?IPC_RMID, NULL\\) += 0\n", id);
|
||||
return rc;
|
||||
|
||||
fail:
|
||||
|
Loading…
x
Reference in New Issue
Block a user