1 /* 2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl> 3 * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl> 4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com> 5 * Copyright (c) 1996-2000 Wichert Akkerman <wichert (at) 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: net.c,v 1.48 2005/06/01 19:22:07 roland Exp $ 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 #include <arpa/inet.h> 53 #include <net/if.h> 54 #if defined(LINUX) 55 #include <asm/types.h> 56 #if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC__ + __GLIBC_MINOR__ >= 3) 57 # include <netipx/ipx.h> 58 #else 59 # include <linux/ipx.h> 60 #endif 61 #endif /* LINUX */ 62 63 #if defined (__GLIBC__) && (((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1)) || defined(HAVE_SIN6_SCOPE_ID_LINUX)) 64 #if defined(HAVE_LINUX_IN6_H) 65 #if defined(HAVE_SIN6_SCOPE_ID_LINUX) 66 #undef in6_addr 67 #undef ipv6_mreq 68 #undef sockaddr_in6 69 #define in6_addr in6_addr_kernel 70 #define ipv6_mreq ipv6_mreq_kernel 71 #define sockaddr_in6 sockaddr_in6_kernel 72 #endif 73 #include <linux/in6.h> 74 #if defined(HAVE_SIN6_SCOPE_ID_LINUX) 75 #undef in6_addr 76 #undef ipv6_mreq 77 #undef sockaddr_in6 78 #define in6_addr in6_addr_libc 79 #define ipv6_mreq ipv6_mreq_libc 80 #define sockaddr_in6 sockaddr_in6_kernel 81 #endif 82 #endif 83 #endif 84 85 #if defined(HAVE_SYS_UIO_H) 86 #include <sys/uio.h> 87 #endif 88 89 #if defined(HAVE_LINUX_NETLINK_H) 90 #include <linux/netlink.h> 91 #endif 92 93 #if defined(HAVE_LINUX_IF_PACKET_H) 94 #include <linux/if_packet.h> 95 #endif 96 97 #if defined(HAVE_LINUX_ICMP_H) 98 #include <linux/icmp.h> 99 #endif 100 101 #ifndef PF_UNSPEC 102 #define PF_UNSPEC AF_UNSPEC 103 #endif 104 105 #if UNIXWARE >= 7 106 #define HAVE_SENDMSG 1 /* HACK - *FIXME* */ 107 #endif 108 109 #ifdef LINUX 110 /* Under Linux these are enums so we can't test for them with ifdef. */ 111 #define IPPROTO_EGP IPPROTO_EGP 112 #define IPPROTO_PUP IPPROTO_PUP 113 #define IPPROTO_IDP IPPROTO_IDP 114 #define IPPROTO_IGMP IPPROTO_IGMP 115 #define IPPROTO_RAW IPPROTO_RAW 116 #define IPPROTO_MAX IPPROTO_MAX 117 #endif 118 119 static const struct xlat domains[] = { 120 #ifdef PF_AAL5 121 { PF_AAL5, "PF_AAL5" }, 122 #endif 123 #ifdef PF_APPLETALK 124 { PF_APPLETALK, "PF_APPLETALK" }, 125 #endif 126 #ifdef PF_ASH 127 { PF_ASH, "PF_ASH" }, 128 #endif 129 #ifdef PF_ATMPVC 130 { PF_ATMPVC, "PF_ATMPVC" }, 131 #endif 132 #ifdef PF_ATMSVC 133 { PF_ATMSVC, "PF_ATMSVC" }, 134 #endif 135 #ifdef PF_AX25 136 { PF_AX25, "PF_AX25" }, 137 #endif 138 #ifdef PF_BLUETOOTH 139 { PF_BLUETOOTH, "PF_BLUETOOTH" }, 140 #endif 141 #ifdef PF_BRIDGE 142 { PF_BRIDGE, "PF_BRIDGE" }, 143 #endif 144 #ifdef PF_DECnet 145 { PF_DECnet, "PF_DECnet" }, 146 #endif 147 #ifdef PF_DECNET 148 { PF_DECNET, "PF_DECNET" }, 149 #endif 150 #ifdef PF_ECONET 151 { PF_ECONET, "PF_ECONET" }, 152 #endif 153 #ifdef PF_FILE 154 { PF_FILE, "PF_FILE" }, 155 #endif 156 #ifdef PF_IMPLINK 157 { PF_IMPLINK, "PF_IMPLINK" }, 158 #endif 159 #ifdef PF_INET 160 { PF_INET, "PF_INET" }, 161 #endif 162 #ifdef PF_INET6 163 { PF_INET6, "PF_INET6" }, 164 #endif 165 #ifdef PF_IPX 166 { PF_IPX, "PF_IPX" }, 167 #endif 168 #ifdef PF_IRDA 169 { PF_IRDA, "PF_IRDA" }, 170 #endif 171 #ifdef PF_ISO 172 { PF_ISO, "PF_ISO" }, 173 #endif 174 #ifdef PF_KEY 175 { PF_KEY, "PF_KEY" }, 176 #endif 177 #ifdef PF_UNIX 178 { PF_UNIX, "PF_UNIX" }, 179 #endif 180 #ifdef PF_LOCAL 181 { PF_LOCAL, "PF_LOCAL" }, 182 #endif 183 #ifdef PF_NETBEUI 184 { PF_NETBEUI, "PF_NETBEUI" }, 185 #endif 186 #ifdef PF_NETLINK 187 { PF_NETLINK, "PF_NETLINK" }, 188 #endif 189 #ifdef PF_NETROM 190 { PF_NETROM, "PF_NETROM" }, 191 #endif 192 #ifdef PF_PACKET 193 { PF_PACKET, "PF_PACKET" }, 194 #endif 195 #ifdef PF_PPPOX 196 { PF_PPPOX, "PF_PPPOX" }, 197 #endif 198 #ifdef PF_ROSE 199 { PF_ROSE, "PF_ROSE" }, 200 #endif 201 #ifdef PF_ROUTE 202 { PF_ROUTE, "PF_ROUTE" }, 203 #endif 204 #ifdef PF_SECURITY 205 { PF_SECURITY, "PF_SECURITY" }, 206 #endif 207 #ifdef PF_SNA 208 { PF_SNA, "PF_SNA" }, 209 #endif 210 #ifdef PF_UNSPEC 211 { PF_UNSPEC, "PF_UNSPEC" }, 212 #endif 213 #ifdef PF_WANPIPE 214 { PF_WANPIPE, "PF_WANPIPE" }, 215 #endif 216 #ifdef PF_X25 217 { PF_X25, "PF_X25" }, 218 #endif 219 { 0, NULL }, 220 }; 221 const struct xlat addrfams[] = { 222 #ifdef AF_APPLETALK 223 { AF_APPLETALK, "AF_APPLETALK" }, 224 #endif 225 #ifdef AF_ASH 226 { AF_ASH, "AF_ASH" }, 227 #endif 228 #ifdef AF_ATMPVC 229 { AF_ATMPVC, "AF_ATMPVC" }, 230 #endif 231 #ifdef AF_ATMSVC 232 { AF_ATMSVC, "AF_ATMSVC" }, 233 #endif 234 #ifdef AF_AX25 235 { AF_AX25, "AF_AX25" }, 236 #endif 237 #ifdef AF_BLUETOOTH 238 { AF_BLUETOOTH, "AF_BLUETOOTH" }, 239 #endif 240 #ifdef AF_BRIDGE 241 { AF_BRIDGE, "AF_BRIDGE" }, 242 #endif 243 #ifdef AF_DECnet 244 { AF_DECnet, "AF_DECnet" }, 245 #endif 246 #ifdef AF_ECONET 247 { AF_ECONET, "AF_ECONET" }, 248 #endif 249 #ifdef AF_FILE 250 { AF_FILE, "AF_FILE" }, 251 #endif 252 #ifdef AF_IMPLINK 253 { AF_IMPLINK, "AF_IMPLINK" }, 254 #endif 255 #ifdef AF_INET 256 { AF_INET, "AF_INET" }, 257 #endif 258 #ifdef AF_INET6 259 { AF_INET6, "AF_INET6" }, 260 #endif 261 #ifdef AF_IPX 262 { AF_IPX, "AF_IPX" }, 263 #endif 264 #ifdef AF_IRDA 265 { AF_IRDA, "AF_IRDA" }, 266 #endif 267 #ifdef AF_ISO 268 { AF_ISO, "AF_ISO" }, 269 #endif 270 #ifdef AF_KEY 271 { AF_KEY, "AF_KEY" }, 272 #endif 273 #ifdef AF_UNIX 274 { AF_UNIX, "AF_UNIX" }, 275 #endif 276 #ifdef AF_LOCAL 277 { AF_LOCAL, "AF_LOCAL" }, 278 #endif 279 #ifdef AF_NETBEUI 280 { AF_NETBEUI, "AF_NETBEUI" }, 281 #endif 282 #ifdef AF_NETLINK 283 { AF_NETLINK, "AF_NETLINK" }, 284 #endif 285 #ifdef AF_NETROM 286 { AF_NETROM, "AF_NETROM" }, 287 #endif 288 #ifdef AF_PACKET 289 { AF_PACKET, "AF_PACKET" }, 290 #endif 291 #ifdef AF_PPPOX 292 { AF_PPPOX, "AF_PPPOX" }, 293 #endif 294 #ifdef AF_ROSE 295 { AF_ROSE, "AF_ROSE" }, 296 #endif 297 #ifdef AF_ROUTE 298 { AF_ROUTE, "AF_ROUTE" }, 299 #endif 300 #ifdef AF_SECURITY 301 { AF_SECURITY, "AF_SECURITY" }, 302 #endif 303 #ifdef AF_SNA 304 { AF_SNA, "AF_SNA" }, 305 #endif 306 #ifdef AF_UNSPEC 307 { AF_UNSPEC, "AF_UNSPEC" }, 308 #endif 309 #ifdef AF_WANPIPE 310 { AF_WANPIPE, "AF_WANPIPE" }, 311 #endif 312 #ifdef AF_X25 313 { AF_X25, "AF_X25" }, 314 #endif 315 { 0, NULL }, 316 }; 317 static const struct xlat socktypes[] = { 318 { SOCK_STREAM, "SOCK_STREAM" }, 319 { SOCK_DGRAM, "SOCK_DGRAM" }, 320 #ifdef SOCK_RAW 321 { SOCK_RAW, "SOCK_RAW" }, 322 #endif 323 #ifdef SOCK_SEQPACKET 324 { SOCK_SEQPACKET,"SOCK_SEQPACKET"}, 325 #endif 326 #ifdef SOCK_RDM 327 { SOCK_RDM, "SOCK_RDM" }, 328 #endif 329 #ifdef SOCK_PACKET 330 { SOCK_PACKET, "SOCK_PACKET" }, 331 #endif 332 { 0, NULL }, 333 }; 334 static const struct xlat socketlayers[] = { 335 #if defined(SOL_IP) 336 { SOL_IP, "SOL_IP" }, 337 #endif 338 #if defined(SOL_ICMP) 339 { SOL_ICMP, "SOL_ICMP" }, 340 #endif 341 #if defined(SOL_TCP) 342 { SOL_TCP, "SOL_TCP" }, 343 #endif 344 #if defined(SOL_UDP) 345 { SOL_UDP, "SOL_UDP" }, 346 #endif 347 #if defined(SOL_IPV6) 348 { SOL_IPV6, "SOL_IPV6" }, 349 #endif 350 #if defined(SOL_ICMPV6) 351 { SOL_ICMPV6, "SOL_ICMPV6" }, 352 #endif 353 #if defined(SOL_RAW) 354 { SOL_RAW, "SOL_RAW" }, 355 #endif 356 #if defined(SOL_IPX) 357 { SOL_IPX, "SOL_IPX" }, 358 #endif 359 #if defined(SOL_IPX) 360 { SOL_IPX, "SOL_IPX" }, 361 #endif 362 #if defined(SOL_AX25) 363 { SOL_AX25, "SOL_AX25" }, 364 #endif 365 #if defined(SOL_ATALK) 366 { SOL_ATALK, "SOL_ATALK" }, 367 #endif 368 #if defined(SOL_NETROM) 369 { SOL_NETROM, "SOL_NETROM" }, 370 #endif 371 #if defined(SOL_ROSE) 372 { SOL_ROSE, "SOL_ROSE" }, 373 #endif 374 #if defined(SOL_DECNET) 375 { SOL_DECNET, "SOL_DECNET" }, 376 #endif 377 #if defined(SOL_X25) 378 { SOL_X25, "SOL_X25" }, 379 #endif 380 #if defined(SOL_PACKET) 381 { SOL_PACKET, "SOL_PACKET" }, 382 #endif 383 #if defined(SOL_ATM) 384 { SOL_ATM, "SOL_ATM" }, 385 #endif 386 #if defined(SOL_AAL) 387 { SOL_AAL, "SOL_AAL" }, 388 #endif 389 #if defined(SOL_IRDA) 390 { SOL_IRDA, "SOL_IRDA" }, 391 #endif 392 { SOL_SOCKET, "SOL_SOCKET" }, /* Never used! */ 393 }; 394 /*** WARNING: DANGER WILL ROBINSON: NOTE "socketlayers" array above 395 falls into "protocols" array below!!!! This is intended!!! ***/ 396 static const struct xlat protocols[] = { 397 { IPPROTO_IP, "IPPROTO_IP" }, 398 { IPPROTO_ICMP, "IPPROTO_ICMP" }, 399 { IPPROTO_TCP, "IPPROTO_TCP" }, 400 { IPPROTO_UDP, "IPPROTO_UDP" }, 401 #ifdef IPPROTO_GGP 402 { IPPROTO_GGP, "IPPROTO_GGP" }, 403 #endif 404 #ifdef IPPROTO_EGP 405 { IPPROTO_EGP, "IPPROTO_EGP" }, 406 #endif 407 #ifdef IPPROTO_PUP 408 { IPPROTO_PUP, "IPPROTO_PUP" }, 409 #endif 410 #ifdef IPPROTO_IDP 411 { IPPROTO_IDP, "IPPROTO_IDP" }, 412 #endif 413 #ifdef IPPROTO_IPV6 414 { IPPROTO_IPV6, "IPPROTO_IPV6" }, 415 #endif 416 #ifdef IPPROTO_ICMPV6 417 { IPPROTO_ICMPV6,"IPPROTO_ICMPV6"}, 418 #endif 419 #ifdef IPPROTO_IGMP 420 { IPPROTO_IGMP, "IPPROTO_IGMP" }, 421 #endif 422 #ifdef IPPROTO_HELLO 423 { IPPROTO_HELLO,"IPPROTO_HELLO" }, 424 #endif 425 #ifdef IPPROTO_ND 426 { IPPROTO_ND, "IPPROTO_ND" }, 427 #endif 428 #ifdef IPPROTO_RAW 429 { IPPROTO_RAW, "IPPROTO_RAW" }, 430 #endif 431 #ifdef IPPROTO_MAX 432 { IPPROTO_MAX, "IPPROTO_MAX" }, 433 #endif 434 #ifdef IPPROTO_IPIP 435 { IPPROTO_IPIP, "IPPROTO_IPIP" }, 436 #endif 437 { 0, NULL }, 438 }; 439 static const struct xlat msg_flags[] = { 440 { MSG_OOB, "MSG_OOB" }, 441 #ifdef MSG_DONTROUTE 442 { MSG_DONTROUTE,"MSG_DONTROUTE" }, 443 #endif 444 #ifdef MSG_PEEK 445 { MSG_PEEK, "MSG_PEEK" }, 446 #endif 447 #ifdef MSG_CTRUNC 448 { MSG_CTRUNC, "MSG_CTRUNC" }, 449 #endif 450 #ifdef MSG_PROXY 451 { MSG_PROXY, "MSG_PROXY" }, 452 #endif 453 #ifdef MSG_EOR 454 { MSG_EOR, "MSG_EOR" }, 455 #endif 456 #ifdef MSG_WAITALL 457 { MSG_WAITALL, "MSG_WAITALL" }, 458 #endif 459 #ifdef MSG_TRUNC 460 { MSG_TRUNC, "MSG_TRUNC" }, 461 #endif 462 #ifdef MSG_CTRUNC 463 { MSG_CTRUNC, "MSG_CTRUNC" }, 464 #endif 465 #ifdef MSG_ERRQUEUE 466 { MSG_ERRQUEUE, "MSG_ERRQUEUE" }, 467 #endif 468 #ifdef MSG_DONTWAIT 469 { MSG_DONTWAIT, "MSG_DONTWAIT" }, 470 #endif 471 #ifdef MSG_CONFIRM 472 { MSG_CONFIRM, "MSG_CONFIRM" }, 473 #endif 474 #ifdef MSG_PROBE 475 { MSG_PROBE, "MSG_PROBE" }, 476 #endif 477 #ifdef MSG_FIN 478 { MSG_FIN, "MSG_FIN" }, 479 #endif 480 #ifdef MSG_SYN 481 { MSG_SYN, "MSG_SYN" }, 482 #endif 483 #ifdef MSG_RST 484 { MSG_RST, "MSG_RST" }, 485 #endif 486 #ifdef MSG_NOSIGNAL 487 { MSG_NOSIGNAL, "MSG_NOSIGNAL" }, 488 #endif 489 #ifdef MSG_MORE 490 { MSG_MORE, "MSG_MORE" }, 491 #endif 492 { 0, NULL }, 493 }; 494 495 static const struct xlat sockoptions[] = { 496 #ifdef SO_ACCEPTCONN 497 { SO_ACCEPTCONN, "SO_ACCEPTCONN" }, 498 #endif 499 #ifdef SO_ALLRAW 500 { SO_ALLRAW, "SO_ALLRAW" }, 501 #endif 502 #ifdef SO_ATTACH_FILTER 503 { SO_ATTACH_FILTER, "SO_ATTACH_FILTER" }, 504 #endif 505 #ifdef SO_BINDTODEVICE 506 { SO_BINDTODEVICE, "SO_BINDTODEVICE" }, 507 #endif 508 #ifdef SO_BROADCAST 509 { SO_BROADCAST, "SO_BROADCAST" }, 510 #endif 511 #ifdef SO_BSDCOMPAT 512 { SO_BSDCOMPAT, "SO_BSDCOMPAT" }, 513 #endif 514 #ifdef SO_DEBUG 515 { SO_DEBUG, "SO_DEBUG" }, 516 #endif 517 #ifdef SO_DETACH_FILTER 518 { SO_DETACH_FILTER, "SO_DETACH_FILTER" }, 519 #endif 520 #ifdef SO_DONTROUTE 521 { SO_DONTROUTE, "SO_DONTROUTE" }, 522 #endif 523 #ifdef SO_ERROR 524 { SO_ERROR, "SO_ERROR" }, 525 #endif 526 #ifdef SO_ICS 527 { SO_ICS, "SO_ICS" }, 528 #endif 529 #ifdef SO_IMASOCKET 530 { SO_IMASOCKET, "SO_IMASOCKET" }, 531 #endif 532 #ifdef SO_KEEPALIVE 533 { SO_KEEPALIVE, "SO_KEEPALIVE" }, 534 #endif 535 #ifdef SO_LINGER 536 { SO_LINGER, "SO_LINGER" }, 537 #endif 538 #ifdef SO_LISTENING 539 { SO_LISTENING, "SO_LISTENING" }, 540 #endif 541 #ifdef SO_MGMT 542 { SO_MGMT, "SO_MGMT" }, 543 #endif 544 #ifdef SO_NO_CHECK 545 { SO_NO_CHECK, "SO_NO_CHECK" }, 546 #endif 547 #ifdef SO_OOBINLINE 548 { SO_OOBINLINE, "SO_OOBINLINE" }, 549 #endif 550 #ifdef SO_ORDREL 551 { SO_ORDREL, "SO_ORDREL" }, 552 #endif 553 #ifdef SO_PARALLELSVR 554 { SO_PARALLELSVR, "SO_PARALLELSVR" }, 555 #endif 556 #ifdef SO_PASSCRED 557 { SO_PASSCRED, "SO_PASSCRED" }, 558 #endif 559 #ifdef SO_PEERCRED 560 { SO_PEERCRED, "SO_PEERCRED" }, 561 #endif 562 #ifdef SO_PEERNAME 563 { SO_PEERNAME, "SO_PEERNAME" }, 564 #endif 565 #ifdef SO_PEERSEC 566 { SO_PEERSEC, "SO_PEERSEC" }, 567 #endif 568 #ifdef SO_PRIORITY 569 { SO_PRIORITY, "SO_PRIORITY" }, 570 #endif 571 #ifdef SO_PROTOTYPE 572 { SO_PROTOTYPE, "SO_PROTOTYPE" }, 573 #endif 574 #ifdef SO_RCVBUF 575 { SO_RCVBUF, "SO_RCVBUF" }, 576 #endif 577 #ifdef SO_RCVLOWAT 578 { SO_RCVLOWAT, "SO_RCVLOWAT" }, 579 #endif 580 #ifdef SO_RCVTIMEO 581 { SO_RCVTIMEO, "SO_RCVTIMEO" }, 582 #endif 583 #ifdef SO_RDWR 584 { SO_RDWR, "SO_RDWR" }, 585 #endif 586 #ifdef SO_REUSEADDR 587 { SO_REUSEADDR, "SO_REUSEADDR" }, 588 #endif 589 #ifdef SO_REUSEPORT 590 { SO_REUSEPORT, "SO_REUSEPORT" }, 591 #endif 592 #ifdef SO_SECURITY_AUTHENTICATION 593 { SO_SECURITY_AUTHENTICATION,"SO_SECURITY_AUTHENTICATION"}, 594 #endif 595 #ifdef SO_SECURITY_ENCRYPTION_NETWORK 596 { SO_SECURITY_ENCRYPTION_NETWORK,"SO_SECURITY_ENCRYPTION_NETWORK"}, 597 #endif 598 #ifdef SO_SECURITY_ENCRYPTION_TRANSPORT 599 { SO_SECURITY_ENCRYPTION_TRANSPORT,"SO_SECURITY_ENCRYPTION_TRANSPORT"}, 600 #endif 601 #ifdef SO_SEMA 602 { SO_SEMA, "SO_SEMA" }, 603 #endif 604 #ifdef SO_SNDBUF 605 { SO_SNDBUF, "SO_SNDBUF" }, 606 #endif 607 #ifdef SO_SNDLOWAT 608 { SO_SNDLOWAT, "SO_SNDLOWAT" }, 609 #endif 610 #ifdef SO_SNDTIMEO 611 { SO_SNDTIMEO, "SO_SNDTIMEO" }, 612 #endif 613 #ifdef SO_TIMESTAMP 614 { SO_TIMESTAMP, "SO_TIMESTAMP" }, 615 #endif 616 #ifdef SO_TYPE 617 { SO_TYPE, "SO_TYPE" }, 618 #endif 619 #ifdef SO_USELOOPBACK 620 { SO_USELOOPBACK, "SO_USELOOPBACK" }, 621 #endif 622 { 0, NULL }, 623 }; 624 625 #if !defined (SOL_IP) && defined (IPPROTO_IP) 626 #define SOL_IP IPPROTO_IP 627 #endif 628 629 #ifdef SOL_IP 630 static const struct xlat sockipoptions[] = { 631 #ifdef IP_TOS 632 { IP_TOS, "IP_TOS" }, 633 #endif 634 #ifdef IP_TTL 635 { IP_TTL, "IP_TTL" }, 636 #endif 637 #ifdef IP_HDRINCL 638 { IP_HDRINCL, "IP_HDRINCL" }, 639 #endif 640 #ifdef IP_OPTIONS 641 { IP_OPTIONS, "IP_OPTIONS" }, 642 #endif 643 #ifdef IP_ROUTER_ALERT 644 { IP_ROUTER_ALERT, "IP_ROUTER_ALERT" }, 645 #endif 646 #ifdef IP_RECVOPTIONS 647 { IP_RECVOPTIONS, "IP_RECVOPTIONS" }, 648 #endif 649 #ifdef IP_RECVOPTS 650 { IP_RECVOPTS, "IP_RECVOPTS" }, 651 #endif 652 #ifdef IP_RECVRETOPTS 653 { IP_RECVRETOPTS, "IP_RECVRETOPTS" }, 654 #endif 655 #ifdef IP_RECVDSTADDR 656 { IP_RECVDSTADDR, "IP_RECVDSTADDR" }, 657 #endif 658 #ifdef IP_RETOPTS 659 { IP_RETOPTS, "IP_RETOPTS" }, 660 #endif 661 #ifdef IP_PKTINFO 662 { IP_PKTINFO, "IP_PKTINFO" }, 663 #endif 664 #ifdef IP_PKTOPTIONS 665 { IP_PKTOPTIONS, "IP_PKTOPTIONS" }, 666 #endif 667 #ifdef IP_MTU_DISCOVER 668 { IP_MTU_DISCOVER, "IP_MTU_DISCOVER" }, 669 #endif 670 #ifdef IP_RECVERR 671 { IP_RECVERR, "IP_RECVERR" }, 672 #endif 673 #ifdef IP_RECVTTL 674 { IP_RECVTTL, "IP_RECRECVTTL" }, 675 #endif 676 #ifdef IP_RECVTOS 677 { IP_RECVTOS, "IP_RECRECVTOS" }, 678 #endif 679 #ifdef IP_MTU 680 { IP_MTU, "IP_MTU" }, 681 #endif 682 #ifdef IP_MULTICAST_IF 683 { IP_MULTICAST_IF, "IP_MULTICAST_IF" }, 684 #endif 685 #ifdef IP_MULTICAST_TTL 686 { IP_MULTICAST_TTL, "IP_MULTICAST_TTL" }, 687 #endif 688 #ifdef IP_MULTICAST_LOOP 689 { IP_MULTICAST_LOOP, "IP_MULTICAST_LOOP" }, 690 #endif 691 #ifdef IP_ADD_MEMBERSHIP 692 { IP_ADD_MEMBERSHIP, "IP_ADD_MEMBERSHIP" }, 693 #endif 694 #ifdef IP_DROP_MEMBERSHIP 695 { IP_DROP_MEMBERSHIP, "IP_DROP_MEMBERSHIP" }, 696 #endif 697 #ifdef IP_BROADCAST_IF 698 { IP_BROADCAST_IF, "IP_BROADCAST_IF" }, 699 #endif 700 #ifdef IP_RECVIFINDEX 701 { IP_RECVIFINDEX, "IP_RECVIFINDEX" }, 702 #endif 703 #ifdef IP_MSFILTER 704 { IP_MSFILTER, "IP_MSFILTER" }, 705 #endif 706 #ifdef MCAST_MSFILTER 707 { MCAST_MSFILTER, "MCAST_MSFILTER" }, 708 #endif 709 #ifdef IP_FREEBIND 710 { IP_FREEBIND, "IP_FREEBIND" }, 711 #endif 712 { 0, NULL }, 713 }; 714 #endif /* SOL_IP */ 715 716 #ifdef SOL_IPV6 717 static const struct xlat sockipv6options[] = { 718 #ifdef IPV6_ADDRFORM 719 { IPV6_ADDRFORM, "IPV6_ADDRFORM" }, 720 #endif 721 #ifdef MCAST_FILTER 722 { MCAST_FILTER, "MCAST_FILTER" }, 723 #endif 724 #ifdef IPV6_PKTOPTIONS 725 { IPV6_PKTOPTIONS, "IPV6_PKTOPTIONS" }, 726 #endif 727 #ifdef IPV6_MTU 728 { IPV6_MTU, "IPV6_MTU" }, 729 #endif 730 #ifdef IPV6_V6ONLY 731 { IPV6_V6ONLY, "IPV6_V6ONLY" }, 732 #endif 733 #ifdef IPV6_PKTINFO 734 { IPV6_PKTINFO, "IPV6_PKTINFO" }, 735 #endif 736 #ifdef IPV6_HOPLIMIT 737 { IPV6_HOPLIMIT, "IPV6_HOPLIMIT" }, 738 #endif 739 #ifdef IPV6_RTHDR 740 { IPV6_RTHDR, "IPV6_RTHDR" }, 741 #endif 742 #ifdef IPV6_HOPOPTS 743 { IPV6_HOPOPTS, "IPV6_HOPOPTS" }, 744 #endif 745 #ifdef IPV6_DSTOPTS 746 { IPV6_DSTOPTS, "IPV6_DSTOPTS" }, 747 #endif 748 #ifdef IPV6_FLOWINFO 749 { IPV6_FLOWINFO, "IPV6_FLOWINFO" }, 750 #endif 751 #ifdef IPV6_UNICAST_HOPS 752 { IPV6_UNICAST_HOPS, "IPV6_UNICAST_HOPS" }, 753 #endif 754 #ifdef IPV6_MULTICAST_HOPS 755 { IPV6_MULTICAST_HOPS, "IPV6_MULTICAST_HOPS" }, 756 #endif 757 #ifdef IPV6_MULTICAST_LOOP 758 { IPV6_MULTICAST_LOOP, "IPV6_MULTICAST_LOOP" }, 759 #endif 760 #ifdef IPV6_MULTICAST_IF 761 { IPV6_MULTICAST_IF, "IPV6_MULTICAST_IF" }, 762 #endif 763 #ifdef IPV6_MTU_DISCOVER 764 { IPV6_MTU_DISCOVER, "IPV6_MTU_DISCOVER" }, 765 #endif 766 #ifdef IPV6_RECVERR 767 { IPV6_RECVERR, "IPV6_RECVERR" }, 768 #endif 769 #ifdef IPV6_FLOWINFO_SEND 770 { IPV6_FLOWINFO_SEND, "IPV6_FLOWINFO_SEND" }, 771 #endif 772 { 0, NULL }, 773 }; 774 #endif /* SOL_IPV6 */ 775 776 #ifdef SOL_IPX 777 static const struct xlat sockipxoptions[] = { 778 { IPX_TYPE, "IPX_TYPE" }, 779 { 0, NULL }, 780 }; 781 #endif /* SOL_IPX */ 782 783 #ifdef SOL_RAW 784 static const struct xlat sockrawoptions[] = { 785 #if defined(ICMP_FILTER) 786 { ICMP_FILTER, "ICMP_FILTER" }, 787 #endif 788 { 0, NULL }, 789 }; 790 #endif /* SOL_RAW */ 791 792 #ifdef SOL_PACKET 793 static const struct xlat sockpacketoptions[] = { 794 { PACKET_ADD_MEMBERSHIP, "PACKET_ADD_MEMBERSHIP" }, 795 { PACKET_DROP_MEMBERSHIP, "PACKET_DROP_MEMBERSHIP"}, 796 #if defined(PACKET_RECV_OUTPUT) 797 { PACKET_RECV_OUTPUT, "PACKET_RECV_OUTPUT" }, 798 #endif 799 #if defined(PACKET_RX_RING) 800 { PACKET_RX_RING, "PACKET_RX_RING" }, 801 #endif 802 #if defined(PACKET_STATISTICS) 803 { PACKET_STATISTICS, "PACKET_STATISTICS" }, 804 #endif 805 { 0, NULL }, 806 }; 807 #endif /* SOL_PACKET */ 808 809 #if !defined (SOL_TCP) && defined (IPPROTO_TCP) 810 #define SOL_TCP IPPROTO_TCP 811 #endif 812 813 #ifdef SOL_TCP 814 static const struct xlat socktcpoptions[] = { 815 { TCP_NODELAY, "TCP_NODELAY" }, 816 { TCP_MAXSEG, "TCP_MAXSEG" }, 817 #if defined(TCP_CORK) 818 { TCP_CORK, "TCP_CORK" }, 819 #endif 820 #if defined(TCP_KEEPIDLE) 821 { TCP_KEEPIDLE, "TCP_KEEPIDLE" }, 822 #endif 823 #if defined(TCP_KEEPINTVL) 824 { TCP_KEEPINTVL, "TCP_KEEPINTVL" }, 825 #endif 826 #if defined(TCP_KEEPCNT) 827 { TCP_KEEPCNT, "TCP_KEEPCNT" }, 828 #endif 829 #if defined(TCP_NKEEP) 830 { TCP_NKEEP, "TCP_NKEEP" }, 831 #endif 832 #if defined(TCP_SYNCNT) 833 { TCP_SYNCNT, "TCP_SYNCNT" }, 834 #endif 835 #if defined(TCP_LINGER2) 836 { TCP_LINGER2, "TCP_LINGER2" }, 837 #endif 838 #if defined(TCP_DEFER_ACCEPT) 839 { TCP_DEFER_ACCEPT, "TCP_DEFER_ACCEPT" }, 840 #endif 841 #if defined(TCP_WINDOW_CLAMP) 842 { TCP_WINDOW_CLAMP, "TCP_WINDOW_CLAMP" }, 843 #endif 844 #if defined(TCP_INFO) 845 { TCP_INFO, "TCP_INFO" }, 846 #endif 847 #if defined(TCP_QUICKACK) 848 { TCP_QUICKACK, "TCP_QUICKACK" }, 849 #endif 850 { 0, NULL }, 851 }; 852 #endif /* SOL_TCP */ 853 854 #ifdef SOL_RAW 855 static const struct xlat icmpfilterflags[] = { 856 #if defined(ICMP_ECHOREPLY) 857 { (1<<ICMP_ECHOREPLY), "ICMP_ECHOREPLY" }, 858 #endif 859 #if defined(ICMP_DEST_UNREACH) 860 { (1<<ICMP_DEST_UNREACH), "ICMP_DEST_UNREACH" }, 861 #endif 862 #if defined(ICMP_SOURCE_QUENCH) 863 { (1<<ICMP_SOURCE_QUENCH), "ICMP_SOURCE_QUENCH" }, 864 #endif 865 #if defined(ICMP_REDIRECT) 866 { (1<<ICMP_REDIRECT), "ICMP_REDIRECT" }, 867 #endif 868 #if defined(ICMP_ECHO) 869 { (1<<ICMP_ECHO), "ICMP_ECHO" }, 870 #endif 871 #if defined(ICMP_TIME_EXCEEDED) 872 { (1<<ICMP_TIME_EXCEEDED), "ICMP_TIME_EXCEEDED" }, 873 #endif 874 #if defined(ICMP_PARAMETERPROB) 875 { (1<<ICMP_PARAMETERPROB), "ICMP_PARAMETERPROB" }, 876 #endif 877 #if defined(ICMP_TIMESTAMP) 878 { (1<<ICMP_TIMESTAMP), "ICMP_TIMESTAMP" }, 879 #endif 880 #if defined(ICMP_TIMESTAMPREPLY) 881 { (1<<ICMP_TIMESTAMPREPLY), "ICMP_TIMESTAMPREPLY" }, 882 #endif 883 #if defined(ICMP_INFO_REQUEST) 884 { (1<<ICMP_INFO_REQUEST), "ICMP_INFO_REQUEST" }, 885 #endif 886 #if defined(ICMP_INFO_REPLY) 887 { (1<<ICMP_INFO_REPLY), "ICMP_INFO_REPLY" }, 888 #endif 889 #if defined(ICMP_ADDRESS) 890 { (1<<ICMP_ADDRESS), "ICMP_ADDRESS" }, 891 #endif 892 #if defined(ICMP_ADDRESSREPLY) 893 { (1<<ICMP_ADDRESSREPLY), "ICMP_ADDRESSREPLY" }, 894 #endif 895 { 0, NULL }, 896 }; 897 #endif /* SOL_RAW */ 898 899 #if defined(AF_PACKET) /* from e.g. linux/if_packet.h */ 900 static const struct xlat af_packet_types[] = { 901 #if defined(PACKET_HOST) 902 { PACKET_HOST, "PACKET_HOST" }, 903 #endif 904 #if defined(PACKET_BROADCAST) 905 { PACKET_BROADCAST, "PACKET_BROADCAST" }, 906 #endif 907 #if defined(PACKET_MULTICAST) 908 { PACKET_MULTICAST, "PACKET_MULTICAST" }, 909 #endif 910 #if defined(PACKET_OTHERHOST) 911 { PACKET_OTHERHOST, "PACKET_OTHERHOST" }, 912 #endif 913 #if defined(PACKET_OUTGOING) 914 { PACKET_OUTGOING, "PACKET_OUTGOING" }, 915 #endif 916 #if defined(PACKET_LOOPBACK) 917 { PACKET_LOOPBACK, "PACKET_LOOPBACK" }, 918 #endif 919 #if defined(PACKET_FASTROUTE) 920 { PACKET_FASTROUTE, "PACKET_FASTROUTE" }, 921 #endif 922 { 0, NULL }, 923 }; 924 #endif /* defined(AF_PACKET) */ 925 926 927 void 928 printsock(tcp, addr, addrlen) 929 struct tcb *tcp; 930 long addr; 931 int addrlen; 932 { 933 union { 934 char pad[128]; 935 struct sockaddr sa; 936 struct sockaddr_in sin; 937 struct sockaddr_un sau; 938 #ifdef HAVE_INET_NTOP 939 struct sockaddr_in6 sa6; 940 #endif 941 #if defined(LINUX) && defined(AF_IPX) 942 struct sockaddr_ipx sipx; 943 #endif 944 #ifdef AF_PACKET 945 struct sockaddr_ll ll; 946 #endif 947 #ifdef AF_NETLINK 948 struct sockaddr_nl nl; 949 #endif 950 } addrbuf; 951 char string_addr[100]; 952 953 if (addr == 0) { 954 tprintf("NULL"); 955 return; 956 } 957 if (!verbose(tcp)) { 958 tprintf("%#lx", addr); 959 return; 960 } 961 if ((addrlen<2) || (addrlen>sizeof(addrbuf))) 962 addrlen=sizeof(addrbuf); 963 964 if (umoven(tcp, addr, addrlen, (char*)&addrbuf) < 0) { 965 tprintf("{...}"); 966 return; 967 } 968 969 tprintf("{sa_family="); 970 printxval(addrfams, addrbuf.sa.sa_family, "AF_???"); 971 tprintf(", "); 972 973 switch (addrbuf.sa.sa_family) { 974 case AF_UNIX: 975 if (addrlen==2) { 976 tprintf("<nil>"); 977 } else if (addrbuf.sau.sun_path[0]) { 978 tprintf("path=\"%-.*s\"", addrlen-2, addrbuf.sau.sun_path); 979 } else { 980 tprintf("path=@%-.*s", addrlen-3, addrbuf.sau.sun_path+1); 981 } 982 break; 983 case AF_INET: 984 tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")", 985 ntohs(addrbuf.sin.sin_port), inet_ntoa(addrbuf.sin.sin_addr)); 986 break; 987 #ifdef HAVE_INET_NTOP 988 case AF_INET6: 989 inet_ntop(AF_INET6, &addrbuf.sa6.sin6_addr, string_addr, sizeof(string_addr)); 990 tprintf("sin6_port=htons(%u), inet_pton(AF_INET6, \"%s\", &sin6_addr), sin6_flowinfo=%u", 991 ntohs(addrbuf.sa6.sin6_port), string_addr, 992 addrbuf.sa6.sin6_flowinfo); 993 #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 994 { 995 #if defined(HAVE_IF_INDEXTONAME) && defined(IN6_IS_ADDR_LINKLOCAL) && defined(IN6_IS_ADDR_MC_LINKLOCAL) 996 int numericscope = 0; 997 if (IN6_IS_ADDR_LINKLOCAL (&addrbuf.sa6.sin6_addr) 998 || IN6_IS_ADDR_MC_LINKLOCAL (&addrbuf.sa6.sin6_addr)) { 999 char scopebuf[IFNAMSIZ + 1]; 1000 1001 if (if_indextoname (addrbuf.sa6.sin6_scope_id, scopebuf) == NULL) 1002 numericscope++; 1003 else 1004 tprintf(", sin6_scope_id=if_nametoindex(\"%s\")", scopebuf); 1005 } else 1006 numericscope++; 1007 1008 if (numericscope) 1009 #endif 1010 tprintf(", sin6_scope_id=%u", addrbuf.sa6.sin6_scope_id); 1011 } 1012 #endif 1013 break; 1014 #endif 1015 #if defined(AF_IPX) && defined(linux) 1016 case AF_IPX: 1017 { 1018 int i; 1019 tprintf("sipx_port=htons(%u), ", 1020 ntohs(addrbuf.sipx.sipx_port)); 1021 /* Yes, I know, this does not look too 1022 * strace-ish, but otherwise the IPX 1023 * addresses just look monstrous... 1024 * Anyways, feel free if you don't like 1025 * this way.. :) 1026 */ 1027 tprintf("%08lx:", (unsigned long)ntohl(addrbuf.sipx.sipx_network)); 1028 for (i = 0; i<IPX_NODE_LEN; i++) 1029 tprintf("%02x", addrbuf.sipx.sipx_node[i]); 1030 tprintf("/[%02x]", addrbuf.sipx.sipx_type); 1031 } 1032 break; 1033 #endif /* AF_IPX && linux */ 1034 #ifdef AF_PACKET 1035 case AF_PACKET: 1036 { 1037 int i; 1038 tprintf("proto=%#04x, if%d, pkttype=", 1039 ntohs(addrbuf.ll.sll_protocol), 1040 addrbuf.ll.sll_ifindex); 1041 printxval(af_packet_types, addrbuf.ll.sll_pkttype, "?"); 1042 tprintf(", addr(%d)={%d, ", 1043 addrbuf.ll.sll_halen, 1044 addrbuf.ll.sll_hatype); 1045 for (i=0; i<addrbuf.ll.sll_halen; i++) 1046 tprintf("%02x", addrbuf.ll.sll_addr[i]); 1047 } 1048 break; 1049 1050 #endif /* AF_APACKET */ 1051 #ifdef AF_NETLINK 1052 case AF_NETLINK: 1053 tprintf("pid=%d, groups=%08x", addrbuf.nl.nl_pid, addrbuf.nl.nl_groups); 1054 break; 1055 #endif /* AF_NETLINK */ 1056 /* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5 1057 AF_X25 AF_ROSE etc. still need to be done */ 1058 1059 default: 1060 tprintf("sa_data="); 1061 printstr(tcp, (long) &((struct sockaddr *) addr)->sa_data, 1062 sizeof addrbuf.sa.sa_data); 1063 break; 1064 } 1065 tprintf("}"); 1066 } 1067 1068 #if HAVE_SENDMSG 1069 static const struct xlat scmvals[] = { 1070 #ifdef SCM_RIGHTS 1071 { SCM_RIGHTS, "SCM_RIGHTS" }, 1072 #endif 1073 #ifdef SCM_CREDENTIALS 1074 { SCM_CREDENTIALS, "SCM_CREDENTIALS" }, 1075 #endif 1076 { 0, NULL } 1077 }; 1078 1079 static void 1080 printcmsghdr(tcp, addr, len) 1081 struct tcb *tcp; 1082 unsigned long addr; 1083 unsigned long len; 1084 { 1085 struct cmsghdr *cmsg = len < sizeof(struct cmsghdr) ? 1086 NULL : malloc(len); 1087 if (cmsg == NULL || umoven(tcp, addr, len, (char *) cmsg) < 0) { 1088 tprintf(", msg_control=%#lx", addr); 1089 free(cmsg); 1090 return; 1091 } 1092 1093 tprintf(", {cmsg_len=%zu, cmsg_level=", cmsg->cmsg_len); 1094 printxval(socketlayers, cmsg->cmsg_level, "SOL_???"); 1095 tprintf(", cmsg_type="); 1096 1097 if (cmsg->cmsg_level == SOL_SOCKET) { 1098 unsigned long cmsg_len; 1099 1100 printxval(scmvals, cmsg->cmsg_type, "SCM_???"); 1101 cmsg_len = (len < cmsg->cmsg_len) ? len : cmsg->cmsg_len; 1102 1103 if (cmsg->cmsg_type == SCM_RIGHTS 1104 && CMSG_LEN(sizeof(int)) <= cmsg_len) { 1105 int *fds = (int *) CMSG_DATA (cmsg); 1106 int first = 1; 1107 1108 tprintf(", {"); 1109 while ((char *) fds < ((char *) cmsg + cmsg_len)) { 1110 if (!first) 1111 tprintf(", "); 1112 tprintf("%d", *fds++); 1113 first = 0; 1114 } 1115 tprintf("}}"); 1116 free(cmsg); 1117 return; 1118 } 1119 if (cmsg->cmsg_type == SCM_CREDENTIALS 1120 && CMSG_LEN(sizeof(struct ucred)) <= cmsg_len) { 1121 struct ucred *uc = (struct ucred *) CMSG_DATA (cmsg); 1122 1123 tprintf("{pid=%ld, uid=%ld, gid=%ld}}", 1124 (long)uc->pid, (long)uc->uid, (long)uc->gid); 1125 free(cmsg); 1126 return; 1127 } 1128 } 1129 free(cmsg); 1130 tprintf(", ...}"); 1131 } 1132 1133 static void 1134 printmsghdr(tcp, addr) 1135 struct tcb *tcp; 1136 long addr; 1137 { 1138 struct msghdr msg; 1139 1140 if (umove(tcp, addr, &msg) < 0) { 1141 tprintf("%#lx", addr); 1142 return; 1143 } 1144 tprintf("{msg_name(%d)=", msg.msg_namelen); 1145 printsock(tcp, (long)msg.msg_name, msg.msg_namelen); 1146 1147 tprintf(", msg_iov(%lu)=", (unsigned long)msg.msg_iovlen); 1148 tprint_iov(tcp, (unsigned long)msg.msg_iovlen, 1149 (unsigned long)msg.msg_iov); 1150 1151 #ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL 1152 tprintf(", msg_controllen=%lu", (unsigned long)msg.msg_controllen); 1153 if (msg.msg_controllen) 1154 printcmsghdr(tcp, (unsigned long) msg.msg_control, 1155 msg.msg_controllen); 1156 tprintf(", msg_flags="); 1157 printflags(msg_flags, msg.msg_flags, "MSG_???"); 1158 #else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */ 1159 tprintf("msg_accrights=%#lx, msg_accrightslen=%u", 1160 (unsigned long) msg.msg_accrights, msg.msg_accrightslen); 1161 #endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */ 1162 tprintf("}"); 1163 } 1164 1165 #endif /* HAVE_SENDMSG */ 1166 1167 int 1168 sys_socket(tcp) 1169 struct tcb *tcp; 1170 { 1171 if (entering(tcp)) { 1172 printxval(domains, tcp->u_arg[0], "PF_???"); 1173 tprintf(", "); 1174 printxval(socktypes, tcp->u_arg[1], "SOCK_???"); 1175 tprintf(", "); 1176 switch (tcp->u_arg[0]) { 1177 case PF_INET: 1178 #ifdef PF_INET6 1179 case PF_INET6: 1180 #endif 1181 printxval(protocols, tcp->u_arg[2], "IPPROTO_???"); 1182 break; 1183 #ifdef PF_IPX 1184 case PF_IPX: 1185 /* BTW: I don't believe this.. */ 1186 tprintf("["); 1187 printxval(domains, tcp->u_arg[2], "PF_???"); 1188 tprintf("]"); 1189 break; 1190 #endif /* PF_IPX */ 1191 default: 1192 tprintf("%lu", tcp->u_arg[2]); 1193 break; 1194 } 1195 } 1196 return 0; 1197 } 1198 1199 int 1200 sys_so_socket(tcp) 1201 struct tcb *tcp; 1202 { 1203 if (entering(tcp)) { 1204 /* not sure really what these args are... but this 1205 * is how truss prints it 1206 */ 1207 tprintf("%ld, %ld, %ld, ", 1208 tcp->u_arg[0], tcp->u_arg[1], tcp->u_arg[2]); 1209 printpath(tcp, tcp->u_arg[3]); 1210 tprintf(", %ld", tcp->u_arg[4]); 1211 } 1212 return 0; 1213 } 1214 1215 int 1216 sys_so_socketpair(tcp) 1217 struct tcb *tcp; 1218 { 1219 if (entering(tcp)) { 1220 /* not sure what this arg is */ 1221 tprintf("0x%lx", tcp->u_arg[0]); 1222 } 1223 return 0; 1224 } 1225 1226 int 1227 sys_bind(tcp) 1228 struct tcb *tcp; 1229 { 1230 if (entering(tcp)) { 1231 tprintf("%ld, ", tcp->u_arg[0]); 1232 printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]); 1233 tprintf(", %lu", tcp->u_arg[2]); 1234 } 1235 return 0; 1236 } 1237 1238 int 1239 sys_connect(tcp) 1240 struct tcb *tcp; 1241 { 1242 return sys_bind(tcp); 1243 } 1244 1245 int 1246 sys_listen(tcp) 1247 struct tcb *tcp; 1248 { 1249 if (entering(tcp)) { 1250 tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]); 1251 } 1252 return 0; 1253 } 1254 1255 int 1256 sys_accept(tcp) 1257 struct tcb *tcp; 1258 { 1259 if (entering(tcp)) { 1260 tprintf("%ld, ", tcp->u_arg[0]); 1261 } else if (!tcp->u_arg[2]) 1262 tprintf("%#lx, NULL", tcp->u_arg[1]); 1263 else { 1264 if (tcp->u_arg[1] == 0 || syserror(tcp)) { 1265 tprintf("%#lx", tcp->u_arg[1]); 1266 } else { 1267 printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]); 1268 } 1269 tprintf(", "); 1270 printnum(tcp, tcp->u_arg[2], "%lu"); 1271 } 1272 return 0; 1273 } 1274 1275 int 1276 sys_send(tcp) 1277 struct tcb *tcp; 1278 { 1279 if (entering(tcp)) { 1280 tprintf("%ld, ", tcp->u_arg[0]); 1281 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 1282 tprintf(", %lu, ", tcp->u_arg[2]); 1283 /* flags */ 1284 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1285 } 1286 return 0; 1287 } 1288 1289 int 1290 sys_sendto(tcp) 1291 struct tcb *tcp; 1292 { 1293 if (entering(tcp)) { 1294 tprintf("%ld, ", tcp->u_arg[0]); 1295 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 1296 tprintf(", %lu, ", tcp->u_arg[2]); 1297 /* flags */ 1298 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1299 /* to address */ 1300 tprintf(", "); 1301 printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]); 1302 /* to length */ 1303 tprintf(", %lu", tcp->u_arg[5]); 1304 } 1305 return 0; 1306 } 1307 1308 #ifdef HAVE_SENDMSG 1309 1310 int 1311 sys_sendmsg(tcp) 1312 struct tcb *tcp; 1313 { 1314 if (entering(tcp)) { 1315 tprintf("%ld, ", tcp->u_arg[0]); 1316 printmsghdr(tcp, tcp->u_arg[1]); 1317 /* flags */ 1318 tprintf(", "); 1319 printflags(msg_flags, tcp->u_arg[2], "MSG_???"); 1320 } 1321 return 0; 1322 } 1323 1324 #endif /* HAVE_SENDMSG */ 1325 1326 int 1327 sys_recv(tcp) 1328 struct tcb *tcp; 1329 { 1330 if (entering(tcp)) { 1331 tprintf("%ld, ", tcp->u_arg[0]); 1332 } else { 1333 if (syserror(tcp)) 1334 tprintf("%#lx", tcp->u_arg[1]); 1335 else 1336 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 1337 1338 tprintf(", %lu, ", tcp->u_arg[2]); 1339 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1340 } 1341 return 0; 1342 } 1343 1344 int 1345 sys_recvfrom(tcp) 1346 struct tcb *tcp; 1347 { 1348 int fromlen; 1349 1350 if (entering(tcp)) { 1351 tprintf("%ld, ", tcp->u_arg[0]); 1352 } else { 1353 if (syserror(tcp)) { 1354 tprintf("%#lx, %lu, %lu, %#lx, %#lx", 1355 tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3], 1356 tcp->u_arg[4], tcp->u_arg[5]); 1357 return 0; 1358 } 1359 /* buf */ 1360 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 1361 /* len */ 1362 tprintf(", %lu, ", tcp->u_arg[2]); 1363 /* flags */ 1364 printflags(msg_flags, tcp->u_arg[3], "MSG_???"); 1365 /* from address, len */ 1366 if (!tcp->u_arg[4] || !tcp->u_arg[5]) { 1367 if (tcp->u_arg[4] == 0) 1368 tprintf(", NULL"); 1369 else 1370 tprintf(", %#lx", tcp->u_arg[4]); 1371 if (tcp->u_arg[5] == 0) 1372 tprintf(", NULL"); 1373 else 1374 tprintf(", %#lx", tcp->u_arg[5]); 1375 return 0; 1376 } 1377 if (umove(tcp, tcp->u_arg[5], &fromlen) < 0) { 1378 tprintf(", {...}, [?]"); 1379 return 0; 1380 } 1381 tprintf(", "); 1382 printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]); 1383 /* from length */ 1384 tprintf(", [%u]", fromlen); 1385 } 1386 return 0; 1387 } 1388 1389 #ifdef HAVE_SENDMSG 1390 1391 int 1392 sys_recvmsg(tcp) 1393 struct tcb *tcp; 1394 { 1395 if (entering(tcp)) { 1396 tprintf("%ld, ", tcp->u_arg[0]); 1397 } else { 1398 if (syserror(tcp) || !verbose(tcp)) 1399 tprintf("%#lx", tcp->u_arg[1]); 1400 else 1401 printmsghdr(tcp, tcp->u_arg[1]); 1402 /* flags */ 1403 tprintf(", "); 1404 printflags(msg_flags, tcp->u_arg[2], "MSG_???"); 1405 } 1406 return 0; 1407 } 1408 1409 #endif /* HAVE_SENDMSG */ 1410 1411 int 1412 sys_shutdown(tcp) 1413 struct tcb *tcp; 1414 { 1415 if (entering(tcp)) { 1416 tprintf("%ld, %ld", tcp->u_arg[0], tcp->u_arg[1]); 1417 switch (tcp->u_arg[1]) { 1418 case 0: 1419 tprintf("%s", " /* receive */"); 1420 break; 1421 case 1: 1422 tprintf("%s", " /* send */"); 1423 break; 1424 case 2: 1425 tprintf("%s", " /* send and receive */"); 1426 break; 1427 } 1428 } 1429 return 0; 1430 } 1431 1432 int 1433 sys_getsockname(tcp) 1434 struct tcb *tcp; 1435 { 1436 return sys_accept(tcp); 1437 } 1438 1439 int 1440 sys_getpeername(tcp) 1441 struct tcb *tcp; 1442 { 1443 return sys_accept(tcp); 1444 } 1445 1446 int 1447 sys_pipe(tcp) 1448 struct tcb *tcp; 1449 { 1450 1451 #if defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64) 1452 int fds[2]; 1453 1454 if (exiting(tcp)) { 1455 if (syserror(tcp)) { 1456 tprintf("%#lx", tcp->u_arg[0]); 1457 return 0; 1458 } 1459 if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0) 1460 tprintf("[...]"); 1461 else 1462 tprintf("[%u, %u]", fds[0], fds[1]); 1463 } 1464 #elif defined(SPARC) || defined(SPARC64) || defined(SH) || defined(SVR4) || defined(FREEBSD) || defined(IA64) 1465 if (exiting(tcp)) 1466 tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp)); 1467 #endif 1468 return 0; 1469 } 1470 1471 int 1472 sys_socketpair(tcp) 1473 struct tcb *tcp; 1474 { 1475 #ifdef LINUX 1476 int fds[2]; 1477 #endif 1478 1479 if (entering(tcp)) { 1480 printxval(domains, tcp->u_arg[0], "PF_???"); 1481 tprintf(", "); 1482 printxval(socktypes, tcp->u_arg[1], "SOCK_???"); 1483 tprintf(", "); 1484 switch (tcp->u_arg[0]) { 1485 case PF_INET: 1486 printxval(protocols, tcp->u_arg[2], "IPPROTO_???"); 1487 break; 1488 #ifdef PF_IPX 1489 case PF_IPX: 1490 /* BTW: I don't believe this.. */ 1491 tprintf("["); 1492 printxval(domains, tcp->u_arg[2], "PF_???"); 1493 tprintf("]"); 1494 break; 1495 #endif /* PF_IPX */ 1496 default: 1497 tprintf("%lu", tcp->u_arg[2]); 1498 break; 1499 } 1500 } else { 1501 if (syserror(tcp)) { 1502 tprintf(", %#lx", tcp->u_arg[3]); 1503 return 0; 1504 } 1505 #ifdef LINUX 1506 if (umoven(tcp, tcp->u_arg[3], sizeof fds, (char *) fds) < 0) 1507 tprintf(", [...]"); 1508 else 1509 tprintf(", [%u, %u]", fds[0], fds[1]); 1510 #endif /* LINUX */ 1511 #if defined(SUNOS4) || defined(SVR4) || defined(FREEBSD) 1512 tprintf(", [%lu, %lu]", tcp->u_rval, getrval2(tcp)); 1513 #endif /* SUNOS4 || SVR4 || FREEBSD */ 1514 } 1515 return 0; 1516 } 1517 1518 int 1519 sys_getsockopt(tcp) 1520 struct tcb *tcp; 1521 { 1522 if (entering(tcp)) { 1523 tprintf("%ld, ", tcp->u_arg[0]); 1524 printxval(socketlayers, tcp->u_arg[1], "SOL_???"); 1525 tprintf (", "); 1526 switch (tcp->u_arg[1]) { 1527 case SOL_SOCKET: 1528 printxval(sockoptions, tcp->u_arg[2], "SO_???"); 1529 break; 1530 #ifdef SOL_IP 1531 case SOL_IP: 1532 printxval(sockipoptions, tcp->u_arg[2], "IP_???"); 1533 break; 1534 #endif 1535 #ifdef SOL_IPV6 1536 case SOL_IPV6: 1537 printxval(sockipv6options, tcp->u_arg[2], "IPV6_???"); 1538 break; 1539 #endif 1540 #ifdef SOL_IPX 1541 case SOL_IPX: 1542 printxval(sockipxoptions, tcp->u_arg[2], "IPX_???"); 1543 break; 1544 #endif 1545 #ifdef SOL_PACKET 1546 case SOL_PACKET: 1547 printxval(sockpacketoptions, tcp->u_arg[2], "PACKET_???"); 1548 break; 1549 #endif 1550 #ifdef SOL_TCP 1551 case SOL_TCP: 1552 printxval(socktcpoptions, tcp->u_arg[2], "TCP_???"); 1553 break; 1554 #endif 1555 1556 /* SOL_AX25 SOL_ROSE SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25 1557 * etc. still need work */ 1558 default: 1559 tprintf("%lu", tcp->u_arg[2]); 1560 break; 1561 } 1562 } else { 1563 int len; 1564 if (syserror(tcp) || umove (tcp, tcp->u_arg[4], &len) < 0) { 1565 tprintf(", %#lx, %#lx", 1566 tcp->u_arg[3], tcp->u_arg[4]); 1567 return 0; 1568 } 1569 1570 switch (tcp->u_arg[1]) { 1571 case SOL_SOCKET: 1572 switch (tcp->u_arg[2]) { 1573 #ifdef SO_LINGER 1574 case SO_LINGER: 1575 if (len == sizeof (struct linger)) { 1576 struct linger linger; 1577 if (umove (tcp, 1578 tcp->u_arg[3], 1579 &linger) < 0) 1580 break; 1581 tprintf(", {onoff=%d, linger=%d}, " 1582 "[%d]", 1583 linger.l_onoff, 1584 linger.l_linger, 1585 len); 1586 return 0; 1587 } 1588 break; 1589 #endif 1590 } 1591 break; 1592 } 1593 1594 tprintf (", "); 1595 if (len == sizeof (int)) { 1596 printnum(tcp, tcp->u_arg[3], "%ld"); 1597 } 1598 else { 1599 printstr (tcp, tcp->u_arg[3], len); 1600 } 1601 tprintf(", [%d]", len); 1602 } 1603 return 0; 1604 } 1605 1606 #if defined(ICMP_FILTER) 1607 static void printicmpfilter(tcp, addr) 1608 struct tcb *tcp; 1609 long addr; 1610 { 1611 struct icmp_filter filter; 1612 1613 if (!addr) { 1614 tprintf("NULL"); 1615 return; 1616 } 1617 if (syserror(tcp) || !verbose(tcp)) { 1618 tprintf("%#lx", addr); 1619 return; 1620 } 1621 if (umove(tcp, addr, &filter) < 0) { 1622 tprintf("{...}"); 1623 return; 1624 } 1625 1626 tprintf("~("); 1627 printflags(icmpfilterflags, ~filter.data, "ICMP_???"); 1628 tprintf(")"); 1629 } 1630 #endif /* ICMP_FILTER */ 1631 1632 static int 1633 printsockopt (tcp, level, name, addr, len) 1634 struct tcb *tcp; 1635 int level; 1636 int name; 1637 long addr; 1638 int len; 1639 { 1640 printxval(socketlayers, level, "SOL_??"); 1641 tprintf (", "); 1642 switch (level) { 1643 case SOL_SOCKET: 1644 printxval(sockoptions, name, "SO_???"); 1645 switch (name) { 1646 #if defined(SO_LINGER) 1647 case SO_LINGER: 1648 if (len == sizeof (struct linger)) { 1649 struct linger linger; 1650 if (umove (tcp, addr, &linger) < 0) 1651 break; 1652 tprintf(", {onoff=%d, linger=%d}", 1653 linger.l_onoff, 1654 linger.l_linger); 1655 return 0; 1656 } 1657 break; 1658 #endif 1659 } 1660 break; 1661 #ifdef SOL_IP 1662 case SOL_IP: 1663 printxval(sockipoptions, name, "IP_???"); 1664 break; 1665 #endif 1666 #ifdef SOL_IPV6 1667 case SOL_IPV6: 1668 printxval(sockipv6options, name, "IPV6_???"); 1669 break; 1670 #endif 1671 #ifdef SOL_IPX 1672 case SOL_IPX: 1673 printxval(sockipxoptions, name, "IPX_???"); 1674 break; 1675 #endif 1676 #ifdef SOL_PACKET 1677 case SOL_PACKET: 1678 printxval(sockpacketoptions, name, "PACKET_???"); 1679 /* TODO: decode packate_mreq for PACKET_*_MEMBERSHIP */ 1680 break; 1681 #endif 1682 #ifdef SOL_TCP 1683 case SOL_TCP: 1684 printxval(socktcpoptions, name, "TCP_???"); 1685 break; 1686 #endif 1687 #ifdef SOL_RAW 1688 case SOL_RAW: 1689 printxval(sockrawoptions, name, "RAW_???"); 1690 switch (name) { 1691 #if defined(ICMP_FILTER) 1692 case ICMP_FILTER: 1693 tprintf(", "); 1694 printicmpfilter(tcp, addr); 1695 return 0; 1696 #endif 1697 } 1698 break; 1699 #endif 1700 1701 /* SOL_AX25 SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25 1702 * etc. still need work */ 1703 1704 default: 1705 tprintf("%u", name); 1706 } 1707 1708 /* default arg printing */ 1709 1710 tprintf (", "); 1711 1712 if (len == sizeof (int)) { 1713 printnum(tcp, addr, "%ld"); 1714 } 1715 else { 1716 printstr (tcp, addr, len); 1717 } 1718 return 0; 1719 } 1720 1721 1722 #ifdef HAVE_STRUCT_OPTHDR 1723 1724 void 1725 print_sock_optmgmt (tcp, addr, len) 1726 struct tcb *tcp; 1727 long addr; 1728 int len; 1729 { 1730 int c = 0; 1731 struct opthdr hdr; 1732 1733 while (len >= (int) sizeof hdr) { 1734 if (umove(tcp, addr, &hdr) < 0) break; 1735 if (c++) { 1736 tprintf (", "); 1737 } 1738 else if (len > hdr.len + sizeof hdr) { 1739 tprintf ("["); 1740 } 1741 tprintf ("{"); 1742 addr += sizeof hdr; 1743 len -= sizeof hdr; 1744 printsockopt (tcp, hdr.level, hdr.name, addr, hdr.len); 1745 if (hdr.len > 0) { 1746 addr += hdr.len; 1747 len -= hdr.len; 1748 } 1749 tprintf ("}"); 1750 } 1751 if (len > 0) { 1752 if (c++) tprintf (", "); 1753 printstr (tcp, addr, len); 1754 } 1755 if (c > 1) tprintf ("]"); 1756 } 1757 1758 #endif 1759 1760 int 1761 sys_setsockopt(tcp) 1762 struct tcb *tcp; 1763 { 1764 if (entering(tcp)) { 1765 tprintf("%ld, ", tcp->u_arg[0]); 1766 printsockopt (tcp, tcp->u_arg[1], tcp->u_arg[2], 1767 tcp->u_arg[3], tcp->u_arg[4]); 1768 tprintf(", %lu", tcp->u_arg[4]); 1769 } 1770 return 0; 1771 } 1772 1773 #if UNIXWARE >= 7 1774 1775 static const struct xlat sock_version[] = { 1776 { __NETLIB_UW211_SVR4, "UW211_SVR4" }, 1777 { __NETLIB_UW211_XPG4, "UW211_XPG4" }, 1778 { __NETLIB_GEMINI_SVR4, "GEMINI_SVR4" }, 1779 { __NETLIB_GEMINI_XPG4, "GEMINI_XPG4" }, 1780 { __NETLIB_FP1_SVR4, "FP1_SVR4" }, 1781 { __NETLIB_FP1_XPG4, "FP1_XPG4" }, 1782 { 0, NULL }, 1783 }; 1784 1785 1786 int 1787 netlib_call(tcp, func) 1788 struct tcb *tcp; 1789 int (*func) (); 1790 { 1791 if (entering(tcp)) { 1792 int i; 1793 printxval (sock_version, tcp->u_arg[0], "__NETLIB_???"); 1794 tprintf(", "); 1795 --tcp->u_nargs; 1796 for (i = 0; i < tcp->u_nargs; i++) 1797 tcp->u_arg[i] = tcp->u_arg[i + 1]; 1798 return func (tcp); 1799 1800 } 1801 1802 return func (tcp); 1803 } 1804 1805 int 1806 sys_xsocket(tcp) 1807 struct tcb *tcp; 1808 { 1809 return netlib_call (tcp, sys_socket); 1810 } 1811 1812 int 1813 sys_xsocketpair(tcp) 1814 struct tcb *tcp; 1815 { 1816 return netlib_call (tcp, sys_socketpair); 1817 } 1818 1819 int 1820 sys_xbind(tcp) 1821 struct tcb *tcp; 1822 { 1823 return netlib_call (tcp, sys_bind); 1824 } 1825 1826 int 1827 sys_xconnect(tcp) 1828 struct tcb *tcp; 1829 { 1830 return netlib_call (tcp, sys_connect); 1831 } 1832 1833 int 1834 sys_xlisten(tcp) 1835 struct tcb *tcp; 1836 { 1837 return netlib_call (tcp, sys_listen); 1838 } 1839 1840 int 1841 sys_xaccept(tcp) 1842 struct tcb *tcp; 1843 { 1844 return netlib_call (tcp, sys_accept); 1845 } 1846 1847 int 1848 sys_xsendmsg(tcp) 1849 struct tcb *tcp; 1850 { 1851 return netlib_call (tcp, sys_sendmsg); 1852 } 1853 1854 int 1855 sys_xrecvmsg(tcp) 1856 struct tcb *tcp; 1857 { 1858 return netlib_call (tcp, sys_recvmsg); 1859 } 1860 1861 int 1862 sys_xgetsockaddr(tcp) 1863 struct tcb *tcp; 1864 { 1865 if (entering(tcp)) { 1866 printxval (sock_version, tcp->u_arg[0], "__NETLIB_???"); 1867 tprintf(", "); 1868 if (tcp->u_arg[1] == 0) { 1869 tprintf ("LOCALNAME, "); 1870 } 1871 else if (tcp->u_arg[1] == 1) { 1872 tprintf ("REMOTENAME, "); 1873 } 1874 else { 1875 tprintf ("%ld, ", tcp->u_arg [1]); 1876 } 1877 tprintf ("%ld, ", tcp->u_arg [2]); 1878 } 1879 else { 1880 if (tcp->u_arg[3] == 0 || syserror(tcp)) { 1881 tprintf("%#lx", tcp->u_arg[3]); 1882 } else { 1883 printsock(tcp, tcp->u_arg[3], tcp->u_arg[4]); 1884 } 1885 tprintf(", "); 1886 printnum(tcp, tcp->u_arg[4], "%lu"); 1887 } 1888 1889 return 0; 1890 1891 } 1892 1893 #if 0 1894 1895 int 1896 sys_xsetsockaddr(tcp) 1897 struct tcb *tcp; 1898 { 1899 return netlib_call (tcp, sys_setsockaddr); 1900 } 1901 1902 #endif 1903 1904 int 1905 sys_xgetsockopt(tcp) 1906 struct tcb *tcp; 1907 { 1908 return netlib_call (tcp, sys_getsockopt); 1909 } 1910 1911 int 1912 sys_xsetsockopt(tcp) 1913 struct tcb *tcp; 1914 { 1915 return netlib_call (tcp, sys_setsockopt); 1916 } 1917 1918 int 1919 sys_xshutdown(tcp) 1920 struct tcb *tcp; 1921 { 1922 return netlib_call (tcp, sys_shutdown); 1923 } 1924 1925 #endif 1926