net.c revision b237b1b20da4ff40efb919f9d4a6458a05f375ca
1/* 2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl> 3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl> 4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com> 5 * Copyright (c) 1996-2000 Wichert Akkerman <wichert@cistron.nl> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * $Id$ 31 */ 32 33#include "defs.h" 34 35#include <sys/stat.h> 36#include <sys/socket.h> 37#include <sys/un.h> 38 39#if defined(HAVE_SIN6_SCOPE_ID_LINUX) 40#define in6_addr in6_addr_libc 41#define ipv6_mreq ipv6_mreq_libc 42#define sockaddr_in6 sockaddr_in6_libc 43#endif 44 45#include <netinet/in.h> 46#ifdef HAVE_NETINET_TCP_H 47#include <netinet/tcp.h> 48#endif 49#ifdef HAVE_NETINET_UDP_H 50#include <netinet/udp.h> 51#endif 52#ifdef HAVE_NETINET_SCTP_H 53#include <netinet/sctp.h> 54#endif 55#include <arpa/inet.h> 56#include <net/if.h> 57#include <asm/types.h> 58#if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC__ + __GLIBC_MINOR__ >= 3) 59# include <netipx/ipx.h> 60#else 61# include <linux/ipx.h> 62#endif 63 64#if defined(__GLIBC__) && (((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1)) || defined(HAVE_SIN6_SCOPE_ID_LINUX)) 65#if defined(HAVE_LINUX_IN6_H) 66#if defined(HAVE_SIN6_SCOPE_ID_LINUX) 67#undef in6_addr 68#undef ipv6_mreq 69#undef sockaddr_in6 70#define in6_addr in6_addr_kernel 71#define ipv6_mreq ipv6_mreq_kernel 72#define sockaddr_in6 sockaddr_in6_kernel 73#endif 74#include <linux/in6.h> 75#if defined(HAVE_SIN6_SCOPE_ID_LINUX) 76#undef in6_addr 77#undef ipv6_mreq 78#undef sockaddr_in6 79#define in6_addr in6_addr_libc 80#define ipv6_mreq ipv6_mreq_libc 81#define sockaddr_in6 sockaddr_in6_kernel 82#endif 83#endif 84#endif 85 86#if defined(HAVE_SYS_UIO_H) 87#include <sys/uio.h> 88#endif 89 90#if defined(HAVE_LINUX_NETLINK_H) 91#include <linux/netlink.h> 92#endif 93 94#if defined(HAVE_LINUX_IF_PACKET_H) 95#include <linux/if_packet.h> 96#endif 97 98#if defined(HAVE_LINUX_ICMP_H) 99#include <linux/icmp.h> 100#endif 101 102#ifndef PF_UNSPEC 103#define PF_UNSPEC AF_UNSPEC 104#endif 105 106/* Under Linux these are enums so we can't test for them with ifdef. */ 107#define IPPROTO_EGP IPPROTO_EGP 108#define IPPROTO_PUP IPPROTO_PUP 109#define IPPROTO_IDP IPPROTO_IDP 110#define IPPROTO_IGMP IPPROTO_IGMP 111#define IPPROTO_RAW IPPROTO_RAW 112#define IPPROTO_MAX IPPROTO_MAX 113 114static const struct xlat domains[] = { 115#ifdef PF_AAL5 116 { PF_AAL5, "PF_AAL5" }, 117#endif 118#ifdef PF_APPLETALK 119 { PF_APPLETALK, "PF_APPLETALK" }, 120#endif 121#ifdef PF_ASH 122 { PF_ASH, "PF_ASH" }, 123#endif 124#ifdef PF_ATMPVC 125 { PF_ATMPVC, "PF_ATMPVC" }, 126#endif 127#ifdef PF_ATMSVC 128 { PF_ATMSVC, "PF_ATMSVC" }, 129#endif 130#ifdef PF_AX25 131 { PF_AX25, "PF_AX25" }, 132#endif 133#ifdef PF_BLUETOOTH 134 { PF_BLUETOOTH, "PF_BLUETOOTH" }, 135#endif 136#ifdef PF_BRIDGE 137 { PF_BRIDGE, "PF_BRIDGE" }, 138#endif 139#ifdef PF_DECnet 140 { PF_DECnet, "PF_DECnet" }, 141#endif 142#ifdef PF_DECNET 143 { PF_DECNET, "PF_DECNET" }, 144#endif 145#ifdef PF_ECONET 146 { PF_ECONET, "PF_ECONET" }, 147#endif 148#ifdef PF_FILE 149 { PF_FILE, "PF_FILE" }, 150#endif 151#ifdef PF_IMPLINK 152 { PF_IMPLINK, "PF_IMPLINK" }, 153#endif 154#ifdef PF_INET 155 { PF_INET, "PF_INET" }, 156#endif 157#ifdef PF_INET6 158 { PF_INET6, "PF_INET6" }, 159#endif 160#ifdef PF_IPX 161 { PF_IPX, "PF_IPX" }, 162#endif 163#ifdef PF_IRDA 164 { PF_IRDA, "PF_IRDA" }, 165#endif 166#ifdef PF_ISO 167 { PF_ISO, "PF_ISO" }, 168#endif 169#ifdef PF_KEY 170 { PF_KEY, "PF_KEY" }, 171#endif 172#ifdef PF_UNIX 173 { PF_UNIX, "PF_UNIX" }, 174#endif 175#ifdef PF_LOCAL 176 { PF_LOCAL, "PF_LOCAL" }, 177#endif 178#ifdef PF_NETBEUI 179 { PF_NETBEUI, "PF_NETBEUI" }, 180#endif 181#ifdef PF_NETLINK 182 { PF_NETLINK, "PF_NETLINK" }, 183#endif 184#ifdef PF_NETROM 185 { PF_NETROM, "PF_NETROM" }, 186#endif 187#ifdef PF_PACKET 188 { PF_PACKET, "PF_PACKET" }, 189#endif 190#ifdef PF_PPPOX 191 { PF_PPPOX, "PF_PPPOX" }, 192#endif 193#ifdef PF_ROSE 194 { PF_ROSE, "PF_ROSE" }, 195#endif 196#ifdef PF_ROUTE 197 { PF_ROUTE, "PF_ROUTE" }, 198#endif 199#ifdef PF_SECURITY 200 { PF_SECURITY, "PF_SECURITY" }, 201#endif 202#ifdef PF_SNA 203 { PF_SNA, "PF_SNA" }, 204#endif 205#ifdef PF_UNSPEC 206 { PF_UNSPEC, "PF_UNSPEC" }, 207#endif 208#ifdef PF_WANPIPE 209 { PF_WANPIPE, "PF_WANPIPE" }, 210#endif 211#ifdef PF_X25 212 { PF_X25, "PF_X25" }, 213#endif 214 { 0, NULL }, 215}; 216const struct xlat addrfams[] = { 217#ifdef AF_APPLETALK 218 { AF_APPLETALK, "AF_APPLETALK" }, 219#endif 220#ifdef AF_ASH 221 { AF_ASH, "AF_ASH" }, 222#endif 223#ifdef AF_ATMPVC 224 { AF_ATMPVC, "AF_ATMPVC" }, 225#endif 226#ifdef AF_ATMSVC 227 { AF_ATMSVC, "AF_ATMSVC" }, 228#endif 229#ifdef AF_AX25 230 { AF_AX25, "AF_AX25" }, 231#endif 232#ifdef AF_BLUETOOTH 233 { AF_BLUETOOTH, "AF_BLUETOOTH" }, 234#endif 235#ifdef AF_BRIDGE 236 { AF_BRIDGE, "AF_BRIDGE" }, 237#endif 238#ifdef AF_DECnet 239 { AF_DECnet, "AF_DECnet" }, 240#endif 241#ifdef AF_ECONET 242 { AF_ECONET, "AF_ECONET" }, 243#endif 244#ifdef AF_FILE 245 { AF_FILE, "AF_FILE" }, 246#endif 247#ifdef AF_IMPLINK 248 { AF_IMPLINK, "AF_IMPLINK" }, 249#endif 250#ifdef AF_INET 251 { AF_INET, "AF_INET" }, 252#endif 253#ifdef AF_INET6 254 { AF_INET6, "AF_INET6" }, 255#endif 256#ifdef AF_IPX 257 { AF_IPX, "AF_IPX" }, 258#endif 259#ifdef AF_IRDA 260 { AF_IRDA, "AF_IRDA" }, 261#endif 262#ifdef AF_ISO 263 { AF_ISO, "AF_ISO" }, 264#endif 265#ifdef AF_KEY 266 { AF_KEY, "AF_KEY" }, 267#endif 268#ifdef AF_UNIX 269 { AF_UNIX, "AF_UNIX" }, 270#endif 271#ifdef AF_LOCAL 272 { AF_LOCAL, "AF_LOCAL" }, 273#endif 274#ifdef AF_NETBEUI 275 { AF_NETBEUI, "AF_NETBEUI" }, 276#endif 277#ifdef AF_NETLINK 278 { AF_NETLINK, "AF_NETLINK" }, 279#endif 280#ifdef AF_NETROM 281 { AF_NETROM, "AF_NETROM" }, 282#endif 283#ifdef AF_PACKET 284 { AF_PACKET, "AF_PACKET" }, 285#endif 286#ifdef AF_PPPOX 287 { AF_PPPOX, "AF_PPPOX" }, 288#endif 289#ifdef AF_ROSE 290 { AF_ROSE, "AF_ROSE" }, 291#endif 292#ifdef AF_ROUTE 293 { AF_ROUTE, "AF_ROUTE" }, 294#endif 295#ifdef AF_SECURITY 296 { AF_SECURITY, "AF_SECURITY" }, 297#endif 298#ifdef AF_SNA 299 { AF_SNA, "AF_SNA" }, 300#endif 301#ifdef AF_UNSPEC 302 { AF_UNSPEC, "AF_UNSPEC" }, 303#endif 304#ifdef AF_WANPIPE 305 { AF_WANPIPE, "AF_WANPIPE" }, 306#endif 307#ifdef AF_X25 308 { AF_X25, "AF_X25" }, 309#endif 310 { 0, NULL }, 311}; 312static const struct xlat socktypes[] = { 313 { SOCK_STREAM, "SOCK_STREAM" }, 314 { SOCK_DGRAM, "SOCK_DGRAM" }, 315#ifdef SOCK_RAW 316 { SOCK_RAW, "SOCK_RAW" }, 317#endif 318#ifdef SOCK_RDM 319 { SOCK_RDM, "SOCK_RDM" }, 320#endif 321#ifdef SOCK_SEQPACKET 322 { SOCK_SEQPACKET,"SOCK_SEQPACKET"}, 323#endif 324#ifdef SOCK_DCCP 325 { SOCK_DCCP, "SOCK_DCCP" }, 326#endif 327#ifdef SOCK_PACKET 328 { SOCK_PACKET, "SOCK_PACKET" }, 329#endif 330 { 0, NULL }, 331}; 332static const struct xlat sock_type_flags[] = { 333#ifdef SOCK_CLOEXEC 334 { SOCK_CLOEXEC, "SOCK_CLOEXEC" }, 335#endif 336#ifdef SOCK_NONBLOCK 337 { SOCK_NONBLOCK,"SOCK_NONBLOCK" }, 338#endif 339 { 0, NULL }, 340}; 341#ifndef SOCK_TYPE_MASK 342# define SOCK_TYPE_MASK 0xf 343#endif 344static const struct xlat socketlayers[] = { 345#if defined(SOL_IP) 346 { SOL_IP, "SOL_IP" }, 347#endif 348#if defined(SOL_ICMP) 349 { SOL_ICMP, "SOL_ICMP" }, 350#endif 351#if defined(SOL_TCP) 352 { SOL_TCP, "SOL_TCP" }, 353#endif 354#if defined(SOL_UDP) 355 { SOL_UDP, "SOL_UDP" }, 356#endif 357#if defined(SOL_IPV6) 358 { SOL_IPV6, "SOL_IPV6" }, 359#endif 360#if defined(SOL_ICMPV6) 361 { SOL_ICMPV6, "SOL_ICMPV6" }, 362#endif 363#if defined(SOL_SCTP) 364 { SOL_SCTP, "SOL_SCTP" }, 365#endif 366#if defined(SOL_UDPLITE) 367 { SOL_UDPLITE, "SOL_UDPLITE" }, 368#endif 369#if defined(SOL_RAW) 370 { SOL_RAW, "SOL_RAW" }, 371#endif 372#if defined(SOL_IPX) 373 { SOL_IPX, "SOL_IPX" }, 374#endif 375#if defined(SOL_AX25) 376 { SOL_AX25, "SOL_AX25" }, 377#endif 378#if defined(SOL_ATALK) 379 { SOL_ATALK, "SOL_ATALK" }, 380#endif 381#if defined(SOL_NETROM) 382 { SOL_NETROM, "SOL_NETROM" }, 383#endif 384#if defined(SOL_ROSE) 385 { SOL_ROSE, "SOL_ROSE" }, 386#endif 387#if defined(SOL_DECNET) 388 { SOL_DECNET, "SOL_DECNET" }, 389#endif 390#if defined(SOL_X25) 391 { SOL_X25, "SOL_X25" }, 392#endif 393#if defined(SOL_PACKET) 394 { SOL_PACKET, "SOL_PACKET" }, 395#endif 396#if defined(SOL_ATM) 397 { SOL_ATM, "SOL_ATM" }, 398#endif 399#if defined(SOL_AAL) 400 { SOL_AAL, "SOL_AAL" }, 401#endif 402#if defined(SOL_IRDA) 403 { SOL_IRDA, "SOL_IRDA" }, 404#endif 405#if defined(SOL_NETBEUI) 406 { SOL_NETBEUI, "SOL_NETBEUI" }, 407#endif 408#if defined(SOL_LLC) 409 { SOL_LLC, "SOL_LLC" }, 410#endif 411#if defined(SOL_DCCP) 412 { SOL_DCCP, "SOL_DCCP" }, 413#endif 414#if defined(SOL_NETLINK) 415 { SOL_NETLINK, "SOL_NETLINK" }, 416#endif 417#if defined(SOL_TIPC) 418 { SOL_TIPC, "SOL_TIPC" }, 419#endif 420#if defined(SOL_RXRPC) 421 { SOL_RXRPC, "SOL_RXRPC" }, 422#endif 423#if defined(SOL_PPPOL2TP) 424 { SOL_PPPOL2TP, "SOL_PPPOL2TP" }, 425#endif 426#if defined(SOL_BLUETOOTH) 427 { SOL_BLUETOOTH,"SOL_BLUETOOTH" }, 428#endif 429#if defined(SOL_PNPIPE) 430 { SOL_PNPIPE, "SOL_PNPIPE" }, 431#endif 432#if defined(SOL_RDS) 433 { SOL_RDS, "SOL_RDS" }, 434#endif 435#if defined(SOL_IUVC) 436 { SOL_IUCV, "SOL_IUCV" }, 437#endif 438#if defined(SOL_CAIF) 439 { SOL_CAIF, "SOL_CAIF" }, 440#endif 441 { SOL_SOCKET, "SOL_SOCKET" }, /* Never used! */ 442 /* The SOL_* array should remain not NULL-terminated. */ 443}; 444/*** WARNING: DANGER WILL ROBINSON: NOTE "socketlayers" array above 445 falls into "protocols" array below!!!! This is intended!!! ***/ 446static const struct xlat protocols[] = { 447 { IPPROTO_IP, "IPPROTO_IP" }, 448 { IPPROTO_ICMP, "IPPROTO_ICMP" }, 449 { IPPROTO_TCP, "IPPROTO_TCP" }, 450 { IPPROTO_UDP, "IPPROTO_UDP" }, 451#ifdef IPPROTO_IGMP 452 { IPPROTO_IGMP, "IPPROTO_IGMP" }, 453#endif 454#ifdef IPPROTO_GGP 455 { IPPROTO_GGP, "IPPROTO_GGP" }, 456#endif 457#ifdef IPPROTO_IPIP 458 { IPPROTO_IPIP, "IPPROTO_IPIP" }, 459#endif 460#ifdef IPPROTO_EGP 461 { IPPROTO_EGP, "IPPROTO_EGP" }, 462#endif 463#ifdef IPPROTO_PUP 464 { IPPROTO_PUP, "IPPROTO_PUP" }, 465#endif 466#ifdef IPPROTO_IDP 467 { IPPROTO_IDP, "IPPROTO_IDP" }, 468#endif 469#ifdef IPPROTO_TP 470 { IPPROTO_TP, "IPPROTO_TP" }, 471#endif 472#ifdef IPPROTO_DCCP 473 { IPPROTO_DCCP, "IPPROTO_DCCP" }, 474#endif 475#ifdef IPPROTO_IPV6 476 { IPPROTO_IPV6, "IPPROTO_IPV6" }, 477#endif 478#ifdef IPPROTO_ROUTING 479 { IPPROTO_ROUTING, "IPPROTO_ROUTING" }, 480#endif 481#ifdef IPPROTO_FRAGMENT 482 { IPPROTO_FRAGMENT, "IPPROTO_FRAGMENT" }, 483#endif 484#ifdef IPPROTO_RSVP 485 { IPPROTO_RSVP, "IPPROTO_RSVP" }, 486#endif 487#ifdef IPPROTO_GRE 488 { IPPROTO_GRE, "IPPROTO_GRE" }, 489#endif 490#ifdef IPPROTO_ESP 491 { IPPROTO_ESP, "IPPROTO_ESP" }, 492#endif 493#ifdef IPPROTO_AH 494 { IPPROTO_AH, "IPPROTO_AH" }, 495#endif 496#ifdef IPPROTO_ICMPV6 497 { IPPROTO_ICMPV6, "IPPROTO_ICMPV6" }, 498#endif 499#ifdef IPPROTO_NONE 500 { IPPROTO_NONE, "IPPROTO_NONE" }, 501#endif 502#ifdef IPPROTO_DSTOPTS 503 { IPPROTO_DSTOPTS, "IPPROTO_DSTOPTS" }, 504#endif 505#ifdef IPPROTO_HELLO 506 { IPPROTO_HELLO, "IPPROTO_HELLO" }, 507#endif 508#ifdef IPPROTO_ND 509 { IPPROTO_ND, "IPPROTO_ND" }, 510#endif 511#ifdef IPPROTO_MTP 512 { IPPROTO_MTP, "IPPROTO_MTP" }, 513#endif 514#ifdef IPPROTO_ENCAP 515 { IPPROTO_ENCAP, "IPPROTO_ENCAP" }, 516#endif 517#ifdef IPPROTO_PIM 518 { IPPROTO_PIM, "IPPROTO_PIM" }, 519#endif 520#ifdef IPPROTO_COMP 521 { IPPROTO_COMP, "IPPROTO_COMP" }, 522#endif 523#ifdef IPPROTO_SCTP 524 { IPPROTO_SCTP, "IPPROTO_SCTP" }, 525#endif 526#ifdef IPPROTO_UDPLITE 527 { IPPROTO_UDPLITE, "IPPROTO_UDPLITE" }, 528#endif 529#ifdef IPPROTO_RAW 530 { IPPROTO_RAW, "IPPROTO_RAW" }, 531#endif 532#ifdef IPPROTO_MAX 533 { IPPROTO_MAX, "IPPROTO_MAX" }, 534#endif 535 { 0, NULL }, 536}; 537static const struct xlat msg_flags[] = { 538 { MSG_OOB, "MSG_OOB" }, 539#ifdef MSG_DONTROUTE 540 { MSG_DONTROUTE, "MSG_DONTROUTE" }, 541#endif 542#ifdef MSG_PEEK 543 { MSG_PEEK, "MSG_PEEK" }, 544#endif 545#ifdef MSG_CTRUNC 546 { MSG_CTRUNC, "MSG_CTRUNC" }, 547#endif 548#ifdef MSG_PROXY 549 { MSG_PROXY, "MSG_PROXY" }, 550#endif 551#ifdef MSG_EOR 552 { MSG_EOR, "MSG_EOR" }, 553#endif 554#ifdef MSG_WAITALL 555 { MSG_WAITALL, "MSG_WAITALL" }, 556#endif 557#ifdef MSG_TRUNC 558 { MSG_TRUNC, "MSG_TRUNC" }, 559#endif 560#ifdef MSG_CTRUNC 561 { MSG_CTRUNC, "MSG_CTRUNC" }, 562#endif 563#ifdef MSG_ERRQUEUE 564 { MSG_ERRQUEUE, "MSG_ERRQUEUE" }, 565#endif 566#ifdef MSG_DONTWAIT 567 { MSG_DONTWAIT, "MSG_DONTWAIT" }, 568#endif 569#ifdef MSG_CONFIRM 570 { MSG_CONFIRM, "MSG_CONFIRM" }, 571#endif 572#ifdef MSG_PROBE 573 { MSG_PROBE, "MSG_PROBE" }, 574#endif 575#ifdef MSG_FIN 576 { MSG_FIN, "MSG_FIN" }, 577#endif 578#ifdef MSG_SYN 579 { MSG_SYN, "MSG_SYN" }, 580#endif 581#ifdef MSG_RST 582 { MSG_RST, "MSG_RST" }, 583#endif 584#ifdef MSG_NOSIGNAL 585 { MSG_NOSIGNAL, "MSG_NOSIGNAL" }, 586#endif 587#ifdef MSG_MORE 588 { MSG_MORE, "MSG_MORE" }, 589#endif 590#ifdef MSG_CMSG_CLOEXEC 591 { MSG_CMSG_CLOEXEC, "MSG_CMSG_CLOEXEC" }, 592#endif 593 { 0, NULL }, 594}; 595 596static const struct xlat sockoptions[] = { 597#ifdef SO_ACCEPTCONN 598 { SO_ACCEPTCONN, "SO_ACCEPTCONN" }, 599#endif 600#ifdef SO_ALLRAW 601 { SO_ALLRAW, "SO_ALLRAW" }, 602#endif 603#ifdef SO_ATTACH_FILTER 604 { SO_ATTACH_FILTER, "SO_ATTACH_FILTER" }, 605#endif 606#ifdef SO_BINDTODEVICE 607 { SO_BINDTODEVICE, "SO_BINDTODEVICE" }, 608#endif 609#ifdef SO_BROADCAST 610 { SO_BROADCAST, "SO_BROADCAST" }, 611#endif 612#ifdef SO_BSDCOMPAT 613 { SO_BSDCOMPAT, "SO_BSDCOMPAT" }, 614#endif 615#ifdef SO_DEBUG 616 { SO_DEBUG, "SO_DEBUG" }, 617#endif 618#ifdef SO_DETACH_FILTER 619 { SO_DETACH_FILTER, "SO_DETACH_FILTER" }, 620#endif 621#ifdef SO_DONTROUTE 622 { SO_DONTROUTE, "SO_DONTROUTE" }, 623#endif 624#ifdef SO_ERROR 625 { SO_ERROR, "SO_ERROR" }, 626#endif 627#ifdef SO_ICS 628 { SO_ICS, "SO_ICS" }, 629#endif 630#ifdef SO_IMASOCKET 631 { SO_IMASOCKET, "SO_IMASOCKET" }, 632#endif 633#ifdef SO_KEEPALIVE 634 { SO_KEEPALIVE, "SO_KEEPALIVE" }, 635#endif 636#ifdef SO_LINGER 637 { SO_LINGER, "SO_LINGER" }, 638#endif 639#ifdef SO_LISTENING 640 { SO_LISTENING, "SO_LISTENING" }, 641#endif 642#ifdef SO_MGMT 643 { SO_MGMT, "SO_MGMT" }, 644#endif 645#ifdef SO_NO_CHECK 646 { SO_NO_CHECK, "SO_NO_CHECK" }, 647#endif 648#ifdef SO_OOBINLINE 649 { SO_OOBINLINE, "SO_OOBINLINE" }, 650#endif 651#ifdef SO_ORDREL 652 { SO_ORDREL, "SO_ORDREL" }, 653#endif 654#ifdef SO_PARALLELSVR 655 { SO_PARALLELSVR, "SO_PARALLELSVR" }, 656#endif 657#ifdef SO_PASSCRED 658 { SO_PASSCRED, "SO_PASSCRED" }, 659#endif 660#ifdef SO_PEERCRED 661 { SO_PEERCRED, "SO_PEERCRED" }, 662#endif 663#ifdef SO_PEERNAME 664 { SO_PEERNAME, "SO_PEERNAME" }, 665#endif 666#ifdef SO_PEERSEC 667 { SO_PEERSEC, "SO_PEERSEC" }, 668#endif 669#ifdef SO_PRIORITY 670 { SO_PRIORITY, "SO_PRIORITY" }, 671#endif 672#ifdef SO_PROTOTYPE 673 { SO_PROTOTYPE, "SO_PROTOTYPE" }, 674#endif 675#ifdef SO_RCVBUF 676 { SO_RCVBUF, "SO_RCVBUF" }, 677#endif 678#ifdef SO_RCVLOWAT 679 { SO_RCVLOWAT, "SO_RCVLOWAT" }, 680#endif 681#ifdef SO_RCVTIMEO 682 { SO_RCVTIMEO, "SO_RCVTIMEO" }, 683#endif 684#ifdef SO_RDWR 685 { SO_RDWR, "SO_RDWR" }, 686#endif 687#ifdef SO_REUSEADDR 688 { SO_REUSEADDR, "SO_REUSEADDR" }, 689#endif 690#ifdef SO_REUSEPORT 691 { SO_REUSEPORT, "SO_REUSEPORT" }, 692#endif 693#ifdef SO_SECURITY_AUTHENTICATION 694 { SO_SECURITY_AUTHENTICATION,"SO_SECURITY_AUTHENTICATION"}, 695#endif 696#ifdef SO_SECURITY_ENCRYPTION_NETWORK 697 { SO_SECURITY_ENCRYPTION_NETWORK,"SO_SECURITY_ENCRYPTION_NETWORK"}, 698#endif 699#ifdef SO_SECURITY_ENCRYPTION_TRANSPORT 700 { SO_SECURITY_ENCRYPTION_TRANSPORT,"SO_SECURITY_ENCRYPTION_TRANSPORT"}, 701#endif 702#ifdef SO_SEMA 703 { SO_SEMA, "SO_SEMA" }, 704#endif 705#ifdef SO_SNDBUF 706 { SO_SNDBUF, "SO_SNDBUF" }, 707#endif 708#ifdef SO_SNDLOWAT 709 { SO_SNDLOWAT, "SO_SNDLOWAT" }, 710#endif 711#ifdef SO_SNDTIMEO 712 { SO_SNDTIMEO, "SO_SNDTIMEO" }, 713#endif 714#ifdef SO_TIMESTAMP 715 { SO_TIMESTAMP, "SO_TIMESTAMP" }, 716#endif 717#ifdef SO_TYPE 718 { SO_TYPE, "SO_TYPE" }, 719#endif 720#ifdef SO_USELOOPBACK 721 { SO_USELOOPBACK, "SO_USELOOPBACK" }, 722#endif 723 { 0, NULL }, 724}; 725 726#if !defined(SOL_IP) && defined(IPPROTO_IP) 727#define SOL_IP IPPROTO_IP 728#endif 729 730#ifdef SOL_IP 731static const struct xlat sockipoptions[] = { 732#ifdef IP_TOS 733 { IP_TOS, "IP_TOS" }, 734#endif 735#ifdef IP_TTL 736 { IP_TTL, "IP_TTL" }, 737#endif 738#ifdef IP_HDRINCL 739 { IP_HDRINCL, "IP_HDRINCL" }, 740#endif 741#ifdef IP_OPTIONS 742 { IP_OPTIONS, "IP_OPTIONS" }, 743#endif 744#ifdef IP_ROUTER_ALERT 745 { IP_ROUTER_ALERT, "IP_ROUTER_ALERT" }, 746#endif 747#ifdef IP_RECVOPTIONS 748 { IP_RECVOPTIONS, "IP_RECVOPTIONS" }, 749#endif 750#ifdef IP_RECVOPTS 751 { IP_RECVOPTS, "IP_RECVOPTS" }, 752#endif 753#ifdef IP_RECVRETOPTS 754 { IP_RECVRETOPTS, "IP_RECVRETOPTS" }, 755#endif 756#ifdef IP_RECVDSTADDR 757 { IP_RECVDSTADDR, "IP_RECVDSTADDR" }, 758#endif 759#ifdef IP_RETOPTS 760 { IP_RETOPTS, "IP_RETOPTS" }, 761#endif 762#ifdef IP_PKTINFO 763 { IP_PKTINFO, "IP_PKTINFO" }, 764#endif 765#ifdef IP_PKTOPTIONS 766 { IP_PKTOPTIONS, "IP_PKTOPTIONS" }, 767#endif 768#ifdef IP_MTU_DISCOVER 769 { IP_MTU_DISCOVER, "IP_MTU_DISCOVER" }, 770#endif 771#ifdef IP_RECVERR 772 { IP_RECVERR, "IP_RECVERR" }, 773#endif 774#ifdef IP_RECVTTL 775 { IP_RECVTTL, "IP_RECVTTL" }, 776#endif 777#ifdef IP_RECVTOS 778 { IP_RECVTOS, "IP_RECVTOS" }, 779#endif 780#ifdef IP_MTU 781 { IP_MTU, "IP_MTU" }, 782#endif 783#ifdef IP_MULTICAST_IF 784 { IP_MULTICAST_IF, "IP_MULTICAST_IF" }, 785#endif 786#ifdef IP_MULTICAST_TTL 787 { IP_MULTICAST_TTL, "IP_MULTICAST_TTL" }, 788#endif 789#ifdef IP_MULTICAST_LOOP 790 { IP_MULTICAST_LOOP, "IP_MULTICAST_LOOP" }, 791#endif 792#ifdef IP_ADD_MEMBERSHIP 793 { IP_ADD_MEMBERSHIP, "IP_ADD_MEMBERSHIP" }, 794#endif 795#ifdef IP_DROP_MEMBERSHIP 796 { IP_DROP_MEMBERSHIP, "IP_DROP_MEMBERSHIP" }, 797#endif 798#ifdef IP_BROADCAST_IF 799 { IP_BROADCAST_IF, "IP_BROADCAST_IF" }, 800#endif 801#ifdef IP_RECVIFINDEX 802 { IP_RECVIFINDEX, "IP_RECVIFINDEX" }, 803#endif 804#ifdef IP_MSFILTER 805 { IP_MSFILTER, "IP_MSFILTER" }, 806#endif 807#ifdef MCAST_MSFILTER 808 { MCAST_MSFILTER, "MCAST_MSFILTER" }, 809#endif 810#ifdef IP_FREEBIND 811 { IP_FREEBIND, "IP_FREEBIND" }, 812#endif 813 { 0, NULL }, 814}; 815#endif /* SOL_IP */ 816 817#ifdef SOL_IPV6 818static const struct xlat sockipv6options[] = { 819#ifdef IPV6_ADDRFORM 820 { IPV6_ADDRFORM, "IPV6_ADDRFORM" }, 821#endif 822#ifdef MCAST_FILTER 823 { MCAST_FILTER, "MCAST_FILTER" }, 824#endif 825#ifdef IPV6_PKTOPTIONS 826 { IPV6_PKTOPTIONS, "IPV6_PKTOPTIONS" }, 827#endif 828#ifdef IPV6_MTU 829 { IPV6_MTU, "IPV6_MTU" }, 830#endif 831#ifdef IPV6_V6ONLY 832 { IPV6_V6ONLY, "IPV6_V6ONLY" }, 833#endif 834#ifdef IPV6_PKTINFO 835 { IPV6_PKTINFO, "IPV6_PKTINFO" }, 836#endif 837#ifdef IPV6_HOPLIMIT 838 { IPV6_HOPLIMIT, "IPV6_HOPLIMIT" }, 839#endif 840#ifdef IPV6_RTHDR 841 { IPV6_RTHDR, "IPV6_RTHDR" }, 842#endif 843#ifdef IPV6_HOPOPTS 844 { IPV6_HOPOPTS, "IPV6_HOPOPTS" }, 845#endif 846#ifdef IPV6_DSTOPTS 847 { IPV6_DSTOPTS, "IPV6_DSTOPTS" }, 848#endif 849#ifdef IPV6_FLOWINFO 850 { IPV6_FLOWINFO, "IPV6_FLOWINFO" }, 851#endif 852#ifdef IPV6_UNICAST_HOPS 853 { IPV6_UNICAST_HOPS, "IPV6_UNICAST_HOPS" }, 854#endif 855#ifdef IPV6_MULTICAST_HOPS 856 { IPV6_MULTICAST_HOPS, "IPV6_MULTICAST_HOPS" }, 857#endif 858#ifdef IPV6_MULTICAST_LOOP 859 { IPV6_MULTICAST_LOOP, "IPV6_MULTICAST_LOOP" }, 860#endif 861#ifdef IPV6_MULTICAST_IF 862 { IPV6_MULTICAST_IF, "IPV6_MULTICAST_IF" }, 863#endif 864#ifdef IPV6_MTU_DISCOVER 865 { IPV6_MTU_DISCOVER, "IPV6_MTU_DISCOVER" }, 866#endif 867#ifdef IPV6_RECVERR 868 { IPV6_RECVERR, "IPV6_RECVERR" }, 869#endif 870#ifdef IPV6_FLOWINFO_SEND 871 { IPV6_FLOWINFO_SEND, "IPV6_FLOWINFO_SEND" }, 872#endif 873#ifdef IPV6_ADD_MEMBERSHIP 874 { IPV6_ADD_MEMBERSHIP, "IPV6_ADD_MEMBERSHIP" }, 875#endif 876#ifdef IPV6_DROP_MEMBERSHIP 877 { IPV6_DROP_MEMBERSHIP, "IPV6_DROP_MEMBERSHIP" }, 878#endif 879#ifdef IPV6_ROUTER_ALERT 880 { IPV6_ROUTER_ALERT, "IPV6_ROUTER_ALERT" }, 881#endif 882 { 0, NULL }, 883}; 884#endif /* SOL_IPV6 */ 885 886#ifdef SOL_IPX 887static const struct xlat sockipxoptions[] = { 888 { IPX_TYPE, "IPX_TYPE" }, 889 { 0, NULL }, 890}; 891#endif /* SOL_IPX */ 892 893#ifdef SOL_RAW 894static const struct xlat sockrawoptions[] = { 895#if defined(ICMP_FILTER) 896 { ICMP_FILTER, "ICMP_FILTER" }, 897#endif 898 { 0, NULL }, 899}; 900#endif /* SOL_RAW */ 901 902#ifdef SOL_PACKET 903static const struct xlat sockpacketoptions[] = { 904#ifdef PACKET_ADD_MEMBERSHIP 905 { PACKET_ADD_MEMBERSHIP, "PACKET_ADD_MEMBERSHIP" }, 906#endif 907#ifdef PACKET_DROP_MEMBERSHIP 908 { PACKET_DROP_MEMBERSHIP, "PACKET_DROP_MEMBERSHIP"}, 909#endif 910#if defined(PACKET_RECV_OUTPUT) 911 { PACKET_RECV_OUTPUT, "PACKET_RECV_OUTPUT" }, 912#endif 913#if defined(PACKET_RX_RING) 914 { PACKET_RX_RING, "PACKET_RX_RING" }, 915#endif 916#if defined(PACKET_STATISTICS) 917 { PACKET_STATISTICS, "PACKET_STATISTICS" }, 918#endif 919#if defined(PACKET_COPY_THRESH) 920 { PACKET_COPY_THRESH, "PACKET_COPY_THRESH" }, 921#endif 922#if defined(PACKET_AUXDATA) 923 { PACKET_AUXDATA, "PACKET_AUXDATA" }, 924#endif 925#if defined(PACKET_ORIGDEV) 926 { PACKET_ORIGDEV, "PACKET_ORIGDEV" }, 927#endif 928#if defined(PACKET_VERSION) 929 { PACKET_VERSION, "PACKET_VERSION" }, 930#endif 931#if defined(PACKET_HDRLEN) 932 { PACKET_HDRLEN, "PACKET_HDRLEN" }, 933#endif 934#if defined(PACKET_RESERVE) 935 { PACKET_RESERVE, "PACKET_RESERVE" }, 936#endif 937#if defined(PACKET_TX_RING) 938 { PACKET_TX_RING, "PACKET_TX_RING" }, 939#endif 940#if defined(PACKET_LOSS) 941 { PACKET_LOSS, "PACKET_LOSS" }, 942#endif 943 { 0, NULL }, 944}; 945#endif /* SOL_PACKET */ 946 947#ifdef SOL_SCTP 948static const struct xlat socksctpoptions[] = { 949#if defined(SCTP_RTOINFO) 950 { SCTP_RTOINFO, "SCTP_RTOINFO" }, 951#endif 952#if defined(SCTP_ASSOCINFO) 953 { SCTP_ASSOCINFO, "SCTP_ASSOCINFO"}, 954#endif 955#if defined(SCTP_INITMSG) 956 { SCTP_INITMSG, "SCTP_INITMSG" }, 957#endif 958#if defined(SCTP_NODELAY) 959 { SCTP_NODELAY, "SCTP_NODELAY" }, 960#endif 961#if defined(SCTP_AUTOCLOSE) 962 { SCTP_AUTOCLOSE, "SCTP_AUTOCLOSE"}, 963#endif 964#if defined(SCTP_SET_PEER_PRIMARY_ADDR) 965 { SCTP_SET_PEER_PRIMARY_ADDR, "SCTP_SET_PEER_PRIMARY_ADDR"}, 966#endif 967#if defined(SCTP_PRIMARY_ADDR) 968 { SCTP_PRIMARY_ADDR, "SCTP_PRIMARY_ADDR" }, 969#endif 970#if defined(SCTP_ADAPTATION_LAYER) 971 { SCTP_ADAPTATION_LAYER, "SCTP_ADAPTATION_LAYER" }, 972#endif 973#if defined(SCTP_DISABLE_FRAGMENTS) 974 { SCTP_DISABLE_FRAGMENTS, "SCTP_DISABLE_FRAGMENTS"}, 975#endif 976#if defined(SCTP_PEER_ADDR_PARAMS) 977 { SCTP_PEER_ADDR_PARAMS, "SCTP_PEER_ADDR_PARAMS" }, 978#endif 979#if defined(SCTP_DEFAULT_SEND_PARAM) 980 { SCTP_DEFAULT_SEND_PARAM, "SCTP_DEFAULT_SEND_PARAM"}, 981#endif 982#if defined(SCTP_EVENTS) 983 { SCTP_EVENTS, "SCTP_EVENTS" }, 984#endif 985#if defined(SCTP_I_WANT_MAPPED_V4_ADDR) 986 { SCTP_I_WANT_MAPPED_V4_ADDR, "SCTP_I_WANT_MAPPED_V4_ADDR"}, 987#endif 988#if defined(SCTP_MAXSEG) 989 { SCTP_MAXSEG, "SCTP_MAXSEG" }, 990#endif 991#if defined(SCTP_STATUS) 992 { SCTP_STATUS, "SCTP_STATUS" }, 993#endif 994#if defined(SCTP_GET_PEER_ADDR_INFO) 995 { SCTP_GET_PEER_ADDR_INFO, "SCTP_GET_PEER_ADDR_INFO"}, 996#endif 997#if defined(SCTP_DELAYED_ACK) 998 { SCTP_DELAYED_ACK, "SCTP_DELAYED_ACK" }, 999#endif 1000#if defined(SCTP_CONTEXT) 1001 { SCTP_CONTEXT, "SCTP_CONTEXT" }, 1002#endif 1003#if defined(SCTP_FRAGMENT_INTERLEAVE) 1004 { SCTP_FRAGMENT_INTERLEAVE, "SCTP_FRAGMENT_INTERLEAVE"}, 1005#endif 1006#if defined(SCTP_PARTIAL_DELIVERY_POINT) 1007 { SCTP_PARTIAL_DELIVERY_POINT, "SCTP_PARTIAL_DELIVERY_POINT"}, 1008#endif 1009#if defined(SCTP_MAX_BURST) 1010 { SCTP_MAX_BURST, "SCTP_MAX_BURST" }, 1011#endif 1012#if defined(SCTP_AUTH_CHUNK) 1013 { SCTP_AUTH_CHUNK, "SCTP_AUTH_CHUNK" }, 1014#endif 1015#if defined(SCTP_HMAC_IDENT) 1016 { SCTP_HMAC_IDENT, "SCTP_HMAC_IDENT" }, 1017#endif 1018#if defined(SCTP_AUTH_KEY) 1019 { SCTP_AUTH_KEY, "SCTP_AUTH_KEY" }, 1020#endif 1021#if defined(SCTP_AUTH_ACTIVE_KEY) 1022 { SCTP_AUTH_ACTIVE_KEY, "SCTP_AUTH_ACTIVE_KEY" }, 1023#endif 1024#if defined(SCTP_AUTH_DELETE_KEY) 1025 { SCTP_AUTH_DELETE_KEY, "SCTP_AUTH_DELETE_KEY" }, 1026#endif 1027#if defined(SCTP_PEER_AUTH_CHUNKS) 1028 { SCTP_PEER_AUTH_CHUNKS, "SCTP_PEER_AUTH_CHUNKS" }, 1029#endif 1030#if defined(SCTP_LOCAL_AUTH_CHUNKS) 1031 { SCTP_LOCAL_AUTH_CHUNKS, "SCTP_LOCAL_AUTH_CHUNKS"}, 1032#endif 1033#if defined(SCTP_GET_ASSOC_NUMBER) 1034 { SCTP_GET_ASSOC_NUMBER, "SCTP_GET_ASSOC_NUMBER" }, 1035#endif 1036 1037 /* linux specific things */ 1038#if defined(SCTP_SOCKOPT_BINDX_ADD) 1039 { SCTP_SOCKOPT_BINDX_ADD, "SCTP_SOCKOPT_BINDX_ADD" }, 1040#endif 1041#if defined(SCTP_SOCKOPT_BINDX_REM) 1042 { SCTP_SOCKOPT_BINDX_REM, "SCTP_SOCKOPT_BINDX_REM" }, 1043#endif 1044#if defined(SCTP_SOCKOPT_PEELOFF) 1045 { SCTP_SOCKOPT_PEELOFF, "SCTP_SOCKOPT_PEELOFF" }, 1046#endif 1047#if defined(SCTP_GET_PEER_ADDRS_NUM_OLD) 1048 { SCTP_GET_PEER_ADDRS_NUM_OLD, "SCTP_GET_PEER_ADDRS_NUM_OLD" }, 1049#endif 1050#if defined(SCTP_GET_PEER_ADDRS_OLD) 1051 { SCTP_GET_PEER_ADDRS_OLD, "SCTP_GET_PEER_ADDRS_OLD" }, 1052#endif 1053#if defined(SCTP_GET_LOCAL_ADDRS_NUM_OLD) 1054 { SCTP_GET_LOCAL_ADDRS_NUM_OLD, "SCTP_GET_LOCAL_ADDRS_NUM_OLD" }, 1055#endif 1056#if defined(SCTP_GET_LOCAL_ADDRS_OLD) 1057 { SCTP_GET_LOCAL_ADDRS_OLD, "SCTP_GET_LOCAL_ADDRS_OLD" }, 1058#endif 1059#if defined(SCTP_SOCKOPT_CONNECTX_OLD) 1060 { SCTP_SOCKOPT_CONNECTX_OLD, "SCTP_SOCKOPT_CONNECTX_OLD" }, 1061#endif 1062#if defined(SCTP_GET_PEER_ADDRS) 1063 { SCTP_GET_PEER_ADDRS, "SCTP_GET_PEER_ADDRS" }, 1064#endif 1065#if defined(SCTP_GET_LOCAL_ADDRS) 1066 { SCTP_GET_LOCAL_ADDRS, "SCTP_GET_LOCAL_ADDRS" }, 1067#endif 1068 1069 { 0, NULL }, 1070}; 1071#endif 1072 1073#if !defined(SOL_TCP) && defined(IPPROTO_TCP) 1074#define SOL_TCP IPPROTO_TCP 1075#endif 1076 1077#ifdef SOL_TCP 1078static const struct xlat socktcpoptions[] = { 1079 { TCP_NODELAY, "TCP_NODELAY" }, 1080 { TCP_MAXSEG, "TCP_MAXSEG" }, 1081#if defined(TCP_CORK) 1082 { TCP_CORK, "TCP_CORK" }, 1083#endif 1084#if defined(TCP_KEEPIDLE) 1085 { TCP_KEEPIDLE, "TCP_KEEPIDLE" }, 1086#endif 1087#if defined(TCP_KEEPINTVL) 1088 { TCP_KEEPINTVL, "TCP_KEEPINTVL" }, 1089#endif 1090#if defined(TCP_KEEPCNT) 1091 { TCP_KEEPCNT, "TCP_KEEPCNT" }, 1092#endif 1093#if defined(TCP_NKEEP) 1094 { TCP_NKEEP, "TCP_NKEEP" }, 1095#endif 1096#if defined(TCP_SYNCNT) 1097 { TCP_SYNCNT, "TCP_SYNCNT" }, 1098#endif 1099#if defined(TCP_LINGER2) 1100 { TCP_LINGER2, "TCP_LINGER2" }, 1101#endif 1102#if defined(TCP_DEFER_ACCEPT) 1103 { TCP_DEFER_ACCEPT, "TCP_DEFER_ACCEPT" }, 1104#endif 1105#if defined(TCP_WINDOW_CLAMP) 1106 { TCP_WINDOW_CLAMP, "TCP_WINDOW_CLAMP" }, 1107#endif 1108#if defined(TCP_INFO) 1109 { TCP_INFO, "TCP_INFO" }, 1110#endif 1111#if defined(TCP_QUICKACK) 1112 { TCP_QUICKACK, "TCP_QUICKACK" }, 1113#endif 1114#if defined(TCP_CONGESTION) 1115 { TCP_CONGESTION, "TCP_CONGESTION" }, 1116#endif 1117#if defined(TCP_MD5SIG) 1118 { TCP_MD5SIG, "TCP_MD5SIG" }, 1119#endif 1120#if defined(TCP_COOKIE_TRANSACTIONS) 1121 { TCP_COOKIE_TRANSACTIONS, "TCP_COOKIE_TRANSACTIONS" }, 1122#endif 1123#if defined(TCP_THIN_LINEAR_TIMEOUTS) 1124 { TCP_THIN_LINEAR_TIMEOUTS, "TCP_THIN_LINEAR_TIMEOUTS" }, 1125#endif 1126#if defined(TCP_THIN_DUPACK) 1127 { TCP_THIN_DUPACK, "TCP_THIN_DUPACK" }, 1128#endif 1129#if defined(TCP_USER_TIMEOUT) 1130 { TCP_USER_TIMEOUT, "TCP_USER_TIMEOUT" }, 1131#endif 1132 { 0, NULL }, 1133}; 1134#endif /* SOL_TCP */ 1135 1136#ifdef SOL_RAW 1137static const struct xlat icmpfilterflags[] = { 1138#if defined(ICMP_ECHOREPLY) 1139 { (1<<ICMP_ECHOREPLY), "ICMP_ECHOREPLY" }, 1140#endif 1141#if defined(ICMP_DEST_UNREACH) 1142 { (1<<ICMP_DEST_UNREACH), "ICMP_DEST_UNREACH" }, 1143#endif 1144#if defined(ICMP_SOURCE_QUENCH) 1145 { (1<<ICMP_SOURCE_QUENCH), "ICMP_SOURCE_QUENCH" }, 1146#endif 1147#if defined(ICMP_REDIRECT) 1148 { (1<<ICMP_REDIRECT), "ICMP_REDIRECT" }, 1149#endif 1150#if defined(ICMP_ECHO) 1151 { (1<<ICMP_ECHO), "ICMP_ECHO" }, 1152#endif 1153#if defined(ICMP_TIME_EXCEEDED) 1154 { (1<<ICMP_TIME_EXCEEDED), "ICMP_TIME_EXCEEDED" }, 1155#endif 1156#if defined(ICMP_PARAMETERPROB) 1157 { (1<<ICMP_PARAMETERPROB), "ICMP_PARAMETERPROB" }, 1158#endif 1159#if defined(ICMP_TIMESTAMP) 1160 { (1<<ICMP_TIMESTAMP), "ICMP_TIMESTAMP" }, 1161#endif 1162#if defined(ICMP_TIMESTAMPREPLY) 1163 { (1<<ICMP_TIMESTAMPREPLY), "ICMP_TIMESTAMPREPLY" }, 1164#endif 1165#if defined(ICMP_INFO_REQUEST) 1166 { (1<<ICMP_INFO_REQUEST), "ICMP_INFO_REQUEST" }, 1167#endif 1168#if defined(ICMP_INFO_REPLY) 1169 { (1<<ICMP_INFO_REPLY), "ICMP_INFO_REPLY" }, 1170#endif 1171#if defined(ICMP_ADDRESS) 1172 { (1<<ICMP_ADDRESS), "ICMP_ADDRESS" }, 1173#endif 1174#if defined(ICMP_ADDRESSREPLY) 1175 { (1<<ICMP_ADDRESSREPLY), "ICMP_ADDRESSREPLY" }, 1176#endif 1177 { 0, NULL }, 1178}; 1179#endif /* SOL_RAW */ 1180 1181#if defined(AF_PACKET) /* from e.g. linux/if_packet.h */ 1182static const struct xlat af_packet_types[] = { 1183#if defined(PACKET_HOST) 1184 { PACKET_HOST, "PACKET_HOST" }, 1185#endif 1186#if defined(PACKET_BROADCAST) 1187 { PACKET_BROADCAST, "PACKET_BROADCAST" }, 1188#endif 1189#if defined(PACKET_MULTICAST) 1190 { PACKET_MULTICAST, "PACKET_MULTICAST" }, 1191#endif 1192#if defined(PACKET_OTHERHOST) 1193 { PACKET_OTHERHOST, "PACKET_OTHERHOST" }, 1194#endif 1195#if defined(PACKET_OUTGOING) 1196 { PACKET_OUTGOING, "PACKET_OUTGOING" }, 1197#endif 1198#if defined(PACKET_LOOPBACK) 1199 { PACKET_LOOPBACK, "PACKET_LOOPBACK" }, 1200#endif 1201#if defined(PACKET_FASTROUTE) 1202 { PACKET_FASTROUTE, "PACKET_FASTROUTE" }, 1203#endif 1204 { 0, NULL }, 1205}; 1206#endif /* defined(AF_PACKET) */ 1207 1208void 1209printsock(struct tcb *tcp, long addr, int addrlen) 1210{ 1211 union { 1212 char pad[128]; 1213 struct sockaddr sa; 1214 struct sockaddr_in sin; 1215 struct sockaddr_un sau; 1216#ifdef HAVE_INET_NTOP 1217 struct sockaddr_in6 sa6; 1218#endif 1219#if defined(AF_IPX) 1220 struct sockaddr_ipx sipx; 1221#endif 1222#ifdef AF_PACKET 1223 struct sockaddr_ll ll; 1224#endif 1225#ifdef AF_NETLINK 1226 struct sockaddr_nl nl; 1227#endif 1228 } addrbuf; 1229 char string_addr[100]; 1230 1231 if (addr == 0) { 1232 tprints("NULL"); 1233 return; 1234 } 1235 if (!verbose(tcp)) { 1236 tprintf("%#lx", addr); 1237 return; 1238 } 1239 1240 if (addrlen < 2 || addrlen > sizeof(addrbuf)) 1241 addrlen = sizeof(addrbuf); 1242 1243 memset(&addrbuf, 0, sizeof(addrbuf)); 1244 if (umoven(tcp, addr, addrlen, addrbuf.pad) < 0) { 1245 tprints("{...}"); 1246 return; 1247 } 1248 addrbuf.pad[sizeof(addrbuf.pad) - 1] = '\0'; 1249 1250 tprints("{sa_family="); 1251 printxval(addrfams, addrbuf.sa.sa_family, "AF_???"); 1252 tprints(", "); 1253 1254 switch (addrbuf.sa.sa_family) { 1255 case AF_UNIX: 1256 if (addrlen == 2) { 1257 tprints("NULL"); 1258 } else if (addrbuf.sau.sun_path[0]) { 1259 tprints("sun_path="); 1260 printpathn(tcp, addr + 2, strlen(addrbuf.sau.sun_path)); 1261 } else { 1262 tprints("sun_path=@"); 1263 printpathn(tcp, addr + 3, strlen(addrbuf.sau.sun_path + 1)); 1264 } 1265 break; 1266 case AF_INET: 1267 tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")", 1268 ntohs(addrbuf.sin.sin_port), inet_ntoa(addrbuf.sin.sin_addr)); 1269 break; 1270#ifdef HAVE_INET_NTOP 1271 case AF_INET6: 1272 inet_ntop(AF_INET6, &addrbuf.sa6.sin6_addr, string_addr, sizeof(string_addr)); 1273 tprintf("sin6_port=htons(%u), inet_pton(AF_INET6, \"%s\", &sin6_addr), sin6_flowinfo=%u", 1274 ntohs(addrbuf.sa6.sin6_port), string_addr, 1275 addrbuf.sa6.sin6_flowinfo); 1276#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1277 { 1278#if defined(HAVE_IF_INDEXTONAME) && defined(IN6_IS_ADDR_LINKLOCAL) && defined(IN6_IS_ADDR_MC_LINKLOCAL) 1279 int numericscope = 0; 1280 if (IN6_IS_ADDR_LINKLOCAL(&addrbuf.sa6.sin6_addr) 1281 || IN6_IS_ADDR_MC_LINKLOCAL(&addrbuf.sa6.sin6_addr)) { 1282 char scopebuf[IFNAMSIZ + 1]; 1283 1284 if (if_indextoname(addrbuf.sa6.sin6_scope_id, scopebuf) == NULL) 1285 numericscope++; 1286 else 1287 tprintf(", sin6_scope_id=if_nametoindex(\"%s\")", scopebuf); 1288 } else 1289 numericscope++; 1290 1291 if (numericscope) 1292#endif 1293 tprintf(", sin6_scope_id=%u", addrbuf.sa6.sin6_scope_id); 1294 } 1295#endif 1296 break; 1297#endif 1298#if defined(AF_IPX) 1299 case AF_IPX: 1300 { 1301 int i; 1302 tprintf("sipx_port=htons(%u), ", 1303 ntohs(addrbuf.sipx.sipx_port)); 1304 /* Yes, I know, this does not look too 1305 * strace-ish, but otherwise the IPX 1306 * addresses just look monstrous... 1307 * Anyways, feel free if you don't like 1308 * this way.. :) 1309 */ 1310 tprintf("%08lx:", (unsigned long)ntohl(addrbuf.sipx.sipx_network)); 1311 for (i = 0; i < IPX_NODE_LEN; i++) 1312 tprintf("%02x", addrbuf.sipx.sipx_node[i]); 1313 tprintf("/[%02x]", addrbuf.sipx.sipx_type); 1314 } 1315 break; 1316#endif /* AF_IPX */ 1317#ifdef AF_PACKET 1318 case AF_PACKET: 1319 { 1320 int i; 1321 tprintf("proto=%#04x, if%d, pkttype=", 1322 ntohs(addrbuf.ll.sll_protocol), 1323 addrbuf.ll.sll_ifindex); 1324 printxval(af_packet_types, addrbuf.ll.sll_pkttype, "?"); 1325 tprintf(", addr(%d)={%d, ", 1326 addrbuf.ll.sll_halen, 1327 addrbuf.ll.sll_hatype); 1328 for (i = 0; i < addrbuf.ll.sll_halen; i++) 1329 tprintf("%02x", addrbuf.ll.sll_addr[i]); 1330 } 1331 break; 1332 1333#endif /* AF_PACKET */ 1334#ifdef AF_NETLINK 1335 case AF_NETLINK: 1336 tprintf("pid=%d, groups=%08x", addrbuf.nl.nl_pid, addrbuf.nl.nl_groups); 1337 break; 1338#endif /* AF_NETLINK */ 1339 /* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5 1340 AF_X25 AF_ROSE etc. still need to be done */ 1341 1342 default: 1343 tprints("sa_data="); 1344 printstr(tcp, (long) &((struct sockaddr *) addr)->sa_data, 1345 sizeof addrbuf.sa.sa_data); 1346 break; 1347 } 1348 tprints("}"); 1349} 1350 1351#if HAVE_SENDMSG 1352static const struct xlat scmvals[] = { 1353#ifdef SCM_RIGHTS 1354 { SCM_RIGHTS, "SCM_RIGHTS" }, 1355#endif 1356#ifdef SCM_CREDENTIALS 1357 { SCM_CREDENTIALS, "SCM_CREDENTIALS" }, 1358#endif 1359 { 0, NULL } 1360}; 1361 1362static void 1363printcmsghdr(struct tcb *tcp, unsigned long addr, unsigned long len) 1364{ 1365 struct cmsghdr *cmsg = len < sizeof(struct cmsghdr) ? 1366 NULL : malloc(len); 1367 if (cmsg == NULL || umoven(tcp, addr, len, (char *) cmsg) < 0) { 1368 tprintf(", msg_control=%#lx", addr); 1369 free(cmsg); 1370 return; 1371 } 1372 1373 tprintf(", {cmsg_len=%u, cmsg_level=", (unsigned) cmsg->cmsg_len); 1374 printxval(socketlayers, cmsg->cmsg_level, "SOL_???"); 1375 tprints(", cmsg_type="); 1376 1377 if (cmsg->cmsg_level == SOL_SOCKET) { 1378 unsigned long cmsg_len; 1379 1380 printxval(scmvals, cmsg->cmsg_type, "SCM_???"); 1381 cmsg_len = (len < cmsg->cmsg_len) ? len : cmsg->cmsg_len; 1382 1383 if (cmsg->cmsg_type == SCM_RIGHTS 1384 && CMSG_LEN(sizeof(int)) <= cmsg_len) { 1385 int *fds = (int *) CMSG_DATA(cmsg); 1386 int first = 1; 1387 1388 tprints(", {"); 1389 while ((char *) fds < ((char *) cmsg + cmsg_len)) { 1390 if (!first) 1391 tprints(", "); 1392 tprintf("%d", *fds++); 1393 first = 0; 1394 } 1395 tprints("}}"); 1396 free(cmsg); 1397 return; 1398 } 1399 if (cmsg->cmsg_type == SCM_CREDENTIALS 1400 && CMSG_LEN(sizeof(struct ucred)) <= cmsg_len) { 1401 struct ucred *uc = (struct ucred *) CMSG_DATA(cmsg); 1402 1403 tprintf("{pid=%ld, uid=%ld, gid=%ld}}", 1404 (long)uc->pid, (long)uc->uid, (long)uc->gid); 1405 free(cmsg); 1406 return; 1407 } 1408 } 1409 free(cmsg); 1410 tprints(", ...}"); 1411} 1412 1413static void 1414do_msghdr(struct tcb *tcp, struct msghdr *msg) 1415{ 1416 tprintf("{msg_name(%d)=", msg->msg_namelen); 1417 printsock(tcp, (long)msg->msg_name, msg->msg_namelen); 1418 1419 tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen); 1420 tprint_iov(tcp, (unsigned long)msg->msg_iovlen, 1421 (unsigned long)msg->msg_iov, 1); 1422 1423#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL 1424 tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen); 1425 if (msg->msg_controllen) 1426 printcmsghdr(tcp, (unsigned long) msg->msg_control, 1427 msg->msg_controllen); 1428 tprints(", msg_flags="); 1429 printflags(msg_flags, msg->msg_flags, "MSG_???"); 1430#else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */ 1431 tprintf("msg_accrights=%#lx, msg_accrightslen=%u", 1432 (unsigned long) msg->msg_accrights, msg->msg_accrightslen); 1433#endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */ 1434 tprints("}"); 1435} 1436 1437static void 1438printmsghdr(struct tcb *tcp, long addr) 1439{ 1440 struct msghdr msg; 1441 1442 if (umove(tcp, addr, &msg) < 0) { 1443 tprintf("%#lx", addr); 1444 return; 1445 } 1446 do_msghdr(tcp, &msg); 1447} 1448 1449static void 1450printmmsghdr(struct tcb *tcp, long addr) 1451{ 1452 struct mmsghdr { 1453 struct msghdr msg_hdr; 1454 unsigned msg_len; 1455 } mmsg; 1456 1457 if (umove(tcp, addr, &mmsg) < 0) { 1458 tprintf("%#lx", addr); 1459 return; 1460 } 1461 tprints("{"); 1462 do_msghdr(tcp, &mmsg.msg_hdr); 1463 tprintf(", %u}", mmsg.msg_len); 1464} 1465 1466#endif /* HAVE_SENDMSG */ 1467 1468/* 1469 * low bits of the socket type define real socket type, 1470 * other bits are socket type flags. 1471 */ 1472static void 1473tprint_sock_type(struct tcb *tcp, int flags) 1474{ 1475 const char *str = xlookup(socktypes, flags & SOCK_TYPE_MASK); 1476 1477 if (str) { 1478 tprints(str); 1479 flags &= ~SOCK_TYPE_MASK; 1480 if (!flags) 1481 return; 1482 tprints("|"); 1483 } 1484 printflags(sock_type_flags, flags, "SOCK_???"); 1485} 1486 1487int 1488sys_socket(struct tcb *tcp) 1489{ 1490 if (entering(tcp)) { 1491 printxval(domains, tcp->u_arg[0], "PF_???"); 1492 tprints(", "); 1493 tprint_sock_type(tcp, tcp->u_arg[1]); 1494 tprints(", "); 1495 switch (tcp->u_arg[0]) { 1496 case PF_INET: 1497#ifdef PF_INET6 1498 case PF_INET6: 1499#endif 1500 printxval(protocols, tcp->u_arg[2], "IPPROTO_???"); 1501 break; 1502#ifdef PF_IPX 1503 case PF_IPX: 1504 /* BTW: I don't believe this.. */ 1505 tprints("["); 1506 printxval(domains, tcp->u_arg[2], "PF_???"); 1507 tprints("]"); 1508 break; 1509#endif /* PF_IPX */ 1510 default: 1511 tprintf("%lu", tcp->u_arg[2]); 1512 break; 1513 } 1514 } 1515 return 0; 1516} 1517 1518int 1519sys_bind(struct tcb *tcp) 1520{ 1521 if (entering(tcp)) { 1522 tprintf("%ld, ", tcp->u_arg[0]); 1523 printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]); 1524 tprintf(", %lu", tcp->u_arg[2]); 1525 } 1526 return 0; 1527} 1528 1529int 1530sys_connect(struct tcb *tcp) 1531{ 1532 return sys_bind(tcp); 1533} 1534 1535int 1536sys_listen(struct tcb *tcp) 1537{ 1538 if (entering(tcp)) { 1539 tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]); 1540 } 1541 return 0; 1542} 1543 1544static int 1545do_accept(struct tcb *tcp, int flags_arg) 1546{ 1547 if (entering(tcp)) { 1548 tprintf("%ld, ", tcp->u_arg[0]); 1549 return 0; 1550 } 1551 if (!tcp->u_arg[2]) 1552 tprintf("%#lx, NULL", tcp->u_arg[1]); 1553 else { 1554 int len; 1555 if (tcp->u_arg[1] == 0 || syserror(tcp) 1556 || umove(tcp, tcp->u_arg[2], &len) < 0) { 1557 tprintf("%#lx", tcp->u_arg[1]); 1558 } else { 1559 printsock(tcp, tcp->u_arg[1], len); 1560 } 1561 tprints(", "); 1562 printnum_int(tcp, tcp->u_arg[2], "%u"); 1563 } 1564 if (flags_arg >= 0) { 1565 tprints(", "); 1566 printflags(sock_type_flags, tcp->u_arg[flags_arg], 1567 "SOCK_???"); 1568 } 1569 return 0; 1570} 1571 1572int 1573sys_accept(struct tcb *tcp) 1574{ 1575 return do_accept(tcp, -1); 1576} 1577 1578int 1579sys_accept4(struct tcb *tcp) 1580{ 1581 return do_accept(tcp, 3); 1582} 1583 1584int 1585sys_send(struct tcb *tcp) 1586{ 1587 if (entering(tcp)) { 1588 tprintf("%ld, ", tcp->u_arg[0]); 1589 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 1590 tprintf(", %lu, ", tcp->u_arg[2]); 1591 /* flags */ 1592 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1593 } 1594 return 0; 1595} 1596 1597int 1598sys_sendto(struct tcb *tcp) 1599{ 1600 if (entering(tcp)) { 1601 tprintf("%ld, ", tcp->u_arg[0]); 1602 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 1603 tprintf(", %lu, ", tcp->u_arg[2]); 1604 /* flags */ 1605 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1606 /* to address */ 1607 tprints(", "); 1608 printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]); 1609 /* to length */ 1610 tprintf(", %lu", tcp->u_arg[5]); 1611 } 1612 return 0; 1613} 1614 1615#ifdef HAVE_SENDMSG 1616 1617int 1618sys_sendmsg(struct tcb *tcp) 1619{ 1620 if (entering(tcp)) { 1621 tprintf("%ld, ", tcp->u_arg[0]); 1622 printmsghdr(tcp, tcp->u_arg[1]); 1623 /* flags */ 1624 tprints(", "); 1625 printflags(msg_flags, tcp->u_arg[2], "MSG_???"); 1626 } 1627 return 0; 1628} 1629 1630#endif /* HAVE_SENDMSG */ 1631 1632int 1633sys_recv(struct tcb *tcp) 1634{ 1635 if (entering(tcp)) { 1636 tprintf("%ld, ", tcp->u_arg[0]); 1637 } else { 1638 if (syserror(tcp)) 1639 tprintf("%#lx", tcp->u_arg[1]); 1640 else 1641 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 1642 1643 tprintf(", %lu, ", tcp->u_arg[2]); 1644 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1645 } 1646 return 0; 1647} 1648 1649int 1650sys_recvfrom(struct tcb *tcp) 1651{ 1652 int fromlen; 1653 1654 if (entering(tcp)) { 1655 tprintf("%ld, ", tcp->u_arg[0]); 1656 } else { 1657 if (syserror(tcp)) { 1658 tprintf("%#lx, %lu, %lu, %#lx, %#lx", 1659 tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3], 1660 tcp->u_arg[4], tcp->u_arg[5]); 1661 return 0; 1662 } 1663 /* buf */ 1664 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 1665 /* len */ 1666 tprintf(", %lu, ", tcp->u_arg[2]); 1667 /* flags */ 1668 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1669 /* from address, len */ 1670 if (!tcp->u_arg[4] || !tcp->u_arg[5]) { 1671 if (tcp->u_arg[4] == 0) 1672 tprints(", NULL"); 1673 else 1674 tprintf(", %#lx", tcp->u_arg[4]); 1675 if (tcp->u_arg[5] == 0) 1676 tprints(", NULL"); 1677 else 1678 tprintf(", %#lx", tcp->u_arg[5]); 1679 return 0; 1680 } 1681 if (umove(tcp, tcp->u_arg[5], &fromlen) < 0) { 1682 tprints(", {...}, [?]"); 1683 return 0; 1684 } 1685 tprints(", "); 1686 printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]); 1687 /* from length */ 1688 tprintf(", [%u]", fromlen); 1689 } 1690 return 0; 1691} 1692 1693#ifdef HAVE_SENDMSG 1694 1695int 1696sys_recvmsg(struct tcb *tcp) 1697{ 1698 if (entering(tcp)) { 1699 tprintf("%ld, ", tcp->u_arg[0]); 1700 } else { 1701 if (syserror(tcp) || !verbose(tcp)) 1702 tprintf("%#lx", tcp->u_arg[1]); 1703 else 1704 printmsghdr(tcp, tcp->u_arg[1]); 1705 /* flags */ 1706 tprints(", "); 1707 printflags(msg_flags, tcp->u_arg[2], "MSG_???"); 1708 } 1709 return 0; 1710} 1711 1712int 1713sys_recvmmsg(struct tcb *tcp) 1714{ 1715 /* +5 chars are for "left " prefix */ 1716 static char str[5 + TIMESPEC_TEXT_BUFSIZE]; 1717 1718 if (entering(tcp)) { 1719 tprintf("%ld, ", tcp->u_arg[0]); 1720 if (verbose(tcp)) { 1721 sprint_timespec(str, tcp, tcp->u_arg[4]); 1722 /* Abusing tcp->auxstr as temp storage. 1723 * Will be used and freed on syscall exit. 1724 */ 1725 tcp->auxstr = strdup(str); 1726 } else { 1727 tprintf("%#lx, %ld, ", tcp->u_arg[1], tcp->u_arg[2]); 1728 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1729 tprints(", "); 1730 print_timespec(tcp, tcp->u_arg[4]); 1731 } 1732 return 0; 1733 } else { 1734 if (verbose(tcp)) { 1735 if (syserror(tcp)) 1736 tprintf("%#lx", tcp->u_arg[1]); 1737 else 1738 printmmsghdr(tcp, tcp->u_arg[1]); 1739 tprintf(", %ld, ", tcp->u_arg[2]); 1740 /* flags */ 1741 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1742 /* timeout on entrance */ 1743 tprintf(", %s", tcp->auxstr ? tcp->auxstr : "{...}"); 1744 free((void *) tcp->auxstr); 1745 tcp->auxstr = NULL; 1746 } 1747 if (syserror(tcp)) 1748 return 0; 1749 if (tcp->u_rval == 0) { 1750 tcp->auxstr = "Timeout"; 1751 return RVAL_STR; 1752 } 1753 if (!verbose(tcp)) 1754 return 0; 1755 /* timeout on exit */ 1756 sprint_timespec(stpcpy(str, "left "), tcp, tcp->u_arg[4]); 1757 tcp->auxstr = str; 1758 return RVAL_STR; 1759 } 1760} 1761 1762#endif /* HAVE_SENDMSG */ 1763 1764static const struct xlat shutdown_modes[] = { 1765 { 0, "SHUT_RD" }, 1766 { 1, "SHUT_WR" }, 1767 { 2, "SHUT_RDWR" }, 1768 { 0, NULL } 1769}; 1770 1771int 1772sys_shutdown(struct tcb *tcp) 1773{ 1774 if (entering(tcp)) { 1775 tprintf("%ld, ", tcp->u_arg[0]); 1776 printxval(shutdown_modes, tcp->u_arg[1], "SHUT_???"); 1777 } 1778 return 0; 1779} 1780 1781int 1782sys_getsockname(struct tcb *tcp) 1783{ 1784 return sys_accept(tcp); 1785} 1786 1787int 1788sys_getpeername(struct tcb *tcp) 1789{ 1790 return sys_accept(tcp); 1791} 1792 1793static int 1794do_pipe(struct tcb *tcp, int flags_arg) 1795{ 1796 if (exiting(tcp)) { 1797 if (syserror(tcp)) { 1798 tprintf("%#lx", tcp->u_arg[0]); 1799 } else { 1800#if !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64) 1801 int fds[2]; 1802 1803 if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0) 1804 tprints("[...]"); 1805 else 1806 tprintf("[%u, %u]", fds[0], fds[1]); 1807#elif defined(SPARC) || defined(SPARC64) || defined(SH) || defined(IA64) 1808 tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp)); 1809#else 1810 tprintf("%#lx", tcp->u_arg[0]); 1811#endif 1812 } 1813 if (flags_arg >= 0) { 1814 tprints(", "); 1815 printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???"); 1816 } 1817 } 1818 return 0; 1819} 1820 1821int 1822sys_pipe(struct tcb *tcp) 1823{ 1824 return do_pipe(tcp, -1); 1825} 1826 1827int 1828sys_pipe2(struct tcb *tcp) 1829{ 1830 return do_pipe(tcp, 1); 1831} 1832 1833int 1834sys_socketpair(struct tcb *tcp) 1835{ 1836 int fds[2]; 1837 1838 if (entering(tcp)) { 1839 printxval(domains, tcp->u_arg[0], "PF_???"); 1840 tprints(", "); 1841 tprint_sock_type(tcp, tcp->u_arg[1]); 1842 tprints(", "); 1843 switch (tcp->u_arg[0]) { 1844 case PF_INET: 1845 printxval(protocols, tcp->u_arg[2], "IPPROTO_???"); 1846 break; 1847#ifdef PF_IPX 1848 case PF_IPX: 1849 /* BTW: I don't believe this.. */ 1850 tprints("["); 1851 printxval(domains, tcp->u_arg[2], "PF_???"); 1852 tprints("]"); 1853 break; 1854#endif /* PF_IPX */ 1855 default: 1856 tprintf("%lu", tcp->u_arg[2]); 1857 break; 1858 } 1859 } else { 1860 if (syserror(tcp)) { 1861 tprintf(", %#lx", tcp->u_arg[3]); 1862 return 0; 1863 } 1864 if (umoven(tcp, tcp->u_arg[3], sizeof fds, (char *) fds) < 0) 1865 tprints(", [...]"); 1866 else 1867 tprintf(", [%u, %u]", fds[0], fds[1]); 1868 } 1869 return 0; 1870} 1871 1872int 1873sys_getsockopt(struct tcb *tcp) 1874{ 1875 if (entering(tcp)) { 1876 tprintf("%ld, ", tcp->u_arg[0]); 1877 printxval(socketlayers, tcp->u_arg[1], "SOL_???"); 1878 tprints(", "); 1879 switch (tcp->u_arg[1]) { 1880 case SOL_SOCKET: 1881 printxval(sockoptions, tcp->u_arg[2], "SO_???"); 1882 break; 1883#ifdef SOL_IP 1884 case SOL_IP: 1885 printxval(sockipoptions, tcp->u_arg[2], "IP_???"); 1886 break; 1887#endif 1888#ifdef SOL_IPV6 1889 case SOL_IPV6: 1890 printxval(sockipv6options, tcp->u_arg[2], "IPV6_???"); 1891 break; 1892#endif 1893#ifdef SOL_IPX 1894 case SOL_IPX: 1895 printxval(sockipxoptions, tcp->u_arg[2], "IPX_???"); 1896 break; 1897#endif 1898#ifdef SOL_PACKET 1899 case SOL_PACKET: 1900 printxval(sockpacketoptions, tcp->u_arg[2], "PACKET_???"); 1901 break; 1902#endif 1903#ifdef SOL_TCP 1904 case SOL_TCP: 1905 printxval(socktcpoptions, tcp->u_arg[2], "TCP_???"); 1906 break; 1907#endif 1908#ifdef SOL_SCTP 1909 case SOL_SCTP: 1910 printxval(socksctpoptions, tcp->u_arg[2], "SCTP_???"); 1911 break; 1912#endif 1913 1914 /* SOL_AX25 SOL_ROSE SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25 1915 * etc. still need work */ 1916 default: 1917 tprintf("%lu", tcp->u_arg[2]); 1918 break; 1919 } 1920 tprints(", "); 1921 } else { 1922 int len; 1923 if (syserror(tcp) || umove(tcp, tcp->u_arg[4], &len) < 0) { 1924 tprintf("%#lx, %#lx", 1925 tcp->u_arg[3], tcp->u_arg[4]); 1926 return 0; 1927 } 1928 1929 switch (tcp->u_arg[1]) { 1930 case SOL_SOCKET: 1931 switch (tcp->u_arg[2]) { 1932#ifdef SO_LINGER 1933 case SO_LINGER: 1934 if (len == sizeof(struct linger)) { 1935 struct linger linger; 1936 if (umove(tcp, 1937 tcp->u_arg[3], 1938 &linger) < 0) 1939 break; 1940 tprintf("{onoff=%d, linger=%d}, " 1941 "[%d]", 1942 linger.l_onoff, 1943 linger.l_linger, 1944 len); 1945 return 0; 1946 } 1947 break; 1948#endif 1949#ifdef SO_PEERCRED 1950 case SO_PEERCRED: 1951 if (len == sizeof(struct ucred)) { 1952 struct ucred uc; 1953 if (umove(tcp, 1954 tcp->u_arg[3], 1955 &uc) < 0) 1956 break; 1957 tprintf("{pid=%ld, uid=%ld, gid=%ld}, " 1958 "[%d]", 1959 (long)uc.pid, 1960 (long)uc.uid, 1961 (long)uc.gid, 1962 len); 1963 return 0; 1964 } 1965 break; 1966#endif 1967 } 1968 break; 1969 case SOL_PACKET: 1970 switch (tcp->u_arg[2]) { 1971#ifdef PACKET_STATISTICS 1972 case PACKET_STATISTICS: 1973 if (len == sizeof(struct tpacket_stats)) { 1974 struct tpacket_stats stats; 1975 if (umove(tcp, 1976 tcp->u_arg[3], 1977 &stats) < 0) 1978 break; 1979 tprintf("{packets=%u, drops=%u}, " 1980 "[%d]", 1981 stats.tp_packets, 1982 stats.tp_drops, 1983 len); 1984 return 0; 1985 } 1986 break; 1987#endif 1988 } 1989 break; 1990 } 1991 1992 if (len == sizeof(int)) { 1993 printnum_int(tcp, tcp->u_arg[3], "%d"); 1994 } 1995 else { 1996 printstr(tcp, tcp->u_arg[3], len); 1997 } 1998 tprintf(", [%d]", len); 1999 } 2000 return 0; 2001} 2002 2003#if defined(ICMP_FILTER) 2004static void printicmpfilter(struct tcb *tcp, long addr) 2005{ 2006 struct icmp_filter filter; 2007 2008 if (!addr) { 2009 tprints("NULL"); 2010 return; 2011 } 2012 if (syserror(tcp) || !verbose(tcp)) { 2013 tprintf("%#lx", addr); 2014 return; 2015 } 2016 if (umove(tcp, addr, &filter) < 0) { 2017 tprints("{...}"); 2018 return; 2019 } 2020 2021 tprints("~("); 2022 printflags(icmpfilterflags, ~filter.data, "ICMP_???"); 2023 tprints(")"); 2024} 2025#endif /* ICMP_FILTER */ 2026 2027static int 2028printsockopt(struct tcb *tcp, int level, int name, long addr, int len) 2029{ 2030 printxval(socketlayers, level, "SOL_??"); 2031 tprints(", "); 2032 switch (level) { 2033 case SOL_SOCKET: 2034 printxval(sockoptions, name, "SO_???"); 2035 switch (name) { 2036#if defined(SO_LINGER) 2037 case SO_LINGER: 2038 if (len == sizeof(struct linger)) { 2039 struct linger linger; 2040 if (umove(tcp, addr, &linger) < 0) 2041 break; 2042 tprintf(", {onoff=%d, linger=%d}", 2043 linger.l_onoff, 2044 linger.l_linger); 2045 return 0; 2046 } 2047 break; 2048#endif 2049 } 2050 break; 2051#ifdef SOL_IP 2052 case SOL_IP: 2053 printxval(sockipoptions, name, "IP_???"); 2054 break; 2055#endif 2056#ifdef SOL_IPV6 2057 case SOL_IPV6: 2058 printxval(sockipv6options, name, "IPV6_???"); 2059 break; 2060#endif 2061#ifdef SOL_IPX 2062 case SOL_IPX: 2063 printxval(sockipxoptions, name, "IPX_???"); 2064 break; 2065#endif 2066#ifdef SOL_PACKET 2067 case SOL_PACKET: 2068 printxval(sockpacketoptions, name, "PACKET_???"); 2069 /* TODO: decode packate_mreq for PACKET_*_MEMBERSHIP */ 2070 switch (name) { 2071#ifdef PACKET_RX_RING 2072 case PACKET_RX_RING: 2073#endif 2074#ifdef PACKET_TX_RING 2075 case PACKET_TX_RING: 2076#endif 2077#if defined(PACKET_RX_RING) || defined(PACKET_TX_RING) 2078 if (len == sizeof(struct tpacket_req)) { 2079 struct tpacket_req req; 2080 if (umove(tcp, addr, &req) < 0) 2081 break; 2082 tprintf(", {block_size=%u, block_nr=%u, frame_size=%u, frame_nr=%u}", 2083 req.tp_block_size, 2084 req.tp_block_nr, 2085 req.tp_frame_size, 2086 req.tp_frame_nr); 2087 return 0; 2088 } 2089 break; 2090#endif /* PACKET_RX_RING || PACKET_TX_RING */ 2091 } 2092 break; 2093#endif 2094#ifdef SOL_TCP 2095 case SOL_TCP: 2096 printxval(socktcpoptions, name, "TCP_???"); 2097 break; 2098#endif 2099#ifdef SOL_SCTP 2100 case SOL_SCTP: 2101 printxval(socksctpoptions, name, "SCTP_???"); 2102 break; 2103#endif 2104#ifdef SOL_RAW 2105 case SOL_RAW: 2106 printxval(sockrawoptions, name, "RAW_???"); 2107 switch (name) { 2108#if defined(ICMP_FILTER) 2109 case ICMP_FILTER: 2110 tprints(", "); 2111 printicmpfilter(tcp, addr); 2112 return 0; 2113#endif 2114 } 2115 break; 2116#endif 2117 2118 /* SOL_AX25 SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25 2119 * etc. still need work */ 2120 2121 default: 2122 tprintf("%u", name); 2123 } 2124 2125 /* default arg printing */ 2126 2127 tprints(", "); 2128 2129 if (len == sizeof(int)) { 2130 printnum_int(tcp, addr, "%d"); 2131 } 2132 else { 2133 printstr(tcp, addr, len); 2134 } 2135 return 0; 2136} 2137 2138#ifdef HAVE_STRUCT_OPTHDR 2139 2140void 2141print_sock_optmgmt(struct tcb *tcp, long addr, int len) 2142{ 2143 int c = 0; 2144 struct opthdr hdr; 2145 2146 while (len >= (int) sizeof hdr) { 2147 if (umove(tcp, addr, &hdr) < 0) break; 2148 if (c++) { 2149 tprints(", "); 2150 } 2151 else if (len > hdr.len + sizeof hdr) { 2152 tprints("["); 2153 } 2154 tprints("{"); 2155 addr += sizeof hdr; 2156 len -= sizeof hdr; 2157 printsockopt(tcp, hdr.level, hdr.name, addr, hdr.len); 2158 if (hdr.len > 0) { 2159 addr += hdr.len; 2160 len -= hdr.len; 2161 } 2162 tprints("}"); 2163 } 2164 if (len > 0) { 2165 if (c++) tprints(", "); 2166 printstr(tcp, addr, len); 2167 } 2168 if (c > 1) tprints("]"); 2169} 2170 2171#endif 2172 2173int 2174sys_setsockopt(struct tcb *tcp) 2175{ 2176 if (entering(tcp)) { 2177 tprintf("%ld, ", tcp->u_arg[0]); 2178 printsockopt(tcp, tcp->u_arg[1], tcp->u_arg[2], 2179 tcp->u_arg[3], tcp->u_arg[4]); 2180 tprintf(", %lu", tcp->u_arg[4]); 2181 } 2182 return 0; 2183} 2184