net.c revision efdecacc5d7f91c17adb7cdb1dd7306ea6d22c9f
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#include <netinet/in.h> 39#ifdef FREEBSD 40#include <netinet/tcp.h> 41#endif 42#include <arpa/inet.h> 43#if defined(LINUX) 44#include <asm/types.h> 45#if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC__ + __GLIBC_MINOR__ >= 3) 46# include <netipx/ipx.h> 47#else 48# include <linux/ipx.h> 49#endif 50#endif /* LINUX */ 51 52#if defined (__GLIBC__) && ((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1)) 53#if defined(HAVE_LINUX_IN6_H) 54#include <linux/in6.h> 55#endif 56#endif 57 58#if defined(HAVE_SYS_UIO_H) 59#include <sys/uio.h> 60#endif 61 62#if defined(HAVE_LINUX_NETLINK_H) 63#include <linux/netlink.h> 64#endif 65 66#if defined(HAVE_LINUX_IF_PACKET_H) 67#include <linux/if_packet.h> 68#endif 69 70#if defined(HAVE_LINUX_ICMP_H) 71#include <linux/icmp.h> 72#endif 73 74#ifndef PF_UNSPEC 75#define PF_UNSPEC AF_UNSPEC 76#endif 77 78#if UNIXWARE >= 7 79#define HAVE_SENDMSG 1 /* HACK - *FIXME* */ 80#endif 81 82#ifdef LINUX 83/* Under Linux these are enums so we can't test for them with ifdef. */ 84#define IPPROTO_EGP IPPROTO_EGP 85#define IPPROTO_PUP IPPROTO_PUP 86#define IPPROTO_IDP IPPROTO_IDP 87#define IPPROTO_IGMP IPPROTO_IGMP 88#define IPPROTO_RAW IPPROTO_RAW 89#define IPPROTO_MAX IPPROTO_MAX 90#endif 91 92static struct xlat domains[] = { 93 { PF_UNSPEC, "PF_UNSPEC" }, 94 { PF_UNIX, "PF_UNIX" }, 95 { PF_INET, "PF_INET" }, 96#ifdef PF_NETLINK 97 { PF_NETLINK, "PF_NETLINK" }, 98#endif 99#ifdef PF_PACKET 100 { PF_PACKET, "PF_PACKET" }, 101#endif 102#ifdef PF_INET6 103 { PF_INET6, "PF_INET6" }, 104#endif 105#ifdef PF_ATMSVC 106 { PF_ATMSVC, "PF_INET6" }, 107#endif 108#ifdef PF_INET6 109 { PF_INET6, "PF_INET6" }, 110#endif 111#ifdef PF_LOCAL 112 { PF_LOCAL, "PS_LOCAL" }, 113#endif 114#ifdef PF_ISO 115 { PF_ISO, "PF_ISO" }, 116#endif 117#ifdef PF_AX25 118 { PF_AX25, "PF_AX25" }, 119#endif 120#ifdef PF_IPX 121 { PF_IPX, "PF_IPX" }, 122#endif 123#ifdef PF_APPLETALK 124 { PF_APPLETALK, "PF_APPLETALK" }, 125#endif 126#ifdef PF_NETROM 127 { PF_NETROM, "PF_NETROM" }, 128#endif 129#ifdef PF_BRIDGE 130 { PF_BRIDGE, "PF_BRIDGE" }, 131#endif 132#ifdef PF_AAL5 133 { PF_AAL5, "PF_AAL5" }, 134#endif 135#ifdef PF_X25 136 { PF_X25, "PF_X25" }, 137#endif 138#ifdef PF_ROSE 139 { PF_ROSE, "PF_ROSE" }, 140#endif 141#ifdef PF_DECNET 142 { PF_DECNET, "PF_DECNET" }, 143#endif 144#ifdef PF_NETBEUI 145 { PF_NETBEUI, "PF_NETBEUI" }, 146#endif 147#ifdef PF_IMPLINK 148 { PF_IMPLINK, "PF_IMPLINK" }, 149#endif 150 { 0, NULL }, 151}; 152static struct xlat addrfams[] = { 153 { AF_UNSPEC, "AF_UNSPEC" }, 154 { AF_UNIX, "AF_UNIX" }, 155 { AF_INET, "AF_INET" }, 156#ifdef AF_INET6 157 { AF_INET6, "AF_INET6" }, 158#endif 159 { AF_DECnet, "AF_DECnet" }, 160#ifdef PF_ATMSVC 161 { AF_ATMSVC, "AF_ATMSVC" }, 162#endif 163#ifdef AF_PACKET 164 { AF_PACKET, "AF_PACKET" }, 165#endif 166#ifdef AF_NETLINK 167 { AF_NETLINK, "AF_NETLINK" }, 168#endif 169#ifdef AF_ISO 170 { AF_ISO, "AF_ISO" }, 171#endif 172#ifdef AF_IMPLINK 173 { AF_IMPLINK, "AF_IMPLINK" }, 174#endif 175 { 0, NULL }, 176}; 177static struct xlat socktypes[] = { 178 { SOCK_STREAM, "SOCK_STREAM" }, 179 { SOCK_DGRAM, "SOCK_DGRAM" }, 180#ifdef SOCK_RAW 181 { SOCK_RAW, "SOCK_RAW" }, 182#endif 183#ifdef SOCK_SEQPACKET 184 { SOCK_SEQPACKET,"SOCK_SEQPACKET"}, 185#endif 186#ifdef SOCK_RDM 187 { SOCK_RDM, "SOCK_RDM" }, 188#endif 189#ifdef SOCK_PACKET 190 { SOCK_PACKET, "SOCK_PACKET" }, 191#endif 192 { 0, NULL }, 193}; 194static struct xlat socketlayers[] = { 195 { SOL_IP, "SOL_IP" }, 196#if defined(SOL_ICMP) 197 { SOL_ICMP, "SOL_ICMP" }, 198#endif 199 { SOL_TCP, "SOL_TCP" }, 200 { SOL_UDP, "SOL_UDP" }, 201#if defined(SOL_IPV6) 202 { SOL_IPV6, "SOL_IPV6" }, 203#endif 204#if defined(SOL_ICMPV6) 205 { SOL_ICMPV6, "SOL_ICMPV6" }, 206#endif 207#if defined(SOL_RAW) 208 { SOL_RAW, "SOL_RAW" }, 209#endif 210#if defined(SOL_IPX) 211 { SOL_IPX, "SOL_IPX" }, 212#endif 213#if defined(SOL_IPX) 214 { SOL_IPX, "SOL_IPX" }, 215#endif 216#if defined(SOL_AX25) 217 { SOL_AX25, "SOL_AX25" }, 218#endif 219#if defined(SOL_ATALK) 220 { SOL_ATALK, "SOL_ATALK" }, 221#endif 222#if defined(SOL_NETROM) 223 { SOL_NETROM, "SOL_NETROM" }, 224#endif 225#if defined(SOL_ROSE) 226 { SOL_ROSE, "SOL_ROSE" }, 227#endif 228#if defined(SOL_DECNET) 229 { SOL_DECNET, "SOL_DECNET" }, 230#endif 231#if defined(SOL_X25) 232 { SOL_X25, "SOL_X25" }, 233#endif 234#if defined(SOL_PACKET) 235 { SOL_PACKET, "SOL_PACKET" }, 236#endif 237#if defined(SOL_ATM) 238 { SOL_ATM, "SOL_ATM" }, 239#endif 240#if defined(SOL_AAL) 241 { SOL_AAL, "SOL_AAL" }, 242#endif 243#if defined(SOL_IRDA) 244 { SOL_IRDA, "SOL_IRDA" }, 245#endif 246}; 247static struct xlat protocols[] = { 248 { IPPROTO_IP, "IPPROTO_IP" }, 249 { IPPROTO_ICMP, "IPPROTO_ICMP" }, 250 { IPPROTO_TCP, "IPPROTO_TCP" }, 251 { IPPROTO_UDP, "IPPROTO_UDP" }, 252#ifdef IPPROTO_GGP 253 { IPPROTO_GGP, "IPPROTO_GGP" }, 254#endif 255#ifdef IPPROTO_EGP 256 { IPPROTO_EGP, "IPPROTO_EGP" }, 257#endif 258#ifdef IPPROTO_PUP 259 { IPPROTO_PUP, "IPPROTO_PUP" }, 260#endif 261#ifdef IPPROTO_IDP 262 { IPPROTO_IDP, "IPPROTO_IDP" }, 263#endif 264#ifdef IPPROTO_IPV6 265 { IPPROTO_IPV6, "IPPROTO_IPV6" }, 266#endif 267#ifdef IPPROTO_ICMPV6 268 { IPPROTO_ICMPV6,"IPPROTO_ICMPV6"}, 269#endif 270#ifdef IPPROTO_IGMP 271 { IPPROTO_IGMP, "IPPROTO_IGMP" }, 272#endif 273#ifdef IPPROTO_HELLO 274 { IPPROTO_HELLO,"IPPROTO_HELLO" }, 275#endif 276#ifdef IPPROTO_ND 277 { IPPROTO_ND, "IPPROTO_ND" }, 278#endif 279#ifdef IPPROTO_RAW 280 { IPPROTO_RAW, "IPPROTO_RAW" }, 281#endif 282#ifdef IPPROTO_MAX 283 { IPPROTO_MAX, "IPPROTO_MAX" }, 284#endif 285#ifdef IPPROTO_IPIP 286 { IPPROTO_IPIP, "IPPROTO_IPIP" }, 287#endif 288 { 0, NULL }, 289}; 290static struct xlat msg_flags[] = { 291 { MSG_OOB, "MSG_OOB" }, 292#ifdef MSG_DONTROUTE 293 { MSG_DONTROUTE,"MSG_DONTROUTE" }, 294#endif 295#ifdef MSG_PEEK 296 { MSG_PEEK, "MSG_PEEK" }, 297#endif 298#ifdef MSG_CTRUNC 299 { MSG_CTRUNC, "MSG_CTRUNC" }, 300#endif 301#ifdef MSG_PROXY 302 { MSG_PROXY, "MSG_PROXY" }, 303#endif 304#ifdef MSG_EOR 305 { MSG_EOR, "MSG_EOR" }, 306#endif 307#ifdef MSG_WAITALL 308 { MSG_WAITALL, "MSG_WAITALL" }, 309#endif 310#ifdef MSG_TRUNC 311 { MSG_TRUNC, "MSG_TRUNC" }, 312#endif 313#ifdef MSG_CTRUNC 314 { MSG_CTRUNC, "MSG_CTRUNC" }, 315#endif 316#ifdef MSG_ERRQUEUE 317 { MSG_ERRQUEUE, "MSG_ERRQUEUE" }, 318#endif 319#ifdef MSG_DONTWAIT 320 { MSG_DONTWAIT, "MSG_DONTWAIT" }, 321#endif 322#ifdef MSG_CONFIRM 323 { MSG_CONFIRM, "MSG_CONFIRM" }, 324#endif 325#ifdef MSG_PROBE 326 { MSG_PROBE, "MSG_PROBE" }, 327#endif 328 { 0, NULL }, 329}; 330 331static struct xlat sockoptions[] = { 332#ifdef SO_PEERCRED 333 { SO_PEERCRED, "SO_PEERCRED" }, 334#endif 335#ifdef SO_PASSCRED 336 { SO_PASSCRED, "SO_PASSCRED" }, 337#endif 338#ifdef SO_DEBUG 339 { SO_DEBUG, "SO_DEBUG" }, 340#endif 341#ifdef SO_REUSEADDR 342 { SO_REUSEADDR, "SO_REUSEADDR" }, 343#endif 344#ifdef SO_KEEPALIVE 345 { SO_KEEPALIVE, "SO_KEEPALIVE" }, 346#endif 347#ifdef SO_DONTROUTE 348 { SO_DONTROUTE, "SO_DONTROUTE" }, 349#endif 350#ifdef SO_BROADCAST 351 { SO_BROADCAST, "SO_BROADCAST" }, 352#endif 353#ifdef SO_LINGER 354 { SO_LINGER, "SO_LINGER" }, 355#endif 356#ifdef SO_OOBINLINE 357 { SO_OOBINLINE, "SO_OOBINLINE" }, 358#endif 359#ifdef SO_TYPE 360 { SO_TYPE, "SO_TYPE" }, 361#endif 362#ifdef SO_ERROR 363 { SO_ERROR, "SO_ERROR" }, 364#endif 365#ifdef SO_SNDBUF 366 { SO_SNDBUF, "SO_SNDBUF" }, 367#endif 368#ifdef SO_RCVBUF 369 { SO_RCVBUF, "SO_RCVBUF" }, 370#endif 371#ifdef SO_NO_CHECK 372 { SO_NO_CHECK, "SO_NO_CHECK" }, 373#endif 374#ifdef SO_PRIORITY 375 { SO_PRIORITY, "SO_PRIORITY" }, 376#endif 377#ifdef SO_ACCEPTCONN 378 { SO_ACCEPTCONN,"SO_ACCEPTCONN" }, 379#endif 380#ifdef SO_USELOOPBACK 381 { SO_USELOOPBACK,"SO_USELOOPBACK"}, 382#endif 383#ifdef SO_SNDLOWAT 384 { SO_SNDLOWAT, "SO_SNDLOWAT" }, 385#endif 386#ifdef SO_RCVLOWAT 387 { SO_RCVLOWAT, "SO_RCVLOWAT" }, 388#endif 389#ifdef SO_SNDTIMEO 390 { SO_SNDTIMEO, "SO_SNDTIMEO" }, 391#endif 392#ifdef SO_RCVTIMEO 393 { SO_RCVTIMEO, "SO_RCVTIMEO" }, 394#endif 395#ifdef SO_BSDCOMPAT 396 { SO_BSDCOMPAT, "SO_BSDCOMPAT" }, 397#endif 398#ifdef SO_REUSEPORT 399 { SO_REUSEPORT, "SO_REUSEPORT" }, 400#endif 401#ifdef SO_RCVLOWAT 402 { SO_RCVLOWAT, "SO_RCVLOWAT" }, 403#endif 404#ifdef SO_SNDLOWAT 405 { SO_SNDLOWAT, "SO_SNDLOWAT" }, 406#endif 407#ifdef SO_RCVTIMEO 408 { SO_RCVTIMEO, "SO_RCVTIMEO" }, 409#endif 410#ifdef SO_SNDTIMEO 411 { SO_SNDTIMEO, "SO_SNDTIMEO" }, 412#endif 413 { 0, NULL }, 414}; 415 416#ifdef SOL_IP 417static struct xlat sockipoptions[] = { 418 { IP_TOS, "IP_TOS" }, 419 { IP_TTL, "IP_TTL" }, 420#if defined(IP_HDRINCL) 421 { IP_HDRINCL, "IP_HDRINCL" }, 422#endif 423#if defined(IP_OPTIONS) 424 { IP_OPTIONS, "IP_OPTIONS" }, 425#endif 426 { IP_ROUTER_ALERT, "IP_ROUTER_ALERT" }, 427#if defined(IP_RECVOPTIONS) 428 { IP_RECVOPTIONS, "IP_RECVOPTIONS" }, 429#endif 430 { IP_RETOPTS, "IP_RETOPTS" }, 431 { IP_PKTINFO, "IP_PKTINFO" }, 432 { IP_PKTOPTIONS, "IP_PKTOPTIONS" }, 433 { IP_MTU_DISCOVER, "IP_MTU_DISCOVER" }, 434 { IP_MTU_DISCOVER, "IP_MTU_DISCOVER" }, 435 { IP_RECVERR, "IP_RECVERR" }, 436 { IP_RECVTTL, "IP_RECRECVTTL" }, 437 { IP_RECVTOS, "IP_RECRECVTOS" }, 438#if defined(IP_MTU) 439 { IP_MTU, "IP_MTU" }, 440#endif 441 { IP_MULTICAST_IF, "IP_MULTICAST_IF" }, 442 { IP_MULTICAST_TTL, "IP_MULTICAST_TTL" }, 443 { IP_MULTICAST_LOOP, "IP_MULTICAST_LOOP" }, 444 { IP_ADD_MEMBERSHIP, "IP_ADD_MEMBERSHIP" }, 445 { IP_DROP_MEMBERSHIP, "IP_DROP_MEMBERSHIP" }, 446 { 0, NULL }, 447}; 448#endif /* SOL_IP */ 449 450#ifdef SOL_IPX 451static struct xlat sockipxoptions[] = { 452 { IPX_TYPE, "IPX_TYPE" }, 453 { 0, NULL }, 454}; 455#endif /* SOL_IPX */ 456 457#ifdef SOL_RAW 458static struct xlat sockrawoptions[] = { 459#if defined(ICMP_FILTER) 460 { ICMP_FILTER, "ICMP_FILTER" }, 461#endif 462 { 0, NULL }, 463}; 464#endif /* SOL_RAW */ 465 466#ifdef SOL_PACKET 467static struct xlat sockpacketoptions[] = { 468 { PACKET_ADD_MEMBERSHIP, "PACKET_ADD_MEMBERSHIP" }, 469 { PACKET_DROP_MEMBERSHIP, "PACKET_DROP_MEMBERSHIP"}, 470#if defined(PACKET_RECV_OUTPUT) 471 { PACKET_RECV_OUTPUT, "PACKET_RECV_OUTPUT" }, 472#endif 473#if defined(PACKET_RX_RING) 474 { PACKET_RX_RING, "PACKET_RX_RING" }, 475#endif 476#if defined(PACKET_STATISTICS) 477 { PACKET_STATISTICS, "PACKET_STATISTICS" }, 478#endif 479 { 0, NULL }, 480}; 481#endif /* SOL_PACKET */ 482 483#ifdef SOL_TCP 484static struct xlat socktcpoptions[] = { 485 { TCP_NODELAY, "TCP_NODELAY" }, 486 { TCP_MAXSEG, "TCP_MAXSEG" }, 487#if defined(TCP_CORK) 488 { TCP_CORK, "TCP_CORK" }, 489#endif 490 { 0, NULL }, 491}; 492#endif /* SOL_TCP */ 493 494#ifdef SOL_RAW 495static struct xlat icmpfilterflags[] = { 496#if defined(ICMP_ECHOREPLY) 497 { (1<<ICMP_ECHOREPLY), "ICMP_ECHOREPLY" }, 498#endif 499#if defined(ICMP_DEST_UNREACH) 500 { (1<<ICMP_DEST_UNREACH), "ICMP_DEST_UNREACH" }, 501#endif 502#if defined(ICMP_SOURCE_QUENCH) 503 { (1<<ICMP_SOURCE_QUENCH), "ICMP_SOURCE_QUENCH" }, 504#endif 505#if defined(ICMP_REDIRECT) 506 { (1<<ICMP_REDIRECT), "ICMP_REDIRECT" }, 507#endif 508#if defined(ICMP_ECHO) 509 { (1<<ICMP_ECHO), "ICMP_ECHO" }, 510#endif 511#if defined(ICMP_TIME_EXCEEDED) 512 { (1<<ICMP_TIME_EXCEEDED), "ICMP_TIME_EXCEEDED" }, 513#endif 514#if defined(ICMP_PARAMETERPROB) 515 { (1<<ICMP_PARAMETERPROB), "ICMP_PARAMETERPROB" }, 516#endif 517#if defined(ICMP_TIMESTAMP) 518 { (1<<ICMP_TIMESTAMP), "ICMP_TIMESTAMP" }, 519#endif 520#if defined(ICMP_TIMESTAMPREPLY) 521 { (1<<ICMP_TIMESTAMPREPLY), "ICMP_TIMESTAMPREPLY" }, 522#endif 523#if defined(ICMP_INFO_REQUEST) 524 { (1<<ICMP_INFO_REQUEST), "ICMP_INFO_REQUEST" }, 525#endif 526#if defined(ICMP_INFO_REPLY) 527 { (1<<ICMP_INFO_REPLY), "ICMP_INFO_REPLY" }, 528#endif 529#if defined(ICMP_ADDRESS) 530 { (1<<ICMP_ADDRESS), "ICMP_ADDRESS" }, 531#endif 532#if defined(ICMP_ADDRESSREPLY) 533 { (1<<ICMP_ADDRESSREPLY), "ICMP_ADDRESSREPLY" }, 534#endif 535 { 0, NULL }, 536}; 537#endif /* SOL_RAW */ 538 539 540void 541printsock(tcp, addr, addrlen) 542struct tcb *tcp; 543long addr; 544int addrlen; 545{ 546 union { 547 char pad[128]; 548 struct sockaddr sa; 549 struct sockaddr_in sin; 550 struct sockaddr_un sau; 551#ifdef HAVE_INET_NTOP 552 struct sockaddr_in6 sa6; 553#endif 554#if defined(LINUX) && defined(AF_IPX) 555 struct sockaddr_ipx sipx; 556#endif 557#ifdef AF_PACKET 558 struct sockaddr_ll ll; 559#endif 560#ifdef AF_NETLINK 561 struct sockaddr_nl nl; 562#endif 563 } addrbuf; 564 char string_addr[100]; 565 566 if (addr == 0) { 567 tprintf("NULL"); 568 return; 569 } 570 if (!verbose(tcp)) { 571 tprintf("%#lx", addr); 572 return; 573 } 574 if ((addrlen<2) || (addrlen>sizeof(addrbuf))) 575 addrlen=sizeof(addrbuf); 576 577 if (umoven(tcp, addr, addrlen, (char*)&addrbuf) < 0) { 578 tprintf("{...}"); 579 return; 580 } 581 582 tprintf("{sin_family="); 583 printxval(addrfams, addrbuf.sa.sa_family, "AF_???"); 584 tprintf(", "); 585 586 switch (addrbuf.sa.sa_family) { 587 case AF_UNIX: 588 if (addrlen==2) { 589 tprintf("<nil>"); 590 } else if (addrbuf.sau.sun_path[0]) { 591 tprintf("path=\"%*.*s\"", addrlen-2, addrlen-2, addrbuf.sau.sun_path); 592 } else { 593 tprintf("path=@%*.*s", addrlen-3, addrlen-3, addrbuf.sau.sun_path+1); 594 } 595 break; 596 case AF_INET: 597 tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")}", 598 ntohs(addrbuf.sin.sin_port), inet_ntoa(addrbuf.sin.sin_addr)); 599 break; 600#ifdef HAVE_INET_NTOP 601 case AF_INET6: 602 inet_ntop(AF_INET6, &addrbuf.sa6.sin6_addr, string_addr, sizeof(string_addr)); 603 tprintf("sin6_port=htons(%u), inet_pton(AF_INET6, \"%s\", &sin6_addr), sin6_flowinfo=htonl(%u)}", 604 ntohs(addrbuf.sa6.sin6_port), string_addr, ntohl(addrbuf.sa6.sin6_flowinfo)); 605 break; 606#endif 607#if defined(AF_IPX) && defined(linux) 608 case AF_IPX: 609 { 610 int i; 611 tprintf("{sipx_port=htons(%u), ", 612 ntohs(addrbuf.sipx.sipx_port)); 613 /* Yes, I know, this does not look too 614 * strace-ish, but otherwise the IPX 615 * addresses just look monstrous... 616 * Anyways, feel free if you don't like 617 * this way.. :) 618 */ 619 tprintf("%08lx:", (unsigned long)ntohl(addrbuf.sipx.sipx_network)); 620 for (i = 0; i<IPX_NODE_LEN; i++) 621 tprintf("%02x", addrbuf.sipx.sipx_node[i]); 622 tprintf("/[%02x]", addrbuf.sipx.sipx_type); 623 } 624 break; 625#endif /* AF_IPX && linux */ 626#ifdef AF_PACKET 627 case AF_PACKET: 628 { 629 int i; 630 tprintf("proto=%#04x, if%d, pkttype=%d, addr(%d)={%d, ", 631 ntohs(addrbuf.ll.sll_protocol), 632 addrbuf.ll.sll_ifindex, 633 addrbuf.ll.sll_pkttype, 634 addrbuf.ll.sll_halen, 635 addrbuf.ll.sll_hatype); 636 for (i=0; i<addrbuf.ll.sll_addr[i]; i++) 637 tprintf("%02x", addrbuf.ll.sll_addr[i]); 638 } 639 break; 640 641#endif /* AF_APACKET */ 642#ifdef AF_NETLINLK 643 case AF_NETLINK: 644 tprintf("pid=%d, groups=%08x", addrbuf.nl.nl_pid, addrbuf.nl.nl_groups); 645 break; 646#endif /* AF_NETLINK */ 647 /* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5 648 AF_X25 AF_ROSE etc. still need to be done */ 649 650 default: 651 tprintf("{sa_family=%u, sa_data=", addrbuf.sa.sa_family); 652 printstr(tcp, (long) &((struct sockaddr *) addr)->sa_data, 653 sizeof addrbuf.sa.sa_data); 654 break; 655 } 656 tprintf("}"); 657} 658 659#if HAVE_SENDMSG 660 661static void 662printiovec(tcp, iovec, len) 663struct tcb *tcp; 664struct iovec *iovec; 665long len; 666{ 667 struct iovec *iov; 668 int i; 669 670 iov = (struct iovec *) malloc(len * sizeof *iov); 671 if (iov == NULL) { 672 fprintf(stderr, "No memory"); 673 return; 674 } 675 if (umoven(tcp, (long)iovec, 676 len * sizeof *iov, (char *) iov) < 0) { 677 tprintf("%#lx", (unsigned long)iovec); 678 } else { 679 tprintf("["); 680 for (i = 0; i < len; i++) { 681 if (i) 682 tprintf(", "); 683 tprintf("{"); 684 printstr(tcp, (long) iov[i].iov_base, 685 iov[i].iov_len); 686 tprintf(", %lu}", (unsigned long)iov[i].iov_len); 687 } 688 tprintf("]"); 689 } 690 free((char *) iov); 691} 692 693static void 694printmsghdr(tcp, addr) 695struct tcb *tcp; 696long addr; 697{ 698 struct msghdr msg; 699 700 if (umove(tcp, addr, &msg) < 0) { 701 tprintf("%#lx", addr); 702 return; 703 } 704 tprintf("{msg_name(%d)=", msg.msg_namelen); 705 printsock(tcp, (long)msg.msg_name, msg.msg_namelen); 706 707 tprintf(", msg_iov(%lu)=", (unsigned long)msg.msg_iovlen); 708 printiovec(tcp, msg.msg_iov, msg.msg_iovlen); 709 710#ifdef HAVE_MSG_CONTROL 711 tprintf(", msg_controllen=%lu", (unsigned long)msg.msg_controllen); 712 if (msg.msg_controllen) 713 tprintf(", msg_control=%#lx, ", (unsigned long) msg.msg_control); 714 tprintf(", msg_flags="); 715 if (printflags(msg_flags, msg.msg_flags)==0) 716 tprintf("0"); 717#else /* !HAVE_MSG_CONTROL */ 718 tprintf("msg_accrights=%#lx, msg_accrightslen=%u", 719 (unsigned long) msg.msg_accrights, msg.msg_accrightslen); 720#endif /* !HAVE_MSG_CONTROL */ 721 tprintf("}"); 722} 723 724#endif /* HAVE_SENDMSG */ 725 726int 727sys_socket(tcp) 728struct tcb *tcp; 729{ 730 if (entering(tcp)) { 731 printxval(domains, tcp->u_arg[0], "PF_???"); 732 tprintf(", "); 733 printxval(socktypes, tcp->u_arg[1], "SOCK_???"); 734 tprintf(", "); 735 switch (tcp->u_arg[0]) { 736 case PF_INET: 737 printxval(protocols, tcp->u_arg[2], "IPPROTO_???"); 738 break; 739#ifdef PF_IPX 740 case PF_IPX: 741 /* BTW: I don't believe this.. */ 742 tprintf("["); 743 printxval(domains, tcp->u_arg[2], "PF_???"); 744 tprintf("]"); 745 break; 746#endif /* PF_IPX */ 747 default: 748 tprintf("%lu", tcp->u_arg[2]); 749 break; 750 } 751 } 752 return 0; 753} 754 755int 756sys_bind(tcp) 757struct tcb *tcp; 758{ 759 if (entering(tcp)) { 760 tprintf("%ld, ", tcp->u_arg[0]); 761 printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]); 762 tprintf(", %lu", tcp->u_arg[2]); 763 } 764 return 0; 765} 766 767int 768sys_connect(tcp) 769struct tcb *tcp; 770{ 771 return sys_bind(tcp); 772} 773 774int 775sys_listen(tcp) 776struct tcb *tcp; 777{ 778 if (entering(tcp)) { 779 tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]); 780 } 781 return 0; 782} 783 784int 785sys_accept(tcp) 786struct tcb *tcp; 787{ 788 if (entering(tcp)) { 789 tprintf("%ld, ", tcp->u_arg[0]); 790 } else if (!tcp->u_arg[2]) 791 tprintf("%#lx, NULL", tcp->u_arg[1]); 792 else { 793 if (tcp->u_arg[1] == 0 || syserror(tcp)) { 794 tprintf("%#lx", tcp->u_arg[1]); 795 } else { 796 printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]); 797 } 798 tprintf(", "); 799 printnum(tcp, tcp->u_arg[2], "%lu"); 800 } 801 return 0; 802} 803 804int 805sys_send(tcp) 806struct tcb *tcp; 807{ 808 if (entering(tcp)) { 809 tprintf("%ld, ", tcp->u_arg[0]); 810 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 811 tprintf(", %lu, ", tcp->u_arg[2]); 812 /* flags */ 813 if (printflags(msg_flags, tcp->u_arg[3]) == 0) 814 tprintf("0"); 815 } 816 return 0; 817} 818 819int 820sys_sendto(tcp) 821struct tcb *tcp; 822{ 823 if (entering(tcp)) { 824 tprintf("%ld, ", tcp->u_arg[0]); 825 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 826 tprintf(", %lu, ", tcp->u_arg[2]); 827 /* flags */ 828 if (printflags(msg_flags, tcp->u_arg[3]) == 0) 829 tprintf("0"); 830 /* to address */ 831 tprintf(", "); 832 printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]); 833 /* to length */ 834 tprintf(", %lu", tcp->u_arg[5]); 835 } 836 return 0; 837} 838 839#ifdef HAVE_SENDMSG 840 841int 842sys_sendmsg(tcp) 843struct tcb *tcp; 844{ 845 if (entering(tcp)) { 846 tprintf("%ld, ", tcp->u_arg[0]); 847 printmsghdr(tcp, tcp->u_arg[1]); 848 /* flags */ 849 tprintf(", "); 850 if (printflags(msg_flags, tcp->u_arg[2]) == 0) 851 tprintf("0"); 852 } 853 return 0; 854} 855 856#endif /* HAVE_SENDMSG */ 857 858int 859sys_recv(tcp) 860struct tcb *tcp; 861{ 862 if (entering(tcp)) { 863 tprintf("%ld, ", tcp->u_arg[0]); 864 } else { 865 if (syserror(tcp)) 866 tprintf("%#lx", tcp->u_arg[1]); 867 else 868 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 869 870 tprintf(", %lu, ", tcp->u_arg[2]); 871 if (printflags(msg_flags, tcp->u_arg[3]) == 0) 872 tprintf("0"); 873 } 874 return 0; 875} 876 877int 878sys_recvfrom(tcp) 879struct tcb *tcp; 880{ 881 int fromlen; 882 883 if (entering(tcp)) { 884 tprintf("%ld, ", tcp->u_arg[0]); 885 } else { 886 if (syserror(tcp)) { 887 tprintf("%#lx, %lu, %lu, %#lx, %#lx", 888 tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3], 889 tcp->u_arg[4], tcp->u_arg[5]); 890 return 0; 891 } 892 /* buf */ 893 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 894 /* len */ 895 tprintf(", %lu, ", tcp->u_arg[2]); 896 /* flags */ 897 if (printflags(msg_flags, tcp->u_arg[3]) == 0) 898 tprintf("0"); 899 /* from address, len */ 900 if (!tcp->u_arg[4] || !tcp->u_arg[5]) { 901 if (tcp->u_arg[4] == 0) 902 tprintf(", NULL"); 903 else 904 tprintf(", %#lx", tcp->u_arg[4]); 905 if (tcp->u_arg[5] == 0) 906 tprintf(", NULL"); 907 else 908 tprintf(", %#lx", tcp->u_arg[5]); 909 return 0; 910 } 911 if (umove(tcp, tcp->u_arg[5], &fromlen) < 0) { 912 tprintf(", {...}, [?]"); 913 return 0; 914 } 915 tprintf(", "); 916 printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]); 917 /* from length */ 918 tprintf(", [%u]", fromlen); 919 } 920 return 0; 921} 922 923#ifdef HAVE_SENDMSG 924 925int 926sys_recvmsg(tcp) 927struct tcb *tcp; 928{ 929 if (entering(tcp)) { 930 tprintf("%ld, ", tcp->u_arg[0]); 931 } else { 932 if (syserror(tcp) || !verbose(tcp)) 933 tprintf("%#lx", tcp->u_arg[1]); 934 else 935 printmsghdr(tcp, tcp->u_arg[1]); 936 /* flags */ 937 tprintf(", "); 938 if (printflags(msg_flags, tcp->u_arg[2]) == 0) 939 tprintf("0"); 940 } 941 return 0; 942} 943 944#endif /* HAVE_SENDMSG */ 945 946int 947sys_shutdown(tcp) 948struct tcb *tcp; 949{ 950 if (entering(tcp)) { 951 tprintf("%ld, %ld", tcp->u_arg[0], tcp->u_arg[1]); 952 switch (tcp->u_arg[1]) { 953 case 0: 954 tprintf("%s", " /* receive */"); 955 break; 956 case 1: 957 tprintf("%s", " /* send */"); 958 break; 959 case 2: 960 tprintf("%s", " /* send and receive */"); 961 break; 962 } 963 } 964 return 0; 965} 966 967int 968sys_getsockname(tcp) 969struct tcb *tcp; 970{ 971 return sys_accept(tcp); 972} 973 974int 975sys_getpeername(tcp) 976struct tcb *tcp; 977{ 978 return sys_accept(tcp); 979} 980 981int 982sys_pipe(tcp) 983struct tcb *tcp; 984{ 985 986#if defined(LINUX) && !defined(SPARC) 987 int fds[2]; 988 989 if (exiting(tcp)) { 990 if (syserror(tcp)) { 991 tprintf("%#lx", tcp->u_arg[0]); 992 return 0; 993 } 994 if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0) 995 tprintf("[...]"); 996 else 997 tprintf("[%u, %u]", fds[0], fds[1]); 998 } 999#elif defined(SPARC) || defined(SVR4) || defined(FREEBSD) 1000 if (exiting(tcp)) 1001 tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp)); 1002#endif 1003 return 0; 1004} 1005 1006int 1007sys_socketpair(tcp) 1008struct tcb *tcp; 1009{ 1010#ifdef LINUX 1011 int fds[2]; 1012#endif 1013 1014 if (entering(tcp)) { 1015 printxval(domains, tcp->u_arg[0], "PF_???"); 1016 tprintf(", "); 1017 printxval(socktypes, tcp->u_arg[1], "SOCK_???"); 1018 tprintf(", "); 1019 switch (tcp->u_arg[0]) { 1020 case PF_INET: 1021 printxval(protocols, tcp->u_arg[2], "IPPROTO_???"); 1022 break; 1023#ifdef PF_IPX 1024 case PF_IPX: 1025 /* BTW: I don't believe this.. */ 1026 tprintf("["); 1027 printxval(domains, tcp->u_arg[2], "PF_???"); 1028 tprintf("]"); 1029 break; 1030#endif /* PF_IPX */ 1031 default: 1032 tprintf("%lu", tcp->u_arg[2]); 1033 break; 1034 } 1035 } else { 1036 if (syserror(tcp)) { 1037 tprintf(", %#lx", tcp->u_arg[3]); 1038 return 0; 1039 } 1040#ifdef LINUX 1041 if (umoven(tcp, tcp->u_arg[3], sizeof fds, (char *) fds) < 0) 1042 tprintf(", [...]"); 1043 else 1044 tprintf(", [%u, %u]", fds[0], fds[1]); 1045#endif /* LINUX */ 1046#if defined(SUNOS4) || defined(SVR4) || defined(FREEBSD) 1047 tprintf(", [%lu, %lu]", tcp->u_rval, getrval2(tcp)); 1048#endif /* SUNOS4 || SVR4 || FREEBSD */ 1049 } 1050 return 0; 1051} 1052 1053int 1054sys_getsockopt(tcp) 1055struct tcb *tcp; 1056{ 1057 if (entering(tcp)) { 1058 tprintf("%ld, ", tcp->u_arg[0]); 1059 switch (tcp->u_arg[1]) { 1060 case SOL_SOCKET: 1061 tprintf("SOL_SOCKET, "); 1062 printxval(sockoptions, tcp->u_arg[2], "SO_???"); 1063 tprintf(", "); 1064 break; 1065#ifdef SOL_IP 1066 case SOL_IP: 1067 tprintf("SOL_IP, "); 1068 printxval(sockipoptions, tcp->u_arg[2], "IP_???"); 1069 tprintf(", "); 1070 break; 1071#endif 1072#ifdef SOL_IPX 1073 case SOL_IPX: 1074 tprintf("SOL_IPX, "); 1075 printxval(sockipxoptions, tcp->u_arg[2], "IPX_???"); 1076 tprintf(", "); 1077 break; 1078#endif 1079#ifdef SOL_PACKET 1080 case SOL_PACKET: 1081 tprintf("SOL_PACKET, "); 1082 printxval(sockpacketoptions, tcp->u_arg[2], "PACKET_???"); 1083 tprintf(", "); 1084 break; 1085#endif 1086#ifdef SOL_TCP 1087 case SOL_TCP: 1088 tprintf("SOL_TCP, "); 1089 printxval(socktcpoptions, tcp->u_arg[2], "TCP_???"); 1090 tprintf(", "); 1091 break; 1092#endif 1093 1094 /* SOL_AX25 SOL_ROSE SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25 1095 * etc. still need work */ 1096 default: 1097 /* XXX - should know socket family here */ 1098 printxval(socketlayers, tcp->u_arg[1], "SOL_???"); 1099 tprintf(", %lu, ", tcp->u_arg[2]); 1100 break; 1101 } 1102 } else { 1103 if (syserror(tcp)) { 1104 tprintf("%#lx, %#lx", 1105 tcp->u_arg[3], tcp->u_arg[4]); 1106 return 0; 1107 } 1108 printnum(tcp, tcp->u_arg[3], "%ld"); 1109 tprintf(", "); 1110 printnum(tcp, tcp->u_arg[4], "%ld"); 1111 } 1112 return 0; 1113} 1114 1115#if defined(ICMP_FILTER) 1116static void printicmpfilter(tcp, addr) 1117struct tcb *tcp; 1118long addr; 1119{ 1120 struct icmp_filter filter; 1121 1122 if (!addr) { 1123 tprintf("NULL"); 1124 return; 1125 } 1126 if (syserror(tcp) || !verbose(tcp)) { 1127 tprintf("%#lx", addr); 1128 return; 1129 } 1130 if (umove(tcp, addr, &filter) < 0) { 1131 tprintf("{...}"); 1132 return; 1133 } 1134 1135 tprintf("~("); 1136 if (printflags(icmpfilterflags, ~filter.data) == 0) 1137 tprintf("0"); 1138 tprintf(")"); 1139} 1140#endif /* ICMP_FILTER */ 1141 1142int 1143sys_setsockopt(tcp) 1144struct tcb *tcp; 1145{ 1146 if (entering(tcp)) { 1147 tprintf("%ld, ", tcp->u_arg[0]); 1148 switch (tcp->u_arg[1]) { 1149 case SOL_SOCKET: 1150 tprintf("SOL_SOCKET, "); 1151 printxval(sockoptions, tcp->u_arg[2], "SO_???"); 1152 tprintf(", "); 1153 printnum(tcp, tcp->u_arg[3], "%ld"); 1154 tprintf(", %lu", tcp->u_arg[4]); 1155 break; 1156#ifdef SOL_IP 1157 case SOL_IP: 1158 tprintf("SOL_IP, "); 1159 printxval(sockipoptions, tcp->u_arg[2], "IP_???"); 1160 tprintf(", "); 1161 printnum(tcp, tcp->u_arg[3], "%ld"); 1162 tprintf(", %lu", tcp->u_arg[4]); 1163 break; 1164#endif 1165#ifdef SOL_IPX 1166 case SOL_IPX: 1167 tprintf("SOL_IPX, "); 1168 printxval(sockipxoptions, tcp->u_arg[2], "IPX_???"); 1169 tprintf(", "); 1170 printnum(tcp, tcp->u_arg[3], "%ld"); 1171 tprintf(", %lu", tcp->u_arg[4]); 1172 break; 1173#endif 1174#ifdef SOL_PACKET 1175 case SOL_PACKET: 1176 tprintf("SOL_PACKET, "); 1177 printxval(sockpacketoptions, tcp->u_arg[2], "PACKET_???"); 1178 tprintf(", "); 1179 /* TODO: decode packate_mreq for PACKET_*_MEMBERSHIP */ 1180 printnum(tcp, tcp->u_arg[3], "%ld"); 1181 tprintf(", %lu", tcp->u_arg[4]); 1182 break; 1183#endif 1184#ifdef SOL_TCP 1185 case SOL_TCP: 1186 tprintf("SOL_TCP, "); 1187 printxval(socktcpoptions, tcp->u_arg[2], "TCP_???"); 1188 tprintf(", "); 1189 printnum(tcp, tcp->u_arg[3], "%ld"); 1190 tprintf(", %lu", tcp->u_arg[4]); 1191 break; 1192#endif 1193#ifdef SOL_RAW 1194 case SOL_RAW: 1195 tprintf("SOL_RAW, "); 1196 printxval(sockrawoptions, tcp->u_arg[2], "RAW_???"); 1197 tprintf(", "); 1198 switch (tcp->u_arg[2]) { 1199#if defined(ICMP_FILTER) 1200 case ICMP_FILTER: 1201 printicmpfilter(tcp, tcp->u_arg[3]); 1202 break; 1203#endif 1204 default: 1205 printnum(tcp, tcp->u_arg[3], "%ld"); 1206 break; 1207 } 1208 tprintf(", %lu", tcp->u_arg[4]); 1209 break; 1210#endif 1211 1212 /* SOL_AX25 SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25 1213 * etc. still need work */ 1214 default: 1215 /* XXX - should know socket family here */ 1216 printxval(socketlayers, tcp->u_arg[1], "IPPROTO_???"); 1217 tprintf(", %lu, ", tcp->u_arg[2]); 1218 printnum(tcp, tcp->u_arg[3], "%ld"); 1219 tprintf(", %lu", tcp->u_arg[4]); 1220 break; 1221 } 1222 } 1223 return 0; 1224} 1225 1226#if UNIXWARE >= 7 1227 1228static struct xlat sock_version[] = { 1229 { __NETLIB_UW211_SVR4, "UW211_SVR4" }, 1230 { __NETLIB_UW211_XPG4, "UW211_XPG4" }, 1231 { __NETLIB_GEMINI_SVR4, "GEMINI_SVR4" }, 1232 { __NETLIB_GEMINI_XPG4, "GEMINI_XPG4" }, 1233 { __NETLIB_FP1_SVR4, "FP1_SVR4" }, 1234 { __NETLIB_FP1_XPG4, "FP1_XPG4" }, 1235 { 0, NULL }, 1236}; 1237 1238 1239int 1240netlib_call(tcp, func) 1241struct tcb *tcp; 1242int (*func) (); 1243{ 1244 if (entering(tcp)) { 1245 int i; 1246 printxval (sock_version, tcp->u_arg[0], "__NETLIB_???"); 1247 tprintf(", "); 1248 --tcp->u_nargs; 1249 for (i = 0; i < tcp->u_nargs; i++) 1250 tcp->u_arg[i] = tcp->u_arg[i + 1]; 1251 return func (tcp); 1252 1253 } 1254 1255 return func (tcp); 1256} 1257 1258int 1259sys_xsocket(tcp) 1260struct tcb *tcp; 1261{ 1262 return netlib_call (tcp, sys_socket); 1263} 1264 1265int 1266sys_xsocketpair(tcp) 1267struct tcb *tcp; 1268{ 1269 return netlib_call (tcp, sys_socketpair); 1270} 1271 1272int 1273sys_xbind(tcp) 1274struct tcb *tcp; 1275{ 1276 return netlib_call (tcp, sys_bind); 1277} 1278 1279int 1280sys_xconnect(tcp) 1281struct tcb *tcp; 1282{ 1283 return netlib_call (tcp, sys_connect); 1284} 1285 1286int 1287sys_xlisten(tcp) 1288struct tcb *tcp; 1289{ 1290 return netlib_call (tcp, sys_listen); 1291} 1292 1293int 1294sys_xaccept(tcp) 1295struct tcb *tcp; 1296{ 1297 return netlib_call (tcp, sys_accept); 1298} 1299 1300int 1301sys_xsendmsg(tcp) 1302struct tcb *tcp; 1303{ 1304 return netlib_call (tcp, sys_sendmsg); 1305} 1306 1307int 1308sys_xrecvmsg(tcp) 1309struct tcb *tcp; 1310{ 1311 return netlib_call (tcp, sys_recvmsg); 1312} 1313 1314int 1315sys_xgetsockaddr(tcp) 1316struct tcb *tcp; 1317{ 1318 if (entering(tcp)) { 1319 printxval (sock_version, tcp->u_arg[0], "__NETLIB_???"); 1320 tprintf(", "); 1321 if (tcp->u_arg[1] == 0) { 1322 tprintf ("LOCALNAME, "); 1323 } 1324 else if (tcp->u_arg[1] == 1) { 1325 tprintf ("REMOTENAME, "); 1326 } 1327 else { 1328 tprintf ("%ld, ", tcp->u_arg [1]); 1329 } 1330 tprintf ("%ld, ", tcp->u_arg [2]); 1331 } 1332 else { 1333 if (tcp->u_arg[3] == 0 || syserror(tcp)) { 1334 tprintf("%#lx", tcp->u_arg[3]); 1335 } else { 1336 printsock(tcp, tcp->u_arg[3], tcp->u_arg[4]); 1337 } 1338 tprintf(", "); 1339 printnum(tcp, tcp->u_arg[4], "%lu"); 1340 } 1341 1342 return 0; 1343 1344} 1345 1346#if 0 1347 1348int 1349sys_xsetsockaddr(tcp) 1350struct tcb *tcp; 1351{ 1352 return netlib_call (tcp, sys_setsockaddr); 1353} 1354 1355#endif 1356 1357int 1358sys_xgetsockopt(tcp) 1359struct tcb *tcp; 1360{ 1361 return netlib_call (tcp, sys_getsockopt); 1362} 1363 1364int 1365sys_xsetsockopt(tcp) 1366struct tcb *tcp; 1367{ 1368 return netlib_call (tcp, sys_setsockopt); 1369} 1370 1371int 1372sys_xshutdown(tcp) 1373struct tcb *tcp; 1374{ 1375 return netlib_call (tcp, sys_shutdown); 1376} 1377 1378#endif 1379