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:
Дмитрий Левин 2015-07-20 10:11:33 +00:00
parent 2f444dc871
commit 2370d53281
3 changed files with 80 additions and 88 deletions

160
ipc.c
View File

@ -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)

View File

@ -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:

View File

@ -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: