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:
Michael Tuexen 2018-01-14 14:33:22 +00:00
parent 1e6455d870
commit 4d7b980924
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=327967
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);