Improve support for sctp_generic_recvmsg() and sctp_generic_sendmsg()

and add support for sctp_generic_sendmsg_iov().

Handle the struct iovec argument and the struct sctp_sndrcvinfo
arguments.
This commit is contained in:
tuexen 2018-01-14 14:33:22 +00:00
parent dc1ea661c7
commit 4b456d8fb0
2 changed files with 38 additions and 6 deletions

View File

@ -82,7 +82,7 @@ enum Argtype { None = 1, Hex, Octal, Int, UInt, LongHex, Name, Ptr, Stat, Stat11
Sockoptname, Msgflags, CapRights, PUInt, PQuadHex, Acltype,
Extattrnamespace, Minherit, Mlockall, Mountflags, Msync, Priowhich,
Ptraceop, Quotactlcmd, Reboothowto, Rtpriofunc, Schedpolicy, Schedparam,
PSig, Siginfo, Kevent11, Iovec,
PSig, Siginfo, Kevent11, Iovec, Sctpsndrcvinfo,
CloudABIAdvice, CloudABIClockID, ClouduABIFDSFlags,
CloudABIFDStat, CloudABIFileStat, CloudABIFileType,

View File

@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
#include <sys/un.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>
#include <assert.h>
@ -428,13 +429,17 @@ static struct syscall decoded_syscalls[] = {
{ .name = "sched_setscheduler", .ret_type = 1, .nargs = 3,
.args = { { Int, 0 }, { Schedpolicy, 1 }, { Schedparam, 2 } } },
{ .name = "sctp_generic_recvmsg", .ret_type = 1, .nargs = 7,
.args = { { Int, 0 }, { Ptr | IN, 1 }, { Int, 2 },
{ Sockaddr | OUT, 3 }, { Ptr | OUT, 4 }, { Ptr | OUT, 5 },
{ Ptr | OUT, 6 } } },
.args = { { Int, 0 }, { Iovec | OUT, 1 }, { Int, 2 },
{ Sockaddr | OUT, 3 }, { Ptr | OUT, 4 },
{ Sctpsndrcvinfo | OUT, 5 }, { Ptr | OUT, 6 } } },
{ .name = "sctp_generic_sendmsg", .ret_type = 1, .nargs = 7,
.args = { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 },
{ Sockaddr | IN, 3 }, { Socklent, 4 }, { Ptr | IN, 5 },
{ Msgflags, 6 } } },
{ Sockaddr | IN, 3 }, { Socklent, 4 },
{ Sctpsndrcvinfo | IN, 5 }, { Msgflags, 6 } } },
{ .name = "sctp_generic_sendmsg_iov", .ret_type = 1, .nargs = 7,
.args = { { Int, 0 }, { Iovec | IN, 1 }, { Int, 2 },
{ Sockaddr | IN, 3 }, { Socklent, 4 },
{ Sctpsndrcvinfo | IN, 5 }, { Msgflags, 6 } } },
{ .name = "select", .ret_type = 1, .nargs = 5,
.args = { { Int, 0 }, { Fd_set, 1 }, { Fd_set, 2 }, { Fd_set, 3 },
{ Timeval, 4 } } },
@ -2205,6 +2210,33 @@ print_arg(struct syscall_args *sc, unsigned long *args, long *retval,
fprintf(fp, "%s%s", iov_truncated ? ",..." : "", "]");
break;
}
case Sctpsndrcvinfo: {
struct sctp_sndrcvinfo info;
if (get_struct(pid, (void *)args[sc->offset],
&info, sizeof(struct sctp_sndrcvinfo)) == -1) {
fprintf(fp, "0x%lx", args[sc->offset]);
break;
}
fprintf(fp, "{sid=%u,", info.sinfo_stream);
if (sc->type & OUT) {
fprintf(fp, "ssn=%u,", info.sinfo_ssn);
}
fputs("flgs=", fp);
sysdecode_sctp_sinfo_flags(fp, info.sinfo_flags);
fprintf(fp, ",ppid=%u,", ntohl(info.sinfo_ppid));
/* Can't use IN here, since IN is 0 */
if ((sc->type & OUT) == 0) {
fprintf(fp, "ctx=%u,", info.sinfo_context);
fprintf(fp, "ttl=%u,", info.sinfo_timetolive);
}
if (sc->type & OUT) {
fprintf(fp, "tsn=%u,", info.sinfo_tsn);
fprintf(fp, "cumtsn=%u,", info.sinfo_cumtsn);
}
fprintf(fp, "id=%u}", info.sinfo_assoc_id);
break;
}
case CloudABIAdvice:
fputs(xlookup(cloudabi_advice, args[sc->offset]), fp);