}
}
+/**
+ * Decode arg parameter of the ioctl call.
+ *
+ * @return There are two bits of the return value important for the purposes of
+ * processing by SYS_FUNC(ioctl):
+ * - 1 - indicates that ioctl decoder code has printed arg parameter.
+ * - RVAL_DECODED - indicates that decoding is done.
+ * As a result, the following behaviour is expected:
+ * - on entering:
+ * - 0 - decoding should be continued on exiting;
+ * - RVAL_DECODED - decoding on exiting is not needed and generic
+ * handler should print arg value;
+ * - 1 | RVAL_DECODED - decoding on exiting is not needed and decoder
+ * has printed arg value.
+ * - on exiting:
+ * - 0 - generic handler should print arg value.
+ * - 1 - decoder has printed arg value.
+ *
+ * Note that it makes no sense to return just 1 (without RVAL_DECODED)
+ * on entering, or 1 | RVAL_DECODED on exiting, but, of course, it is
+ * not prohibited (for example, it may be useful in cases where the
+ * return path is common on entering and on exiting the syscall).
+ *
+ * SYS_FUNC(ioctl) clears bit 0 and passes all other bits of
+ * ioctl_decode return value unchanged.
+ */
static int
ioctl_decode(struct tcb *tcp)
{
ret = ioctl_decode(tcp) | RVAL_DECODED;
}
- if (ret & RVAL_DECODED) {
- ret &= ~RVAL_DECODED;
- if (ret)
- --ret;
- else
- tprintf(", %#" PRI_klx, tcp->u_arg[2]);
- ret |= RVAL_DECODED;
- } else {
- if (ret)
- --ret;
- }
+ if ((ret & RVAL_DECODED) && !(ret & 1))
+ tprintf(", %#" PRI_klx, tcp->u_arg[2]);
+
+ ret &= ~1;
return ret;
}