1df57947fSPedro F. Giffuni /*- 2df57947fSPedro F. Giffuni * SPDX-License-Identifier: BSD-4-Clause 3df57947fSPedro F. Giffuni * 40a6c71f8SWarner Losh * Copyright 1997 Sean Eric Fagan 509d64da3SSean Eric Fagan * 609d64da3SSean Eric Fagan * Redistribution and use in source and binary forms, with or without 709d64da3SSean Eric Fagan * modification, are permitted provided that the following conditions 809d64da3SSean Eric Fagan * are met: 909d64da3SSean Eric Fagan * 1. Redistributions of source code must retain the above copyright 1009d64da3SSean Eric Fagan * notice, this list of conditions and the following disclaimer. 1109d64da3SSean Eric Fagan * 2. Redistributions in binary form must reproduce the above copyright 1209d64da3SSean Eric Fagan * notice, this list of conditions and the following disclaimer in the 1309d64da3SSean Eric Fagan * documentation and/or other materials provided with the distribution. 1409d64da3SSean Eric Fagan * 3. All advertising materials mentioning features or use of this software 1509d64da3SSean Eric Fagan * must display the following acknowledgement: 1609d64da3SSean Eric Fagan * This product includes software developed by Sean Eric Fagan 1709d64da3SSean Eric Fagan * 4. Neither the name of the author may be used to endorse or promote 1809d64da3SSean Eric Fagan * products derived from this software without specific prior written 1909d64da3SSean Eric Fagan * permission. 2009d64da3SSean Eric Fagan * 2109d64da3SSean Eric Fagan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2209d64da3SSean Eric Fagan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2309d64da3SSean Eric Fagan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2409d64da3SSean Eric Fagan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2509d64da3SSean Eric Fagan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2609d64da3SSean Eric Fagan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2709d64da3SSean Eric Fagan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2809d64da3SSean Eric Fagan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2909d64da3SSean Eric Fagan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3009d64da3SSean Eric Fagan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3109d64da3SSean Eric Fagan * SUCH DAMAGE. 3209d64da3SSean Eric Fagan */ 3309d64da3SSean Eric Fagan 342b75c8adSJohn Baldwin #include <sys/cdefs.h> 352b75c8adSJohn Baldwin __FBSDID("$FreeBSD$"); 363cf51049SPhilippe Charnier 3709d64da3SSean Eric Fagan /* 38bbeaf6c0SSean Eric Fagan * This file has routines used to print out system calls and their 39bbeaf6c0SSean Eric Fagan * arguments. 40bbeaf6c0SSean Eric Fagan */ 41bbeaf6c0SSean Eric Fagan 427136a1d9SJohn Baldwin #include <sys/capsicum.h> 439ddd1412SDag-Erling Smørgrav #include <sys/types.h> 44ffb66079SJohn Baldwin #define _WANT_FREEBSD11_KEVENT 452b75c8adSJohn Baldwin #include <sys/event.h> 462b75c8adSJohn Baldwin #include <sys/ioccom.h> 47a776866bSBryan Drewery #include <sys/mount.h> 485d2d083cSXin LI #include <sys/ptrace.h> 492b75c8adSJohn Baldwin #include <sys/resource.h> 509ddd1412SDag-Erling Smørgrav #include <sys/socket.h> 518207f12dSWarner Losh #define _WANT_FREEBSD11_STAT 522b75c8adSJohn Baldwin #include <sys/stat.h> 539ddd1412SDag-Erling Smørgrav #include <sys/un.h> 5434763d1cSJohn Baldwin #include <sys/wait.h> 559ddd1412SDag-Erling Smørgrav #include <netinet/in.h> 564d7b9809SMichael Tuexen #include <netinet/sctp.h> 579ddd1412SDag-Erling Smørgrav #include <arpa/inet.h> 589ddd1412SDag-Erling Smørgrav 591175b23fSJohn Baldwin #include <assert.h> 60dec17687SBrian Feldman #include <ctype.h> 613cf51049SPhilippe Charnier #include <err.h> 62894b8f7aSAlfred Perlstein #include <fcntl.h> 63e45a5a0dSDavid Malone #include <poll.h> 64a4110f9fSJohn Baldwin #include <sched.h> 659ddd1412SDag-Erling Smørgrav #include <signal.h> 66808d9805SEd Schouten #include <stdbool.h> 67bbeaf6c0SSean Eric Fagan #include <stdio.h> 68bbeaf6c0SSean Eric Fagan #include <stdlib.h> 69bbeaf6c0SSean Eric Fagan #include <string.h> 70d6fb4894SJohn Baldwin #include <sysdecode.h> 71bbeaf6c0SSean Eric Fagan #include <unistd.h> 72081e5c48SPav Lucistnik #include <vis.h> 739ddd1412SDag-Erling Smørgrav 741f3bbfd8SEd Schouten #include <contrib/cloudabi/cloudabi_types_common.h> 75808d9805SEd Schouten 76ec0bed25SMatthew N. Dodd #include "truss.h" 771be5d704SMark Murray #include "extern.h" 78bbeaf6c0SSean Eric Fagan #include "syscall.h" 79bbeaf6c0SSean Eric Fagan 80bbeaf6c0SSean Eric Fagan /* 81081e5c48SPav Lucistnik * This should probably be in its own file, sorted alphabetically. 82bbeaf6c0SSean Eric Fagan */ 836c61b0f3SBryan Drewery static struct syscall decoded_syscalls[] = { 84f44fc79dSJohn Baldwin /* Native ABI */ 857ce44f08SJohn Baldwin { .name = "__acl_aclcheck_fd", .ret_type = 1, .nargs = 3, 867ce44f08SJohn Baldwin .args = { { Int, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 877ce44f08SJohn Baldwin { .name = "__acl_aclcheck_file", .ret_type = 1, .nargs = 3, 887ce44f08SJohn Baldwin .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 897ce44f08SJohn Baldwin { .name = "__acl_aclcheck_link", .ret_type = 1, .nargs = 3, 907ce44f08SJohn Baldwin .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 917ce44f08SJohn Baldwin { .name = "__acl_delete_fd", .ret_type = 1, .nargs = 2, 927ce44f08SJohn Baldwin .args = { { Int, 0 }, { Acltype, 1 } } }, 937ce44f08SJohn Baldwin { .name = "__acl_delete_file", .ret_type = 1, .nargs = 2, 947ce44f08SJohn Baldwin .args = { { Name, 0 }, { Acltype, 1 } } }, 957ce44f08SJohn Baldwin { .name = "__acl_delete_link", .ret_type = 1, .nargs = 2, 967ce44f08SJohn Baldwin .args = { { Name, 0 }, { Acltype, 1 } } }, 977ce44f08SJohn Baldwin { .name = "__acl_get_fd", .ret_type = 1, .nargs = 3, 987ce44f08SJohn Baldwin .args = { { Int, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 997ce44f08SJohn Baldwin { .name = "__acl_get_file", .ret_type = 1, .nargs = 3, 1007ce44f08SJohn Baldwin .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 1017ce44f08SJohn Baldwin { .name = "__acl_get_link", .ret_type = 1, .nargs = 3, 1027ce44f08SJohn Baldwin .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 1037ce44f08SJohn Baldwin { .name = "__acl_set_fd", .ret_type = 1, .nargs = 3, 1047ce44f08SJohn Baldwin .args = { { Int, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 1057ce44f08SJohn Baldwin { .name = "__acl_set_file", .ret_type = 1, .nargs = 3, 1067ce44f08SJohn Baldwin .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 1077ce44f08SJohn Baldwin { .name = "__acl_set_link", .ret_type = 1, .nargs = 3, 1087ce44f08SJohn Baldwin .args = { { Name, 0 }, { Acltype, 1 }, { Ptr, 2 } } }, 1097136a1d9SJohn Baldwin { .name = "__cap_rights_get", .ret_type = 1, .nargs = 3, 1107136a1d9SJohn Baldwin .args = { { Int, 0 }, { Int, 1 }, { CapRights | OUT, 2 } } }, 111f44fc79dSJohn Baldwin { .name = "__getcwd", .ret_type = 1, .nargs = 2, 112f44fc79dSJohn Baldwin .args = { { Name | OUT, 0 }, { Int, 1 } } }, 113f44fc79dSJohn Baldwin { .name = "_umtx_op", .ret_type = 1, .nargs = 5, 114f44fc79dSJohn Baldwin .args = { { Ptr, 0 }, { Umtxop, 1 }, { LongHex, 2 }, { Ptr, 3 }, 115f44fc79dSJohn Baldwin { Ptr, 4 } } }, 116f44fc79dSJohn Baldwin { .name = "accept", .ret_type = 1, .nargs = 3, 117f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } }, 118f44fc79dSJohn Baldwin { .name = "access", .ret_type = 1, .nargs = 2, 119f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Accessmode, 1 } } }, 120f44fc79dSJohn Baldwin { .name = "bind", .ret_type = 1, .nargs = 3, 12158227c60SMichael Tuexen .args = { { Int, 0 }, { Sockaddr | IN, 1 }, { Socklent, 2 } } }, 122f44fc79dSJohn Baldwin { .name = "bindat", .ret_type = 1, .nargs = 4, 123f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Int, 1 }, { Sockaddr | IN, 2 }, 1247d897327SJohn Baldwin { Int, 3 } } }, 125f44fc79dSJohn Baldwin { .name = "break", .ret_type = 1, .nargs = 1, 126f44fc79dSJohn Baldwin .args = { { Ptr, 0 } } }, 127bed418c8SJohn Baldwin { .name = "cap_fcntls_get", .ret_type = 1, .nargs = 2, 128bed418c8SJohn Baldwin .args = { { Int, 0 }, { CapFcntlRights | OUT, 1 } } }, 129bed418c8SJohn Baldwin { .name = "cap_fcntls_limit", .ret_type = 1, .nargs = 2, 130bed418c8SJohn Baldwin .args = { { Int, 0 }, { CapFcntlRights, 1 } } }, 131ebb2cc40SJohn Baldwin { .name = "cap_getmode", .ret_type = 1, .nargs = 1, 132ebb2cc40SJohn Baldwin .args = { { PUInt | OUT, 0 } } }, 1337136a1d9SJohn Baldwin { .name = "cap_rights_limit", .ret_type = 1, .nargs = 2, 1347136a1d9SJohn Baldwin .args = { { Int, 0 }, { CapRights, 1 } } }, 135f44fc79dSJohn Baldwin { .name = "chdir", .ret_type = 1, .nargs = 1, 136f44fc79dSJohn Baldwin .args = { { Name, 0 } } }, 137f44fc79dSJohn Baldwin { .name = "chflags", .ret_type = 1, .nargs = 2, 13827459358SJohn Baldwin .args = { { Name | IN, 0 }, { FileFlags, 1 } } }, 13927459358SJohn Baldwin { .name = "chflagsat", .ret_type = 1, .nargs = 4, 14027459358SJohn Baldwin .args = { { Atfd, 0 }, { Name | IN, 1 }, { FileFlags, 2 }, 14127459358SJohn Baldwin { Atflags, 3 } } }, 142f44fc79dSJohn Baldwin { .name = "chmod", .ret_type = 1, .nargs = 2, 143ee3b0f6eSDiomidis Spinellis .args = { { Name, 0 }, { Octal, 1 } } }, 144f44fc79dSJohn Baldwin { .name = "chown", .ret_type = 1, .nargs = 3, 145f44fc79dSJohn Baldwin .args = { { Name, 0 }, { Int, 1 }, { Int, 2 } } }, 146f44fc79dSJohn Baldwin { .name = "chroot", .ret_type = 1, .nargs = 1, 147f44fc79dSJohn Baldwin .args = { { Name, 0 } } }, 148f44fc79dSJohn Baldwin { .name = "clock_gettime", .ret_type = 1, .nargs = 2, 149f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Timespec | OUT, 1 } } }, 150ee3b0f6eSDiomidis Spinellis { .name = "close", .ret_type = 1, .nargs = 1, 151ee3b0f6eSDiomidis Spinellis .args = { { Int, 0 } } }, 1521b224b09SWarner Losh { .name = "compat11.fstat", .ret_type = 1, .nargs = 2, 1531b224b09SWarner Losh .args = { { Int, 0 }, { Stat11 | OUT, 1 } } }, 15475a14d22SMark Johnston { .name = "compat11.fstatat", .ret_type = 1, .nargs = 4, 15575a14d22SMark Johnston .args = { { Atfd, 0 }, { Name | IN, 1 }, { Stat11 | OUT, 2 }, 15675a14d22SMark Johnston { Atflags, 3 } } }, 157ffb66079SJohn Baldwin { .name = "compat11.kevent", .ret_type = 1, .nargs = 6, 158ffb66079SJohn Baldwin .args = { { Int, 0 }, { Kevent11, 1 }, { Int, 2 }, 159ffb66079SJohn Baldwin { Kevent11 | OUT, 3 }, { Int, 4 }, { Timespec, 5 } } }, 1601b224b09SWarner Losh { .name = "compat11.lstat", .ret_type = 1, .nargs = 2, 1611b224b09SWarner Losh .args = { { Name | IN, 0 }, { Stat11 | OUT, 1 } } }, 1621b224b09SWarner Losh { .name = "compat11.stat", .ret_type = 1, .nargs = 2, 1631b224b09SWarner Losh .args = { { Name | IN, 0 }, { Stat11 | OUT, 1 } } }, 164f44fc79dSJohn Baldwin { .name = "connect", .ret_type = 1, .nargs = 3, 16558227c60SMichael Tuexen .args = { { Int, 0 }, { Sockaddr | IN, 1 }, { Socklent, 2 } } }, 166f44fc79dSJohn Baldwin { .name = "connectat", .ret_type = 1, .nargs = 4, 167f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Int, 1 }, { Sockaddr | IN, 2 }, 168f44fc79dSJohn Baldwin { Int, 3 } } }, 169b60a095bSJohn Baldwin { .name = "dup", .ret_type = 1, .nargs = 1, 170b60a095bSJohn Baldwin .args = { { Int, 0 } } }, 171b60a095bSJohn Baldwin { .name = "dup2", .ret_type = 1, .nargs = 2, 172b60a095bSJohn Baldwin .args = { { Int, 0 }, { Int, 1 } } }, 173f44fc79dSJohn Baldwin { .name = "eaccess", .ret_type = 1, .nargs = 2, 174f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Accessmode, 1 } } }, 175f44fc79dSJohn Baldwin { .name = "execve", .ret_type = 1, .nargs = 3, 176f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { ExecArgs | IN, 1 }, 177f44fc79dSJohn Baldwin { ExecEnv | IN, 2 } } }, 178f44fc79dSJohn Baldwin { .name = "exit", .ret_type = 0, .nargs = 1, 179f44fc79dSJohn Baldwin .args = { { Hex, 0 } } }, 18026606dcaSJohn Baldwin { .name = "extattr_delete_fd", .ret_type = 1, .nargs = 3, 18126606dcaSJohn Baldwin .args = { { Int, 0 }, { Extattrnamespace, 1 }, { Name, 2 } } }, 18226606dcaSJohn Baldwin { .name = "extattr_delete_file", .ret_type = 1, .nargs = 3, 18326606dcaSJohn Baldwin .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 } } }, 18426606dcaSJohn Baldwin { .name = "extattr_delete_link", .ret_type = 1, .nargs = 3, 18526606dcaSJohn Baldwin .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 } } }, 18626606dcaSJohn Baldwin { .name = "extattr_get_fd", .ret_type = 1, .nargs = 5, 18726606dcaSJohn Baldwin .args = { { Int, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, 18826606dcaSJohn Baldwin { BinString | OUT, 3 }, { Sizet, 4 } } }, 18926606dcaSJohn Baldwin { .name = "extattr_get_file", .ret_type = 1, .nargs = 5, 19026606dcaSJohn Baldwin .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, 19126606dcaSJohn Baldwin { BinString | OUT, 3 }, { Sizet, 4 } } }, 19226606dcaSJohn Baldwin { .name = "extattr_get_link", .ret_type = 1, .nargs = 5, 19326606dcaSJohn Baldwin .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, 19426606dcaSJohn Baldwin { BinString | OUT, 3 }, { Sizet, 4 } } }, 19526606dcaSJohn Baldwin { .name = "extattr_list_fd", .ret_type = 1, .nargs = 4, 19626606dcaSJohn Baldwin .args = { { Int, 0 }, { Extattrnamespace, 1 }, { BinString | OUT, 2 }, 19726606dcaSJohn Baldwin { Sizet, 3 } } }, 19826606dcaSJohn Baldwin { .name = "extattr_list_file", .ret_type = 1, .nargs = 4, 19926606dcaSJohn Baldwin .args = { { Name, 0 }, { Extattrnamespace, 1 }, { BinString | OUT, 2 }, 20026606dcaSJohn Baldwin { Sizet, 3 } } }, 20126606dcaSJohn Baldwin { .name = "extattr_list_link", .ret_type = 1, .nargs = 4, 20226606dcaSJohn Baldwin .args = { { Name, 0 }, { Extattrnamespace, 1 }, { BinString | OUT, 2 }, 20326606dcaSJohn Baldwin { Sizet, 3 } } }, 20426606dcaSJohn Baldwin { .name = "extattr_set_fd", .ret_type = 1, .nargs = 5, 20526606dcaSJohn Baldwin .args = { { Int, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, 20626606dcaSJohn Baldwin { BinString | IN, 3 }, { Sizet, 4 } } }, 20726606dcaSJohn Baldwin { .name = "extattr_set_file", .ret_type = 1, .nargs = 5, 20826606dcaSJohn Baldwin .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, 20926606dcaSJohn Baldwin { BinString | IN, 3 }, { Sizet, 4 } } }, 21026606dcaSJohn Baldwin { .name = "extattr_set_link", .ret_type = 1, .nargs = 5, 21126606dcaSJohn Baldwin .args = { { Name, 0 }, { Extattrnamespace, 1 }, { Name, 2 }, 21226606dcaSJohn Baldwin { BinString | IN, 3 }, { Sizet, 4 } } }, 21326606dcaSJohn Baldwin { .name = "extattrctl", .ret_type = 1, .nargs = 5, 21426606dcaSJohn Baldwin .args = { { Name, 0 }, { Hex, 1 }, { Name, 2 }, 21526606dcaSJohn Baldwin { Extattrnamespace, 3 }, { Name, 4 } } }, 216f44fc79dSJohn Baldwin { .name = "faccessat", .ret_type = 1, .nargs = 4, 217f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name | IN, 1 }, { Accessmode, 2 }, 218f44fc79dSJohn Baldwin { Atflags, 3 } } }, 21927459358SJohn Baldwin { .name = "fchflags", .ret_type = 1, .nargs = 2, 22027459358SJohn Baldwin .args = { { Int, 0 }, { FileFlags, 1 } } }, 221f44fc79dSJohn Baldwin { .name = "fchmod", .ret_type = 1, .nargs = 2, 222f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Octal, 1 } } }, 223f44fc79dSJohn Baldwin { .name = "fchmodat", .ret_type = 1, .nargs = 4, 224f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 }, { Atflags, 3 } } }, 225f44fc79dSJohn Baldwin { .name = "fchown", .ret_type = 1, .nargs = 3, 226f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Int, 1 }, { Int, 2 } } }, 227f44fc79dSJohn Baldwin { .name = "fchownat", .ret_type = 1, .nargs = 5, 228f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Int, 2 }, { Int, 3 }, 229f44fc79dSJohn Baldwin { Atflags, 4 } } }, 230f44fc79dSJohn Baldwin { .name = "fcntl", .ret_type = 1, .nargs = 3, 231f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Fcntl, 1 }, { Fcntlflag, 2 } } }, 232dd92181fSJohn Baldwin { .name = "flock", .ret_type = 1, .nargs = 2, 233dd92181fSJohn Baldwin .args = { { Int, 0 }, { Flockop, 1 } } }, 234f44fc79dSJohn Baldwin { .name = "fstat", .ret_type = 1, .nargs = 2, 235f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Stat | OUT, 1 } } }, 236f44fc79dSJohn Baldwin { .name = "fstatat", .ret_type = 1, .nargs = 4, 237f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name | IN, 1 }, { Stat | OUT, 2 }, 238f44fc79dSJohn Baldwin { Atflags, 3 } } }, 239f44fc79dSJohn Baldwin { .name = "fstatfs", .ret_type = 1, .nargs = 2, 240f44fc79dSJohn Baldwin .args = { { Int, 0 }, { StatFs | OUT, 1 } } }, 241f44fc79dSJohn Baldwin { .name = "ftruncate", .ret_type = 1, .nargs = 2, 242c05cc0d6SJohn Baldwin .args = { { Int | IN, 0 }, { QuadHex | IN, 1 } } }, 243f44fc79dSJohn Baldwin { .name = "futimens", .ret_type = 1, .nargs = 2, 244f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Timespec2 | IN, 1 } } }, 245f44fc79dSJohn Baldwin { .name = "futimes", .ret_type = 1, .nargs = 2, 246f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Timeval2 | IN, 1 } } }, 247f44fc79dSJohn Baldwin { .name = "futimesat", .ret_type = 1, .nargs = 3, 248f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name | IN, 1 }, { Timeval2 | IN, 2 } } }, 249b60a095bSJohn Baldwin { .name = "getdirentries", .ret_type = 1, .nargs = 4, 250b60a095bSJohn Baldwin .args = { { Int, 0 }, { BinString | OUT, 1 }, { Int, 2 }, 251b60a095bSJohn Baldwin { PQuadHex | OUT, 3 } } }, 252ab43bedcSJohn Baldwin { .name = "getfsstat", .ret_type = 1, .nargs = 3, 253ab43bedcSJohn Baldwin .args = { { Ptr, 0 }, { Long, 1 }, { Getfsstatmode, 2 } } }, 254f44fc79dSJohn Baldwin { .name = "getitimer", .ret_type = 1, .nargs = 2, 255f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Itimerval | OUT, 2 } } }, 256f44fc79dSJohn Baldwin { .name = "getpeername", .ret_type = 1, .nargs = 3, 257f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } }, 258f44fc79dSJohn Baldwin { .name = "getpgid", .ret_type = 1, .nargs = 1, 259f44fc79dSJohn Baldwin .args = { { Int, 0 } } }, 260ad419d33SJohn Baldwin { .name = "getpriority", .ret_type = 1, .nargs = 2, 261ad419d33SJohn Baldwin .args = { { Priowhich, 0 }, { Int, 1 } } }, 262f44fc79dSJohn Baldwin { .name = "getrlimit", .ret_type = 1, .nargs = 2, 263f44fc79dSJohn Baldwin .args = { { Resource, 0 }, { Rlimit | OUT, 1 } } }, 264f44fc79dSJohn Baldwin { .name = "getrusage", .ret_type = 1, .nargs = 2, 265ee8aa41dSJohn Baldwin .args = { { RusageWho, 0 }, { Rusage | OUT, 1 } } }, 266f44fc79dSJohn Baldwin { .name = "getsid", .ret_type = 1, .nargs = 1, 267f44fc79dSJohn Baldwin .args = { { Int, 0 } } }, 268f44fc79dSJohn Baldwin { .name = "getsockname", .ret_type = 1, .nargs = 3, 269f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Sockaddr | OUT, 1 }, { Ptr | OUT, 2 } } }, 270832af457SMichael Tuexen { .name = "getsockopt", .ret_type = 1, .nargs = 5, 271832af457SMichael Tuexen .args = { { Int, 0 }, { Sockoptlevel, 1 }, { Sockoptname, 2 }, 272832af457SMichael Tuexen { Ptr | OUT, 3 }, { Ptr | OUT, 4 } } }, 273f44fc79dSJohn Baldwin { .name = "gettimeofday", .ret_type = 1, .nargs = 2, 274f44fc79dSJohn Baldwin .args = { { Timeval | OUT, 0 }, { Ptr, 1 } } }, 275f44fc79dSJohn Baldwin { .name = "ioctl", .ret_type = 1, .nargs = 3, 276a776eeafSJohn Baldwin .args = { { Int, 0 }, { Ioctl, 1 }, { Ptr, 2 } } }, 277f44fc79dSJohn Baldwin { .name = "kevent", .ret_type = 1, .nargs = 6, 278f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Kevent, 1 }, { Int, 2 }, { Kevent | OUT, 3 }, 279f44fc79dSJohn Baldwin { Int, 4 }, { Timespec, 5 } } }, 280f44fc79dSJohn Baldwin { .name = "kill", .ret_type = 1, .nargs = 2, 281f44fc79dSJohn Baldwin .args = { { Int | IN, 0 }, { Signal | IN, 1 } } }, 282f44fc79dSJohn Baldwin { .name = "kldfind", .ret_type = 1, .nargs = 1, 283f44fc79dSJohn Baldwin .args = { { Name | IN, 0 } } }, 284f44fc79dSJohn Baldwin { .name = "kldfirstmod", .ret_type = 1, .nargs = 1, 285f44fc79dSJohn Baldwin .args = { { Int, 0 } } }, 286f44fc79dSJohn Baldwin { .name = "kldload", .ret_type = 1, .nargs = 1, 287f44fc79dSJohn Baldwin .args = { { Name | IN, 0 } } }, 288f44fc79dSJohn Baldwin { .name = "kldnext", .ret_type = 1, .nargs = 1, 289f44fc79dSJohn Baldwin .args = { { Int, 0 } } }, 290f44fc79dSJohn Baldwin { .name = "kldstat", .ret_type = 1, .nargs = 2, 291f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Ptr, 1 } } }, 29294e854c5SJohn Baldwin { .name = "kldsym", .ret_type = 1, .nargs = 3, 29394e854c5SJohn Baldwin .args = { { Int, 0 }, { Kldsymcmd, 1 }, { Ptr, 2 } } }, 294f44fc79dSJohn Baldwin { .name = "kldunload", .ret_type = 1, .nargs = 1, 295f44fc79dSJohn Baldwin .args = { { Int, 0 } } }, 29694e854c5SJohn Baldwin { .name = "kldunloadf", .ret_type = 1, .nargs = 2, 29794e854c5SJohn Baldwin .args = { { Int, 0 }, { Kldunloadflags, 1 } } }, 298f44fc79dSJohn Baldwin { .name = "kse_release", .ret_type = 0, .nargs = 1, 299f44fc79dSJohn Baldwin .args = { { Timespec, 0 } } }, 300f44fc79dSJohn Baldwin { .name = "lchflags", .ret_type = 1, .nargs = 2, 30127459358SJohn Baldwin .args = { { Name | IN, 0 }, { FileFlags, 1 } } }, 302f44fc79dSJohn Baldwin { .name = "lchmod", .ret_type = 1, .nargs = 2, 303f44fc79dSJohn Baldwin .args = { { Name, 0 }, { Octal, 1 } } }, 304f44fc79dSJohn Baldwin { .name = "lchown", .ret_type = 1, .nargs = 3, 305f44fc79dSJohn Baldwin .args = { { Name, 0 }, { Int, 1 }, { Int, 2 } } }, 3062b75c8adSJohn Baldwin { .name = "link", .ret_type = 1, .nargs = 2, 307ee3b0f6eSDiomidis Spinellis .args = { { Name, 0 }, { Name, 1 } } }, 3082b75c8adSJohn Baldwin { .name = "linkat", .ret_type = 1, .nargs = 5, 3097d897327SJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Atfd, 2 }, { Name, 3 }, 3107d897327SJohn Baldwin { Atflags, 4 } } }, 311e8d2c81dSMichael Tuexen { .name = "listen", .ret_type = 1, .nargs = 2, 312e8d2c81dSMichael Tuexen .args = { { Int, 0 }, { Int, 1 } } }, 313f44fc79dSJohn Baldwin { .name = "lseek", .ret_type = 2, .nargs = 3, 314c05cc0d6SJohn Baldwin .args = { { Int, 0 }, { QuadHex, 1 }, { Whence, 2 } } }, 315f44fc79dSJohn Baldwin { .name = "lstat", .ret_type = 1, .nargs = 2, 316f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Stat | OUT, 1 } } }, 317f44fc79dSJohn Baldwin { .name = "lutimes", .ret_type = 1, .nargs = 2, 318f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Timeval2 | IN, 1 } } }, 31998fdbeecSJohn Baldwin { .name = "madvise", .ret_type = 1, .nargs = 3, 32098fdbeecSJohn Baldwin .args = { { Ptr, 0 }, { Sizet, 1 }, { Madvice, 2 } } }, 3212d9c9988SJohn Baldwin { .name = "minherit", .ret_type = 1, .nargs = 3, 3222d9c9988SJohn Baldwin .args = { { Ptr, 0 }, { Sizet, 1 }, { Minherit, 2 } } }, 323f44fc79dSJohn Baldwin { .name = "mkdir", .ret_type = 1, .nargs = 2, 324f44fc79dSJohn Baldwin .args = { { Name, 0 }, { Octal, 1 } } }, 325f44fc79dSJohn Baldwin { .name = "mkdirat", .ret_type = 1, .nargs = 3, 326f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 } } }, 3272b75c8adSJohn Baldwin { .name = "mkfifo", .ret_type = 1, .nargs = 2, 328e82ce59cSJohn Baldwin .args = { { Name, 0 }, { Octal, 1 } } }, 3292b75c8adSJohn Baldwin { .name = "mkfifoat", .ret_type = 1, .nargs = 3, 3307d897327SJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 } } }, 3312b75c8adSJohn Baldwin { .name = "mknod", .ret_type = 1, .nargs = 3, 332e82ce59cSJohn Baldwin .args = { { Name, 0 }, { Octal, 1 }, { Int, 2 } } }, 3332b75c8adSJohn Baldwin { .name = "mknodat", .ret_type = 1, .nargs = 4, 3347d897327SJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Octal, 2 }, { Int, 3 } } }, 33594bde755SJohn Baldwin { .name = "mlock", .ret_type = 1, .nargs = 2, 33694bde755SJohn Baldwin .args = { { Ptr, 0 }, { Sizet, 1 } } }, 33794bde755SJohn Baldwin { .name = "mlockall", .ret_type = 1, .nargs = 1, 33894bde755SJohn Baldwin .args = { { Mlockall, 0 } } }, 339f44fc79dSJohn Baldwin { .name = "mmap", .ret_type = 1, .nargs = 6, 340e261fb2aSJohn Baldwin .args = { { Ptr, 0 }, { Sizet, 1 }, { Mprot, 2 }, { Mmapflags, 3 }, 341c05cc0d6SJohn Baldwin { Int, 4 }, { QuadHex, 5 } } }, 342f44fc79dSJohn Baldwin { .name = "modfind", .ret_type = 1, .nargs = 1, 343f44fc79dSJohn Baldwin .args = { { Name | IN, 0 } } }, 3442b75c8adSJohn Baldwin { .name = "mount", .ret_type = 1, .nargs = 4, 3458acc8e78SJohn Baldwin .args = { { Name, 0 }, { Name, 1 }, { Mountflags, 2 }, { Ptr, 3 } } }, 346f44fc79dSJohn Baldwin { .name = "mprotect", .ret_type = 1, .nargs = 3, 347e261fb2aSJohn Baldwin .args = { { Ptr, 0 }, { Sizet, 1 }, { Mprot, 2 } } }, 348114aeee0SJohn Baldwin { .name = "msync", .ret_type = 1, .nargs = 3, 349114aeee0SJohn Baldwin .args = { { Ptr, 0 }, { Sizet, 1 }, { Msync, 2 } } }, 35094bde755SJohn Baldwin { .name = "munlock", .ret_type = 1, .nargs = 2, 35194bde755SJohn Baldwin .args = { { Ptr, 0 }, { Sizet, 1 } } }, 352f44fc79dSJohn Baldwin { .name = "munmap", .ret_type = 1, .nargs = 2, 353e261fb2aSJohn Baldwin .args = { { Ptr, 0 }, { Sizet, 1 } } }, 354f44fc79dSJohn Baldwin { .name = "nanosleep", .ret_type = 1, .nargs = 1, 355f44fc79dSJohn Baldwin .args = { { Timespec, 0 } } }, 3568acc8e78SJohn Baldwin { .name = "nmount", .ret_type = 1, .nargs = 3, 3578acc8e78SJohn Baldwin .args = { { Ptr, 0 }, { UInt, 1 }, { Mountflags, 2 } } }, 358f44fc79dSJohn Baldwin { .name = "open", .ret_type = 1, .nargs = 3, 359f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Open, 1 }, { Octal, 2 } } }, 360f44fc79dSJohn Baldwin { .name = "openat", .ret_type = 1, .nargs = 4, 361f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name | IN, 1 }, { Open, 2 }, 362f44fc79dSJohn Baldwin { Octal, 3 } } }, 363f44fc79dSJohn Baldwin { .name = "pathconf", .ret_type = 1, .nargs = 2, 364f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Pathconf, 1 } } }, 365f44fc79dSJohn Baldwin { .name = "pipe", .ret_type = 1, .nargs = 1, 366f44fc79dSJohn Baldwin .args = { { PipeFds | OUT, 0 } } }, 367f44fc79dSJohn Baldwin { .name = "pipe2", .ret_type = 1, .nargs = 2, 3689289f547SJohn Baldwin .args = { { Ptr, 0 }, { Pipe2, 1 } } }, 369f44fc79dSJohn Baldwin { .name = "poll", .ret_type = 1, .nargs = 3, 370f44fc79dSJohn Baldwin .args = { { Pollfd, 0 }, { Int, 1 }, { Int, 2 } } }, 371d2a97485SJohn Baldwin { .name = "posix_fadvise", .ret_type = 1, .nargs = 4, 372d2a97485SJohn Baldwin .args = { { Int, 0 }, { QuadHex, 1 }, { QuadHex, 2 }, 373d2a97485SJohn Baldwin { Fadvice, 3 } } }, 374f44fc79dSJohn Baldwin { .name = "posix_openpt", .ret_type = 1, .nargs = 1, 375f44fc79dSJohn Baldwin .args = { { Open, 0 } } }, 376b60a095bSJohn Baldwin { .name = "pread", .ret_type = 1, .nargs = 4, 377b60a095bSJohn Baldwin .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 }, 378b60a095bSJohn Baldwin { QuadHex, 3 } } }, 379f44fc79dSJohn Baldwin { .name = "procctl", .ret_type = 1, .nargs = 4, 380c05cc0d6SJohn Baldwin .args = { { Idtype, 0 }, { Quad, 1 }, { Procctl, 2 }, { Ptr, 3 } } }, 3815ac1c7acSJohn Baldwin { .name = "ptrace", .ret_type = 1, .nargs = 4, 3825ac1c7acSJohn Baldwin .args = { { Ptraceop, 0 }, { Int, 1 }, { Ptr, 2 }, { Int, 3 } } }, 383b60a095bSJohn Baldwin { .name = "pwrite", .ret_type = 1, .nargs = 4, 384b60a095bSJohn Baldwin .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 }, 385b60a095bSJohn Baldwin { QuadHex, 3 } } }, 386dd0c462cSJohn Baldwin { .name = "quotactl", .ret_type = 1, .nargs = 4, 387dd0c462cSJohn Baldwin .args = { { Name, 0 }, { Quotactlcmd, 1 }, { Int, 2 }, { Ptr, 3 } } }, 388f44fc79dSJohn Baldwin { .name = "read", .ret_type = 1, .nargs = 3, 389e261fb2aSJohn Baldwin .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 } } }, 390f44fc79dSJohn Baldwin { .name = "readlink", .ret_type = 1, .nargs = 3, 391e261fb2aSJohn Baldwin .args = { { Name, 0 }, { Readlinkres | OUT, 1 }, { Sizet, 2 } } }, 392f44fc79dSJohn Baldwin { .name = "readlinkat", .ret_type = 1, .nargs = 4, 393f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Readlinkres | OUT, 2 }, 394e261fb2aSJohn Baldwin { Sizet, 3 } } }, 395097b25a7SMichael Tuexen { .name = "readv", .ret_type = 1, .nargs = 3, 396097b25a7SMichael Tuexen .args = { { Int, 0 }, { Iovec | OUT, 1 }, { Int, 2 } } }, 3974152441fSJohn Baldwin { .name = "reboot", .ret_type = 1, .nargs = 1, 3984152441fSJohn Baldwin .args = { { Reboothowto, 0 } } }, 399ee3b0f6eSDiomidis Spinellis { .name = "recvfrom", .ret_type = 1, .nargs = 6, 4008b429b65SMichael Tuexen .args = { { Int, 0 }, { BinString | OUT, 1 }, { Sizet, 2 }, 4018b429b65SMichael Tuexen { Msgflags, 3 }, { Sockaddr | OUT, 4 }, 4028b429b65SMichael Tuexen { Ptr | OUT, 5 } } }, 403fca08fe6SMichael Tuexen { .name = "recvmsg", .ret_type = 1, .nargs = 3, 404a2674e03SMichael Tuexen .args = { { Int, 0 }, { Msghdr | OUT, 1 }, { Msgflags, 2 } } }, 405f44fc79dSJohn Baldwin { .name = "rename", .ret_type = 1, .nargs = 2, 406f44fc79dSJohn Baldwin .args = { { Name, 0 }, { Name, 1 } } }, 407f44fc79dSJohn Baldwin { .name = "renameat", .ret_type = 1, .nargs = 4, 408f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Atfd, 2 }, { Name, 3 } } }, 409f44fc79dSJohn Baldwin { .name = "rfork", .ret_type = 1, .nargs = 1, 410f44fc79dSJohn Baldwin .args = { { Rforkflags, 0 } } }, 411cca89ee3SBryan Drewery { .name = "rmdir", .ret_type = 1, .nargs = 1, 412cca89ee3SBryan Drewery .args = { { Name, 0 } } }, 4133cd40bc3SJohn Baldwin { .name = "rtprio", .ret_type = 1, .nargs = 3, 4143cd40bc3SJohn Baldwin .args = { { Rtpriofunc, 0 }, { Int, 1 }, { Ptr, 2 } } }, 4153cd40bc3SJohn Baldwin { .name = "rtprio_thread", .ret_type = 1, .nargs = 3, 4163cd40bc3SJohn Baldwin .args = { { Rtpriofunc, 0 }, { Int, 1 }, { Ptr, 2 } } }, 417a4110f9fSJohn Baldwin { .name = "sched_get_priority_max", .ret_type = 1, .nargs = 1, 418a4110f9fSJohn Baldwin .args = { { Schedpolicy, 0 } } }, 419a4110f9fSJohn Baldwin { .name = "sched_get_priority_min", .ret_type = 1, .nargs = 1, 420a4110f9fSJohn Baldwin .args = { { Schedpolicy, 0 } } }, 421a4110f9fSJohn Baldwin { .name = "sched_getparam", .ret_type = 1, .nargs = 2, 422a4110f9fSJohn Baldwin .args = { { Int, 0 }, { Schedparam | OUT, 1 } } }, 423a4110f9fSJohn Baldwin { .name = "sched_getscheduler", .ret_type = 1, .nargs = 1, 424a4110f9fSJohn Baldwin .args = { { Int, 0 } } }, 425a4110f9fSJohn Baldwin { .name = "sched_rr_get_interval", .ret_type = 1, .nargs = 2, 426a4110f9fSJohn Baldwin .args = { { Int, 0 }, { Timespec | OUT, 1 } } }, 427a4110f9fSJohn Baldwin { .name = "sched_setparam", .ret_type = 1, .nargs = 2, 428a4110f9fSJohn Baldwin .args = { { Int, 0 }, { Schedparam, 1 } } }, 429a4110f9fSJohn Baldwin { .name = "sched_setscheduler", .ret_type = 1, .nargs = 3, 430a4110f9fSJohn Baldwin .args = { { Int, 0 }, { Schedpolicy, 1 }, { Schedparam, 2 } } }, 431c0b72375SMichael Tuexen { .name = "sctp_generic_recvmsg", .ret_type = 1, .nargs = 7, 4324d7b9809SMichael Tuexen .args = { { Int, 0 }, { Iovec | OUT, 1 }, { Int, 2 }, 4334d7b9809SMichael Tuexen { Sockaddr | OUT, 3 }, { Ptr | OUT, 4 }, 4344d7b9809SMichael Tuexen { Sctpsndrcvinfo | OUT, 5 }, { Ptr | OUT, 6 } } }, 435c0b72375SMichael Tuexen { .name = "sctp_generic_sendmsg", .ret_type = 1, .nargs = 7, 436c0b72375SMichael Tuexen .args = { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 }, 4374d7b9809SMichael Tuexen { Sockaddr | IN, 3 }, { Socklent, 4 }, 4384d7b9809SMichael Tuexen { Sctpsndrcvinfo | IN, 5 }, { Msgflags, 6 } } }, 4394d7b9809SMichael Tuexen { .name = "sctp_generic_sendmsg_iov", .ret_type = 1, .nargs = 7, 4404d7b9809SMichael Tuexen .args = { { Int, 0 }, { Iovec | IN, 1 }, { Int, 2 }, 4414d7b9809SMichael Tuexen { Sockaddr | IN, 3 }, { Socklent, 4 }, 4424d7b9809SMichael Tuexen { Sctpsndrcvinfo | IN, 5 }, { Msgflags, 6 } } }, 443ee3b0f6eSDiomidis Spinellis { .name = "select", .ret_type = 1, .nargs = 5, 4440a46af44SJohn Baldwin .args = { { Int, 0 }, { Fd_set, 1 }, { Fd_set, 2 }, { Fd_set, 3 }, 4450a46af44SJohn Baldwin { Timeval, 4 } } }, 446fca08fe6SMichael Tuexen { .name = "sendmsg", .ret_type = 1, .nargs = 3, 447a2674e03SMichael Tuexen .args = { { Int, 0 }, { Msghdr | IN, 1 }, { Msgflags, 2 } } }, 448f44fc79dSJohn Baldwin { .name = "sendto", .ret_type = 1, .nargs = 6, 4498b429b65SMichael Tuexen .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 }, 4508b429b65SMichael Tuexen { Msgflags, 3 }, { Sockaddr | IN, 4 }, 4518b429b65SMichael Tuexen { Socklent | IN, 5 } } }, 452ee3b0f6eSDiomidis Spinellis { .name = "setitimer", .ret_type = 1, .nargs = 3, 453ee3b0f6eSDiomidis Spinellis .args = { { Int, 0 }, { Itimerval, 1 }, { Itimerval | OUT, 2 } } }, 454ad419d33SJohn Baldwin { .name = "setpriority", .ret_type = 1, .nargs = 3, 455ad419d33SJohn Baldwin .args = { { Priowhich, 0 }, { Int, 1 }, { Int, 2 } } }, 456f44fc79dSJohn Baldwin { .name = "setrlimit", .ret_type = 1, .nargs = 2, 457f44fc79dSJohn Baldwin .args = { { Resource, 0 }, { Rlimit | IN, 1 } } }, 458832af457SMichael Tuexen { .name = "setsockopt", .ret_type = 1, .nargs = 5, 459832af457SMichael Tuexen .args = { { Int, 0 }, { Sockoptlevel, 1 }, { Sockoptname, 2 }, 460832af457SMichael Tuexen { Ptr | IN, 3 }, { Socklent, 4 } } }, 461f44fc79dSJohn Baldwin { .name = "shutdown", .ret_type = 1, .nargs = 2, 462f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Shutdown, 1 } } }, 463f44fc79dSJohn Baldwin { .name = "sigaction", .ret_type = 1, .nargs = 3, 464f44fc79dSJohn Baldwin .args = { { Signal, 0 }, { Sigaction | IN, 1 }, 465f44fc79dSJohn Baldwin { Sigaction | OUT, 2 } } }, 4662b75c8adSJohn Baldwin { .name = "sigpending", .ret_type = 1, .nargs = 1, 467b289a8d7SJohn Baldwin .args = { { Sigset | OUT, 0 } } }, 4682b75c8adSJohn Baldwin { .name = "sigprocmask", .ret_type = 1, .nargs = 3, 469ee3b0f6eSDiomidis Spinellis .args = { { Sigprocmask, 0 }, { Sigset, 1 }, { Sigset | OUT, 2 } } }, 4702b75c8adSJohn Baldwin { .name = "sigqueue", .ret_type = 1, .nargs = 3, 471b289a8d7SJohn Baldwin .args = { { Int, 0 }, { Signal, 1 }, { LongHex, 2 } } }, 4722b75c8adSJohn Baldwin { .name = "sigreturn", .ret_type = 1, .nargs = 1, 473b289a8d7SJohn Baldwin .args = { { Ptr, 0 } } }, 4742b75c8adSJohn Baldwin { .name = "sigsuspend", .ret_type = 1, .nargs = 1, 475b289a8d7SJohn Baldwin .args = { { Sigset | IN, 0 } } }, 476b289a8d7SJohn Baldwin { .name = "sigtimedwait", .ret_type = 1, .nargs = 3, 47713e5e6b6SJohn Baldwin .args = { { Sigset | IN, 0 }, { Siginfo | OUT, 1 }, 47813e5e6b6SJohn Baldwin { Timespec | IN, 2 } } }, 479b289a8d7SJohn Baldwin { .name = "sigwait", .ret_type = 1, .nargs = 2, 48013e5e6b6SJohn Baldwin .args = { { Sigset | IN, 0 }, { PSig | OUT, 1 } } }, 481b289a8d7SJohn Baldwin { .name = "sigwaitinfo", .ret_type = 1, .nargs = 2, 48213e5e6b6SJohn Baldwin .args = { { Sigset | IN, 0 }, { Siginfo | OUT, 1 } } }, 483ee3b0f6eSDiomidis Spinellis { .name = "socket", .ret_type = 1, .nargs = 3, 484ecac235bSMichael Tuexen .args = { { Sockdomain, 0 }, { Socktype, 1 }, { Sockprotocol, 2 } } }, 485f44fc79dSJohn Baldwin { .name = "stat", .ret_type = 1, .nargs = 2, 486f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Stat | OUT, 1 } } }, 487f44fc79dSJohn Baldwin { .name = "statfs", .ret_type = 1, .nargs = 2, 488f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { StatFs | OUT, 1 } } }, 489ee3b0f6eSDiomidis Spinellis { .name = "symlink", .ret_type = 1, .nargs = 2, 490ee3b0f6eSDiomidis Spinellis .args = { { Name, 0 }, { Name, 1 } } }, 4917d897327SJohn Baldwin { .name = "symlinkat", .ret_type = 1, .nargs = 3, 4927d897327SJohn Baldwin .args = { { Name, 0 }, { Atfd, 1 }, { Name, 2 } } }, 493f44fc79dSJohn Baldwin { .name = "sysarch", .ret_type = 1, .nargs = 2, 494f44fc79dSJohn Baldwin .args = { { Sysarch, 0 }, { Ptr, 1 } } }, 495f44fc79dSJohn Baldwin { .name = "thr_kill", .ret_type = 1, .nargs = 2, 496f44fc79dSJohn Baldwin .args = { { Long, 0 }, { Signal, 1 } } }, 497f44fc79dSJohn Baldwin { .name = "thr_self", .ret_type = 1, .nargs = 1, 498f44fc79dSJohn Baldwin .args = { { Ptr, 0 } } }, 499d86cddf0SJohn Baldwin { .name = "thr_set_name", .ret_type = 1, .nargs = 2, 500d86cddf0SJohn Baldwin .args = { { Long, 0 }, { Name, 1 } } }, 501f44fc79dSJohn Baldwin { .name = "truncate", .ret_type = 1, .nargs = 2, 502c05cc0d6SJohn Baldwin .args = { { Name | IN, 0 }, { QuadHex | IN, 1 } } }, 503f44fc79dSJohn Baldwin #if 0 504f44fc79dSJohn Baldwin /* Does not exist */ 505f44fc79dSJohn Baldwin { .name = "umount", .ret_type = 1, .nargs = 2, 506f44fc79dSJohn Baldwin .args = { { Name, 0 }, { Int, 2 } } }, 507f44fc79dSJohn Baldwin #endif 508f44fc79dSJohn Baldwin { .name = "unlink", .ret_type = 1, .nargs = 1, 509f44fc79dSJohn Baldwin .args = { { Name, 0 } } }, 510f44fc79dSJohn Baldwin { .name = "unlinkat", .ret_type = 1, .nargs = 3, 511f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name, 1 }, { Atflags, 2 } } }, 512f44fc79dSJohn Baldwin { .name = "unmount", .ret_type = 1, .nargs = 2, 5138acc8e78SJohn Baldwin .args = { { Name, 0 }, { Mountflags, 1 } } }, 514f44fc79dSJohn Baldwin { .name = "utimensat", .ret_type = 1, .nargs = 4, 515f44fc79dSJohn Baldwin .args = { { Atfd, 0 }, { Name | IN, 1 }, { Timespec2 | IN, 2 }, 516f44fc79dSJohn Baldwin { Atflags, 3 } } }, 517f44fc79dSJohn Baldwin { .name = "utimes", .ret_type = 1, .nargs = 2, 518f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Timeval2 | IN, 1 } } }, 519195aef99SBryan Drewery { .name = "utrace", .ret_type = 1, .nargs = 1, 520195aef99SBryan Drewery .args = { { Utrace, 0 } } }, 52134763d1cSJohn Baldwin { .name = "wait4", .ret_type = 1, .nargs = 4, 52234763d1cSJohn Baldwin .args = { { Int, 0 }, { ExitStatus | OUT, 1 }, { Waitoptions, 2 }, 52334763d1cSJohn Baldwin { Rusage | OUT, 3 } } }, 52434763d1cSJohn Baldwin { .name = "wait6", .ret_type = 1, .nargs = 6, 525c05cc0d6SJohn Baldwin .args = { { Idtype, 0 }, { Quad, 1 }, { ExitStatus | OUT, 2 }, 52613e5e6b6SJohn Baldwin { Waitoptions, 3 }, { Rusage | OUT, 4 }, 52713e5e6b6SJohn Baldwin { Siginfo | OUT, 5 } } }, 528f44fc79dSJohn Baldwin { .name = "write", .ret_type = 1, .nargs = 3, 529e261fb2aSJohn Baldwin .args = { { Int, 0 }, { BinString | IN, 1 }, { Sizet, 2 } } }, 530ee6e58b2SMichael Tuexen { .name = "writev", .ret_type = 1, .nargs = 3, 531dfcd2888SMichael Tuexen .args = { { Int, 0 }, { Iovec | IN, 1 }, { Int, 2 } } }, 532f44fc79dSJohn Baldwin 533f44fc79dSJohn Baldwin /* Linux ABI */ 534f44fc79dSJohn Baldwin { .name = "linux_access", .ret_type = 1, .nargs = 2, 535f44fc79dSJohn Baldwin .args = { { Name, 0 }, { Accessmode, 1 } } }, 536f44fc79dSJohn Baldwin { .name = "linux_execve", .ret_type = 1, .nargs = 3, 537f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { ExecArgs | IN, 1 }, 538f44fc79dSJohn Baldwin { ExecEnv | IN, 2 } } }, 539f44fc79dSJohn Baldwin { .name = "linux_lseek", .ret_type = 2, .nargs = 3, 540f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Int, 1 }, { Whence, 2 } } }, 541f44fc79dSJohn Baldwin { .name = "linux_mkdir", .ret_type = 1, .nargs = 2, 542f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Int, 1 } } }, 543f44fc79dSJohn Baldwin { .name = "linux_newfstat", .ret_type = 1, .nargs = 2, 544f44fc79dSJohn Baldwin .args = { { Int, 0 }, { Ptr | OUT, 1 } } }, 545f44fc79dSJohn Baldwin { .name = "linux_newstat", .ret_type = 1, .nargs = 2, 546f44fc79dSJohn Baldwin .args = { { Name | IN, 0 }, { Ptr | OUT, 1 } } }, 547f44fc79dSJohn Baldwin { .name = "linux_open", .ret_type = 1, .nargs = 3, 548f44fc79dSJohn Baldwin .args = { { Name, 0 }, { Hex, 1 }, { Octal, 2 } } }, 549f44fc79dSJohn Baldwin { .name = "linux_readlink", .ret_type = 1, .nargs = 3, 550e261fb2aSJohn Baldwin .args = { { Name, 0 }, { Name | OUT, 1 }, { Sizet, 2 } } }, 551f44fc79dSJohn Baldwin { .name = "linux_socketcall", .ret_type = 1, .nargs = 2, 552f44fc79dSJohn Baldwin .args = { { Int, 0 }, { LinuxSockArgs, 1 } } }, 55364f4703bSJohn Baldwin { .name = "linux_stat64", .ret_type = 1, .nargs = 2, 55464f4703bSJohn Baldwin .args = { { Name | IN, 0 }, { Ptr | OUT, 1 } } }, 555f44fc79dSJohn Baldwin 556808d9805SEd Schouten /* CloudABI system calls. */ 557808d9805SEd Schouten { .name = "cloudabi_sys_clock_res_get", .ret_type = 1, .nargs = 1, 558808d9805SEd Schouten .args = { { CloudABIClockID, 0 } } }, 559808d9805SEd Schouten { .name = "cloudabi_sys_clock_time_get", .ret_type = 1, .nargs = 2, 560808d9805SEd Schouten .args = { { CloudABIClockID, 0 }, { CloudABITimestamp, 1 } } }, 561808d9805SEd Schouten { .name = "cloudabi_sys_condvar_signal", .ret_type = 1, .nargs = 3, 562808d9805SEd Schouten .args = { { Ptr, 0 }, { CloudABIMFlags, 1 }, { UInt, 2 } } }, 563808d9805SEd Schouten { .name = "cloudabi_sys_fd_close", .ret_type = 1, .nargs = 1, 564808d9805SEd Schouten .args = { { Int, 0 } } }, 565808d9805SEd Schouten { .name = "cloudabi_sys_fd_create1", .ret_type = 1, .nargs = 1, 566808d9805SEd Schouten .args = { { CloudABIFileType, 0 } } }, 567808d9805SEd Schouten { .name = "cloudabi_sys_fd_create2", .ret_type = 1, .nargs = 2, 568808d9805SEd Schouten .args = { { CloudABIFileType, 0 }, { PipeFds | OUT, 0 } } }, 569808d9805SEd Schouten { .name = "cloudabi_sys_fd_datasync", .ret_type = 1, .nargs = 1, 570808d9805SEd Schouten .args = { { Int, 0 } } }, 571808d9805SEd Schouten { .name = "cloudabi_sys_fd_dup", .ret_type = 1, .nargs = 1, 572808d9805SEd Schouten .args = { { Int, 0 } } }, 573808d9805SEd Schouten { .name = "cloudabi_sys_fd_replace", .ret_type = 1, .nargs = 2, 574808d9805SEd Schouten .args = { { Int, 0 }, { Int, 1 } } }, 575808d9805SEd Schouten { .name = "cloudabi_sys_fd_seek", .ret_type = 1, .nargs = 3, 576808d9805SEd Schouten .args = { { Int, 0 }, { Int, 1 }, { CloudABIWhence, 2 } } }, 577808d9805SEd Schouten { .name = "cloudabi_sys_fd_stat_get", .ret_type = 1, .nargs = 2, 578808d9805SEd Schouten .args = { { Int, 0 }, { CloudABIFDStat | OUT, 1 } } }, 579808d9805SEd Schouten { .name = "cloudabi_sys_fd_stat_put", .ret_type = 1, .nargs = 3, 580808d9805SEd Schouten .args = { { Int, 0 }, { CloudABIFDStat | IN, 1 }, 581808d9805SEd Schouten { ClouduABIFDSFlags, 2 } } }, 582808d9805SEd Schouten { .name = "cloudabi_sys_fd_sync", .ret_type = 1, .nargs = 1, 583808d9805SEd Schouten .args = { { Int, 0 } } }, 584808d9805SEd Schouten { .name = "cloudabi_sys_file_advise", .ret_type = 1, .nargs = 4, 585808d9805SEd Schouten .args = { { Int, 0 }, { Int, 1 }, { Int, 2 }, 586808d9805SEd Schouten { CloudABIAdvice, 3 } } }, 587808d9805SEd Schouten { .name = "cloudabi_sys_file_allocate", .ret_type = 1, .nargs = 3, 588808d9805SEd Schouten .args = { { Int, 0 }, { Int, 1 }, { Int, 2 } } }, 589808d9805SEd Schouten { .name = "cloudabi_sys_file_create", .ret_type = 1, .nargs = 3, 590808d9805SEd Schouten .args = { { Int, 0 }, { BinString | IN, 1 }, 591808d9805SEd Schouten { CloudABIFileType, 3 } } }, 592808d9805SEd Schouten { .name = "cloudabi_sys_file_link", .ret_type = 1, .nargs = 4, 593808d9805SEd Schouten .args = { { CloudABILookup, 0 }, { BinString | IN, 1 }, 594808d9805SEd Schouten { Int, 3 }, { BinString | IN, 4 } } }, 595808d9805SEd Schouten { .name = "cloudabi_sys_file_open", .ret_type = 1, .nargs = 4, 596808d9805SEd Schouten .args = { { Int, 0 }, { BinString | IN, 1 }, 597808d9805SEd Schouten { CloudABIOFlags, 3 }, { CloudABIFDStat | IN, 4 } } }, 598808d9805SEd Schouten { .name = "cloudabi_sys_file_readdir", .ret_type = 1, .nargs = 4, 599808d9805SEd Schouten .args = { { Int, 0 }, { BinString | OUT, 1 }, { Int, 2 }, 600808d9805SEd Schouten { Int, 3 } } }, 601808d9805SEd Schouten { .name = "cloudabi_sys_file_readlink", .ret_type = 1, .nargs = 4, 602808d9805SEd Schouten .args = { { Int, 0 }, { BinString | IN, 1 }, 603808d9805SEd Schouten { BinString | OUT, 3 }, { Int, 4 } } }, 604808d9805SEd Schouten { .name = "cloudabi_sys_file_rename", .ret_type = 1, .nargs = 4, 605808d9805SEd Schouten .args = { { Int, 0 }, { BinString | IN, 1 }, 606808d9805SEd Schouten { Int, 3 }, { BinString | IN, 4 } } }, 607808d9805SEd Schouten { .name = "cloudabi_sys_file_stat_fget", .ret_type = 1, .nargs = 2, 608808d9805SEd Schouten .args = { { Int, 0 }, { CloudABIFileStat | OUT, 1 } } }, 609808d9805SEd Schouten { .name = "cloudabi_sys_file_stat_fput", .ret_type = 1, .nargs = 3, 610808d9805SEd Schouten .args = { { Int, 0 }, { CloudABIFileStat | IN, 1 }, 611808d9805SEd Schouten { CloudABIFSFlags, 2 } } }, 612808d9805SEd Schouten { .name = "cloudabi_sys_file_stat_get", .ret_type = 1, .nargs = 3, 613808d9805SEd Schouten .args = { { CloudABILookup, 0 }, { BinString | IN, 1 }, 614808d9805SEd Schouten { CloudABIFileStat | OUT, 3 } } }, 615808d9805SEd Schouten { .name = "cloudabi_sys_file_stat_put", .ret_type = 1, .nargs = 4, 616808d9805SEd Schouten .args = { { CloudABILookup, 0 }, { BinString | IN, 1 }, 617808d9805SEd Schouten { CloudABIFileStat | IN, 3 }, { CloudABIFSFlags, 4 } } }, 618808d9805SEd Schouten { .name = "cloudabi_sys_file_symlink", .ret_type = 1, .nargs = 3, 619808d9805SEd Schouten .args = { { BinString | IN, 0 }, 620808d9805SEd Schouten { Int, 2 }, { BinString | IN, 3 } } }, 621808d9805SEd Schouten { .name = "cloudabi_sys_file_unlink", .ret_type = 1, .nargs = 3, 622808d9805SEd Schouten .args = { { Int, 0 }, { BinString | IN, 1 }, 623808d9805SEd Schouten { CloudABIULFlags, 3 } } }, 624808d9805SEd Schouten { .name = "cloudabi_sys_lock_unlock", .ret_type = 1, .nargs = 2, 625808d9805SEd Schouten .args = { { Ptr, 0 }, { CloudABIMFlags, 1 } } }, 626808d9805SEd Schouten { .name = "cloudabi_sys_mem_advise", .ret_type = 1, .nargs = 3, 627808d9805SEd Schouten .args = { { Ptr, 0 }, { Int, 1 }, { CloudABIAdvice, 2 } } }, 628808d9805SEd Schouten { .name = "cloudabi_sys_mem_map", .ret_type = 1, .nargs = 6, 629808d9805SEd Schouten .args = { { Ptr, 0 }, { Int, 1 }, { CloudABIMProt, 2 }, 630808d9805SEd Schouten { CloudABIMFlags, 3 }, { Int, 4 }, { Int, 5 } } }, 631808d9805SEd Schouten { .name = "cloudabi_sys_mem_protect", .ret_type = 1, .nargs = 3, 632808d9805SEd Schouten .args = { { Ptr, 0 }, { Int, 1 }, { CloudABIMProt, 2 } } }, 633808d9805SEd Schouten { .name = "cloudabi_sys_mem_sync", .ret_type = 1, .nargs = 3, 634808d9805SEd Schouten .args = { { Ptr, 0 }, { Int, 1 }, { CloudABIMSFlags, 2 } } }, 635808d9805SEd Schouten { .name = "cloudabi_sys_mem_unmap", .ret_type = 1, .nargs = 2, 636808d9805SEd Schouten .args = { { Ptr, 0 }, { Int, 1 } } }, 637808d9805SEd Schouten { .name = "cloudabi_sys_proc_exec", .ret_type = 1, .nargs = 5, 638808d9805SEd Schouten .args = { { Int, 0 }, { BinString | IN, 1 }, { Int, 2 }, 639808d9805SEd Schouten { IntArray, 3 }, { Int, 4 } } }, 640808d9805SEd Schouten { .name = "cloudabi_sys_proc_exit", .ret_type = 1, .nargs = 1, 641808d9805SEd Schouten .args = { { Int, 0 } } }, 642808d9805SEd Schouten { .name = "cloudabi_sys_proc_fork", .ret_type = 1, .nargs = 0 }, 643808d9805SEd Schouten { .name = "cloudabi_sys_proc_raise", .ret_type = 1, .nargs = 1, 644808d9805SEd Schouten .args = { { CloudABISignal, 0 } } }, 645808d9805SEd Schouten { .name = "cloudabi_sys_random_get", .ret_type = 1, .nargs = 2, 646808d9805SEd Schouten .args = { { BinString | OUT, 0 }, { Int, 1 } } }, 647808d9805SEd Schouten { .name = "cloudabi_sys_sock_shutdown", .ret_type = 1, .nargs = 2, 648808d9805SEd Schouten .args = { { Int, 0 }, { CloudABISDFlags, 1 } } }, 649808d9805SEd Schouten { .name = "cloudabi_sys_thread_exit", .ret_type = 1, .nargs = 2, 650808d9805SEd Schouten .args = { { Ptr, 0 }, { CloudABIMFlags, 1 } } }, 651808d9805SEd Schouten { .name = "cloudabi_sys_thread_yield", .ret_type = 1, .nargs = 0 }, 652808d9805SEd Schouten 653ee3b0f6eSDiomidis Spinellis { .name = 0 }, 654bbeaf6c0SSean Eric Fagan }; 6556c61b0f3SBryan Drewery static STAILQ_HEAD(, syscall) syscalls; 656bbeaf6c0SSean Eric Fagan 657081e5c48SPav Lucistnik /* Xlat idea taken from strace */ 658081e5c48SPav Lucistnik struct xlat { 659081e5c48SPav Lucistnik int val; 6605d2d083cSXin LI const char *str; 661081e5c48SPav Lucistnik }; 662081e5c48SPav Lucistnik 663081e5c48SPav Lucistnik #define X(a) { a, #a }, 664081e5c48SPav Lucistnik #define XEND { 0, NULL } 665081e5c48SPav Lucistnik 666a02c83afSEd Schouten static struct xlat poll_flags[] = { 667081e5c48SPav Lucistnik X(POLLSTANDARD) X(POLLIN) X(POLLPRI) X(POLLOUT) X(POLLERR) 668081e5c48SPav Lucistnik X(POLLHUP) X(POLLNVAL) X(POLLRDNORM) X(POLLRDBAND) 669081e5c48SPav Lucistnik X(POLLWRBAND) X(POLLINIGNEOF) XEND 670081e5c48SPav Lucistnik }; 671081e5c48SPav Lucistnik 672081e5c48SPav Lucistnik static struct xlat sigaction_flags[] = { 673081e5c48SPav Lucistnik X(SA_ONSTACK) X(SA_RESTART) X(SA_RESETHAND) X(SA_NOCLDSTOP) 674081e5c48SPav Lucistnik X(SA_NODEFER) X(SA_NOCLDWAIT) X(SA_SIGINFO) XEND 675081e5c48SPav Lucistnik }; 676081e5c48SPav Lucistnik 677fb7eabb0SJohn Baldwin static struct xlat linux_socketcall_ops[] = { 678fb7eabb0SJohn Baldwin X(LINUX_SOCKET) X(LINUX_BIND) X(LINUX_CONNECT) X(LINUX_LISTEN) 679fb7eabb0SJohn Baldwin X(LINUX_ACCEPT) X(LINUX_GETSOCKNAME) X(LINUX_GETPEERNAME) 680fb7eabb0SJohn Baldwin X(LINUX_SOCKETPAIR) X(LINUX_SEND) X(LINUX_RECV) X(LINUX_SENDTO) 681fb7eabb0SJohn Baldwin X(LINUX_RECVFROM) X(LINUX_SHUTDOWN) X(LINUX_SETSOCKOPT) 682fb7eabb0SJohn Baldwin X(LINUX_GETSOCKOPT) X(LINUX_SENDMSG) X(LINUX_RECVMSG) 683fb7eabb0SJohn Baldwin XEND 684fb7eabb0SJohn Baldwin }; 685fb7eabb0SJohn Baldwin 686081e5c48SPav Lucistnik #undef X 687808d9805SEd Schouten #define X(a) { CLOUDABI_##a, #a }, 688808d9805SEd Schouten 689808d9805SEd Schouten static struct xlat cloudabi_advice[] = { 690808d9805SEd Schouten X(ADVICE_DONTNEED) X(ADVICE_NOREUSE) X(ADVICE_NORMAL) 691808d9805SEd Schouten X(ADVICE_RANDOM) X(ADVICE_SEQUENTIAL) X(ADVICE_WILLNEED) 692808d9805SEd Schouten XEND 693808d9805SEd Schouten }; 694808d9805SEd Schouten 695808d9805SEd Schouten static struct xlat cloudabi_clockid[] = { 696808d9805SEd Schouten X(CLOCK_MONOTONIC) X(CLOCK_PROCESS_CPUTIME_ID) 697808d9805SEd Schouten X(CLOCK_REALTIME) X(CLOCK_THREAD_CPUTIME_ID) 698808d9805SEd Schouten XEND 699808d9805SEd Schouten }; 700808d9805SEd Schouten 701808d9805SEd Schouten static struct xlat cloudabi_fdflags[] = { 702808d9805SEd Schouten X(FDFLAG_APPEND) X(FDFLAG_DSYNC) X(FDFLAG_NONBLOCK) 703808d9805SEd Schouten X(FDFLAG_RSYNC) X(FDFLAG_SYNC) 704808d9805SEd Schouten XEND 705808d9805SEd Schouten }; 706808d9805SEd Schouten 707808d9805SEd Schouten static struct xlat cloudabi_fdsflags[] = { 708808d9805SEd Schouten X(FDSTAT_FLAGS) X(FDSTAT_RIGHTS) 709808d9805SEd Schouten XEND 710808d9805SEd Schouten }; 711808d9805SEd Schouten 712808d9805SEd Schouten static struct xlat cloudabi_filetype[] = { 713808d9805SEd Schouten X(FILETYPE_UNKNOWN) X(FILETYPE_BLOCK_DEVICE) 714808d9805SEd Schouten X(FILETYPE_CHARACTER_DEVICE) X(FILETYPE_DIRECTORY) 7154e184778SEd Schouten X(FILETYPE_PROCESS) X(FILETYPE_REGULAR_FILE) 716733ba7f8SEd Schouten X(FILETYPE_SHARED_MEMORY) X(FILETYPE_SOCKET_DGRAM) 717733ba7f8SEd Schouten X(FILETYPE_SOCKET_STREAM) X(FILETYPE_SYMBOLIC_LINK) 718808d9805SEd Schouten XEND 719808d9805SEd Schouten }; 720808d9805SEd Schouten 721808d9805SEd Schouten static struct xlat cloudabi_fsflags[] = { 722808d9805SEd Schouten X(FILESTAT_ATIM) X(FILESTAT_ATIM_NOW) X(FILESTAT_MTIM) 723808d9805SEd Schouten X(FILESTAT_MTIM_NOW) X(FILESTAT_SIZE) 724808d9805SEd Schouten XEND 725808d9805SEd Schouten }; 726808d9805SEd Schouten 727808d9805SEd Schouten static struct xlat cloudabi_mflags[] = { 728808d9805SEd Schouten X(MAP_ANON) X(MAP_FIXED) X(MAP_PRIVATE) X(MAP_SHARED) 729808d9805SEd Schouten XEND 730808d9805SEd Schouten }; 731808d9805SEd Schouten 732808d9805SEd Schouten static struct xlat cloudabi_mprot[] = { 733808d9805SEd Schouten X(PROT_EXEC) X(PROT_WRITE) X(PROT_READ) 734808d9805SEd Schouten XEND 735808d9805SEd Schouten }; 736808d9805SEd Schouten 737808d9805SEd Schouten static struct xlat cloudabi_msflags[] = { 738808d9805SEd Schouten X(MS_ASYNC) X(MS_INVALIDATE) X(MS_SYNC) 739808d9805SEd Schouten XEND 740808d9805SEd Schouten }; 741808d9805SEd Schouten 742808d9805SEd Schouten static struct xlat cloudabi_oflags[] = { 743808d9805SEd Schouten X(O_CREAT) X(O_DIRECTORY) X(O_EXCL) X(O_TRUNC) 744808d9805SEd Schouten XEND 745808d9805SEd Schouten }; 746808d9805SEd Schouten 747808d9805SEd Schouten static struct xlat cloudabi_sdflags[] = { 748808d9805SEd Schouten X(SHUT_RD) X(SHUT_WR) 749808d9805SEd Schouten XEND 750808d9805SEd Schouten }; 751808d9805SEd Schouten 752808d9805SEd Schouten static struct xlat cloudabi_signal[] = { 753808d9805SEd Schouten X(SIGABRT) X(SIGALRM) X(SIGBUS) X(SIGCHLD) X(SIGCONT) X(SIGFPE) 754808d9805SEd Schouten X(SIGHUP) X(SIGILL) X(SIGINT) X(SIGKILL) X(SIGPIPE) X(SIGQUIT) 755808d9805SEd Schouten X(SIGSEGV) X(SIGSTOP) X(SIGSYS) X(SIGTERM) X(SIGTRAP) X(SIGTSTP) 756808d9805SEd Schouten X(SIGTTIN) X(SIGTTOU) X(SIGURG) X(SIGUSR1) X(SIGUSR2) 757808d9805SEd Schouten X(SIGVTALRM) X(SIGXCPU) X(SIGXFSZ) 758808d9805SEd Schouten XEND 759808d9805SEd Schouten }; 760808d9805SEd Schouten 761808d9805SEd Schouten static struct xlat cloudabi_ulflags[] = { 762808d9805SEd Schouten X(UNLINK_REMOVEDIR) 763808d9805SEd Schouten XEND 764808d9805SEd Schouten }; 765808d9805SEd Schouten 766808d9805SEd Schouten static struct xlat cloudabi_whence[] = { 767808d9805SEd Schouten X(WHENCE_CUR) X(WHENCE_END) X(WHENCE_SET) 768808d9805SEd Schouten XEND 769808d9805SEd Schouten }; 770808d9805SEd Schouten 771808d9805SEd Schouten #undef X 772081e5c48SPav Lucistnik #undef XEND 773081e5c48SPav Lucistnik 774d8984f48SDag-Erling Smørgrav /* 775d8984f48SDag-Erling Smørgrav * Searches an xlat array for a value, and returns it if found. Otherwise 776d8984f48SDag-Erling Smørgrav * return a string representation. 777d8984f48SDag-Erling Smørgrav */ 778d8984f48SDag-Erling Smørgrav static const char * 779d8984f48SDag-Erling Smørgrav lookup(struct xlat *xlat, int val, int base) 780081e5c48SPav Lucistnik { 781081e5c48SPav Lucistnik static char tmp[16]; 782d8984f48SDag-Erling Smørgrav 783081e5c48SPav Lucistnik for (; xlat->str != NULL; xlat++) 784081e5c48SPav Lucistnik if (xlat->val == val) 785d8984f48SDag-Erling Smørgrav return (xlat->str); 786081e5c48SPav Lucistnik switch (base) { 787081e5c48SPav Lucistnik case 8: 788081e5c48SPav Lucistnik sprintf(tmp, "0%o", val); 789081e5c48SPav Lucistnik break; 790081e5c48SPav Lucistnik case 16: 791081e5c48SPav Lucistnik sprintf(tmp, "0x%x", val); 792081e5c48SPav Lucistnik break; 793081e5c48SPav Lucistnik case 10: 794081e5c48SPav Lucistnik sprintf(tmp, "%u", val); 795081e5c48SPav Lucistnik break; 796081e5c48SPav Lucistnik default: 797081e5c48SPav Lucistnik errx(1,"Unknown lookup base"); 798081e5c48SPav Lucistnik break; 799081e5c48SPav Lucistnik } 800d8984f48SDag-Erling Smørgrav return (tmp); 801081e5c48SPav Lucistnik } 802081e5c48SPav Lucistnik 8035d2d083cSXin LI static const char * 8045d2d083cSXin LI xlookup(struct xlat *xlat, int val) 805081e5c48SPav Lucistnik { 806d8984f48SDag-Erling Smørgrav 807d8984f48SDag-Erling Smørgrav return (lookup(xlat, val, 16)); 808081e5c48SPav Lucistnik } 809081e5c48SPav Lucistnik 8104e3da534SJohn Baldwin /* 8114e3da534SJohn Baldwin * Searches an xlat array containing bitfield values. Remaining bits 8124e3da534SJohn Baldwin * set after removing the known ones are printed at the end: 8134e3da534SJohn Baldwin * IN|0x400. 8144e3da534SJohn Baldwin */ 815d8984f48SDag-Erling Smørgrav static char * 816d8984f48SDag-Erling Smørgrav xlookup_bits(struct xlat *xlat, int val) 817081e5c48SPav Lucistnik { 81894355cfdSAndrey Zonov int len, rem; 819081e5c48SPav Lucistnik static char str[512]; 820081e5c48SPav Lucistnik 82194355cfdSAndrey Zonov len = 0; 82294355cfdSAndrey Zonov rem = val; 823d8984f48SDag-Erling Smørgrav for (; xlat->str != NULL; xlat++) { 824d8984f48SDag-Erling Smørgrav if ((xlat->val & rem) == xlat->val) { 8254e3da534SJohn Baldwin /* 8264e3da534SJohn Baldwin * Don't print the "all-bits-zero" string unless all 8274e3da534SJohn Baldwin * bits are really zero. 8284e3da534SJohn Baldwin */ 829081e5c48SPav Lucistnik if (xlat->val == 0 && val != 0) 830081e5c48SPav Lucistnik continue; 831081e5c48SPav Lucistnik len += sprintf(str + len, "%s|", xlat->str); 832081e5c48SPav Lucistnik rem &= ~(xlat->val); 833081e5c48SPav Lucistnik } 834081e5c48SPav Lucistnik } 8354e3da534SJohn Baldwin 8364e3da534SJohn Baldwin /* 8374e3da534SJohn Baldwin * If we have leftover bits or didn't match anything, print 8384e3da534SJohn Baldwin * the remainder. 8394e3da534SJohn Baldwin */ 840081e5c48SPav Lucistnik if (rem || len == 0) 841081e5c48SPav Lucistnik len += sprintf(str + len, "0x%x", rem); 842081e5c48SPav Lucistnik if (len && str[len - 1] == '|') 843081e5c48SPav Lucistnik len--; 844081e5c48SPav Lucistnik str[len] = 0; 845d8984f48SDag-Erling Smørgrav return (str); 846081e5c48SPav Lucistnik } 847081e5c48SPav Lucistnik 8489289f547SJohn Baldwin static void 8499289f547SJohn Baldwin print_integer_arg(const char *(*decoder)(int), FILE *fp, int value) 8509289f547SJohn Baldwin { 8519289f547SJohn Baldwin const char *str; 8529289f547SJohn Baldwin 8539289f547SJohn Baldwin str = decoder(value); 8549289f547SJohn Baldwin if (str != NULL) 8559289f547SJohn Baldwin fputs(str, fp); 8569289f547SJohn Baldwin else 8579289f547SJohn Baldwin fprintf(fp, "%d", value); 8589289f547SJohn Baldwin } 8599289f547SJohn Baldwin 8609289f547SJohn Baldwin static void 8619289f547SJohn Baldwin print_mask_arg(bool (*decoder)(FILE *, int, int *), FILE *fp, int value) 8629289f547SJohn Baldwin { 8639289f547SJohn Baldwin int rem; 8649289f547SJohn Baldwin 8659289f547SJohn Baldwin if (!decoder(fp, value, &rem)) 8669289f547SJohn Baldwin fprintf(fp, "0x%x", rem); 8679289f547SJohn Baldwin else if (rem != 0) 8689289f547SJohn Baldwin fprintf(fp, "|0x%x", rem); 8699289f547SJohn Baldwin } 8709289f547SJohn Baldwin 871bed418c8SJohn Baldwin static void 872bed418c8SJohn Baldwin print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), FILE *fp, 873bed418c8SJohn Baldwin uint32_t value) 874bed418c8SJohn Baldwin { 875bed418c8SJohn Baldwin uint32_t rem; 876bed418c8SJohn Baldwin 877bed418c8SJohn Baldwin if (!decoder(fp, value, &rem)) 878bed418c8SJohn Baldwin fprintf(fp, "0x%x", rem); 879bed418c8SJohn Baldwin else if (rem != 0) 880bed418c8SJohn Baldwin fprintf(fp, "|0x%x", rem); 881bed418c8SJohn Baldwin } 882bed418c8SJohn Baldwin 883c05cc0d6SJohn Baldwin #ifndef __LP64__ 884c05cc0d6SJohn Baldwin /* 885c05cc0d6SJohn Baldwin * Add argument padding to subsequent system calls afater a Quad 886c05cc0d6SJohn Baldwin * syscall arguments as needed. This used to be done by hand in the 887c05cc0d6SJohn Baldwin * decoded_syscalls table which was ugly and error prone. It is 888c05cc0d6SJohn Baldwin * simpler to do the fixup of offsets at initalization time than when 889c05cc0d6SJohn Baldwin * decoding arguments. 890c05cc0d6SJohn Baldwin */ 891c05cc0d6SJohn Baldwin static void 892c05cc0d6SJohn Baldwin quad_fixup(struct syscall *sc) 893c05cc0d6SJohn Baldwin { 894c05cc0d6SJohn Baldwin int offset, prev; 895c05cc0d6SJohn Baldwin u_int i; 896c05cc0d6SJohn Baldwin 897c05cc0d6SJohn Baldwin offset = 0; 898c05cc0d6SJohn Baldwin prev = -1; 899c05cc0d6SJohn Baldwin for (i = 0; i < sc->nargs; i++) { 900c05cc0d6SJohn Baldwin /* This arg type is a dummy that doesn't use offset. */ 901c05cc0d6SJohn Baldwin if ((sc->args[i].type & ARG_MASK) == PipeFds) 902c05cc0d6SJohn Baldwin continue; 903c05cc0d6SJohn Baldwin 904c05cc0d6SJohn Baldwin assert(prev < sc->args[i].offset); 905c05cc0d6SJohn Baldwin prev = sc->args[i].offset; 906c05cc0d6SJohn Baldwin sc->args[i].offset += offset; 907c05cc0d6SJohn Baldwin switch (sc->args[i].type & ARG_MASK) { 908c05cc0d6SJohn Baldwin case Quad: 909c05cc0d6SJohn Baldwin case QuadHex: 910c05cc0d6SJohn Baldwin #ifdef __powerpc__ 911c05cc0d6SJohn Baldwin /* 912c05cc0d6SJohn Baldwin * 64-bit arguments on 32-bit powerpc must be 913c05cc0d6SJohn Baldwin * 64-bit aligned. If the current offset is 914c05cc0d6SJohn Baldwin * not aligned, the calling convention inserts 915c05cc0d6SJohn Baldwin * a 32-bit pad argument that should be skipped. 916c05cc0d6SJohn Baldwin */ 917c05cc0d6SJohn Baldwin if (sc->args[i].offset % 2 == 1) { 918c05cc0d6SJohn Baldwin sc->args[i].offset++; 919c05cc0d6SJohn Baldwin offset++; 920c05cc0d6SJohn Baldwin } 921c05cc0d6SJohn Baldwin #endif 922c05cc0d6SJohn Baldwin offset++; 923c05cc0d6SJohn Baldwin default: 924c05cc0d6SJohn Baldwin break; 925c05cc0d6SJohn Baldwin } 926c05cc0d6SJohn Baldwin } 927c05cc0d6SJohn Baldwin } 928c05cc0d6SJohn Baldwin #endif 929c05cc0d6SJohn Baldwin 9306c61b0f3SBryan Drewery void 9316c61b0f3SBryan Drewery init_syscalls(void) 9326c61b0f3SBryan Drewery { 9336c61b0f3SBryan Drewery struct syscall *sc; 9346c61b0f3SBryan Drewery 9356c61b0f3SBryan Drewery STAILQ_INIT(&syscalls); 936c05cc0d6SJohn Baldwin for (sc = decoded_syscalls; sc->name != NULL; sc++) { 937c05cc0d6SJohn Baldwin #ifndef __LP64__ 938c05cc0d6SJohn Baldwin quad_fixup(sc); 939c05cc0d6SJohn Baldwin #endif 9406c61b0f3SBryan Drewery STAILQ_INSERT_HEAD(&syscalls, sc, entries); 9416c61b0f3SBryan Drewery } 942c05cc0d6SJohn Baldwin } 9431175b23fSJohn Baldwin 9441175b23fSJohn Baldwin static struct syscall * 9451175b23fSJohn Baldwin find_syscall(struct procabi *abi, u_int number) 9461175b23fSJohn Baldwin { 9471175b23fSJohn Baldwin struct extra_syscall *es; 9481175b23fSJohn Baldwin 9491175b23fSJohn Baldwin if (number < nitems(abi->syscalls)) 9501175b23fSJohn Baldwin return (abi->syscalls[number]); 9511175b23fSJohn Baldwin STAILQ_FOREACH(es, &abi->extra_syscalls, entries) { 9521175b23fSJohn Baldwin if (es->number == number) 9531175b23fSJohn Baldwin return (es->sc); 9541175b23fSJohn Baldwin } 9551175b23fSJohn Baldwin return (NULL); 9561175b23fSJohn Baldwin } 9571175b23fSJohn Baldwin 9581175b23fSJohn Baldwin static void 9591175b23fSJohn Baldwin add_syscall(struct procabi *abi, u_int number, struct syscall *sc) 9601175b23fSJohn Baldwin { 9611175b23fSJohn Baldwin struct extra_syscall *es; 9621175b23fSJohn Baldwin 9631175b23fSJohn Baldwin if (number < nitems(abi->syscalls)) { 9641175b23fSJohn Baldwin assert(abi->syscalls[number] == NULL); 9651175b23fSJohn Baldwin abi->syscalls[number] = sc; 9661175b23fSJohn Baldwin } else { 9671175b23fSJohn Baldwin es = malloc(sizeof(*es)); 9681175b23fSJohn Baldwin es->sc = sc; 9691175b23fSJohn Baldwin es->number = number; 9701175b23fSJohn Baldwin STAILQ_INSERT_TAIL(&abi->extra_syscalls, es, entries); 9711175b23fSJohn Baldwin } 9721175b23fSJohn Baldwin } 9731175b23fSJohn Baldwin 974bbeaf6c0SSean Eric Fagan /* 975bbeaf6c0SSean Eric Fagan * If/when the list gets big, it might be desirable to do it 976bbeaf6c0SSean Eric Fagan * as a hash table or binary search. 977bbeaf6c0SSean Eric Fagan */ 978bbeaf6c0SSean Eric Fagan struct syscall * 9791175b23fSJohn Baldwin get_syscall(struct threadinfo *t, u_int number, u_int nargs) 980d8984f48SDag-Erling Smørgrav { 98194355cfdSAndrey Zonov struct syscall *sc; 9821175b23fSJohn Baldwin const char *name; 9831175b23fSJohn Baldwin char *new_name; 9841175b23fSJohn Baldwin u_int i; 985bbeaf6c0SSean Eric Fagan 9861175b23fSJohn Baldwin sc = find_syscall(t->proc->abi, number); 9871175b23fSJohn Baldwin if (sc != NULL) 988d8984f48SDag-Erling Smørgrav return (sc); 9896c61b0f3SBryan Drewery 9901175b23fSJohn Baldwin name = sysdecode_syscallname(t->proc->abi->abi, number); 9911175b23fSJohn Baldwin if (name == NULL) { 9921175b23fSJohn Baldwin asprintf(&new_name, "#%d", number); 9931175b23fSJohn Baldwin name = new_name; 9941175b23fSJohn Baldwin } else 9951175b23fSJohn Baldwin new_name = NULL; 9961175b23fSJohn Baldwin STAILQ_FOREACH(sc, &syscalls, entries) { 9971175b23fSJohn Baldwin if (strcmp(name, sc->name) == 0) { 9981175b23fSJohn Baldwin add_syscall(t->proc->abi, number, sc); 9991175b23fSJohn Baldwin free(new_name); 10001175b23fSJohn Baldwin return (sc); 10011175b23fSJohn Baldwin } 10021175b23fSJohn Baldwin } 10031175b23fSJohn Baldwin 10046c61b0f3SBryan Drewery /* It is unknown. Add it into the list. */ 10056c61b0f3SBryan Drewery #if DEBUG 10066c61b0f3SBryan Drewery fprintf(stderr, "unknown syscall %s -- setting args to %d\n", name, 10076c61b0f3SBryan Drewery nargs); 10086c61b0f3SBryan Drewery #endif 10096c61b0f3SBryan Drewery 10106c61b0f3SBryan Drewery sc = calloc(1, sizeof(struct syscall)); 10111175b23fSJohn Baldwin sc->name = name; 10121175b23fSJohn Baldwin if (new_name != NULL) 10131175b23fSJohn Baldwin sc->unknown = true; 10146c61b0f3SBryan Drewery sc->ret_type = 1; 10156c61b0f3SBryan Drewery sc->nargs = nargs; 10166c61b0f3SBryan Drewery for (i = 0; i < nargs; i++) { 10176c61b0f3SBryan Drewery sc->args[i].offset = i; 10186c61b0f3SBryan Drewery /* Treat all unknown arguments as LongHex. */ 10196c61b0f3SBryan Drewery sc->args[i].type = LongHex; 1020bbeaf6c0SSean Eric Fagan } 10216c61b0f3SBryan Drewery STAILQ_INSERT_HEAD(&syscalls, sc, entries); 10221175b23fSJohn Baldwin add_syscall(t->proc->abi, number, sc); 10236c61b0f3SBryan Drewery 10246c61b0f3SBryan Drewery return (sc); 1025bbeaf6c0SSean Eric Fagan } 1026bbeaf6c0SSean Eric Fagan 1027bbeaf6c0SSean Eric Fagan /* 10289ddd1412SDag-Erling Smørgrav * Copy a fixed amount of bytes from the process. 10299ddd1412SDag-Erling Smørgrav */ 10301be5d704SMark Murray static int 1031be305c9cSAndrey Zonov get_struct(pid_t pid, void *offset, void *buf, int len) 1032d8984f48SDag-Erling Smørgrav { 10335d2d083cSXin LI struct ptrace_io_desc iorequest; 10349ddd1412SDag-Erling Smørgrav 10355d2d083cSXin LI iorequest.piod_op = PIOD_READ_D; 10365d2d083cSXin LI iorequest.piod_offs = offset; 10375d2d083cSXin LI iorequest.piod_addr = buf; 10385d2d083cSXin LI iorequest.piod_len = len; 10395d2d083cSXin LI if (ptrace(PT_IO, pid, (caddr_t)&iorequest, 0) < 0) 1040d8984f48SDag-Erling Smørgrav return (-1); 1041d8984f48SDag-Erling Smørgrav return (0); 10429ddd1412SDag-Erling Smørgrav } 10439ddd1412SDag-Erling Smørgrav 10445d2d083cSXin LI #define MAXSIZE 4096 1045abb3f965SJohn Baldwin 10469ddd1412SDag-Erling Smørgrav /* 1047bbeaf6c0SSean Eric Fagan * Copy a string from the process. Note that it is 1048bbeaf6c0SSean Eric Fagan * expected to be a C string, but if max is set, it will 1049bbeaf6c0SSean Eric Fagan * only get that much. 1050bbeaf6c0SSean Eric Fagan */ 10515d2d083cSXin LI static char * 1052abb3f965SJohn Baldwin get_string(pid_t pid, void *addr, int max) 1053d8984f48SDag-Erling Smørgrav { 10545d2d083cSXin LI struct ptrace_io_desc iorequest; 1055abb3f965SJohn Baldwin char *buf, *nbuf; 1056abb3f965SJohn Baldwin size_t offset, size, totalsize; 1057bbeaf6c0SSean Eric Fagan 1058abb3f965SJohn Baldwin offset = 0; 1059abb3f965SJohn Baldwin if (max) 1060abb3f965SJohn Baldwin size = max + 1; 1061abb3f965SJohn Baldwin else { 1062abb3f965SJohn Baldwin /* Read up to the end of the current page. */ 1063abb3f965SJohn Baldwin size = PAGE_SIZE - ((uintptr_t)addr % PAGE_SIZE); 1064abb3f965SJohn Baldwin if (size > MAXSIZE) 1065abb3f965SJohn Baldwin size = MAXSIZE; 1066abb3f965SJohn Baldwin } 1067abb3f965SJohn Baldwin totalsize = size; 10685d2d083cSXin LI buf = malloc(totalsize); 10695d2d083cSXin LI if (buf == NULL) 1070d8984f48SDag-Erling Smørgrav return (NULL); 10715d2d083cSXin LI for (;;) { 10725d2d083cSXin LI iorequest.piod_op = PIOD_READ_D; 1073abb3f965SJohn Baldwin iorequest.piod_offs = (char *)addr + offset; 1074abb3f965SJohn Baldwin iorequest.piod_addr = buf + offset; 10755d2d083cSXin LI iorequest.piod_len = size; 10765d2d083cSXin LI if (ptrace(PT_IO, pid, (caddr_t)&iorequest, 0) < 0) { 10775d2d083cSXin LI free(buf); 1078d8984f48SDag-Erling Smørgrav return (NULL); 1079bbeaf6c0SSean Eric Fagan } 1080abb3f965SJohn Baldwin if (memchr(buf + offset, '\0', size) != NULL) 1081abb3f965SJohn Baldwin return (buf); 1082abb3f965SJohn Baldwin offset += size; 1083abb3f965SJohn Baldwin if (totalsize < MAXSIZE && max == 0) { 1084abb3f965SJohn Baldwin size = MAXSIZE - totalsize; 1085abb3f965SJohn Baldwin if (size > PAGE_SIZE) 1086abb3f965SJohn Baldwin size = PAGE_SIZE; 1087abb3f965SJohn Baldwin nbuf = realloc(buf, totalsize + size); 1088abb3f965SJohn Baldwin if (nbuf == NULL) { 1089abb3f965SJohn Baldwin buf[totalsize - 1] = '\0'; 10904e92419dSMarcel Moolenaar return (buf); 1091bbeaf6c0SSean Eric Fagan } 1092abb3f965SJohn Baldwin buf = nbuf; 1093abb3f965SJohn Baldwin totalsize += size; 1094d8984f48SDag-Erling Smørgrav } else { 1095cdfc719cSJaakko Heinonen buf[totalsize - 1] = '\0'; 1096d8984f48SDag-Erling Smørgrav return (buf); 10975d2d083cSXin LI } 10985d2d083cSXin LI } 10995d2d083cSXin LI } 1100bbeaf6c0SSean Eric Fagan 11019289f547SJohn Baldwin static const char * 110234763d1cSJohn Baldwin strsig2(int sig) 110334763d1cSJohn Baldwin { 11049289f547SJohn Baldwin static char tmp[32]; 11059289f547SJohn Baldwin const char *signame; 110634763d1cSJohn Baldwin 11079289f547SJohn Baldwin signame = sysdecode_signal(sig); 11089289f547SJohn Baldwin if (signame == NULL) { 1109f083f689SJohn Baldwin snprintf(tmp, sizeof(tmp), "%d", sig); 11109289f547SJohn Baldwin signame = tmp; 1111f083f689SJohn Baldwin } 11129289f547SJohn Baldwin return (signame); 111334763d1cSJohn Baldwin } 1114bbeaf6c0SSean Eric Fagan 1115c915ff03SJohn Baldwin static void 1116ffb66079SJohn Baldwin print_kevent(FILE *fp, struct kevent *ke) 1117c915ff03SJohn Baldwin { 1118c915ff03SJohn Baldwin 1119c915ff03SJohn Baldwin switch (ke->filter) { 1120c915ff03SJohn Baldwin case EVFILT_READ: 1121c915ff03SJohn Baldwin case EVFILT_WRITE: 1122c915ff03SJohn Baldwin case EVFILT_VNODE: 1123c915ff03SJohn Baldwin case EVFILT_PROC: 1124c915ff03SJohn Baldwin case EVFILT_TIMER: 1125c915ff03SJohn Baldwin case EVFILT_PROCDESC: 1126ffb66079SJohn Baldwin case EVFILT_EMPTY: 1127c915ff03SJohn Baldwin fprintf(fp, "%ju", (uintmax_t)ke->ident); 1128c915ff03SJohn Baldwin break; 1129c915ff03SJohn Baldwin case EVFILT_SIGNAL: 1130c915ff03SJohn Baldwin fputs(strsig2(ke->ident), fp); 1131c915ff03SJohn Baldwin break; 1132c915ff03SJohn Baldwin default: 1133c915ff03SJohn Baldwin fprintf(fp, "%p", (void *)ke->ident); 1134c915ff03SJohn Baldwin } 1135ffb66079SJohn Baldwin fprintf(fp, ","); 1136ffb66079SJohn Baldwin print_integer_arg(sysdecode_kevent_filter, fp, ke->filter); 1137ffb66079SJohn Baldwin fprintf(fp, ","); 1138ffb66079SJohn Baldwin print_mask_arg(sysdecode_kevent_flags, fp, ke->flags); 1139ffb66079SJohn Baldwin fprintf(fp, ","); 1140ffb66079SJohn Baldwin sysdecode_kevent_fflags(fp, ke->filter, ke->fflags, 16); 11412b34e843SKonstantin Belousov fprintf(fp, ",%#jx,%p", (uintmax_t)ke->data, ke->udata); 1142c915ff03SJohn Baldwin } 1143c915ff03SJohn Baldwin 1144195aef99SBryan Drewery static void 1145195aef99SBryan Drewery print_utrace(FILE *fp, void *utrace_addr, size_t len) 1146195aef99SBryan Drewery { 1147195aef99SBryan Drewery unsigned char *utrace_buffer; 1148195aef99SBryan Drewery 1149195aef99SBryan Drewery fprintf(fp, "{ "); 1150d6fb4894SJohn Baldwin if (sysdecode_utrace(fp, utrace_addr, len)) { 1151195aef99SBryan Drewery fprintf(fp, " }"); 1152195aef99SBryan Drewery return; 1153195aef99SBryan Drewery } 1154195aef99SBryan Drewery 1155195aef99SBryan Drewery utrace_buffer = utrace_addr; 1156195aef99SBryan Drewery fprintf(fp, "%zu:", len); 1157195aef99SBryan Drewery while (len--) 1158195aef99SBryan Drewery fprintf(fp, " %02x", *utrace_buffer++); 1159195aef99SBryan Drewery fprintf(fp, " }"); 1160195aef99SBryan Drewery } 1161195aef99SBryan Drewery 1162a2674e03SMichael Tuexen static void 1163a2674e03SMichael Tuexen print_sockaddr(FILE *fp, struct trussinfo *trussinfo, void *arg, socklen_t len) 1164a2674e03SMichael Tuexen { 1165a2674e03SMichael Tuexen char addr[64]; 1166a2674e03SMichael Tuexen struct sockaddr_in *lsin; 1167a2674e03SMichael Tuexen struct sockaddr_in6 *lsin6; 1168a2674e03SMichael Tuexen struct sockaddr_un *sun; 1169a2674e03SMichael Tuexen struct sockaddr *sa; 1170a2674e03SMichael Tuexen u_char *q; 1171a2674e03SMichael Tuexen pid_t pid = trussinfo->curthread->proc->pid; 1172a2674e03SMichael Tuexen 1173a2674e03SMichael Tuexen if (arg == NULL) { 1174a2674e03SMichael Tuexen fputs("NULL", fp); 1175a2674e03SMichael Tuexen return; 1176a2674e03SMichael Tuexen } 1177a2674e03SMichael Tuexen /* If the length is too small, just bail. */ 1178a2674e03SMichael Tuexen if (len < sizeof(*sa)) { 11793193be24SMichael Tuexen fprintf(fp, "%p", arg); 1180a2674e03SMichael Tuexen return; 1181a2674e03SMichael Tuexen } 1182a2674e03SMichael Tuexen 1183a2674e03SMichael Tuexen sa = calloc(1, len); 1184a2674e03SMichael Tuexen if (get_struct(pid, arg, sa, len) == -1) { 1185a2674e03SMichael Tuexen free(sa); 11863193be24SMichael Tuexen fprintf(fp, "%p", arg); 1187a2674e03SMichael Tuexen return; 1188a2674e03SMichael Tuexen } 1189a2674e03SMichael Tuexen 1190a2674e03SMichael Tuexen switch (sa->sa_family) { 1191a2674e03SMichael Tuexen case AF_INET: 1192a2674e03SMichael Tuexen if (len < sizeof(*lsin)) 1193a2674e03SMichael Tuexen goto sockaddr_short; 1194a2674e03SMichael Tuexen lsin = (struct sockaddr_in *)(void *)sa; 1195a2674e03SMichael Tuexen inet_ntop(AF_INET, &lsin->sin_addr, addr, sizeof(addr)); 1196a2674e03SMichael Tuexen fprintf(fp, "{ AF_INET %s:%d }", addr, 1197a2674e03SMichael Tuexen htons(lsin->sin_port)); 1198a2674e03SMichael Tuexen break; 1199a2674e03SMichael Tuexen case AF_INET6: 1200a2674e03SMichael Tuexen if (len < sizeof(*lsin6)) 1201a2674e03SMichael Tuexen goto sockaddr_short; 1202a2674e03SMichael Tuexen lsin6 = (struct sockaddr_in6 *)(void *)sa; 1203a2674e03SMichael Tuexen inet_ntop(AF_INET6, &lsin6->sin6_addr, addr, 1204a2674e03SMichael Tuexen sizeof(addr)); 1205a2674e03SMichael Tuexen fprintf(fp, "{ AF_INET6 [%s]:%d }", addr, 1206a2674e03SMichael Tuexen htons(lsin6->sin6_port)); 1207a2674e03SMichael Tuexen break; 1208a2674e03SMichael Tuexen case AF_UNIX: 1209a2674e03SMichael Tuexen sun = (struct sockaddr_un *)sa; 1210a2674e03SMichael Tuexen fprintf(fp, "{ AF_UNIX \"%.*s\" }", 1211a2674e03SMichael Tuexen (int)(len - offsetof(struct sockaddr_un, sun_path)), 1212a2674e03SMichael Tuexen sun->sun_path); 1213a2674e03SMichael Tuexen break; 1214a2674e03SMichael Tuexen default: 1215a2674e03SMichael Tuexen sockaddr_short: 1216a2674e03SMichael Tuexen fprintf(fp, 1217a2674e03SMichael Tuexen "{ sa_len = %d, sa_family = %d, sa_data = {", 1218a2674e03SMichael Tuexen (int)sa->sa_len, (int)sa->sa_family); 1219a2674e03SMichael Tuexen for (q = (u_char *)sa->sa_data; 1220a2674e03SMichael Tuexen q < (u_char *)sa + len; q++) 1221a2674e03SMichael Tuexen fprintf(fp, "%s 0x%02x", 1222a2674e03SMichael Tuexen q == (u_char *)sa->sa_data ? "" : ",", 1223a2674e03SMichael Tuexen *q); 1224a2674e03SMichael Tuexen fputs(" } }", fp); 1225a2674e03SMichael Tuexen } 1226a2674e03SMichael Tuexen free(sa); 1227a2674e03SMichael Tuexen } 1228a2674e03SMichael Tuexen 1229a2674e03SMichael Tuexen #define IOV_LIMIT 16 1230a2674e03SMichael Tuexen 1231a2674e03SMichael Tuexen static void 1232a2674e03SMichael Tuexen print_iovec(FILE *fp, struct trussinfo *trussinfo, void *arg, int iovcnt) 1233a2674e03SMichael Tuexen { 1234a2674e03SMichael Tuexen struct iovec iov[IOV_LIMIT]; 1235a2674e03SMichael Tuexen size_t max_string = trussinfo->strsize; 1236a2674e03SMichael Tuexen char tmp2[max_string + 1], *tmp3; 1237a2674e03SMichael Tuexen size_t len; 1238a2674e03SMichael Tuexen pid_t pid = trussinfo->curthread->proc->pid; 1239a2674e03SMichael Tuexen int i; 1240a2674e03SMichael Tuexen bool buf_truncated, iov_truncated; 1241a2674e03SMichael Tuexen 1242a2674e03SMichael Tuexen if (iovcnt <= 0) { 12433193be24SMichael Tuexen fprintf(fp, "%p", arg); 1244a2674e03SMichael Tuexen return; 1245a2674e03SMichael Tuexen } 1246a2674e03SMichael Tuexen if (iovcnt > IOV_LIMIT) { 1247a2674e03SMichael Tuexen iovcnt = IOV_LIMIT; 1248a2674e03SMichael Tuexen iov_truncated = true; 1249a2674e03SMichael Tuexen } else { 1250a2674e03SMichael Tuexen iov_truncated = false; 1251a2674e03SMichael Tuexen } 1252a2674e03SMichael Tuexen if (get_struct(pid, arg, &iov, iovcnt * sizeof(struct iovec)) == -1) { 12533193be24SMichael Tuexen fprintf(fp, "%p", arg); 1254a2674e03SMichael Tuexen return; 1255a2674e03SMichael Tuexen } 1256a2674e03SMichael Tuexen 1257a2674e03SMichael Tuexen fputs("[", fp); 1258a2674e03SMichael Tuexen for (i = 0; i < iovcnt; i++) { 1259a2674e03SMichael Tuexen len = iov[i].iov_len; 1260a2674e03SMichael Tuexen if (len > max_string) { 1261a2674e03SMichael Tuexen len = max_string; 1262a2674e03SMichael Tuexen buf_truncated = true; 1263a2674e03SMichael Tuexen } else { 1264a2674e03SMichael Tuexen buf_truncated = false; 1265a2674e03SMichael Tuexen } 1266a2674e03SMichael Tuexen fprintf(fp, "%s{", (i > 0) ? "," : ""); 1267a2674e03SMichael Tuexen if (len && get_struct(pid, iov[i].iov_base, &tmp2, len) != -1) { 1268a2674e03SMichael Tuexen tmp3 = malloc(len * 4 + 1); 1269a2674e03SMichael Tuexen while (len) { 1270a2674e03SMichael Tuexen if (strvisx(tmp3, tmp2, len, 1271a2674e03SMichael Tuexen VIS_CSTYLE|VIS_TAB|VIS_NL) <= 1272a2674e03SMichael Tuexen (int)max_string) 1273a2674e03SMichael Tuexen break; 1274a2674e03SMichael Tuexen len--; 1275a2674e03SMichael Tuexen buf_truncated = true; 1276a2674e03SMichael Tuexen } 1277a2674e03SMichael Tuexen fprintf(fp, "\"%s\"%s", tmp3, 1278a2674e03SMichael Tuexen buf_truncated ? "..." : ""); 1279a2674e03SMichael Tuexen free(tmp3); 1280a2674e03SMichael Tuexen } else { 12813193be24SMichael Tuexen fprintf(fp, "%p", iov[i].iov_base); 1282a2674e03SMichael Tuexen } 1283a2674e03SMichael Tuexen fprintf(fp, ",%zu}", iov[i].iov_len); 1284a2674e03SMichael Tuexen } 1285a2674e03SMichael Tuexen fprintf(fp, "%s%s", iov_truncated ? ",..." : "", "]"); 1286a2674e03SMichael Tuexen } 1287a2674e03SMichael Tuexen 1288a2674e03SMichael Tuexen static void 1289a2674e03SMichael Tuexen print_gen_cmsg(FILE *fp, struct cmsghdr *cmsghdr) 1290a2674e03SMichael Tuexen { 1291a2674e03SMichael Tuexen u_char *q; 1292a2674e03SMichael Tuexen 1293a2674e03SMichael Tuexen fputs("{", fp); 1294a2674e03SMichael Tuexen for (q = CMSG_DATA(cmsghdr); 1295a2674e03SMichael Tuexen q < (u_char *)cmsghdr + cmsghdr->cmsg_len; q++) { 1296a2674e03SMichael Tuexen fprintf(fp, "%s0x%02x", q == CMSG_DATA(cmsghdr) ? "" : ",", *q); 1297a2674e03SMichael Tuexen } 1298a2674e03SMichael Tuexen fputs("}", fp); 1299a2674e03SMichael Tuexen } 1300a2674e03SMichael Tuexen 1301a2674e03SMichael Tuexen static void 1302a2674e03SMichael Tuexen print_sctp_initmsg(FILE *fp, struct sctp_initmsg *init) 1303a2674e03SMichael Tuexen { 1304a2674e03SMichael Tuexen fprintf(fp, "{out=%u,", init->sinit_num_ostreams); 1305a2674e03SMichael Tuexen fprintf(fp, "in=%u,", init->sinit_max_instreams); 1306a2674e03SMichael Tuexen fprintf(fp, "max_rtx=%u,", init->sinit_max_attempts); 1307a2674e03SMichael Tuexen fprintf(fp, "max_rto=%u}", init->sinit_max_init_timeo); 1308a2674e03SMichael Tuexen } 1309a2674e03SMichael Tuexen 1310a2674e03SMichael Tuexen static void 131176785d6eSJohn Baldwin print_sctp_sndrcvinfo(FILE *fp, bool receive, struct sctp_sndrcvinfo *info) 1312a2674e03SMichael Tuexen { 1313a2674e03SMichael Tuexen fprintf(fp, "{sid=%u,", info->sinfo_stream); 131476785d6eSJohn Baldwin if (receive) { 1315a2674e03SMichael Tuexen fprintf(fp, "ssn=%u,", info->sinfo_ssn); 1316a2674e03SMichael Tuexen } 1317a2674e03SMichael Tuexen fputs("flgs=", fp); 1318a2674e03SMichael Tuexen sysdecode_sctp_sinfo_flags(fp, info->sinfo_flags); 1319a2674e03SMichael Tuexen fprintf(fp, ",ppid=%u,", ntohl(info->sinfo_ppid)); 132076785d6eSJohn Baldwin if (!receive) { 1321a2674e03SMichael Tuexen fprintf(fp, "ctx=%u,", info->sinfo_context); 1322a2674e03SMichael Tuexen fprintf(fp, "ttl=%u,", info->sinfo_timetolive); 1323a2674e03SMichael Tuexen } 132476785d6eSJohn Baldwin if (receive) { 1325a2674e03SMichael Tuexen fprintf(fp, "tsn=%u,", info->sinfo_tsn); 1326a2674e03SMichael Tuexen fprintf(fp, "cumtsn=%u,", info->sinfo_cumtsn); 1327a2674e03SMichael Tuexen } 1328a2674e03SMichael Tuexen fprintf(fp, "id=%u}", info->sinfo_assoc_id); 1329a2674e03SMichael Tuexen } 1330a2674e03SMichael Tuexen 1331a2674e03SMichael Tuexen static void 1332a2674e03SMichael Tuexen print_sctp_sndinfo(FILE *fp, struct sctp_sndinfo *info) 1333a2674e03SMichael Tuexen { 1334a2674e03SMichael Tuexen fprintf(fp, "{sid=%u,", info->snd_sid); 1335a2674e03SMichael Tuexen fputs("flgs=", fp); 1336a2674e03SMichael Tuexen print_mask_arg(sysdecode_sctp_snd_flags, fp, info->snd_flags); 1337a2674e03SMichael Tuexen fprintf(fp, ",ppid=%u,", ntohl(info->snd_ppid)); 1338a2674e03SMichael Tuexen fprintf(fp, "ctx=%u,", info->snd_context); 1339a2674e03SMichael Tuexen fprintf(fp, "id=%u}", info->snd_assoc_id); 1340a2674e03SMichael Tuexen } 1341a2674e03SMichael Tuexen 1342a2674e03SMichael Tuexen static void 1343a2674e03SMichael Tuexen print_sctp_rcvinfo(FILE *fp, struct sctp_rcvinfo *info) 1344a2674e03SMichael Tuexen { 1345a2674e03SMichael Tuexen fprintf(fp, "{sid=%u,", info->rcv_sid); 1346a2674e03SMichael Tuexen fprintf(fp, "ssn=%u,", info->rcv_ssn); 1347a2674e03SMichael Tuexen fputs("flgs=", fp); 1348a2674e03SMichael Tuexen print_mask_arg(sysdecode_sctp_rcv_flags, fp, info->rcv_flags); 1349a2674e03SMichael Tuexen fprintf(fp, ",ppid=%u,", ntohl(info->rcv_ppid)); 1350a2674e03SMichael Tuexen fprintf(fp, "tsn=%u,", info->rcv_tsn); 1351a2674e03SMichael Tuexen fprintf(fp, "cumtsn=%u,", info->rcv_cumtsn); 1352a2674e03SMichael Tuexen fprintf(fp, "ctx=%u,", info->rcv_context); 1353a2674e03SMichael Tuexen fprintf(fp, "id=%u}", info->rcv_assoc_id); 1354a2674e03SMichael Tuexen } 1355a2674e03SMichael Tuexen 1356a2674e03SMichael Tuexen static void 1357a2674e03SMichael Tuexen print_sctp_nxtinfo(FILE *fp, struct sctp_nxtinfo *info) 1358a2674e03SMichael Tuexen { 1359a2674e03SMichael Tuexen fprintf(fp, "{sid=%u,", info->nxt_sid); 1360a2674e03SMichael Tuexen fputs("flgs=", fp); 1361a2674e03SMichael Tuexen print_mask_arg(sysdecode_sctp_nxt_flags, fp, info->nxt_flags); 1362a2674e03SMichael Tuexen fprintf(fp, ",ppid=%u,", ntohl(info->nxt_ppid)); 1363a2674e03SMichael Tuexen fprintf(fp, "len=%u,", info->nxt_length); 1364a2674e03SMichael Tuexen fprintf(fp, "id=%u}", info->nxt_assoc_id); 1365a2674e03SMichael Tuexen } 1366a2674e03SMichael Tuexen 1367a2674e03SMichael Tuexen static void 1368a2674e03SMichael Tuexen print_sctp_prinfo(FILE *fp, struct sctp_prinfo *info) 1369a2674e03SMichael Tuexen { 1370a2674e03SMichael Tuexen fputs("{pol=", fp); 1371a2674e03SMichael Tuexen print_integer_arg(sysdecode_sctp_pr_policy, fp, info->pr_policy); 1372a2674e03SMichael Tuexen fprintf(fp, ",val=%u}", info->pr_value); 1373a2674e03SMichael Tuexen } 1374a2674e03SMichael Tuexen 1375a2674e03SMichael Tuexen static void 1376a2674e03SMichael Tuexen print_sctp_authinfo(FILE *fp, struct sctp_authinfo *info) 1377a2674e03SMichael Tuexen { 1378a2674e03SMichael Tuexen fprintf(fp, "{num=%u}", info->auth_keynumber); 1379a2674e03SMichael Tuexen } 1380a2674e03SMichael Tuexen 1381a2674e03SMichael Tuexen static void 1382a2674e03SMichael Tuexen print_sctp_ipv4_addr(FILE *fp, struct in_addr *addr) 1383a2674e03SMichael Tuexen { 1384a2674e03SMichael Tuexen char buf[INET_ADDRSTRLEN]; 1385a2674e03SMichael Tuexen const char *s; 1386a2674e03SMichael Tuexen 1387a2674e03SMichael Tuexen s = inet_ntop(AF_INET, addr, buf, INET_ADDRSTRLEN); 1388a2674e03SMichael Tuexen if (s != NULL) 1389a2674e03SMichael Tuexen fprintf(fp, "{addr=%s}", s); 1390a2674e03SMichael Tuexen else 1391a2674e03SMichael Tuexen fputs("{addr=???}", fp); 1392a2674e03SMichael Tuexen } 1393a2674e03SMichael Tuexen 1394a2674e03SMichael Tuexen static void 1395a2674e03SMichael Tuexen print_sctp_ipv6_addr(FILE *fp, struct in6_addr *addr) 1396a2674e03SMichael Tuexen { 1397a2674e03SMichael Tuexen char buf[INET6_ADDRSTRLEN]; 1398a2674e03SMichael Tuexen const char *s; 1399a2674e03SMichael Tuexen 1400a2674e03SMichael Tuexen s = inet_ntop(AF_INET6, addr, buf, INET6_ADDRSTRLEN); 1401a2674e03SMichael Tuexen if (s != NULL) 1402a2674e03SMichael Tuexen fprintf(fp, "{addr=%s}", s); 1403a2674e03SMichael Tuexen else 1404a2674e03SMichael Tuexen fputs("{addr=???}", fp); 1405a2674e03SMichael Tuexen } 1406a2674e03SMichael Tuexen 1407a2674e03SMichael Tuexen static void 140876785d6eSJohn Baldwin print_sctp_cmsg(FILE *fp, bool receive, struct cmsghdr *cmsghdr) 1409a2674e03SMichael Tuexen { 1410a2674e03SMichael Tuexen void *data; 1411a2674e03SMichael Tuexen socklen_t len; 1412a2674e03SMichael Tuexen 1413a2674e03SMichael Tuexen len = cmsghdr->cmsg_len; 1414a2674e03SMichael Tuexen data = CMSG_DATA(cmsghdr); 1415a2674e03SMichael Tuexen switch (cmsghdr->cmsg_type) { 1416a2674e03SMichael Tuexen case SCTP_INIT: 1417a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct sctp_initmsg))) 1418a2674e03SMichael Tuexen print_sctp_initmsg(fp, (struct sctp_initmsg *)data); 1419a2674e03SMichael Tuexen else 1420a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1421a2674e03SMichael Tuexen break; 1422a2674e03SMichael Tuexen case SCTP_SNDRCV: 1423a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct sctp_sndrcvinfo))) 142476785d6eSJohn Baldwin print_sctp_sndrcvinfo(fp, receive, 1425a2674e03SMichael Tuexen (struct sctp_sndrcvinfo *)data); 1426a2674e03SMichael Tuexen else 1427a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1428a2674e03SMichael Tuexen break; 1429a2674e03SMichael Tuexen #if 0 1430a2674e03SMichael Tuexen case SCTP_EXTRCV: 1431a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct sctp_extrcvinfo))) 1432a2674e03SMichael Tuexen print_sctp_extrcvinfo(fp, 1433a2674e03SMichael Tuexen (struct sctp_extrcvinfo *)data); 1434a2674e03SMichael Tuexen else 1435a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1436a2674e03SMichael Tuexen break; 1437a2674e03SMichael Tuexen #endif 1438a2674e03SMichael Tuexen case SCTP_SNDINFO: 1439a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct sctp_sndinfo))) 1440a2674e03SMichael Tuexen print_sctp_sndinfo(fp, (struct sctp_sndinfo *)data); 1441a2674e03SMichael Tuexen else 1442a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1443a2674e03SMichael Tuexen break; 1444a2674e03SMichael Tuexen case SCTP_RCVINFO: 1445a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct sctp_rcvinfo))) 1446a2674e03SMichael Tuexen print_sctp_rcvinfo(fp, (struct sctp_rcvinfo *)data); 1447a2674e03SMichael Tuexen else 1448a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1449a2674e03SMichael Tuexen break; 1450a2674e03SMichael Tuexen case SCTP_NXTINFO: 1451a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct sctp_nxtinfo))) 1452a2674e03SMichael Tuexen print_sctp_nxtinfo(fp, (struct sctp_nxtinfo *)data); 1453a2674e03SMichael Tuexen else 1454a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1455a2674e03SMichael Tuexen break; 1456a2674e03SMichael Tuexen case SCTP_PRINFO: 1457a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct sctp_prinfo))) 1458a2674e03SMichael Tuexen print_sctp_prinfo(fp, (struct sctp_prinfo *)data); 1459a2674e03SMichael Tuexen else 1460a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1461a2674e03SMichael Tuexen break; 1462a2674e03SMichael Tuexen case SCTP_AUTHINFO: 1463a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct sctp_authinfo))) 1464a2674e03SMichael Tuexen print_sctp_authinfo(fp, (struct sctp_authinfo *)data); 1465a2674e03SMichael Tuexen else 1466a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1467a2674e03SMichael Tuexen break; 1468a2674e03SMichael Tuexen case SCTP_DSTADDRV4: 1469a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct in_addr))) 1470a2674e03SMichael Tuexen print_sctp_ipv4_addr(fp, (struct in_addr *)data); 1471a2674e03SMichael Tuexen else 1472a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1473a2674e03SMichael Tuexen break; 1474a2674e03SMichael Tuexen case SCTP_DSTADDRV6: 1475a2674e03SMichael Tuexen if (len == CMSG_LEN(sizeof(struct in6_addr))) 1476a2674e03SMichael Tuexen print_sctp_ipv6_addr(fp, (struct in6_addr *)data); 1477a2674e03SMichael Tuexen else 1478a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1479a2674e03SMichael Tuexen break; 1480a2674e03SMichael Tuexen default: 1481a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1482a2674e03SMichael Tuexen } 1483a2674e03SMichael Tuexen } 1484a2674e03SMichael Tuexen 1485a2674e03SMichael Tuexen static void 148676785d6eSJohn Baldwin print_cmsgs(FILE *fp, pid_t pid, bool receive, struct msghdr *msghdr) 1487a2674e03SMichael Tuexen { 1488a2674e03SMichael Tuexen struct cmsghdr *cmsghdr; 1489a2674e03SMichael Tuexen char *cmsgbuf; 1490a2674e03SMichael Tuexen const char *temp; 1491a2674e03SMichael Tuexen socklen_t len; 1492a2674e03SMichael Tuexen int level, type; 1493a2674e03SMichael Tuexen bool first; 1494a2674e03SMichael Tuexen 1495a2674e03SMichael Tuexen len = msghdr->msg_controllen; 14966accaf4aSMichael Tuexen if (len == 0) { 14976accaf4aSMichael Tuexen fputs("{}", fp); 14986accaf4aSMichael Tuexen return; 14996accaf4aSMichael Tuexen } 1500a2674e03SMichael Tuexen cmsgbuf = calloc(1, len); 1501a2674e03SMichael Tuexen if (get_struct(pid, msghdr->msg_control, cmsgbuf, len) == -1) { 15023193be24SMichael Tuexen fprintf(fp, "%p", msghdr->msg_control); 1503a2674e03SMichael Tuexen free(cmsgbuf); 15046accaf4aSMichael Tuexen return; 1505a2674e03SMichael Tuexen } 1506a2674e03SMichael Tuexen msghdr->msg_control = cmsgbuf; 1507a2674e03SMichael Tuexen first = true; 1508a2674e03SMichael Tuexen fputs("{", fp); 1509a2674e03SMichael Tuexen for (cmsghdr = CMSG_FIRSTHDR(msghdr); 1510a2674e03SMichael Tuexen cmsghdr != NULL; 1511a2674e03SMichael Tuexen cmsghdr = CMSG_NXTHDR(msghdr, cmsghdr)) { 1512a2674e03SMichael Tuexen level = cmsghdr->cmsg_level; 1513a2674e03SMichael Tuexen type = cmsghdr->cmsg_type; 1514a2674e03SMichael Tuexen len = cmsghdr->cmsg_len; 1515a2674e03SMichael Tuexen fprintf(fp, "%s{level=", first ? "" : ","); 1516a2674e03SMichael Tuexen print_integer_arg(sysdecode_sockopt_level, fp, level); 1517a2674e03SMichael Tuexen fputs(",type=", fp); 1518a2674e03SMichael Tuexen temp = sysdecode_cmsg_type(level, type); 1519a2674e03SMichael Tuexen if (temp) { 1520a2674e03SMichael Tuexen fputs(temp, fp); 1521a2674e03SMichael Tuexen } else { 1522a2674e03SMichael Tuexen fprintf(fp, "%d", type); 1523a2674e03SMichael Tuexen } 1524a2674e03SMichael Tuexen fputs(",data=", fp); 1525a2674e03SMichael Tuexen switch (level) { 1526a2674e03SMichael Tuexen case IPPROTO_SCTP: 152776785d6eSJohn Baldwin print_sctp_cmsg(fp, receive, cmsghdr); 1528a2674e03SMichael Tuexen break; 1529a2674e03SMichael Tuexen default: 1530a2674e03SMichael Tuexen print_gen_cmsg(fp, cmsghdr); 1531a2674e03SMichael Tuexen break; 1532a2674e03SMichael Tuexen } 1533a2674e03SMichael Tuexen fputs("}", fp); 1534*b8ff144eSMichael Tuexen first = false; 1535a2674e03SMichael Tuexen } 1536a2674e03SMichael Tuexen fputs("}", fp); 1537a2674e03SMichael Tuexen free(cmsgbuf); 1538a2674e03SMichael Tuexen } 1539a2674e03SMichael Tuexen 1540bbeaf6c0SSean Eric Fagan /* 1541bbeaf6c0SSean Eric Fagan * Converts a syscall argument into a string. Said string is 15424e3da534SJohn Baldwin * allocated via malloc(), so needs to be free()'d. sc is 1543bbeaf6c0SSean Eric Fagan * a pointer to the syscall description (see above); args is 1544bbeaf6c0SSean Eric Fagan * an array of all of the system call arguments. 1545bbeaf6c0SSean Eric Fagan */ 1546bbeaf6c0SSean Eric Fagan char * 15472b75c8adSJohn Baldwin print_arg(struct syscall_args *sc, unsigned long *args, long *retval, 154894355cfdSAndrey Zonov struct trussinfo *trussinfo) 1549d8984f48SDag-Erling Smørgrav { 1550f083f689SJohn Baldwin FILE *fp; 155194355cfdSAndrey Zonov char *tmp; 1552f083f689SJohn Baldwin size_t tmplen; 155394355cfdSAndrey Zonov pid_t pid; 1554d8984f48SDag-Erling Smørgrav 1555f083f689SJohn Baldwin fp = open_memstream(&tmp, &tmplen); 15562b75c8adSJohn Baldwin pid = trussinfo->curthread->proc->pid; 1557bbeaf6c0SSean Eric Fagan switch (sc->type & ARG_MASK) { 1558bbeaf6c0SSean Eric Fagan case Hex: 1559f083f689SJohn Baldwin fprintf(fp, "0x%x", (int)args[sc->offset]); 1560bbeaf6c0SSean Eric Fagan break; 1561bbeaf6c0SSean Eric Fagan case Octal: 1562f083f689SJohn Baldwin fprintf(fp, "0%o", (int)args[sc->offset]); 1563bbeaf6c0SSean Eric Fagan break; 1564bbeaf6c0SSean Eric Fagan case Int: 1565f083f689SJohn Baldwin fprintf(fp, "%d", (int)args[sc->offset]); 1566bbeaf6c0SSean Eric Fagan break; 1567808d9805SEd Schouten case UInt: 1568808d9805SEd Schouten fprintf(fp, "%u", (unsigned int)args[sc->offset]); 1569808d9805SEd Schouten break; 1570ebb2cc40SJohn Baldwin case PUInt: { 1571ebb2cc40SJohn Baldwin unsigned int val; 1572ebb2cc40SJohn Baldwin 1573ebb2cc40SJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &val, 1574ebb2cc40SJohn Baldwin sizeof(val)) == 0) 1575ebb2cc40SJohn Baldwin fprintf(fp, "{ %u }", val); 1576ebb2cc40SJohn Baldwin else 1577ebb2cc40SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1578ebb2cc40SJohn Baldwin break; 1579ebb2cc40SJohn Baldwin } 1580fdb5bf37SJohn Baldwin case LongHex: 1581f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1582fdb5bf37SJohn Baldwin break; 1583b289a8d7SJohn Baldwin case Long: 1584f083f689SJohn Baldwin fprintf(fp, "%ld", args[sc->offset]); 1585b289a8d7SJohn Baldwin break; 1586e261fb2aSJohn Baldwin case Sizet: 1587e261fb2aSJohn Baldwin fprintf(fp, "%zu", (size_t)args[sc->offset]); 1588e261fb2aSJohn Baldwin break; 1589d8984f48SDag-Erling Smørgrav case Name: { 1590081e5c48SPav Lucistnik /* NULL-terminated string. */ 1591bbeaf6c0SSean Eric Fagan char *tmp2; 15924e3da534SJohn Baldwin 15935d2d083cSXin LI tmp2 = get_string(pid, (void*)args[sc->offset], 0); 1594f083f689SJohn Baldwin fprintf(fp, "\"%s\"", tmp2); 1595bbeaf6c0SSean Eric Fagan free(tmp2); 1596bbeaf6c0SSean Eric Fagan break; 1597d8984f48SDag-Erling Smørgrav } 1598d8984f48SDag-Erling Smørgrav case BinString: { 15994e3da534SJohn Baldwin /* 16004e3da534SJohn Baldwin * Binary block of data that might have printable characters. 16014e3da534SJohn Baldwin * XXX If type|OUT, assume that the length is the syscall's 16024e3da534SJohn Baldwin * return value. Otherwise, assume that the length of the block 16034e3da534SJohn Baldwin * is in the next syscall argument. 16044e3da534SJohn Baldwin */ 1605081e5c48SPav Lucistnik int max_string = trussinfo->strsize; 1606081e5c48SPav Lucistnik char tmp2[max_string + 1], *tmp3; 1607081e5c48SPav Lucistnik int len; 1608081e5c48SPav Lucistnik int truncated = 0; 1609081e5c48SPav Lucistnik 1610081e5c48SPav Lucistnik if (sc->type & OUT) 16112b75c8adSJohn Baldwin len = retval[0]; 1612081e5c48SPav Lucistnik else 1613081e5c48SPav Lucistnik len = args[sc->offset + 1]; 1614081e5c48SPav Lucistnik 16154e3da534SJohn Baldwin /* 16164e3da534SJohn Baldwin * Don't print more than max_string characters, to avoid word 16174e3da534SJohn Baldwin * wrap. If we have to truncate put some ... after the string. 1618081e5c48SPav Lucistnik */ 1619081e5c48SPav Lucistnik if (len > max_string) { 1620081e5c48SPav Lucistnik len = max_string; 1621081e5c48SPav Lucistnik truncated = 1; 1622081e5c48SPav Lucistnik } 162394355cfdSAndrey Zonov if (len && get_struct(pid, (void*)args[sc->offset], &tmp2, len) 162494355cfdSAndrey Zonov != -1) { 1625081e5c48SPav Lucistnik tmp3 = malloc(len * 4 + 1); 1626081e5c48SPav Lucistnik while (len) { 162794355cfdSAndrey Zonov if (strvisx(tmp3, tmp2, len, 162894355cfdSAndrey Zonov VIS_CSTYLE|VIS_TAB|VIS_NL) <= max_string) 1629081e5c48SPav Lucistnik break; 1630081e5c48SPav Lucistnik len--; 1631081e5c48SPav Lucistnik truncated = 1; 163280c7cc1cSPedro F. Giffuni } 1633f083f689SJohn Baldwin fprintf(fp, "\"%s\"%s", tmp3, truncated ? 163494355cfdSAndrey Zonov "..." : ""); 1635081e5c48SPav Lucistnik free(tmp3); 1636d8984f48SDag-Erling Smørgrav } else { 1637f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1638081e5c48SPav Lucistnik } 1639081e5c48SPav Lucistnik break; 1640d8984f48SDag-Erling Smørgrav } 164168055893SJohn Baldwin case ExecArgs: 164268055893SJohn Baldwin case ExecEnv: 1643d8984f48SDag-Erling Smørgrav case StringArray: { 1644890843c1SJohn Baldwin uintptr_t addr; 1645890843c1SJohn Baldwin union { 1646890843c1SJohn Baldwin char *strarray[0]; 1647890843c1SJohn Baldwin char buf[PAGE_SIZE]; 1648890843c1SJohn Baldwin } u; 16499897b203SMatthew N. Dodd char *string; 1650890843c1SJohn Baldwin size_t len; 16512b75c8adSJohn Baldwin u_int first, i; 16529897b203SMatthew N. Dodd 1653890843c1SJohn Baldwin /* 165468055893SJohn Baldwin * Only parse argv[] and environment arrays from exec calls 165568055893SJohn Baldwin * if requested. 165668055893SJohn Baldwin */ 165768055893SJohn Baldwin if (((sc->type & ARG_MASK) == ExecArgs && 165868055893SJohn Baldwin (trussinfo->flags & EXECVEARGS) == 0) || 165968055893SJohn Baldwin ((sc->type & ARG_MASK) == ExecEnv && 166068055893SJohn Baldwin (trussinfo->flags & EXECVEENVS) == 0)) { 166168055893SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 166268055893SJohn Baldwin break; 166368055893SJohn Baldwin } 166468055893SJohn Baldwin 166568055893SJohn Baldwin /* 1666890843c1SJohn Baldwin * Read a page of pointers at a time. Punt if the top-level 1667890843c1SJohn Baldwin * pointer is not aligned. Note that the first read is of 1668890843c1SJohn Baldwin * a partial page. 1669890843c1SJohn Baldwin */ 1670890843c1SJohn Baldwin addr = args[sc->offset]; 1671890843c1SJohn Baldwin if (addr % sizeof(char *) != 0) { 1672890843c1SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1673890843c1SJohn Baldwin break; 16749897b203SMatthew N. Dodd } 16759897b203SMatthew N. Dodd 1676890843c1SJohn Baldwin len = PAGE_SIZE - (addr & PAGE_MASK); 1677890843c1SJohn Baldwin if (get_struct(pid, (void *)addr, u.buf, len) == -1) { 1678890843c1SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1679890843c1SJohn Baldwin break; 16809897b203SMatthew N. Dodd } 1681890843c1SJohn Baldwin 1682890843c1SJohn Baldwin fputc('[', fp); 1683890843c1SJohn Baldwin first = 1; 1684890843c1SJohn Baldwin i = 0; 1685890843c1SJohn Baldwin while (u.strarray[i] != NULL) { 1686890843c1SJohn Baldwin string = get_string(pid, u.strarray[i], 0); 1687890843c1SJohn Baldwin fprintf(fp, "%s \"%s\"", first ? "" : ",", string); 1688890843c1SJohn Baldwin free(string); 1689890843c1SJohn Baldwin first = 0; 1690890843c1SJohn Baldwin 1691890843c1SJohn Baldwin i++; 1692890843c1SJohn Baldwin if (i == len / sizeof(char *)) { 1693890843c1SJohn Baldwin addr += len; 1694890843c1SJohn Baldwin len = PAGE_SIZE; 1695890843c1SJohn Baldwin if (get_struct(pid, (void *)addr, u.buf, len) == 1696890843c1SJohn Baldwin -1) { 1697890843c1SJohn Baldwin fprintf(fp, ", <inval>"); 1698890843c1SJohn Baldwin break; 1699890843c1SJohn Baldwin } 1700890843c1SJohn Baldwin i = 0; 1701890843c1SJohn Baldwin } 1702890843c1SJohn Baldwin } 1703890843c1SJohn Baldwin fputs(" ]", fp); 17049897b203SMatthew N. Dodd break; 1705d8984f48SDag-Erling Smørgrav } 170610aeefc9SMarcel Moolenaar #ifdef __LP64__ 170710aeefc9SMarcel Moolenaar case Quad: 170872df19e7SJohn Baldwin fprintf(fp, "%ld", args[sc->offset]); 170972df19e7SJohn Baldwin break; 171072df19e7SJohn Baldwin case QuadHex: 1711f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 171210aeefc9SMarcel Moolenaar break; 171310aeefc9SMarcel Moolenaar #else 171472df19e7SJohn Baldwin case Quad: 171572df19e7SJohn Baldwin case QuadHex: { 171610aeefc9SMarcel Moolenaar unsigned long long ll; 17174e3da534SJohn Baldwin 17182b75c8adSJohn Baldwin #if _BYTE_ORDER == _LITTLE_ENDIAN 17192b75c8adSJohn Baldwin ll = (unsigned long long)args[sc->offset + 1] << 32 | 17202b75c8adSJohn Baldwin args[sc->offset]; 17212b75c8adSJohn Baldwin #else 17222b75c8adSJohn Baldwin ll = (unsigned long long)args[sc->offset] << 32 | 17232b75c8adSJohn Baldwin args[sc->offset + 1]; 17242b75c8adSJohn Baldwin #endif 172572df19e7SJohn Baldwin if ((sc->type & ARG_MASK) == Quad) 172672df19e7SJohn Baldwin fprintf(fp, "%lld", ll); 172772df19e7SJohn Baldwin else 1728f083f689SJohn Baldwin fprintf(fp, "0x%llx", ll); 1729bbeaf6c0SSean Eric Fagan break; 1730bbeaf6c0SSean Eric Fagan } 173110aeefc9SMarcel Moolenaar #endif 1732b60a095bSJohn Baldwin case PQuadHex: { 1733b60a095bSJohn Baldwin uint64_t val; 1734b60a095bSJohn Baldwin 1735b60a095bSJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &val, 1736b60a095bSJohn Baldwin sizeof(val)) == 0) 1737b60a095bSJohn Baldwin fprintf(fp, "{ 0x%jx }", (uintmax_t)val); 1738b60a095bSJohn Baldwin else 1739b60a095bSJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1740b60a095bSJohn Baldwin break; 1741b60a095bSJohn Baldwin } 1742bbeaf6c0SSean Eric Fagan case Ptr: 1743f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1744bbeaf6c0SSean Eric Fagan break; 1745d8984f48SDag-Erling Smørgrav case Readlinkres: { 17462bae4eb3SAlfred Perlstein char *tmp2; 17474e3da534SJohn Baldwin 17482b75c8adSJohn Baldwin if (retval[0] == -1) 17492bae4eb3SAlfred Perlstein break; 17502b75c8adSJohn Baldwin tmp2 = get_string(pid, (void*)args[sc->offset], retval[0]); 1751f083f689SJohn Baldwin fprintf(fp, "\"%s\"", tmp2); 17522bae4eb3SAlfred Perlstein free(tmp2); 17532bae4eb3SAlfred Perlstein break; 1754d8984f48SDag-Erling Smørgrav } 1755d8984f48SDag-Erling Smørgrav case Ioctl: { 17564e3da534SJohn Baldwin const char *temp; 17574e3da534SJohn Baldwin unsigned long cmd; 17584e3da534SJohn Baldwin 17594e3da534SJohn Baldwin cmd = args[sc->offset]; 1760265e5898SJohn Baldwin temp = sysdecode_ioctlname(cmd); 176194355cfdSAndrey Zonov if (temp) 1762f083f689SJohn Baldwin fputs(temp, fp); 176394355cfdSAndrey Zonov else { 1764f083f689SJohn Baldwin fprintf(fp, "0x%lx { IO%s%s 0x%lx('%c'), %lu, %lu }", 17654e3da534SJohn Baldwin cmd, cmd & IOC_OUT ? "R" : "", 17664e3da534SJohn Baldwin cmd & IOC_IN ? "W" : "", IOCGROUP(cmd), 17674e3da534SJohn Baldwin isprint(IOCGROUP(cmd)) ? (char)IOCGROUP(cmd) : '?', 17684e3da534SJohn Baldwin cmd & 0xFF, IOCPARM_LEN(cmd)); 1769081e5c48SPav Lucistnik } 1770081e5c48SPav Lucistnik break; 1771d8984f48SDag-Erling Smørgrav } 1772d8984f48SDag-Erling Smørgrav case Timespec: { 1773e45a5a0dSDavid Malone struct timespec ts; 17744e3da534SJohn Baldwin 177594355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], &ts, 177694355cfdSAndrey Zonov sizeof(ts)) != -1) 1777a1436773SJohn Baldwin fprintf(fp, "{ %jd.%09ld }", (intmax_t)ts.tv_sec, 177894355cfdSAndrey Zonov ts.tv_nsec); 1779e45a5a0dSDavid Malone else 1780f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1781e45a5a0dSDavid Malone break; 1782d8984f48SDag-Erling Smørgrav } 17837d897327SJohn Baldwin case Timespec2: { 17847d897327SJohn Baldwin struct timespec ts[2]; 17857d897327SJohn Baldwin const char *sep; 17867d897327SJohn Baldwin unsigned int i; 17877d897327SJohn Baldwin 17887d897327SJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &ts, sizeof(ts)) 17897d897327SJohn Baldwin != -1) { 17901e2ec671SJohn Baldwin fputs("{ ", fp); 17917d897327SJohn Baldwin sep = ""; 17927d897327SJohn Baldwin for (i = 0; i < nitems(ts); i++) { 17937d897327SJohn Baldwin fputs(sep, fp); 17947d897327SJohn Baldwin sep = ", "; 17957d897327SJohn Baldwin switch (ts[i].tv_nsec) { 17967d897327SJohn Baldwin case UTIME_NOW: 17977d897327SJohn Baldwin fprintf(fp, "UTIME_NOW"); 17987d897327SJohn Baldwin break; 17997d897327SJohn Baldwin case UTIME_OMIT: 18007d897327SJohn Baldwin fprintf(fp, "UTIME_OMIT"); 18017d897327SJohn Baldwin break; 18027d897327SJohn Baldwin default: 1803a1436773SJohn Baldwin fprintf(fp, "%jd.%09ld", 1804a1436773SJohn Baldwin (intmax_t)ts[i].tv_sec, 1805a1436773SJohn Baldwin ts[i].tv_nsec); 18067d897327SJohn Baldwin break; 18077d897327SJohn Baldwin } 18087d897327SJohn Baldwin } 18091e2ec671SJohn Baldwin fputs(" }", fp); 18107d897327SJohn Baldwin } else 1811f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 18127d897327SJohn Baldwin break; 18137d897327SJohn Baldwin } 1814d8984f48SDag-Erling Smørgrav case Timeval: { 1815e45a5a0dSDavid Malone struct timeval tv; 18164e3da534SJohn Baldwin 181794355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], &tv, sizeof(tv)) 181894355cfdSAndrey Zonov != -1) 1819a1436773SJohn Baldwin fprintf(fp, "{ %jd.%06ld }", (intmax_t)tv.tv_sec, 182094355cfdSAndrey Zonov tv.tv_usec); 1821081e5c48SPav Lucistnik else 1822f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1823081e5c48SPav Lucistnik break; 1824d8984f48SDag-Erling Smørgrav } 1825d8984f48SDag-Erling Smørgrav case Timeval2: { 1826081e5c48SPav Lucistnik struct timeval tv[2]; 18274e3da534SJohn Baldwin 182894355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], &tv, sizeof(tv)) 182994355cfdSAndrey Zonov != -1) 1830a1436773SJohn Baldwin fprintf(fp, "{ %jd.%06ld, %jd.%06ld }", 1831a1436773SJohn Baldwin (intmax_t)tv[0].tv_sec, tv[0].tv_usec, 1832a1436773SJohn Baldwin (intmax_t)tv[1].tv_sec, tv[1].tv_usec); 1833e45a5a0dSDavid Malone else 1834f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1835e45a5a0dSDavid Malone break; 1836d8984f48SDag-Erling Smørgrav } 1837d8984f48SDag-Erling Smørgrav case Itimerval: { 1838e45a5a0dSDavid Malone struct itimerval itv; 18394e3da534SJohn Baldwin 184094355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], &itv, 184194355cfdSAndrey Zonov sizeof(itv)) != -1) 1842a1436773SJohn Baldwin fprintf(fp, "{ %jd.%06ld, %jd.%06ld }", 1843a1436773SJohn Baldwin (intmax_t)itv.it_interval.tv_sec, 1844081e5c48SPav Lucistnik itv.it_interval.tv_usec, 1845a1436773SJohn Baldwin (intmax_t)itv.it_value.tv_sec, 1846081e5c48SPav Lucistnik itv.it_value.tv_usec); 1847e45a5a0dSDavid Malone else 1848f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1849e45a5a0dSDavid Malone break; 1850d8984f48SDag-Erling Smørgrav } 18511c99a22aSSteven Hartland case LinuxSockArgs: 18521c99a22aSSteven Hartland { 18531c99a22aSSteven Hartland struct linux_socketcall_args largs; 18544e3da534SJohn Baldwin 18551c99a22aSSteven Hartland if (get_struct(pid, (void *)args[sc->offset], (void *)&largs, 1856fb7eabb0SJohn Baldwin sizeof(largs)) != -1) 1857f083f689SJohn Baldwin fprintf(fp, "{ %s, 0x%lx }", 1858fb7eabb0SJohn Baldwin lookup(linux_socketcall_ops, largs.what, 10), 18590a46af44SJohn Baldwin (long unsigned int)largs.args); 1860fb7eabb0SJohn Baldwin else 1861f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 18621c99a22aSSteven Hartland break; 18631c99a22aSSteven Hartland } 1864d8984f48SDag-Erling Smørgrav case Pollfd: { 1865e45a5a0dSDavid Malone /* 186694355cfdSAndrey Zonov * XXX: A Pollfd argument expects the /next/ syscall argument 186794355cfdSAndrey Zonov * to be the number of fds in the array. This matches the poll 186894355cfdSAndrey Zonov * syscall. 1869e45a5a0dSDavid Malone */ 1870e45a5a0dSDavid Malone struct pollfd *pfd; 1871e45a5a0dSDavid Malone int numfds = args[sc->offset + 1]; 1872f083f689SJohn Baldwin size_t bytes = sizeof(struct pollfd) * numfds; 1873f083f689SJohn Baldwin int i; 1874e45a5a0dSDavid Malone 1875e45a5a0dSDavid Malone if ((pfd = malloc(bytes)) == NULL) 1876f083f689SJohn Baldwin err(1, "Cannot malloc %zu bytes for pollfd array", 187794355cfdSAndrey Zonov bytes); 187894355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], pfd, bytes) 187994355cfdSAndrey Zonov != -1) { 1880f083f689SJohn Baldwin fputs("{", fp); 1881e45a5a0dSDavid Malone for (i = 0; i < numfds; i++) { 1882f083f689SJohn Baldwin fprintf(fp, " %d/%s", pfd[i].fd, 1883081e5c48SPav Lucistnik xlookup_bits(poll_flags, pfd[i].events)); 1884e45a5a0dSDavid Malone } 1885f083f689SJohn Baldwin fputs(" }", fp); 1886d8984f48SDag-Erling Smørgrav } else { 1887f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1888e45a5a0dSDavid Malone } 1889d8984f48SDag-Erling Smørgrav free(pfd); 1890e45a5a0dSDavid Malone break; 1891d8984f48SDag-Erling Smørgrav } 1892d8984f48SDag-Erling Smørgrav case Fd_set: { 1893e45a5a0dSDavid Malone /* 189494355cfdSAndrey Zonov * XXX: A Fd_set argument expects the /first/ syscall argument 189594355cfdSAndrey Zonov * to be the number of fds in the array. This matches the 189694355cfdSAndrey Zonov * select syscall. 1897e45a5a0dSDavid Malone */ 1898e45a5a0dSDavid Malone fd_set *fds; 1899e45a5a0dSDavid Malone int numfds = args[0]; 1900f083f689SJohn Baldwin size_t bytes = _howmany(numfds, _NFDBITS) * _NFDBITS; 1901f083f689SJohn Baldwin int i; 1902e45a5a0dSDavid Malone 1903e45a5a0dSDavid Malone if ((fds = malloc(bytes)) == NULL) 1904f083f689SJohn Baldwin err(1, "Cannot malloc %zu bytes for fd_set array", 190594355cfdSAndrey Zonov bytes); 190694355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], fds, bytes) 190794355cfdSAndrey Zonov != -1) { 1908f083f689SJohn Baldwin fputs("{", fp); 1909e45a5a0dSDavid Malone for (i = 0; i < numfds; i++) { 1910f083f689SJohn Baldwin if (FD_ISSET(i, fds)) 1911f083f689SJohn Baldwin fprintf(fp, " %d", i); 1912e45a5a0dSDavid Malone } 1913f083f689SJohn Baldwin fputs(" }", fp); 191494355cfdSAndrey Zonov } else 1915f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1916d8984f48SDag-Erling Smørgrav free(fds); 1917e45a5a0dSDavid Malone break; 1918d8984f48SDag-Erling Smørgrav } 191934763d1cSJohn Baldwin case Signal: 1920f083f689SJohn Baldwin fputs(strsig2(args[sc->offset]), fp); 1921f0ebbc29SDag-Erling Smørgrav break; 1922d8984f48SDag-Erling Smørgrav case Sigset: { 1923081e5c48SPav Lucistnik long sig; 1924081e5c48SPav Lucistnik sigset_t ss; 1925f083f689SJohn Baldwin int i, first; 1926081e5c48SPav Lucistnik 1927081e5c48SPav Lucistnik sig = args[sc->offset]; 192894355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], (void *)&ss, 192994355cfdSAndrey Zonov sizeof(ss)) == -1) { 1930f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 1931081e5c48SPav Lucistnik break; 1932081e5c48SPav Lucistnik } 1933f083f689SJohn Baldwin fputs("{ ", fp); 1934f083f689SJohn Baldwin first = 1; 1935d8984f48SDag-Erling Smørgrav for (i = 1; i < sys_nsig; i++) { 193634763d1cSJohn Baldwin if (sigismember(&ss, i)) { 1937f083f689SJohn Baldwin fprintf(fp, "%s%s", !first ? "|" : "", 19389289f547SJohn Baldwin strsig2(i)); 1939f083f689SJohn Baldwin first = 0; 194034763d1cSJohn Baldwin } 1941081e5c48SPav Lucistnik } 1942f083f689SJohn Baldwin if (!first) 1943f083f689SJohn Baldwin fputc(' ', fp); 1944f083f689SJohn Baldwin fputc('}', fp); 1945081e5c48SPav Lucistnik break; 1946d8984f48SDag-Erling Smørgrav } 19479289f547SJohn Baldwin case Sigprocmask: 19489289f547SJohn Baldwin print_integer_arg(sysdecode_sigprocmask_how, fp, 19499289f547SJohn Baldwin args[sc->offset]); 1950894b8f7aSAlfred Perlstein break; 19519289f547SJohn Baldwin case Fcntlflag: 19524e3da534SJohn Baldwin /* XXX: Output depends on the value of the previous argument. */ 19539289f547SJohn Baldwin if (sysdecode_fcntl_arg_p(args[sc->offset - 1])) 19549289f547SJohn Baldwin sysdecode_fcntl_arg(fp, args[sc->offset - 1], 19559289f547SJohn Baldwin args[sc->offset], 16); 1956081e5c48SPav Lucistnik break; 1957081e5c48SPav Lucistnik case Open: 19589289f547SJohn Baldwin print_mask_arg(sysdecode_open_flags, fp, args[sc->offset]); 1959081e5c48SPav Lucistnik break; 1960081e5c48SPav Lucistnik case Fcntl: 19619289f547SJohn Baldwin print_integer_arg(sysdecode_fcntl_cmd, fp, args[sc->offset]); 1962081e5c48SPav Lucistnik break; 1963894b8f7aSAlfred Perlstein case Mprot: 19649289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, fp, args[sc->offset]); 1965894b8f7aSAlfred Perlstein break; 19669289f547SJohn Baldwin case Mmapflags: 19679289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_flags, fp, args[sc->offset]); 1968894b8f7aSAlfred Perlstein break; 1969fde3a7d1SAlfred Perlstein case Whence: 19709289f547SJohn Baldwin print_integer_arg(sysdecode_whence, fp, args[sc->offset]); 1971081e5c48SPav Lucistnik break; 1972081e5c48SPav Lucistnik case Sockdomain: 19739289f547SJohn Baldwin print_integer_arg(sysdecode_socketdomain, fp, args[sc->offset]); 1974081e5c48SPav Lucistnik break; 19759289f547SJohn Baldwin case Socktype: 19769289f547SJohn Baldwin print_mask_arg(sysdecode_socket_type, fp, args[sc->offset]); 1977081e5c48SPav Lucistnik break; 1978081e5c48SPav Lucistnik case Shutdown: 19799289f547SJohn Baldwin print_integer_arg(sysdecode_shutdown_how, fp, args[sc->offset]); 1980081e5c48SPav Lucistnik break; 1981081e5c48SPav Lucistnik case Resource: 19829289f547SJohn Baldwin print_integer_arg(sysdecode_rlimit, fp, args[sc->offset]); 1983081e5c48SPav Lucistnik break; 1984ee8aa41dSJohn Baldwin case RusageWho: 1985ee8aa41dSJohn Baldwin print_integer_arg(sysdecode_getrusage_who, fp, args[sc->offset]); 1986ee8aa41dSJohn Baldwin break; 1987081e5c48SPav Lucistnik case Pathconf: 198839a3a438SJohn Baldwin print_integer_arg(sysdecode_pathconf_name, fp, args[sc->offset]); 1989fde3a7d1SAlfred Perlstein break; 19909e1db66eSMark Johnston case Rforkflags: 19919289f547SJohn Baldwin print_mask_arg(sysdecode_rfork_flags, fp, args[sc->offset]); 19929e1db66eSMark Johnston break; 1993d8984f48SDag-Erling Smørgrav case Sockaddr: { 199466917ca9SJohn Baldwin socklen_t len; 19959ddd1412SDag-Erling Smørgrav 1996a7a08c7eSMarcel Moolenaar if (args[sc->offset] == 0) { 1997f083f689SJohn Baldwin fputs("NULL", fp); 1998a7a08c7eSMarcel Moolenaar break; 1999a7a08c7eSMarcel Moolenaar } 2000a7a08c7eSMarcel Moolenaar 20016a656761SAlfred Perlstein /* 200266917ca9SJohn Baldwin * Extract the address length from the next argument. If 200366917ca9SJohn Baldwin * this is an output sockaddr (OUT is set), then the 200466917ca9SJohn Baldwin * next argument is a pointer to a socklen_t. Otherwise 200566917ca9SJohn Baldwin * the next argument contains a socklen_t by value. 20066a656761SAlfred Perlstein */ 200766917ca9SJohn Baldwin if (sc->type & OUT) { 200866917ca9SJohn Baldwin if (get_struct(pid, (void *)args[sc->offset + 1], 200966917ca9SJohn Baldwin &len, sizeof(len)) == -1) { 201066917ca9SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 20116a656761SAlfred Perlstein break; 20126a656761SAlfred Perlstein } 201366917ca9SJohn Baldwin } else 201466917ca9SJohn Baldwin len = args[sc->offset + 1]; 201566917ca9SJohn Baldwin 2016a2674e03SMichael Tuexen print_sockaddr(fp, trussinfo, (void *)args[sc->offset], len); 20179ddd1412SDag-Erling Smørgrav break; 2018d8984f48SDag-Erling Smørgrav } 2019d8984f48SDag-Erling Smørgrav case Sigaction: { 2020e45a5a0dSDavid Malone struct sigaction sa; 2021e45a5a0dSDavid Malone 202294355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], &sa, sizeof(sa)) 202394355cfdSAndrey Zonov != -1) { 2024f083f689SJohn Baldwin fputs("{ ", fp); 2025e45a5a0dSDavid Malone if (sa.sa_handler == SIG_DFL) 2026f083f689SJohn Baldwin fputs("SIG_DFL", fp); 2027e45a5a0dSDavid Malone else if (sa.sa_handler == SIG_IGN) 2028f083f689SJohn Baldwin fputs("SIG_IGN", fp); 2029e45a5a0dSDavid Malone else 2030f083f689SJohn Baldwin fprintf(fp, "%p", sa.sa_handler); 2031f083f689SJohn Baldwin fprintf(fp, " %s ss_t }", 2032081e5c48SPav Lucistnik xlookup_bits(sigaction_flags, sa.sa_flags)); 203394355cfdSAndrey Zonov } else 2034f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 2035e45a5a0dSDavid Malone break; 2036d8984f48SDag-Erling Smørgrav } 2037d8984f48SDag-Erling Smørgrav case Kevent: { 2038081e5c48SPav Lucistnik /* 20394e3da534SJohn Baldwin * XXX XXX: The size of the array is determined by either the 2040081e5c48SPav Lucistnik * next syscall argument, or by the syscall return value, 2041081e5c48SPav Lucistnik * depending on which argument number we are. This matches the 2042081e5c48SPav Lucistnik * kevent syscall, but luckily that's the only syscall that uses 2043081e5c48SPav Lucistnik * them. 2044081e5c48SPav Lucistnik */ 2045081e5c48SPav Lucistnik struct kevent *ke; 2046081e5c48SPav Lucistnik int numevents = -1; 2047f083f689SJohn Baldwin size_t bytes; 2048f083f689SJohn Baldwin int i; 2049081e5c48SPav Lucistnik 2050081e5c48SPav Lucistnik if (sc->offset == 1) 2051081e5c48SPav Lucistnik numevents = args[sc->offset+1]; 20522b75c8adSJohn Baldwin else if (sc->offset == 3 && retval[0] != -1) 20532b75c8adSJohn Baldwin numevents = retval[0]; 2054081e5c48SPav Lucistnik 2055f083f689SJohn Baldwin if (numevents >= 0) { 2056081e5c48SPav Lucistnik bytes = sizeof(struct kevent) * numevents; 2057081e5c48SPav Lucistnik if ((ke = malloc(bytes)) == NULL) 2058f083f689SJohn Baldwin err(1, 2059f083f689SJohn Baldwin "Cannot malloc %zu bytes for kevent array", 206094355cfdSAndrey Zonov bytes); 2061f083f689SJohn Baldwin } else 2062f083f689SJohn Baldwin ke = NULL; 206394355cfdSAndrey Zonov if (numevents >= 0 && get_struct(pid, (void *)args[sc->offset], 206494355cfdSAndrey Zonov ke, bytes) != -1) { 2065f083f689SJohn Baldwin fputc('{', fp); 2066c915ff03SJohn Baldwin for (i = 0; i < numevents; i++) { 2067c915ff03SJohn Baldwin fputc(' ', fp); 2068ffb66079SJohn Baldwin print_kevent(fp, &ke[i]); 2069c915ff03SJohn Baldwin } 2070f083f689SJohn Baldwin fputs(" }", fp); 2071d8984f48SDag-Erling Smørgrav } else { 2072f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 2073081e5c48SPav Lucistnik } 2074d8984f48SDag-Erling Smørgrav free(ke); 2075081e5c48SPav Lucistnik break; 2076d8984f48SDag-Erling Smørgrav } 2077ffb66079SJohn Baldwin case Kevent11: { 2078ffb66079SJohn Baldwin struct kevent_freebsd11 *ke11; 2079ffb66079SJohn Baldwin struct kevent ke; 2080ffb66079SJohn Baldwin int numevents = -1; 2081ffb66079SJohn Baldwin size_t bytes; 2082ffb66079SJohn Baldwin int i; 2083ffb66079SJohn Baldwin 2084ffb66079SJohn Baldwin if (sc->offset == 1) 2085ffb66079SJohn Baldwin numevents = args[sc->offset+1]; 2086ffb66079SJohn Baldwin else if (sc->offset == 3 && retval[0] != -1) 2087ffb66079SJohn Baldwin numevents = retval[0]; 2088ffb66079SJohn Baldwin 2089ffb66079SJohn Baldwin if (numevents >= 0) { 2090ffb66079SJohn Baldwin bytes = sizeof(struct kevent_freebsd11) * numevents; 2091ffb66079SJohn Baldwin if ((ke11 = malloc(bytes)) == NULL) 2092ffb66079SJohn Baldwin err(1, 2093ffb66079SJohn Baldwin "Cannot malloc %zu bytes for kevent array", 2094ffb66079SJohn Baldwin bytes); 2095ffb66079SJohn Baldwin } else 2096ffb66079SJohn Baldwin ke11 = NULL; 2097ffb66079SJohn Baldwin memset(&ke, 0, sizeof(ke)); 2098ffb66079SJohn Baldwin if (numevents >= 0 && get_struct(pid, (void *)args[sc->offset], 2099ffb66079SJohn Baldwin ke11, bytes) != -1) { 2100ffb66079SJohn Baldwin fputc('{', fp); 2101ffb66079SJohn Baldwin for (i = 0; i < numevents; i++) { 2102ffb66079SJohn Baldwin fputc(' ', fp); 2103ffb66079SJohn Baldwin ke.ident = ke11[i].ident; 2104ffb66079SJohn Baldwin ke.filter = ke11[i].filter; 2105ffb66079SJohn Baldwin ke.flags = ke11[i].flags; 2106ffb66079SJohn Baldwin ke.fflags = ke11[i].fflags; 2107ffb66079SJohn Baldwin ke.data = ke11[i].data; 2108ffb66079SJohn Baldwin ke.udata = ke11[i].udata; 2109ffb66079SJohn Baldwin print_kevent(fp, &ke); 2110ffb66079SJohn Baldwin } 2111ffb66079SJohn Baldwin fputs(" }", fp); 2112ffb66079SJohn Baldwin } else { 2113ffb66079SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 2114ffb66079SJohn Baldwin } 2115ffb66079SJohn Baldwin free(ke11); 2116ffb66079SJohn Baldwin break; 2117ffb66079SJohn Baldwin } 2118d8984f48SDag-Erling Smørgrav case Stat: { 2119081e5c48SPav Lucistnik struct stat st; 21204e3da534SJohn Baldwin 212194355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], &st, sizeof(st)) 212294355cfdSAndrey Zonov != -1) { 2123081e5c48SPav Lucistnik char mode[12]; 21244e3da534SJohn Baldwin 2125081e5c48SPav Lucistnik strmode(st.st_mode, mode); 2126f083f689SJohn Baldwin fprintf(fp, 2127b38fbc2eSJohn Baldwin "{ mode=%s,inode=%ju,size=%jd,blksize=%ld }", mode, 2128b38fbc2eSJohn Baldwin (uintmax_t)st.st_ino, (intmax_t)st.st_size, 212994355cfdSAndrey Zonov (long)st.st_blksize); 2130d8984f48SDag-Erling Smørgrav } else { 2131f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 2132081e5c48SPav Lucistnik } 2133081e5c48SPav Lucistnik break; 2134d8984f48SDag-Erling Smørgrav } 21358207f12dSWarner Losh case Stat11: { 21368207f12dSWarner Losh struct freebsd11_stat st; 21378207f12dSWarner Losh 21388207f12dSWarner Losh if (get_struct(pid, (void *)args[sc->offset], &st, sizeof(st)) 21398207f12dSWarner Losh != -1) { 21408207f12dSWarner Losh char mode[12]; 21418207f12dSWarner Losh 21428207f12dSWarner Losh strmode(st.st_mode, mode); 21438207f12dSWarner Losh fprintf(fp, 21448207f12dSWarner Losh "{ mode=%s,inode=%ju,size=%jd,blksize=%ld }", mode, 21458207f12dSWarner Losh (uintmax_t)st.st_ino, (intmax_t)st.st_size, 21468207f12dSWarner Losh (long)st.st_blksize); 21478207f12dSWarner Losh } else { 21488207f12dSWarner Losh fprintf(fp, "0x%lx", args[sc->offset]); 21498207f12dSWarner Losh } 21508207f12dSWarner Losh break; 21518207f12dSWarner Losh } 2152a776866bSBryan Drewery case StatFs: { 2153a776866bSBryan Drewery unsigned int i; 2154a776866bSBryan Drewery struct statfs buf; 21550a71c082SBryan Drewery 2156a776866bSBryan Drewery if (get_struct(pid, (void *)args[sc->offset], &buf, 2157a776866bSBryan Drewery sizeof(buf)) != -1) { 2158a776866bSBryan Drewery char fsid[17]; 2159a776866bSBryan Drewery 2160a776866bSBryan Drewery bzero(fsid, sizeof(fsid)); 2161a776866bSBryan Drewery if (buf.f_fsid.val[0] != 0 || buf.f_fsid.val[1] != 0) { 2162a776866bSBryan Drewery for (i = 0; i < sizeof(buf.f_fsid); i++) 2163a776866bSBryan Drewery snprintf(&fsid[i*2], 2164a776866bSBryan Drewery sizeof(fsid) - (i*2), "%02x", 2165a776866bSBryan Drewery ((u_char *)&buf.f_fsid)[i]); 2166a776866bSBryan Drewery } 2167a776866bSBryan Drewery fprintf(fp, 2168a776866bSBryan Drewery "{ fstypename=%s,mntonname=%s,mntfromname=%s," 2169a776866bSBryan Drewery "fsid=%s }", buf.f_fstypename, buf.f_mntonname, 2170a776866bSBryan Drewery buf.f_mntfromname, fsid); 2171a776866bSBryan Drewery } else 2172a776866bSBryan Drewery fprintf(fp, "0x%lx", args[sc->offset]); 2173a776866bSBryan Drewery break; 2174a776866bSBryan Drewery } 2175a776866bSBryan Drewery 2176d8984f48SDag-Erling Smørgrav case Rusage: { 2177081e5c48SPav Lucistnik struct rusage ru; 21784e3da534SJohn Baldwin 217994355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], &ru, sizeof(ru)) 218094355cfdSAndrey Zonov != -1) { 2181f083f689SJohn Baldwin fprintf(fp, 2182a1436773SJohn Baldwin "{ u=%jd.%06ld,s=%jd.%06ld,in=%ld,out=%ld }", 2183a1436773SJohn Baldwin (intmax_t)ru.ru_utime.tv_sec, ru.ru_utime.tv_usec, 2184a1436773SJohn Baldwin (intmax_t)ru.ru_stime.tv_sec, ru.ru_stime.tv_usec, 2185081e5c48SPav Lucistnik ru.ru_inblock, ru.ru_oublock); 218694355cfdSAndrey Zonov } else 2187f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 2188081e5c48SPav Lucistnik break; 2189d8984f48SDag-Erling Smørgrav } 2190d8984f48SDag-Erling Smørgrav case Rlimit: { 2191081e5c48SPav Lucistnik struct rlimit rl; 21924e3da534SJohn Baldwin 219394355cfdSAndrey Zonov if (get_struct(pid, (void *)args[sc->offset], &rl, sizeof(rl)) 219494355cfdSAndrey Zonov != -1) { 2195f083f689SJohn Baldwin fprintf(fp, "{ cur=%ju,max=%ju }", 2196081e5c48SPav Lucistnik rl.rlim_cur, rl.rlim_max); 219794355cfdSAndrey Zonov } else 2198f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 2199081e5c48SPav Lucistnik break; 2200d8984f48SDag-Erling Smørgrav } 220134763d1cSJohn Baldwin case ExitStatus: { 220234763d1cSJohn Baldwin int status; 2203f083f689SJohn Baldwin 220434763d1cSJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &status, 220534763d1cSJohn Baldwin sizeof(status)) != -1) { 2206f083f689SJohn Baldwin fputs("{ ", fp); 220734763d1cSJohn Baldwin if (WIFCONTINUED(status)) 2208f083f689SJohn Baldwin fputs("CONTINUED", fp); 220934763d1cSJohn Baldwin else if (WIFEXITED(status)) 2210f083f689SJohn Baldwin fprintf(fp, "EXITED,val=%d", 221134763d1cSJohn Baldwin WEXITSTATUS(status)); 221234763d1cSJohn Baldwin else if (WIFSIGNALED(status)) 2213f083f689SJohn Baldwin fprintf(fp, "SIGNALED,sig=%s%s", 2214f083f689SJohn Baldwin strsig2(WTERMSIG(status)), 221534763d1cSJohn Baldwin WCOREDUMP(status) ? ",cored" : ""); 221634763d1cSJohn Baldwin else 2217f083f689SJohn Baldwin fprintf(fp, "STOPPED,sig=%s", 2218f083f689SJohn Baldwin strsig2(WTERMSIG(status))); 2219f083f689SJohn Baldwin fputs(" }", fp); 222034763d1cSJohn Baldwin } else 2221f083f689SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 222234763d1cSJohn Baldwin break; 222334763d1cSJohn Baldwin } 222434763d1cSJohn Baldwin case Waitoptions: 22259289f547SJohn Baldwin print_mask_arg(sysdecode_wait6_options, fp, args[sc->offset]); 222634763d1cSJohn Baldwin break; 222734763d1cSJohn Baldwin case Idtype: 22289289f547SJohn Baldwin print_integer_arg(sysdecode_idtype, fp, args[sc->offset]); 222934763d1cSJohn Baldwin break; 223055648840SJohn Baldwin case Procctl: 22319289f547SJohn Baldwin print_integer_arg(sysdecode_procctl_cmd, fp, args[sc->offset]); 223255648840SJohn Baldwin break; 2233fdb5bf37SJohn Baldwin case Umtxop: 22349289f547SJohn Baldwin print_integer_arg(sysdecode_umtx_op, fp, args[sc->offset]); 2235fdb5bf37SJohn Baldwin break; 22367d897327SJohn Baldwin case Atfd: 22379289f547SJohn Baldwin print_integer_arg(sysdecode_atfd, fp, args[sc->offset]); 22387d897327SJohn Baldwin break; 22397d897327SJohn Baldwin case Atflags: 224039a3a438SJohn Baldwin print_mask_arg(sysdecode_atflags, fp, args[sc->offset]); 22417d897327SJohn Baldwin break; 22427d897327SJohn Baldwin case Accessmode: 22439289f547SJohn Baldwin print_mask_arg(sysdecode_access_mode, fp, args[sc->offset]); 22447d897327SJohn Baldwin break; 2245b289a8d7SJohn Baldwin case Sysarch: 224639a3a438SJohn Baldwin print_integer_arg(sysdecode_sysarch_number, fp, 224739a3a438SJohn Baldwin args[sc->offset]); 2248b289a8d7SJohn Baldwin break; 22492b75c8adSJohn Baldwin case PipeFds: 22502b75c8adSJohn Baldwin /* 22512b75c8adSJohn Baldwin * The pipe() system call in the kernel returns its 22522b75c8adSJohn Baldwin * two file descriptors via return values. However, 22532b75c8adSJohn Baldwin * the interface exposed by libc is that pipe() 22542b75c8adSJohn Baldwin * accepts a pointer to an array of descriptors. 22552b75c8adSJohn Baldwin * Format the output to match the libc API by printing 22562b75c8adSJohn Baldwin * the returned file descriptors as a fake argument. 22572b75c8adSJohn Baldwin * 22582b75c8adSJohn Baldwin * Overwrite the first retval to signal a successful 22592b75c8adSJohn Baldwin * return as well. 22602b75c8adSJohn Baldwin */ 22612b75c8adSJohn Baldwin fprintf(fp, "{ %ld, %ld }", retval[0], retval[1]); 22622b75c8adSJohn Baldwin retval[0] = 0; 22632b75c8adSJohn Baldwin break; 2264195aef99SBryan Drewery case Utrace: { 2265195aef99SBryan Drewery size_t len; 2266195aef99SBryan Drewery void *utrace_addr; 2267195aef99SBryan Drewery 2268195aef99SBryan Drewery len = args[sc->offset + 1]; 2269195aef99SBryan Drewery utrace_addr = calloc(1, len); 2270195aef99SBryan Drewery if (get_struct(pid, (void *)args[sc->offset], 2271195aef99SBryan Drewery (void *)utrace_addr, len) != -1) 2272195aef99SBryan Drewery print_utrace(fp, utrace_addr, len); 2273195aef99SBryan Drewery else 2274195aef99SBryan Drewery fprintf(fp, "0x%lx", args[sc->offset]); 2275195aef99SBryan Drewery free(utrace_addr); 2276195aef99SBryan Drewery break; 2277195aef99SBryan Drewery } 2278808d9805SEd Schouten case IntArray: { 2279808d9805SEd Schouten int descriptors[16]; 2280808d9805SEd Schouten unsigned long i, ndescriptors; 2281808d9805SEd Schouten bool truncated; 2282808d9805SEd Schouten 2283808d9805SEd Schouten ndescriptors = args[sc->offset + 1]; 2284808d9805SEd Schouten truncated = false; 2285808d9805SEd Schouten if (ndescriptors > nitems(descriptors)) { 2286808d9805SEd Schouten ndescriptors = nitems(descriptors); 2287808d9805SEd Schouten truncated = true; 2288808d9805SEd Schouten } 2289808d9805SEd Schouten if (get_struct(pid, (void *)args[sc->offset], 2290808d9805SEd Schouten descriptors, ndescriptors * sizeof(descriptors[0])) != -1) { 2291808d9805SEd Schouten fprintf(fp, "{"); 2292808d9805SEd Schouten for (i = 0; i < ndescriptors; i++) 2293808d9805SEd Schouten fprintf(fp, i == 0 ? " %d" : ", %d", 2294808d9805SEd Schouten descriptors[i]); 2295808d9805SEd Schouten fprintf(fp, truncated ? ", ... }" : " }"); 2296808d9805SEd Schouten } else 2297808d9805SEd Schouten fprintf(fp, "0x%lx", args[sc->offset]); 2298808d9805SEd Schouten break; 2299808d9805SEd Schouten } 23009289f547SJohn Baldwin case Pipe2: 23019289f547SJohn Baldwin print_mask_arg(sysdecode_pipe2_flags, fp, args[sc->offset]); 23029289f547SJohn Baldwin break; 2303bed418c8SJohn Baldwin case CapFcntlRights: { 2304bed418c8SJohn Baldwin uint32_t rights; 2305bed418c8SJohn Baldwin 2306bed418c8SJohn Baldwin if (sc->type & OUT) { 2307bed418c8SJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &rights, 2308bed418c8SJohn Baldwin sizeof(rights)) == -1) { 2309bed418c8SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 2310bed418c8SJohn Baldwin break; 2311bed418c8SJohn Baldwin } 2312bed418c8SJohn Baldwin } else 2313bed418c8SJohn Baldwin rights = args[sc->offset]; 2314bed418c8SJohn Baldwin print_mask_arg32(sysdecode_cap_fcntlrights, fp, rights); 2315bed418c8SJohn Baldwin break; 2316bed418c8SJohn Baldwin } 2317d2a97485SJohn Baldwin case Fadvice: 2318d2a97485SJohn Baldwin print_integer_arg(sysdecode_fadvice, fp, args[sc->offset]); 2319d2a97485SJohn Baldwin break; 232027459358SJohn Baldwin case FileFlags: { 232127459358SJohn Baldwin fflags_t rem; 232227459358SJohn Baldwin 232327459358SJohn Baldwin if (!sysdecode_fileflags(fp, args[sc->offset], &rem)) 232427459358SJohn Baldwin fprintf(fp, "0x%x", rem); 232527459358SJohn Baldwin else if (rem != 0) 232627459358SJohn Baldwin fprintf(fp, "|0x%x", rem); 232727459358SJohn Baldwin break; 232827459358SJohn Baldwin } 2329dd92181fSJohn Baldwin case Flockop: 2330dd92181fSJohn Baldwin print_mask_arg(sysdecode_flock_operation, fp, args[sc->offset]); 2331dd92181fSJohn Baldwin break; 2332ab43bedcSJohn Baldwin case Getfsstatmode: 2333ab43bedcSJohn Baldwin print_integer_arg(sysdecode_getfsstat_mode, fp, 2334ab43bedcSJohn Baldwin args[sc->offset]); 2335ab43bedcSJohn Baldwin break; 233694e854c5SJohn Baldwin case Kldsymcmd: 233794e854c5SJohn Baldwin print_integer_arg(sysdecode_kldsym_cmd, fp, args[sc->offset]); 233894e854c5SJohn Baldwin break; 233994e854c5SJohn Baldwin case Kldunloadflags: 234094e854c5SJohn Baldwin print_integer_arg(sysdecode_kldunload_flags, fp, 234194e854c5SJohn Baldwin args[sc->offset]); 234294e854c5SJohn Baldwin break; 234398fdbeecSJohn Baldwin case Madvice: 234498fdbeecSJohn Baldwin print_integer_arg(sysdecode_madvice, fp, args[sc->offset]); 234598fdbeecSJohn Baldwin break; 234658227c60SMichael Tuexen case Socklent: 234758227c60SMichael Tuexen fprintf(fp, "%u", (socklen_t)args[sc->offset]); 234858227c60SMichael Tuexen break; 2349ecac235bSMichael Tuexen case Sockprotocol: { 2350738a93a4SMichael Tuexen const char *temp; 2351738a93a4SMichael Tuexen int domain, protocol; 2352ecac235bSMichael Tuexen 2353738a93a4SMichael Tuexen domain = args[sc->offset - 2]; 2354ecac235bSMichael Tuexen protocol = args[sc->offset]; 2355ecac235bSMichael Tuexen if (protocol == 0) { 2356ecac235bSMichael Tuexen fputs("0", fp); 2357ecac235bSMichael Tuexen } else { 2358738a93a4SMichael Tuexen temp = sysdecode_socket_protocol(domain, protocol); 2359738a93a4SMichael Tuexen if (temp) { 2360738a93a4SMichael Tuexen fputs(temp, fp); 2361738a93a4SMichael Tuexen } else { 2362738a93a4SMichael Tuexen fprintf(fp, "%d", protocol); 2363738a93a4SMichael Tuexen } 2364ecac235bSMichael Tuexen } 2365ecac235bSMichael Tuexen break; 2366ecac235bSMichael Tuexen } 2367832af457SMichael Tuexen case Sockoptlevel: 2368832af457SMichael Tuexen print_integer_arg(sysdecode_sockopt_level, fp, 2369832af457SMichael Tuexen args[sc->offset]); 2370832af457SMichael Tuexen break; 2371832af457SMichael Tuexen case Sockoptname: { 2372832af457SMichael Tuexen const char *temp; 2373832af457SMichael Tuexen int level, name; 2374832af457SMichael Tuexen 2375832af457SMichael Tuexen level = args[sc->offset - 1]; 2376832af457SMichael Tuexen name = args[sc->offset]; 2377832af457SMichael Tuexen temp = sysdecode_sockopt_name(level, name); 2378832af457SMichael Tuexen if (temp) { 2379832af457SMichael Tuexen fputs(temp, fp); 2380832af457SMichael Tuexen } else { 2381832af457SMichael Tuexen fprintf(fp, "%d", name); 2382832af457SMichael Tuexen } 2383832af457SMichael Tuexen break; 2384832af457SMichael Tuexen } 23858b429b65SMichael Tuexen case Msgflags: 23868b429b65SMichael Tuexen print_mask_arg(sysdecode_msg_flags, fp, args[sc->offset]); 23878b429b65SMichael Tuexen break; 23887136a1d9SJohn Baldwin case CapRights: { 23897136a1d9SJohn Baldwin cap_rights_t rights; 23907136a1d9SJohn Baldwin 23917136a1d9SJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &rights, 23927136a1d9SJohn Baldwin sizeof(rights)) != -1) { 23937136a1d9SJohn Baldwin fputs("{ ", fp); 23947136a1d9SJohn Baldwin sysdecode_cap_rights(fp, &rights); 23957136a1d9SJohn Baldwin fputs(" }", fp); 23967136a1d9SJohn Baldwin } else 23977136a1d9SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 23987136a1d9SJohn Baldwin break; 23997136a1d9SJohn Baldwin } 24007ce44f08SJohn Baldwin case Acltype: 24017ce44f08SJohn Baldwin print_integer_arg(sysdecode_acltype, fp, args[sc->offset]); 24027ce44f08SJohn Baldwin break; 240326606dcaSJohn Baldwin case Extattrnamespace: 240426606dcaSJohn Baldwin print_integer_arg(sysdecode_extattrnamespace, fp, 240526606dcaSJohn Baldwin args[sc->offset]); 240626606dcaSJohn Baldwin break; 24072d9c9988SJohn Baldwin case Minherit: 24082d9c9988SJohn Baldwin print_integer_arg(sysdecode_minherit_inherit, fp, 24092d9c9988SJohn Baldwin args[sc->offset]); 24102d9c9988SJohn Baldwin break; 241194bde755SJohn Baldwin case Mlockall: 241294bde755SJohn Baldwin print_mask_arg(sysdecode_mlockall_flags, fp, args[sc->offset]); 241394bde755SJohn Baldwin break; 24148acc8e78SJohn Baldwin case Mountflags: 24158acc8e78SJohn Baldwin print_mask_arg(sysdecode_mount_flags, fp, args[sc->offset]); 24168acc8e78SJohn Baldwin break; 2417114aeee0SJohn Baldwin case Msync: 2418114aeee0SJohn Baldwin print_mask_arg(sysdecode_msync_flags, fp, args[sc->offset]); 2419114aeee0SJohn Baldwin break; 2420ad419d33SJohn Baldwin case Priowhich: 2421ad419d33SJohn Baldwin print_integer_arg(sysdecode_prio_which, fp, args[sc->offset]); 2422ad419d33SJohn Baldwin break; 24235ac1c7acSJohn Baldwin case Ptraceop: 24245ac1c7acSJohn Baldwin print_integer_arg(sysdecode_ptrace_request, fp, 24255ac1c7acSJohn Baldwin args[sc->offset]); 24265ac1c7acSJohn Baldwin break; 2427dd0c462cSJohn Baldwin case Quotactlcmd: 2428dd0c462cSJohn Baldwin if (!sysdecode_quotactl_cmd(fp, args[sc->offset])) 2429dd0c462cSJohn Baldwin fprintf(fp, "%#x", (int)args[sc->offset]); 2430dd0c462cSJohn Baldwin break; 24314152441fSJohn Baldwin case Reboothowto: 24324152441fSJohn Baldwin print_mask_arg(sysdecode_reboot_howto, fp, args[sc->offset]); 24334152441fSJohn Baldwin break; 24343cd40bc3SJohn Baldwin case Rtpriofunc: 24353cd40bc3SJohn Baldwin print_integer_arg(sysdecode_rtprio_function, fp, 24363cd40bc3SJohn Baldwin args[sc->offset]); 24373cd40bc3SJohn Baldwin break; 2438a4110f9fSJohn Baldwin case Schedpolicy: 2439a4110f9fSJohn Baldwin print_integer_arg(sysdecode_scheduler_policy, fp, 2440a4110f9fSJohn Baldwin args[sc->offset]); 2441a4110f9fSJohn Baldwin break; 2442a4110f9fSJohn Baldwin case Schedparam: { 2443a4110f9fSJohn Baldwin struct sched_param sp; 2444a4110f9fSJohn Baldwin 2445a4110f9fSJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &sp, 2446a4110f9fSJohn Baldwin sizeof(sp)) != -1) 2447a4110f9fSJohn Baldwin fprintf(fp, "{ %d }", sp.sched_priority); 2448a4110f9fSJohn Baldwin else 2449a4110f9fSJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 2450a4110f9fSJohn Baldwin break; 2451a4110f9fSJohn Baldwin } 245213e5e6b6SJohn Baldwin case PSig: { 245313e5e6b6SJohn Baldwin int sig; 245413e5e6b6SJohn Baldwin 245513e5e6b6SJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &sig, 245613e5e6b6SJohn Baldwin sizeof(sig)) == 0) 245713e5e6b6SJohn Baldwin fprintf(fp, "{ %s }", strsig2(sig)); 245813e5e6b6SJohn Baldwin else 245913e5e6b6SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 246013e5e6b6SJohn Baldwin break; 246113e5e6b6SJohn Baldwin } 246213e5e6b6SJohn Baldwin case Siginfo: { 246313e5e6b6SJohn Baldwin siginfo_t si; 246413e5e6b6SJohn Baldwin 246513e5e6b6SJohn Baldwin if (get_struct(pid, (void *)args[sc->offset], &si, 246613e5e6b6SJohn Baldwin sizeof(si)) != -1) { 246713e5e6b6SJohn Baldwin fprintf(fp, "{ signo=%s", strsig2(si.si_signo)); 246813e5e6b6SJohn Baldwin decode_siginfo(fp, &si); 246913e5e6b6SJohn Baldwin fprintf(fp, " }"); 247013e5e6b6SJohn Baldwin } else 247113e5e6b6SJohn Baldwin fprintf(fp, "0x%lx", args[sc->offset]); 247213e5e6b6SJohn Baldwin break; 247313e5e6b6SJohn Baldwin } 2474a2674e03SMichael Tuexen case Iovec: 2475ee6e58b2SMichael Tuexen /* 2476ee6e58b2SMichael Tuexen * Print argument as an array of struct iovec, where the next 2477ee6e58b2SMichael Tuexen * syscall argument is the number of elements of the array. 2478ee6e58b2SMichael Tuexen */ 2479ee6e58b2SMichael Tuexen 2480a2674e03SMichael Tuexen print_iovec(fp, trussinfo, (void *)args[sc->offset], 2481a2674e03SMichael Tuexen (int)args[sc->offset + 1]); 2482ee6e58b2SMichael Tuexen break; 24834d7b9809SMichael Tuexen case Sctpsndrcvinfo: { 24844d7b9809SMichael Tuexen struct sctp_sndrcvinfo info; 24854d7b9809SMichael Tuexen 24864d7b9809SMichael Tuexen if (get_struct(pid, (void *)args[sc->offset], 24874d7b9809SMichael Tuexen &info, sizeof(struct sctp_sndrcvinfo)) == -1) { 24884d7b9809SMichael Tuexen fprintf(fp, "0x%lx", args[sc->offset]); 24894d7b9809SMichael Tuexen break; 24904d7b9809SMichael Tuexen } 2491a2674e03SMichael Tuexen print_sctp_sndrcvinfo(fp, sc->type & OUT, &info); 2492a2674e03SMichael Tuexen break; 24934d7b9809SMichael Tuexen } 2494a2674e03SMichael Tuexen case Msghdr: { 2495a2674e03SMichael Tuexen struct msghdr msghdr; 2496a2674e03SMichael Tuexen 2497a2674e03SMichael Tuexen if (get_struct(pid, (void *)args[sc->offset], 2498a2674e03SMichael Tuexen &msghdr, sizeof(struct msghdr)) == -1) { 2499a2674e03SMichael Tuexen fprintf(fp, "0x%lx", args[sc->offset]); 2500a2674e03SMichael Tuexen break; 25014d7b9809SMichael Tuexen } 2502a2674e03SMichael Tuexen fputs("{", fp); 2503a2674e03SMichael Tuexen print_sockaddr(fp, trussinfo, msghdr.msg_name, msghdr.msg_namelen); 2504a2674e03SMichael Tuexen fprintf(fp, ",%d,", msghdr.msg_namelen); 2505a2674e03SMichael Tuexen print_iovec(fp, trussinfo, msghdr.msg_iov, msghdr.msg_iovlen); 2506a2674e03SMichael Tuexen fprintf(fp, ",%d,", msghdr.msg_iovlen); 2507a2674e03SMichael Tuexen print_cmsgs(fp, pid, sc->type & OUT, &msghdr); 2508a2674e03SMichael Tuexen fprintf(fp, ",%u,", msghdr.msg_controllen); 2509a2674e03SMichael Tuexen print_mask_arg(sysdecode_msg_flags, fp, msghdr.msg_flags); 2510a2674e03SMichael Tuexen fputs("}", fp); 25114d7b9809SMichael Tuexen break; 25124d7b9809SMichael Tuexen } 2513808d9805SEd Schouten 2514808d9805SEd Schouten case CloudABIAdvice: 2515808d9805SEd Schouten fputs(xlookup(cloudabi_advice, args[sc->offset]), fp); 2516808d9805SEd Schouten break; 2517808d9805SEd Schouten case CloudABIClockID: 2518808d9805SEd Schouten fputs(xlookup(cloudabi_clockid, args[sc->offset]), fp); 2519808d9805SEd Schouten break; 2520808d9805SEd Schouten case ClouduABIFDSFlags: 2521808d9805SEd Schouten fputs(xlookup_bits(cloudabi_fdsflags, args[sc->offset]), fp); 2522808d9805SEd Schouten break; 2523808d9805SEd Schouten case CloudABIFDStat: { 2524808d9805SEd Schouten cloudabi_fdstat_t fds; 2525808d9805SEd Schouten if (get_struct(pid, (void *)args[sc->offset], &fds, sizeof(fds)) 2526808d9805SEd Schouten != -1) { 2527808d9805SEd Schouten fprintf(fp, "{ %s, ", 2528808d9805SEd Schouten xlookup(cloudabi_filetype, fds.fs_filetype)); 2529808d9805SEd Schouten fprintf(fp, "%s, ... }", 2530808d9805SEd Schouten xlookup_bits(cloudabi_fdflags, fds.fs_flags)); 2531808d9805SEd Schouten } else 2532808d9805SEd Schouten fprintf(fp, "0x%lx", args[sc->offset]); 2533808d9805SEd Schouten break; 2534808d9805SEd Schouten } 2535808d9805SEd Schouten case CloudABIFileStat: { 2536808d9805SEd Schouten cloudabi_filestat_t fsb; 2537808d9805SEd Schouten if (get_struct(pid, (void *)args[sc->offset], &fsb, sizeof(fsb)) 2538808d9805SEd Schouten != -1) 25399ba32307SJohn Baldwin fprintf(fp, "{ %s, %ju }", 2540808d9805SEd Schouten xlookup(cloudabi_filetype, fsb.st_filetype), 25419ba32307SJohn Baldwin (uintmax_t)fsb.st_size); 2542808d9805SEd Schouten else 2543808d9805SEd Schouten fprintf(fp, "0x%lx", args[sc->offset]); 2544808d9805SEd Schouten break; 2545808d9805SEd Schouten } 2546808d9805SEd Schouten case CloudABIFileType: 2547808d9805SEd Schouten fputs(xlookup(cloudabi_filetype, args[sc->offset]), fp); 2548808d9805SEd Schouten break; 2549808d9805SEd Schouten case CloudABIFSFlags: 2550808d9805SEd Schouten fputs(xlookup_bits(cloudabi_fsflags, args[sc->offset]), fp); 2551808d9805SEd Schouten break; 2552808d9805SEd Schouten case CloudABILookup: 2553808d9805SEd Schouten if ((args[sc->offset] & CLOUDABI_LOOKUP_SYMLINK_FOLLOW) != 0) 2554808d9805SEd Schouten fprintf(fp, "%d|LOOKUP_SYMLINK_FOLLOW", 2555808d9805SEd Schouten (int)args[sc->offset]); 2556808d9805SEd Schouten else 2557808d9805SEd Schouten fprintf(fp, "%d", (int)args[sc->offset]); 2558808d9805SEd Schouten break; 2559808d9805SEd Schouten case CloudABIMFlags: 2560808d9805SEd Schouten fputs(xlookup_bits(cloudabi_mflags, args[sc->offset]), fp); 2561808d9805SEd Schouten break; 2562808d9805SEd Schouten case CloudABIMProt: 2563808d9805SEd Schouten fputs(xlookup_bits(cloudabi_mprot, args[sc->offset]), fp); 2564808d9805SEd Schouten break; 2565808d9805SEd Schouten case CloudABIMSFlags: 2566808d9805SEd Schouten fputs(xlookup_bits(cloudabi_msflags, args[sc->offset]), fp); 2567808d9805SEd Schouten break; 2568808d9805SEd Schouten case CloudABIOFlags: 2569808d9805SEd Schouten fputs(xlookup_bits(cloudabi_oflags, args[sc->offset]), fp); 2570808d9805SEd Schouten break; 2571808d9805SEd Schouten case CloudABISDFlags: 2572808d9805SEd Schouten fputs(xlookup_bits(cloudabi_sdflags, args[sc->offset]), fp); 2573808d9805SEd Schouten break; 2574808d9805SEd Schouten case CloudABISignal: 2575808d9805SEd Schouten fputs(xlookup(cloudabi_signal, args[sc->offset]), fp); 2576808d9805SEd Schouten break; 2577808d9805SEd Schouten case CloudABITimestamp: 2578808d9805SEd Schouten fprintf(fp, "%lu.%09lus", args[sc->offset] / 1000000000, 2579808d9805SEd Schouten args[sc->offset] % 1000000000); 2580808d9805SEd Schouten break; 2581808d9805SEd Schouten case CloudABIULFlags: 2582808d9805SEd Schouten fputs(xlookup_bits(cloudabi_ulflags, args[sc->offset]), fp); 2583808d9805SEd Schouten break; 2584808d9805SEd Schouten case CloudABIWhence: 2585808d9805SEd Schouten fputs(xlookup(cloudabi_whence, args[sc->offset]), fp); 2586808d9805SEd Schouten break; 2587808d9805SEd Schouten 2588081e5c48SPav Lucistnik default: 2589081e5c48SPav Lucistnik errx(1, "Invalid argument type %d\n", sc->type & ARG_MASK); 2590bbeaf6c0SSean Eric Fagan } 2591f083f689SJohn Baldwin fclose(fp); 2592d8984f48SDag-Erling Smørgrav return (tmp); 2593bbeaf6c0SSean Eric Fagan } 2594bbeaf6c0SSean Eric Fagan 2595bbeaf6c0SSean Eric Fagan /* 259600ddbdf2SJohn Baldwin * Print (to outfile) the system call and its arguments. 2597bbeaf6c0SSean Eric Fagan */ 2598bbeaf6c0SSean Eric Fagan void 259900ddbdf2SJohn Baldwin print_syscall(struct trussinfo *trussinfo) 2600d8984f48SDag-Erling Smørgrav { 260100ddbdf2SJohn Baldwin struct threadinfo *t; 260200ddbdf2SJohn Baldwin const char *name; 260300ddbdf2SJohn Baldwin char **s_args; 260400ddbdf2SJohn Baldwin int i, len, nargs; 26050d0bd00eSMatthew N. Dodd 260600ddbdf2SJohn Baldwin t = trussinfo->curthread; 2607c03bfcc8SMatthew N. Dodd 26081175b23fSJohn Baldwin name = t->cs.sc->name; 260900ddbdf2SJohn Baldwin nargs = t->cs.nargs; 261000ddbdf2SJohn Baldwin s_args = t->cs.s_args; 26110d0bd00eSMatthew N. Dodd 2612d70876fdSJohn Baldwin len = print_line_prefix(trussinfo); 2613ec0bed25SMatthew N. Dodd len += fprintf(trussinfo->outfile, "%s(", name); 2614c03bfcc8SMatthew N. Dodd 2615bbeaf6c0SSean Eric Fagan for (i = 0; i < nargs; i++) { 261600ddbdf2SJohn Baldwin if (s_args[i] != NULL) 2617ec0bed25SMatthew N. Dodd len += fprintf(trussinfo->outfile, "%s", s_args[i]); 2618bbeaf6c0SSean Eric Fagan else 261994355cfdSAndrey Zonov len += fprintf(trussinfo->outfile, 262094355cfdSAndrey Zonov "<missing argument>"); 262194355cfdSAndrey Zonov len += fprintf(trussinfo->outfile, "%s", i < (nargs - 1) ? 262294355cfdSAndrey Zonov "," : ""); 2623bbeaf6c0SSean Eric Fagan } 2624ec0bed25SMatthew N. Dodd len += fprintf(trussinfo->outfile, ")"); 26256cb533feSSean Eric Fagan for (i = 0; i < 6 - (len / 8); i++) 2626ec0bed25SMatthew N. Dodd fprintf(trussinfo->outfile, "\t"); 26276cb533feSSean Eric Fagan } 26286cb533feSSean Eric Fagan 26296cb533feSSean Eric Fagan void 263000ddbdf2SJohn Baldwin print_syscall_ret(struct trussinfo *trussinfo, int errorp, long *retval) 26311bcb5f5aSMarcel Moolenaar { 2632ee3b0f6eSDiomidis Spinellis struct timespec timediff; 263300ddbdf2SJohn Baldwin struct threadinfo *t; 263400ddbdf2SJohn Baldwin struct syscall *sc; 2635287b96ddSJohn Baldwin int error; 2636ee3b0f6eSDiomidis Spinellis 263700ddbdf2SJohn Baldwin t = trussinfo->curthread; 263800ddbdf2SJohn Baldwin sc = t->cs.sc; 2639ee3b0f6eSDiomidis Spinellis if (trussinfo->flags & COUNTONLY) { 264000ddbdf2SJohn Baldwin timespecsubt(&t->after, &t->before, &timediff); 2641d9dcc463SXin LI timespecadd(&sc->time, &timediff, &sc->time); 2642ee3b0f6eSDiomidis Spinellis sc->ncalls++; 2643ee3b0f6eSDiomidis Spinellis if (errorp) 2644ee3b0f6eSDiomidis Spinellis sc->nerror++; 2645ee3b0f6eSDiomidis Spinellis return; 2646ee3b0f6eSDiomidis Spinellis } 2647d8984f48SDag-Erling Smørgrav 264800ddbdf2SJohn Baldwin print_syscall(trussinfo); 26490cf21b4fSBrian Somers fflush(trussinfo->outfile); 2650b9befd33SJohn Baldwin 2651b9befd33SJohn Baldwin if (retval == NULL) { 2652b9befd33SJohn Baldwin /* 2653b9befd33SJohn Baldwin * This system call resulted in the current thread's exit, 2654b9befd33SJohn Baldwin * so there is no return value or error to display. 2655b9befd33SJohn Baldwin */ 2656b9befd33SJohn Baldwin fprintf(trussinfo->outfile, "\n"); 2657b9befd33SJohn Baldwin return; 2658b9befd33SJohn Baldwin } 2659b9befd33SJohn Baldwin 2660287b96ddSJohn Baldwin if (errorp) { 2661287b96ddSJohn Baldwin error = sysdecode_abi_to_freebsd_errno(t->proc->abi->abi, 2662287b96ddSJohn Baldwin retval[0]); 26632b75c8adSJohn Baldwin fprintf(trussinfo->outfile, " ERR#%ld '%s'\n", retval[0], 2664287b96ddSJohn Baldwin error == INT_MAX ? "Unknown error" : strerror(error)); 2665287b96ddSJohn Baldwin } 26662b75c8adSJohn Baldwin #ifndef __LP64__ 26676c61b0f3SBryan Drewery else if (sc->ret_type == 2) { 26682b75c8adSJohn Baldwin off_t off; 26692b75c8adSJohn Baldwin 26702b75c8adSJohn Baldwin #if _BYTE_ORDER == _LITTLE_ENDIAN 26712b75c8adSJohn Baldwin off = (off_t)retval[1] << 32 | retval[0]; 26722b75c8adSJohn Baldwin #else 26732b75c8adSJohn Baldwin off = (off_t)retval[0] << 32 | retval[1]; 26742b75c8adSJohn Baldwin #endif 26752b75c8adSJohn Baldwin fprintf(trussinfo->outfile, " = %jd (0x%jx)\n", (intmax_t)off, 26762b75c8adSJohn Baldwin (intmax_t)off); 26776cb533feSSean Eric Fagan } 26782b75c8adSJohn Baldwin #endif 26792b75c8adSJohn Baldwin else 26802b75c8adSJohn Baldwin fprintf(trussinfo->outfile, " = %ld (0x%lx)\n", retval[0], 26812b75c8adSJohn Baldwin retval[0]); 2682bbeaf6c0SSean Eric Fagan } 2683ee3b0f6eSDiomidis Spinellis 2684ee3b0f6eSDiomidis Spinellis void 2685ee3b0f6eSDiomidis Spinellis print_summary(struct trussinfo *trussinfo) 2686ee3b0f6eSDiomidis Spinellis { 2687ee3b0f6eSDiomidis Spinellis struct timespec total = {0, 0}; 268894355cfdSAndrey Zonov struct syscall *sc; 2689ee3b0f6eSDiomidis Spinellis int ncall, nerror; 2690ee3b0f6eSDiomidis Spinellis 2691ee3b0f6eSDiomidis Spinellis fprintf(trussinfo->outfile, "%-20s%15s%8s%8s\n", 2692ee3b0f6eSDiomidis Spinellis "syscall", "seconds", "calls", "errors"); 2693ee3b0f6eSDiomidis Spinellis ncall = nerror = 0; 26946c61b0f3SBryan Drewery STAILQ_FOREACH(sc, &syscalls, entries) 2695ee3b0f6eSDiomidis Spinellis if (sc->ncalls) { 269655a8d2bbSJaakko Heinonen fprintf(trussinfo->outfile, "%-20s%5jd.%09ld%8d%8d\n", 269755a8d2bbSJaakko Heinonen sc->name, (intmax_t)sc->time.tv_sec, 269855a8d2bbSJaakko Heinonen sc->time.tv_nsec, sc->ncalls, sc->nerror); 2699d9dcc463SXin LI timespecadd(&total, &sc->time, &total); 2700ee3b0f6eSDiomidis Spinellis ncall += sc->ncalls; 2701ee3b0f6eSDiomidis Spinellis nerror += sc->nerror; 2702ee3b0f6eSDiomidis Spinellis } 2703ee3b0f6eSDiomidis Spinellis fprintf(trussinfo->outfile, "%20s%15s%8s%8s\n", 2704ee3b0f6eSDiomidis Spinellis "", "-------------", "-------", "-------"); 270555a8d2bbSJaakko Heinonen fprintf(trussinfo->outfile, "%-20s%5jd.%09ld%8d%8d\n", 270655a8d2bbSJaakko Heinonen "", (intmax_t)total.tv_sec, total.tv_nsec, ncall, nerror); 2707ee3b0f6eSDiomidis Spinellis } 2708