1999-02-19 03:21:36 +03:00
/*
* Copyright ( c ) 1991 , 1992 Paul Kranenburg < pk @ cs . few . eur . nl >
* Copyright ( c ) 1993 Branko Lankester < branko @ hacktic . nl >
* Copyright ( c ) 1993 , 1994 , 1995 , 1996 Rick Sladkey < jrs @ world . std . com >
2000-07-05 20:05:39 +04:00
* Copyright ( c ) 1996 - 2000 Wichert Akkerman < wichert @ cistron . nl >
1999-02-19 03:21:36 +03:00
* All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ` ` AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED .
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
* DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* $ Id $
*/
# include "defs.h"
# include <sys/stat.h>
# include <sys/socket.h>
# include <sys/un.h>
2001-02-16 23:29:03 +03:00
# if defined(HAVE_SIN6_SCOPE_ID_LINUX)
# define in6_addr in6_addr_libc
# define ipv6_mreq ipv6_mreq_libc
# define sockaddr_in6 sockaddr_in6_libc
# endif
1999-02-19 03:21:36 +03:00
# include <netinet/in.h>
2001-02-16 22:59:55 +03:00
# ifdef HAVE_NETINET_TCP_H
2000-09-02 01:03:06 +04:00
# include <netinet/tcp.h>
# endif
2001-02-16 22:59:55 +03:00
# ifdef HAVE_NETINET_UDP_H
# include <netinet/udp.h>
# endif
1999-02-19 03:21:36 +03:00
# include <arpa/inet.h>
2001-02-16 23:29:03 +03:00
# include <net/if.h>
1999-02-19 03:21:36 +03:00
# if defined(LINUX)
# include <asm/types.h>
# if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC__ + __GLIBC_MINOR__ >= 3)
# include <netipx / ipx.h>
# else
# include <linux / ipx.h>
# endif
# endif /* LINUX */
2001-02-16 23:29:03 +03:00
# if defined (__GLIBC__) && (((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1)) || defined(HAVE_SIN6_SCOPE_ID_LINUX))
1999-11-18 20:09:47 +03:00
# if defined(HAVE_LINUX_IN6_H)
2001-02-16 23:29:03 +03:00
# if defined(HAVE_SIN6_SCOPE_ID_LINUX)
# undef in6_addr
# undef ipv6_mreq
# undef sockaddr_in6
# define in6_addr in6_addr_kernel
# define ipv6_mreq ipv6_mreq_kernel
# define sockaddr_in6 sockaddr_in6_kernel
# endif
1999-11-01 22:39:08 +03:00
# include <linux/in6.h>
2001-02-16 23:29:03 +03:00
# if defined(HAVE_SIN6_SCOPE_ID_LINUX)
# undef in6_addr
# undef ipv6_mreq
# undef sockaddr_in6
# define in6_addr in6_addr_libc
# define ipv6_mreq ipv6_mreq_libc
# define sockaddr_in6 sockaddr_in6_kernel
# endif
1999-11-01 22:39:08 +03:00
# endif
1999-11-01 22:53:31 +03:00
# endif
1999-11-01 22:39:08 +03:00
1999-11-18 20:09:47 +03:00
# if defined(HAVE_SYS_UIO_H)
# include <sys/uio.h>
# endif
# if defined(HAVE_LINUX_NETLINK_H)
# include <linux/netlink.h>
# endif
# if defined(HAVE_LINUX_IF_PACKET_H)
# include <linux/if_packet.h>
# endif
2000-07-05 20:05:39 +04:00
# if defined(HAVE_LINUX_ICMP_H)
# include <linux/icmp.h>
# endif
1999-02-19 03:21:36 +03:00
# ifndef PF_UNSPEC
# define PF_UNSPEC AF_UNSPEC
# endif
2000-08-10 06:14:04 +04:00
# if UNIXWARE >= 7
# define HAVE_SENDMSG 1 /* HACK - *FIXME* */
# endif
1999-02-19 03:21:36 +03:00
# ifdef LINUX
/* Under Linux these are enums so we can't test for them with ifdef. */
# define IPPROTO_EGP IPPROTO_EGP
# define IPPROTO_PUP IPPROTO_PUP
# define IPPROTO_IDP IPPROTO_IDP
# define IPPROTO_IGMP IPPROTO_IGMP
# define IPPROTO_RAW IPPROTO_RAW
# define IPPROTO_MAX IPPROTO_MAX
# endif
static struct xlat domains [ ] = {
{ PF_UNSPEC , " PF_UNSPEC " } ,
{ PF_UNIX , " PF_UNIX " } ,
{ PF_INET , " PF_INET " } ,
1999-11-18 20:09:47 +03:00
# ifdef PF_NETLINK
{ PF_NETLINK , " PF_NETLINK " } ,
# endif
# ifdef PF_PACKET
{ PF_PACKET , " PF_PACKET " } ,
# endif
# ifdef PF_INET6
{ PF_INET6 , " PF_INET6 " } ,
# endif
# ifdef PF_ATMSVC
{ PF_ATMSVC , " PF_INET6 " } ,
# endif
# ifdef PF_INET6
{ PF_INET6 , " PF_INET6 " } ,
# endif
1999-02-19 03:21:36 +03:00
# ifdef PF_LOCAL
{ PF_LOCAL , " PS_LOCAL " } ,
# endif
# ifdef PF_ISO
{ PF_ISO , " PF_ISO " } ,
# endif
# ifdef PF_AX25
{ PF_AX25 , " PF_AX25 " } ,
# endif
# ifdef PF_IPX
{ PF_IPX , " PF_IPX " } ,
# endif
# ifdef PF_APPLETALK
{ PF_APPLETALK , " PF_APPLETALK " } ,
# endif
# ifdef PF_NETROM
{ PF_NETROM , " PF_NETROM " } ,
# endif
# ifdef PF_BRIDGE
{ PF_BRIDGE , " PF_BRIDGE " } ,
# endif
# ifdef PF_AAL5
{ PF_AAL5 , " PF_AAL5 " } ,
# endif
# ifdef PF_X25
{ PF_X25 , " PF_X25 " } ,
# endif
# ifdef PF_ROSE
{ PF_ROSE , " PF_ROSE " } ,
# endif
# ifdef PF_DECNET
{ PF_DECNET , " PF_DECNET " } ,
# endif
# ifdef PF_NETBEUI
{ PF_NETBEUI , " PF_NETBEUI " } ,
# endif
# ifdef PF_IMPLINK
{ PF_IMPLINK , " PF_IMPLINK " } ,
# endif
{ 0 , NULL } ,
} ;
1999-11-18 20:09:47 +03:00
static struct xlat addrfams [ ] = {
{ AF_UNSPEC , " AF_UNSPEC " } ,
{ AF_UNIX , " AF_UNIX " } ,
{ AF_INET , " AF_INET " } ,
1999-11-26 12:54:08 +03:00
# ifdef AF_INET6
1999-11-18 20:09:47 +03:00
{ AF_INET6 , " AF_INET6 " } ,
1999-11-26 12:54:08 +03:00
# endif
1999-11-18 20:09:47 +03:00
{ AF_DECnet , " AF_DECnet " } ,
# ifdef PF_ATMSVC
{ AF_ATMSVC , " AF_ATMSVC " } ,
# endif
1999-11-26 12:54:08 +03:00
# ifdef AF_PACKET
1999-11-18 20:09:47 +03:00
{ AF_PACKET , " AF_PACKET " } ,
1999-11-26 12:54:08 +03:00
# endif
# ifdef AF_NETLINK
1999-11-18 20:09:47 +03:00
{ AF_NETLINK , " AF_NETLINK " } ,
1999-11-26 12:54:08 +03:00
# endif
# ifdef AF_ISO
1999-11-18 20:09:47 +03:00
{ AF_ISO , " AF_ISO " } ,
# endif
1999-11-26 12:54:08 +03:00
# ifdef AF_IMPLINK
1999-11-18 20:09:47 +03:00
{ AF_IMPLINK , " AF_IMPLINK " } ,
# endif
{ 0 , NULL } ,
} ;
1999-02-19 03:21:36 +03:00
static struct xlat socktypes [ ] = {
{ SOCK_STREAM , " SOCK_STREAM " } ,
{ SOCK_DGRAM , " SOCK_DGRAM " } ,
# ifdef SOCK_RAW
{ SOCK_RAW , " SOCK_RAW " } ,
# endif
# ifdef SOCK_SEQPACKET
{ SOCK_SEQPACKET , " SOCK_SEQPACKET " } ,
# endif
# ifdef SOCK_RDM
{ SOCK_RDM , " SOCK_RDM " } ,
# endif
# ifdef SOCK_PACKET
{ SOCK_PACKET , " SOCK_PACKET " } ,
# endif
{ 0 , NULL } ,
} ;
2000-11-26 06:59:21 +03:00
static struct xlat socketlayers [ ] = {
2001-03-06 12:25:46 +03:00
# if defined(SOL_IP)
2000-11-26 06:59:21 +03:00
{ SOL_IP , " SOL_IP " } ,
2001-03-06 12:25:46 +03:00
# endif
2000-11-26 06:59:21 +03:00
# if defined(SOL_ICMP)
{ SOL_ICMP , " SOL_ICMP " } ,
# endif
2001-03-06 12:25:46 +03:00
# if defined(SOL_TCP)
2000-11-26 06:59:21 +03:00
{ SOL_TCP , " SOL_TCP " } ,
2001-03-06 12:25:46 +03:00
# endif
# if defined(SOL_UDP)
2000-11-26 06:59:21 +03:00
{ SOL_UDP , " SOL_UDP " } ,
2001-03-06 12:25:46 +03:00
# endif
2000-11-26 06:59:21 +03:00
# if defined(SOL_IPV6)
{ SOL_IPV6 , " SOL_IPV6 " } ,
# endif
# if defined(SOL_ICMPV6)
{ SOL_ICMPV6 , " SOL_ICMPV6 " } ,
# endif
# if defined(SOL_RAW)
{ SOL_RAW , " SOL_RAW " } ,
# endif
# if defined(SOL_IPX)
{ SOL_IPX , " SOL_IPX " } ,
# endif
# if defined(SOL_IPX)
{ SOL_IPX , " SOL_IPX " } ,
# endif
# if defined(SOL_AX25)
{ SOL_AX25 , " SOL_AX25 " } ,
# endif
# if defined(SOL_ATALK)
{ SOL_ATALK , " SOL_ATALK " } ,
# endif
# if defined(SOL_NETROM)
{ SOL_NETROM , " SOL_NETROM " } ,
# endif
# if defined(SOL_ROSE)
{ SOL_ROSE , " SOL_ROSE " } ,
# endif
# if defined(SOL_DECNET)
{ SOL_DECNET , " SOL_DECNET " } ,
# endif
# if defined(SOL_X25)
{ SOL_X25 , " SOL_X25 " } ,
# endif
# if defined(SOL_PACKET)
{ SOL_PACKET , " SOL_PACKET " } ,
# endif
# if defined(SOL_ATM)
{ SOL_ATM , " SOL_ATM " } ,
# endif
# if defined(SOL_AAL)
{ SOL_AAL , " SOL_AAL " } ,
# endif
# if defined(SOL_IRDA)
{ SOL_IRDA , " SOL_IRDA " } ,
# endif
2001-03-27 20:47:36 +04:00
{ SOL_SOCKET , " SOL_SOCKET " } , /* Never used! */
2000-11-26 06:59:21 +03:00
} ;
2002-05-22 19:46:49 +04:00
/*** WARNING: DANGER WILL ROBINSON: NOTE "socketlayers" array above
falls into " protocols " array below ! ! ! ! This is intended ! ! ! * * */
1999-02-19 03:21:36 +03:00
static struct xlat protocols [ ] = {
{ IPPROTO_IP , " IPPROTO_IP " } ,
{ IPPROTO_ICMP , " IPPROTO_ICMP " } ,
{ IPPROTO_TCP , " IPPROTO_TCP " } ,
{ IPPROTO_UDP , " IPPROTO_UDP " } ,
# ifdef IPPROTO_GGP
{ IPPROTO_GGP , " IPPROTO_GGP " } ,
# endif
# ifdef IPPROTO_EGP
{ IPPROTO_EGP , " IPPROTO_EGP " } ,
# endif
# ifdef IPPROTO_PUP
{ IPPROTO_PUP , " IPPROTO_PUP " } ,
# endif
# ifdef IPPROTO_IDP
{ IPPROTO_IDP , " IPPROTO_IDP " } ,
# endif
# ifdef IPPROTO_IPV6
{ IPPROTO_IPV6 , " IPPROTO_IPV6 " } ,
# endif
# ifdef IPPROTO_ICMPV6
{ IPPROTO_ICMPV6 , " IPPROTO_ICMPV6 " } ,
# endif
# ifdef IPPROTO_IGMP
{ IPPROTO_IGMP , " IPPROTO_IGMP " } ,
# endif
# ifdef IPPROTO_HELLO
{ IPPROTO_HELLO , " IPPROTO_HELLO " } ,
# endif
# ifdef IPPROTO_ND
{ IPPROTO_ND , " IPPROTO_ND " } ,
# endif
# ifdef IPPROTO_RAW
{ IPPROTO_RAW , " IPPROTO_RAW " } ,
# endif
# ifdef IPPROTO_MAX
{ IPPROTO_MAX , " IPPROTO_MAX " } ,
# endif
# ifdef IPPROTO_IPIP
{ IPPROTO_IPIP , " IPPROTO_IPIP " } ,
# endif
{ 0 , NULL } ,
} ;
static struct xlat msg_flags [ ] = {
{ MSG_OOB , " MSG_OOB " } ,
# ifdef MSG_DONTROUTE
{ MSG_DONTROUTE , " MSG_DONTROUTE " } ,
# endif
# ifdef MSG_PEEK
{ MSG_PEEK , " MSG_PEEK " } ,
# endif
# ifdef MSG_CTRUNC
{ MSG_CTRUNC , " MSG_CTRUNC " } ,
# endif
# ifdef MSG_PROXY
{ MSG_PROXY , " MSG_PROXY " } ,
# endif
# ifdef MSG_EOR
{ MSG_EOR , " MSG_EOR " } ,
# endif
# ifdef MSG_WAITALL
{ MSG_WAITALL , " MSG_WAITALL " } ,
1999-11-18 20:09:47 +03:00
# endif
# ifdef MSG_TRUNC
{ MSG_TRUNC , " MSG_TRUNC " } ,
# endif
# ifdef MSG_CTRUNC
{ MSG_CTRUNC , " MSG_CTRUNC " } ,
# endif
# ifdef MSG_ERRQUEUE
{ MSG_ERRQUEUE , " MSG_ERRQUEUE " } ,
# endif
# ifdef MSG_DONTWAIT
{ MSG_DONTWAIT , " MSG_DONTWAIT " } ,
# endif
# ifdef MSG_CONFIRM
{ MSG_CONFIRM , " MSG_CONFIRM " } ,
# endif
# ifdef MSG_PROBE
{ MSG_PROBE , " MSG_PROBE " } ,
1999-02-19 03:21:36 +03:00
# endif
{ 0 , NULL } ,
} ;
static struct xlat sockoptions [ ] = {
1999-11-18 20:09:47 +03:00
# ifdef SO_PEERCRED
{ SO_PEERCRED , " SO_PEERCRED " } ,
# endif
# ifdef SO_PASSCRED
{ SO_PASSCRED , " SO_PASSCRED " } ,
# endif
1999-02-19 03:21:36 +03:00
# ifdef SO_DEBUG
{ SO_DEBUG , " SO_DEBUG " } ,
# endif
# ifdef SO_REUSEADDR
{ SO_REUSEADDR , " SO_REUSEADDR " } ,
# endif
# ifdef SO_KEEPALIVE
{ SO_KEEPALIVE , " SO_KEEPALIVE " } ,
# endif
# ifdef SO_DONTROUTE
{ SO_DONTROUTE , " SO_DONTROUTE " } ,
# endif
# ifdef SO_BROADCAST
{ SO_BROADCAST , " SO_BROADCAST " } ,
# endif
# ifdef SO_LINGER
{ SO_LINGER , " SO_LINGER " } ,
# endif
# ifdef SO_OOBINLINE
{ SO_OOBINLINE , " SO_OOBINLINE " } ,
# endif
# ifdef SO_TYPE
{ SO_TYPE , " SO_TYPE " } ,
# endif
# ifdef SO_ERROR
{ SO_ERROR , " SO_ERROR " } ,
# endif
# ifdef SO_SNDBUF
{ SO_SNDBUF , " SO_SNDBUF " } ,
# endif
# ifdef SO_RCVBUF
{ SO_RCVBUF , " SO_RCVBUF " } ,
# endif
# ifdef SO_NO_CHECK
{ SO_NO_CHECK , " SO_NO_CHECK " } ,
# endif
# ifdef SO_PRIORITY
{ SO_PRIORITY , " SO_PRIORITY " } ,
# endif
# ifdef SO_ACCEPTCONN
{ SO_ACCEPTCONN , " SO_ACCEPTCONN " } ,
# endif
# ifdef SO_USELOOPBACK
{ SO_USELOOPBACK , " SO_USELOOPBACK " } ,
# endif
# ifdef SO_SNDLOWAT
{ SO_SNDLOWAT , " SO_SNDLOWAT " } ,
# endif
# ifdef SO_RCVLOWAT
{ SO_RCVLOWAT , " SO_RCVLOWAT " } ,
# endif
# ifdef SO_SNDTIMEO
{ SO_SNDTIMEO , " SO_SNDTIMEO " } ,
# endif
# ifdef SO_RCVTIMEO
{ SO_RCVTIMEO , " SO_RCVTIMEO " } ,
# endif
# ifdef SO_BSDCOMPAT
{ SO_BSDCOMPAT , " SO_BSDCOMPAT " } ,
# endif
# ifdef SO_REUSEPORT
{ SO_REUSEPORT , " SO_REUSEPORT " } ,
# endif
2002-05-23 15:48:58 +04:00
# ifdef SO_ORDREL
{ SO_ORDREL , " SO_ORDREL " } ,
1999-02-19 03:21:36 +03:00
# endif
2002-05-23 15:48:58 +04:00
# ifdef SO_IMASOCKET
{ SO_IMASOCKET , " SO_IMASOCKET " } ,
1999-02-19 03:21:36 +03:00
# endif
2002-05-23 15:48:58 +04:00
# ifdef SO_MGMT
{ SO_MGMT , " SO_MGMT " } ,
1999-02-19 03:21:36 +03:00
# endif
2002-05-23 15:48:58 +04:00
# ifdef SO_LISTENING
{ SO_LISTENING , " SO_LISTENING " } ,
# endif
# ifdef SO_RDWR
{ SO_RDWR , " SO_RDWR " } ,
# endif
# ifdef SO_SEMA
{ SO_SEMA , " SO_SEMA " } ,
# endif
# ifdef SO_PARALLELSVR
{ SO_PARALLELSVR , " SO_PARALLELSVR " } ,
# endif
# ifdef SO_PROTOTYPE
{ SO_PROTOTYPE , " SO_PROTOTYPE " } ,
# endif
# ifdef SO_ALLRAW
{ SO_ALLRAW , " SO_ALLRAW " } ,
# endif
# ifdef SO_ICS
{ SO_ICS , " SO_ICS " } ,
1999-02-19 03:21:36 +03:00
# endif
{ 0 , NULL } ,
} ;
2002-05-22 19:46:49 +04:00
# if !defined (SOL_IP) && defined (IPPROTO_IP)
# define SOL_IP IPPROTO_IP
# endif
1999-02-19 03:21:36 +03:00
# ifdef SOL_IP
static struct xlat sockipoptions [ ] = {
2002-05-22 19:46:49 +04:00
# ifdef IP_TOS
2000-07-05 20:05:39 +04:00
{ IP_TOS , " IP_TOS " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_TTL
2000-07-05 20:05:39 +04:00
{ IP_TTL , " IP_TTL " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_HDRINCL
2000-07-05 20:05:39 +04:00
{ IP_HDRINCL , " IP_HDRINCL " } ,
1999-02-19 03:21:36 +03:00
# endif
2002-05-22 19:46:49 +04:00
# ifdef IP_OPTIONS
2000-07-05 20:05:39 +04:00
{ IP_OPTIONS , " IP_OPTIONS " } ,
# endif
2002-05-22 19:46:49 +04:00
# ifdef IP_ROUTER_ALERT
2000-07-05 20:05:39 +04:00
{ IP_ROUTER_ALERT , " IP_ROUTER_ALERT " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_RECVOPTIONS
2000-07-05 20:05:39 +04:00
{ IP_RECVOPTIONS , " IP_RECVOPTIONS " } ,
# endif
2002-05-22 19:46:49 +04:00
# ifdef IP_RECVOPTS
{ IP_RECVOPTS , " IP_RECVOPTS " } ,
# endif
# ifdef IP_RECVRETOPTS
{ IP_RECVRETOPTS , " IP_RECVRETOPTS " } ,
# endif
# ifdef IP_RECVDSTADDR
{ IP_RECVDSTADDR , " IP_RECVDSTADDR " } ,
# endif
# ifdef IP_RETOPTS
2000-07-05 20:05:39 +04:00
{ IP_RETOPTS , " IP_RETOPTS " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_PKTINFO
2000-07-05 20:05:39 +04:00
{ IP_PKTINFO , " IP_PKTINFO " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_PKTOPTIONS
{ IP_PKTOPTIONS , " IP_PKTOPTIONS " } ,
# endif
# ifdef IP_MTU_DISCOVER
2000-07-05 20:05:39 +04:00
{ IP_MTU_DISCOVER , " IP_MTU_DISCOVER " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_RECVERR
2000-07-05 20:05:39 +04:00
{ IP_RECVERR , " IP_RECVERR " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_RECVTTL
2000-07-05 20:05:39 +04:00
{ IP_RECVTTL , " IP_RECRECVTTL " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_RECVTOS
2000-07-05 20:05:39 +04:00
{ IP_RECVTOS , " IP_RECRECVTOS " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_MTU
2000-07-05 20:05:39 +04:00
{ IP_MTU , " IP_MTU " } ,
# endif
2002-05-22 19:46:49 +04:00
# ifdef IP_MULTICAST_IF
2000-07-05 20:05:39 +04:00
{ IP_MULTICAST_IF , " IP_MULTICAST_IF " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_MULTICAST_TTL
2000-07-05 20:05:39 +04:00
{ IP_MULTICAST_TTL , " IP_MULTICAST_TTL " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_MULTICAST_LOOP
2000-07-05 20:05:39 +04:00
{ IP_MULTICAST_LOOP , " IP_MULTICAST_LOOP " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_ADD_MEMBERSHIP
2000-07-05 20:05:39 +04:00
{ IP_ADD_MEMBERSHIP , " IP_ADD_MEMBERSHIP " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_DROP_MEMBERSHIP
2000-07-05 20:05:39 +04:00
{ IP_DROP_MEMBERSHIP , " IP_DROP_MEMBERSHIP " } ,
2002-05-22 19:46:49 +04:00
# endif
# ifdef IP_BROADCAST_IF
{ IP_BROADCAST_IF , " IP_BROADCAST_IF " } ,
# endif
# ifdef IP_RECVIFINDEX
{ IP_RECVIFINDEX , " IP_RECVIFINDEX " } ,
# endif
2000-07-05 20:05:39 +04:00
{ 0 , NULL } ,
1999-02-19 03:21:36 +03:00
} ;
# endif /* SOL_IP */
# ifdef SOL_IPX
static struct xlat sockipxoptions [ ] = {
{ IPX_TYPE , " IPX_TYPE " } ,
{ 0 , NULL } ,
} ;
# endif /* SOL_IPX */
2000-07-05 20:05:39 +04:00
# ifdef SOL_RAW
static struct xlat sockrawoptions [ ] = {
# if defined(ICMP_FILTER)
{ ICMP_FILTER , " ICMP_FILTER " } ,
# endif
{ 0 , NULL } ,
} ;
# endif /* SOL_RAW */
# ifdef SOL_PACKET
static struct xlat sockpacketoptions [ ] = {
{ PACKET_ADD_MEMBERSHIP , " PACKET_ADD_MEMBERSHIP " } ,
{ PACKET_DROP_MEMBERSHIP , " PACKET_DROP_MEMBERSHIP " } ,
# if defined(PACKET_RECV_OUTPUT)
{ PACKET_RECV_OUTPUT , " PACKET_RECV_OUTPUT " } ,
# endif
# if defined(PACKET_RX_RING)
{ PACKET_RX_RING , " PACKET_RX_RING " } ,
# endif
# if defined(PACKET_STATISTICS)
{ PACKET_STATISTICS , " PACKET_STATISTICS " } ,
# endif
{ 0 , NULL } ,
} ;
# endif /* SOL_PACKET */
2002-05-22 19:46:49 +04:00
# if !defined (SOL_TCP) && defined (IPPROTO_TCP)
# define SOL_TCP IPPROTO_TCP
# endif
1999-02-19 03:21:36 +03:00
# ifdef SOL_TCP
static struct xlat socktcpoptions [ ] = {
2001-12-28 01:27:30 +03:00
{ TCP_NODELAY , " TCP_NODELAY " } ,
{ TCP_MAXSEG , " TCP_MAXSEG " } ,
2000-07-05 20:05:39 +04:00
# if defined(TCP_CORK)
2001-12-28 01:27:30 +03:00
{ TCP_CORK , " TCP_CORK " } ,
2000-07-05 20:05:39 +04:00
# endif
2001-12-28 01:27:30 +03:00
# if defined(TCP_KEEPIDLE)
{ TCP_KEEPIDLE , " TCP_KEEPIDLE " } ,
# endif
# if defined(TCP_KEEPINTVL)
{ TCP_KEEPINTVL , " TCP_KEEPINTVL " } ,
# endif
# if defined(TCP_KEEPCNT)
{ TCP_KEEPCNT , " TCP_KEEPCNT " } ,
# endif
2002-05-23 15:48:58 +04:00
# if defined(TCP_NKEEP)
{ TCP_NKEEP , " TCP_NKEEP " } ,
# endif
2001-12-28 01:27:30 +03:00
# if defined(TCP_SYNCNT)
{ TCP_SYNCNT , " TCP_SYNCNT " } ,
# endif
# if defined(TCP_LINGER2)
{ TCP_LINGER2 , " TCP_LINGER2 " } ,
# endif
# if defined(TCP_DEFER_ACCEPT)
{ TCP_DEFER_ACCEPT , " TCP_DEFER_ACCEPT " } ,
# endif
# if defined(TCP_WINDOW_CLAMP)
{ TCP_WINDOW_CLAMP , " TCP_WINDOW_CLAMP " } ,
# endif
# if defined(TCP_INFO)
{ TCP_INFO , " TCP_INFO " } ,
# endif
# if defined(TCP_QUICKACK)
{ TCP_QUICKACK , " TCP_QUICKACK " } ,
# endif
{ 0 , NULL } ,
1999-02-19 03:21:36 +03:00
} ;
# endif /* SOL_TCP */
2000-07-05 20:05:39 +04:00
# ifdef SOL_RAW
static struct xlat icmpfilterflags [ ] = {
# if defined(ICMP_ECHOREPLY)
{ ( 1 < < ICMP_ECHOREPLY ) , " ICMP_ECHOREPLY " } ,
# endif
# if defined(ICMP_DEST_UNREACH)
{ ( 1 < < ICMP_DEST_UNREACH ) , " ICMP_DEST_UNREACH " } ,
# endif
# if defined(ICMP_SOURCE_QUENCH)
{ ( 1 < < ICMP_SOURCE_QUENCH ) , " ICMP_SOURCE_QUENCH " } ,
# endif
# if defined(ICMP_REDIRECT)
{ ( 1 < < ICMP_REDIRECT ) , " ICMP_REDIRECT " } ,
# endif
# if defined(ICMP_ECHO)
{ ( 1 < < ICMP_ECHO ) , " ICMP_ECHO " } ,
# endif
# if defined(ICMP_TIME_EXCEEDED)
{ ( 1 < < ICMP_TIME_EXCEEDED ) , " ICMP_TIME_EXCEEDED " } ,
# endif
# if defined(ICMP_PARAMETERPROB)
{ ( 1 < < ICMP_PARAMETERPROB ) , " ICMP_PARAMETERPROB " } ,
# endif
# if defined(ICMP_TIMESTAMP)
{ ( 1 < < ICMP_TIMESTAMP ) , " ICMP_TIMESTAMP " } ,
# endif
# if defined(ICMP_TIMESTAMPREPLY)
{ ( 1 < < ICMP_TIMESTAMPREPLY ) , " ICMP_TIMESTAMPREPLY " } ,
# endif
# if defined(ICMP_INFO_REQUEST)
{ ( 1 < < ICMP_INFO_REQUEST ) , " ICMP_INFO_REQUEST " } ,
# endif
# if defined(ICMP_INFO_REPLY)
{ ( 1 < < ICMP_INFO_REPLY ) , " ICMP_INFO_REPLY " } ,
# endif
# if defined(ICMP_ADDRESS)
{ ( 1 < < ICMP_ADDRESS ) , " ICMP_ADDRESS " } ,
# endif
# if defined(ICMP_ADDRESSREPLY)
{ ( 1 < < ICMP_ADDRESSREPLY ) , " ICMP_ADDRESSREPLY " } ,
# endif
{ 0 , NULL } ,
} ;
# endif /* SOL_RAW */
2002-04-01 16:48:06 +04:00
# if defined(AF_PACKET) /* from e.g. linux/if_packet.h */
static struct xlat af_packet_types [ ] = {
# if defined(PACKET_HOST)
{ PACKET_HOST , " PACKET_HOST " } ,
# endif
# if defined(PACKET_BROADCAST)
{ PACKET_BROADCAST , " PACKET_BROADCAST " } ,
# endif
# if defined(PACKET_MULTICAST)
{ PACKET_MULTICAST , " PACKET_MULTICAST " } ,
# endif
# if defined(PACKET_OTHERHOST)
{ PACKET_OTHERHOST , " PACKET_OTHERHOST " } ,
# endif
# if defined(PACKET_OUTGOING)
{ PACKET_OUTGOING , " PACKET_OUTGOING " } ,
# endif
# if defined(PACKET_LOOPBACK)
{ PACKET_LOOPBACK , " PACKET_LOOPBACK " } ,
# endif
# if defined(PACKET_FASTROUTE)
{ PACKET_FASTROUTE , " PACKET_FASTROUTE " } ,
# endif
{ 0 , NULL } ,
} ;
# endif /* defined(AF_PACKET) */
2000-08-10 06:14:04 +04:00
1999-02-19 03:21:36 +03:00
void
1999-11-18 20:09:47 +03:00
printsock ( tcp , addr , addrlen )
1999-02-19 03:21:36 +03:00
struct tcb * tcp ;
long addr ;
1999-11-18 20:09:47 +03:00
int addrlen ;
1999-02-19 03:21:36 +03:00
{
1999-11-18 20:09:47 +03:00
union {
char pad [ 128 ] ;
struct sockaddr sa ;
struct sockaddr_in sin ;
struct sockaddr_un sau ;
1999-08-30 03:15:07 +04:00
# ifdef HAVE_INET_NTOP
1999-11-18 20:09:47 +03:00
struct sockaddr_in6 sa6 ;
1999-08-30 03:15:07 +04:00
# endif
1999-11-18 20:09:47 +03:00
# if defined(LINUX) && defined(AF_IPX)
struct sockaddr_ipx sipx ;
# endif
# ifdef AF_PACKET
struct sockaddr_ll ll ;
1999-02-19 03:21:36 +03:00
# endif
1999-11-18 20:09:47 +03:00
# ifdef AF_NETLINK
struct sockaddr_nl nl ;
# endif
} addrbuf ;
char string_addr [ 100 ] ;
1999-02-19 03:21:36 +03:00
if ( addr = = 0 ) {
tprintf ( " NULL " ) ;
return ;
}
if ( ! verbose ( tcp ) ) {
tprintf ( " %#lx " , addr ) ;
return ;
}
1999-11-18 20:09:47 +03:00
if ( ( addrlen < 2 ) | | ( addrlen > sizeof ( addrbuf ) ) )
addrlen = sizeof ( addrbuf ) ;
if ( umoven ( tcp , addr , addrlen , ( char * ) & addrbuf ) < 0 ) {
1999-02-19 03:21:36 +03:00
tprintf ( " {...} " ) ;
return ;
}
1999-11-18 20:09:47 +03:00
2001-09-18 19:56:53 +04:00
tprintf ( " {sa_family= " ) ;
1999-11-18 20:09:47 +03:00
printxval ( addrfams , addrbuf . sa . sa_family , " AF_??? " ) ;
tprintf ( " , " ) ;
switch ( addrbuf . sa . sa_family ) {
1999-02-19 03:21:36 +03:00
case AF_UNIX :
1999-11-18 20:09:47 +03:00
if ( addrlen = = 2 ) {
tprintf ( " <nil> " ) ;
} else if ( addrbuf . sau . sun_path [ 0 ] ) {
2001-02-21 19:42:26 +03:00
tprintf ( " path= \" %-.*s \" " , addrlen - 2 , addrbuf . sau . sun_path ) ;
1999-11-18 20:09:47 +03:00
} else {
2001-02-21 19:42:26 +03:00
tprintf ( " path=@%-.*s " , addrlen - 3 , addrbuf . sau . sun_path + 1 ) ;
1999-11-18 20:09:47 +03:00
}
1999-02-19 03:21:36 +03:00
break ;
case AF_INET :
2001-09-18 19:56:53 +04:00
tprintf ( " sin_port=htons(%u), sin_addr=inet_addr( \" %s \" ) " ,
1999-11-18 20:09:47 +03:00
ntohs ( addrbuf . sin . sin_port ) , inet_ntoa ( addrbuf . sin . sin_addr ) ) ;
1999-02-19 03:21:36 +03:00
break ;
1999-08-30 03:15:07 +04:00
# ifdef HAVE_INET_NTOP
case AF_INET6 :
1999-11-18 20:09:47 +03:00
inet_ntop ( AF_INET6 , & addrbuf . sa6 . sin6_addr , string_addr , sizeof ( string_addr ) ) ;
2001-02-16 23:29:03 +03:00
tprintf ( " sin6_port=htons(%u), inet_pton(AF_INET6, \" %s \" , &sin6_addr), sin6_flowinfo=%u " ,
ntohs ( addrbuf . sa6 . sin6_port ) , string_addr ,
addrbuf . sa6 . sin6_flowinfo ) ;
2002-12-30 03:51:30 +03:00
# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
2001-02-16 23:29:03 +03:00
{
# if defined(HAVE_IF_INDEXTONAME) && defined(IN6_IS_ADDR_LINKLOCAL) && defined(IN6_IS_ADDR_MC_LINKLOCAL)
int numericscope = 0 ;
if ( IN6_IS_ADDR_LINKLOCAL ( & addrbuf . sa6 . sin6_addr )
| | IN6_IS_ADDR_MC_LINKLOCAL ( & addrbuf . sa6 . sin6_addr ) ) {
char scopebuf [ IFNAMSIZ + 1 ] ;
2002-12-30 03:51:30 +03:00
2001-02-16 23:29:03 +03:00
if ( if_indextoname ( addrbuf . sa6 . sin6_scope_id , scopebuf ) = = NULL )
numericscope + + ;
else
tprintf ( " , sin6_scope_id=if_nametoindex( \" %s \" ) " , scopebuf ) ;
} else
numericscope + + ;
2002-12-30 03:51:30 +03:00
2001-02-16 23:29:03 +03:00
if ( numericscope )
# endif
tprintf ( " , sin6_scope_id=%u " , addrbuf . sa6 . sin6_scope_id ) ;
}
# endif
break ;
1999-08-30 03:15:07 +04:00
# endif
1999-05-11 19:06:44 +04:00
# if defined(AF_IPX) && defined(linux)
1999-02-19 03:21:36 +03:00
case AF_IPX :
1999-11-18 20:09:47 +03:00
{
1999-02-19 03:21:36 +03:00
int i ;
2001-09-18 19:56:53 +04:00
tprintf ( " sipx_port=htons(%u), " ,
1999-11-18 20:09:47 +03:00
ntohs ( addrbuf . sipx . sipx_port ) ) ;
1999-02-19 03:21:36 +03:00
/* Yes, I know, this does not look too
* strace - ish , but otherwise the IPX
* addresses just look monstrous . . .
* Anyways , feel free if you don ' t like
2002-12-30 03:51:30 +03:00
* this way . . : )
1999-02-19 03:21:36 +03:00
*/
1999-11-18 20:09:47 +03:00
tprintf ( " %08lx: " , ( unsigned long ) ntohl ( addrbuf . sipx . sipx_network ) ) ;
1999-02-19 03:21:36 +03:00
for ( i = 0 ; i < IPX_NODE_LEN ; i + + )
1999-11-18 20:09:47 +03:00
tprintf ( " %02x " , addrbuf . sipx . sipx_node [ i ] ) ;
tprintf ( " /[%02x] " , addrbuf . sipx . sipx_type ) ;
}
break ;
# endif /* AF_IPX && linux */
# ifdef AF_PACKET
case AF_PACKET :
{
int i ;
2002-04-01 16:48:06 +04:00
tprintf ( " proto=%#04x, if%d, pkttype= " ,
1999-11-18 20:09:47 +03:00
ntohs ( addrbuf . ll . sll_protocol ) ,
2002-04-01 16:48:06 +04:00
addrbuf . ll . sll_ifindex ) ;
printxval ( af_packet_types , addrbuf . ll . sll_pkttype , " ? " ) ;
tprintf ( " , addr(%d)={%d, " ,
1999-11-18 20:09:47 +03:00
addrbuf . ll . sll_halen ,
addrbuf . ll . sll_hatype ) ;
2002-12-30 03:51:30 +03:00
for ( i = 0 ; i < addrbuf . ll . sll_halen ; i + + )
1999-11-18 20:09:47 +03:00
tprintf ( " %02x " , addrbuf . ll . sll_addr [ i ] ) ;
1999-02-19 03:21:36 +03:00
}
break ;
1999-11-18 20:09:47 +03:00
# endif /* AF_APACKET */
2003-11-07 02:41:23 +03:00
# ifdef AF_NETLINK
1999-11-18 20:09:47 +03:00
case AF_NETLINK :
tprintf ( " pid=%d, groups=%08x " , addrbuf . nl . nl_pid , addrbuf . nl . nl_groups ) ;
break ;
# endif /* AF_NETLINK */
1999-02-19 03:21:36 +03:00
/* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5
1999-11-18 20:09:47 +03:00
AF_X25 AF_ROSE etc . still need to be done */
1999-02-19 03:21:36 +03:00
default :
2001-09-18 19:56:53 +04:00
tprintf ( " sa_data= " ) ;
1999-02-19 03:21:36 +03:00
printstr ( tcp , ( long ) & ( ( struct sockaddr * ) addr ) - > sa_data ,
1999-11-18 20:09:47 +03:00
sizeof addrbuf . sa . sa_data ) ;
1999-02-19 03:21:36 +03:00
break ;
}
1999-11-18 20:09:47 +03:00
tprintf ( " } " ) ;
1999-02-19 03:21:36 +03:00
}
# if HAVE_SENDMSG
static void
printmsghdr ( tcp , addr )
struct tcb * tcp ;
long addr ;
{
struct msghdr msg ;
1999-05-09 04:29:58 +04:00
if ( umove ( tcp , addr , & msg ) < 0 ) {
tprintf ( " %#lx " , addr ) ;
return ;
}
1999-11-18 20:09:47 +03:00
tprintf ( " {msg_name(%d)= " , msg . msg_namelen ) ;
printsock ( tcp , ( long ) msg . msg_name , msg . msg_namelen ) ;
tprintf ( " , msg_iov(%lu)= " , ( unsigned long ) msg . msg_iovlen ) ;
2001-07-10 17:48:44 +04:00
tprint_iov ( tcp , msg . msg_iovlen , ( long ) msg . msg_iov ) ;
1999-11-18 20:09:47 +03:00
2002-12-30 03:51:30 +03:00
# ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
1999-11-18 20:09:47 +03:00
tprintf ( " , msg_controllen=%lu " , ( unsigned long ) msg . msg_controllen ) ;
2002-12-30 03:51:30 +03:00
if ( msg . msg_controllen )
1999-11-18 20:09:47 +03:00
tprintf ( " , msg_control=%#lx, " , ( unsigned long ) msg . msg_control ) ;
tprintf ( " , msg_flags= " ) ;
if ( printflags ( msg_flags , msg . msg_flags ) = = 0 )
tprintf ( " 0 " ) ;
2002-12-30 03:51:30 +03:00
# else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
1999-11-18 20:09:47 +03:00
tprintf ( " msg_accrights=%#lx, msg_accrightslen=%u " ,
1999-02-19 03:21:36 +03:00
( unsigned long ) msg . msg_accrights , msg . msg_accrightslen ) ;
2002-12-30 03:51:30 +03:00
# endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
1999-11-18 20:09:47 +03:00
tprintf ( " } " ) ;
1999-02-19 03:21:36 +03:00
}
# endif /* HAVE_SENDMSG */
int
sys_socket ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
printxval ( domains , tcp - > u_arg [ 0 ] , " PF_??? " ) ;
tprintf ( " , " ) ;
printxval ( socktypes , tcp - > u_arg [ 1 ] , " SOCK_??? " ) ;
tprintf ( " , " ) ;
switch ( tcp - > u_arg [ 0 ] ) {
case PF_INET :
2003-06-24 03:39:59 +04:00
# ifdef PF_INET6
case PF_INET6 :
# endif
1999-02-19 03:21:36 +03:00
printxval ( protocols , tcp - > u_arg [ 2 ] , " IPPROTO_??? " ) ;
break ;
# ifdef PF_IPX
case PF_IPX :
/* BTW: I don't believe this.. */
tprintf ( " [ " ) ;
printxval ( domains , tcp - > u_arg [ 2 ] , " PF_??? " ) ;
tprintf ( " ] " ) ;
break ;
# endif /* PF_IPX */
default :
tprintf ( " %lu " , tcp - > u_arg [ 2 ] ) ;
break ;
}
}
return 0 ;
}
2001-03-06 18:08:09 +03:00
int
sys_so_socket ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
/* not sure really what these args are... but this
* is how truss prints it
*/
tprintf ( " %ld, %ld, %ld, " ,
tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
printpath ( tcp , tcp - > u_arg [ 3 ] ) ;
tprintf ( " , %ld " , tcp - > u_arg [ 4 ] ) ;
}
return 0 ;
}
int
sys_so_socketpair ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
/* not sure what this arg is */
tprintf ( " 0x%lx " , tcp - > u_arg [ 0 ] ) ;
}
return 0 ;
}
1999-02-19 03:21:36 +03:00
int
sys_bind ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
1999-11-18 20:09:47 +03:00
printsock ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
1999-02-19 03:21:36 +03:00
tprintf ( " , %lu " , tcp - > u_arg [ 2 ] ) ;
}
return 0 ;
}
int
sys_connect ( tcp )
struct tcb * tcp ;
{
return sys_bind ( tcp ) ;
}
int
sys_listen ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, %lu " , tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] ) ;
}
return 0 ;
}
int
sys_accept ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
} else if ( ! tcp - > u_arg [ 2 ] )
tprintf ( " %#lx, NULL " , tcp - > u_arg [ 1 ] ) ;
else {
if ( tcp - > u_arg [ 1 ] = = 0 | | syserror ( tcp ) ) {
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
} else {
1999-11-18 20:09:47 +03:00
printsock ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
1999-02-19 03:21:36 +03:00
}
tprintf ( " , " ) ;
printnum ( tcp , tcp - > u_arg [ 2 ] , " %lu " ) ;
}
return 0 ;
}
int
sys_send ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
/* flags */
if ( printflags ( msg_flags , tcp - > u_arg [ 3 ] ) = = 0 )
tprintf ( " 0 " ) ;
}
return 0 ;
}
int
sys_sendto ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
/* flags */
if ( printflags ( msg_flags , tcp - > u_arg [ 3 ] ) = = 0 )
tprintf ( " 0 " ) ;
/* to address */
tprintf ( " , " ) ;
1999-11-18 20:09:47 +03:00
printsock ( tcp , tcp - > u_arg [ 4 ] , tcp - > u_arg [ 5 ] ) ;
1999-02-19 03:21:36 +03:00
/* to length */
tprintf ( " , %lu " , tcp - > u_arg [ 5 ] ) ;
}
return 0 ;
}
# ifdef HAVE_SENDMSG
int
sys_sendmsg ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
printmsghdr ( tcp , tcp - > u_arg [ 1 ] ) ;
/* flags */
tprintf ( " , " ) ;
if ( printflags ( msg_flags , tcp - > u_arg [ 2 ] ) = = 0 )
tprintf ( " 0 " ) ;
}
return 0 ;
}
# endif /* HAVE_SENDMSG */
int
sys_recv ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
} else {
if ( syserror ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
else
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_rval ) ;
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
if ( printflags ( msg_flags , tcp - > u_arg [ 3 ] ) = = 0 )
tprintf ( " 0 " ) ;
}
return 0 ;
}
int
sys_recvfrom ( tcp )
struct tcb * tcp ;
{
int fromlen ;
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
} else {
if ( syserror ( tcp ) ) {
tprintf ( " %#lx, %lu, %lu, %#lx, %#lx " ,
tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] , tcp - > u_arg [ 3 ] ,
tcp - > u_arg [ 4 ] , tcp - > u_arg [ 5 ] ) ;
return 0 ;
}
/* buf */
printstr ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_rval ) ;
/* len */
tprintf ( " , %lu, " , tcp - > u_arg [ 2 ] ) ;
/* flags */
if ( printflags ( msg_flags , tcp - > u_arg [ 3 ] ) = = 0 )
tprintf ( " 0 " ) ;
/* from address, len */
if ( ! tcp - > u_arg [ 4 ] | | ! tcp - > u_arg [ 5 ] ) {
if ( tcp - > u_arg [ 4 ] = = 0 )
tprintf ( " , NULL " ) ;
else
tprintf ( " , %#lx " , tcp - > u_arg [ 4 ] ) ;
if ( tcp - > u_arg [ 5 ] = = 0 )
tprintf ( " , NULL " ) ;
else
tprintf ( " , %#lx " , tcp - > u_arg [ 5 ] ) ;
return 0 ;
}
if ( umove ( tcp , tcp - > u_arg [ 5 ] , & fromlen ) < 0 ) {
tprintf ( " , {...}, [?] " ) ;
return 0 ;
}
tprintf ( " , " ) ;
1999-11-18 20:09:47 +03:00
printsock ( tcp , tcp - > u_arg [ 4 ] , tcp - > u_arg [ 5 ] ) ;
1999-02-19 03:21:36 +03:00
/* from length */
tprintf ( " , [%u] " , fromlen ) ;
}
return 0 ;
}
# ifdef HAVE_SENDMSG
int
sys_recvmsg ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
} else {
if ( syserror ( tcp ) | | ! verbose ( tcp ) )
tprintf ( " %#lx " , tcp - > u_arg [ 1 ] ) ;
else
printmsghdr ( tcp , tcp - > u_arg [ 1 ] ) ;
/* flags */
tprintf ( " , " ) ;
if ( printflags ( msg_flags , tcp - > u_arg [ 2 ] ) = = 0 )
tprintf ( " 0 " ) ;
}
return 0 ;
}
# endif /* HAVE_SENDMSG */
int
sys_shutdown ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, %ld " , tcp - > u_arg [ 0 ] , tcp - > u_arg [ 1 ] ) ;
switch ( tcp - > u_arg [ 1 ] ) {
case 0 :
tprintf ( " %s " , " /* receive */ " ) ;
break ;
case 1 :
tprintf ( " %s " , " /* send */ " ) ;
break ;
case 2 :
tprintf ( " %s " , " /* send and receive */ " ) ;
break ;
}
}
return 0 ;
}
int
sys_getsockname ( tcp )
struct tcb * tcp ;
{
return sys_accept ( tcp ) ;
}
int
sys_getpeername ( tcp )
struct tcb * tcp ;
{
return sys_accept ( tcp ) ;
}
int
sys_pipe ( tcp )
struct tcb * tcp ;
{
2004-03-01 23:30:48 +03:00
# if defined(LINUX) && !defined(SPARC) && !defined(SH) && !defined(IA64)
1999-02-19 03:21:36 +03:00
int fds [ 2 ] ;
if ( exiting ( tcp ) ) {
if ( syserror ( tcp ) ) {
tprintf ( " %#lx " , tcp - > u_arg [ 0 ] ) ;
return 0 ;
}
if ( umoven ( tcp , tcp - > u_arg [ 0 ] , sizeof fds , ( char * ) fds ) < 0 )
tprintf ( " [...] " ) ;
else
tprintf ( " [%u, %u] " , fds [ 0 ] , fds [ 1 ] ) ;
}
2004-03-01 23:30:48 +03:00
# elif defined(SPARC) || defined(SH) || defined(SVR4) || defined(FREEBSD) || defined(IA64)
1999-02-19 03:21:36 +03:00
if ( exiting ( tcp ) )
tprintf ( " [%lu, %lu] " , tcp - > u_rval , getrval2 ( tcp ) ) ;
# endif
return 0 ;
}
int
sys_socketpair ( tcp )
struct tcb * tcp ;
{
# ifdef LINUX
int fds [ 2 ] ;
# endif
if ( entering ( tcp ) ) {
printxval ( domains , tcp - > u_arg [ 0 ] , " PF_??? " ) ;
tprintf ( " , " ) ;
printxval ( socktypes , tcp - > u_arg [ 1 ] , " SOCK_??? " ) ;
tprintf ( " , " ) ;
switch ( tcp - > u_arg [ 0 ] ) {
case PF_INET :
printxval ( protocols , tcp - > u_arg [ 2 ] , " IPPROTO_??? " ) ;
break ;
# ifdef PF_IPX
case PF_IPX :
/* BTW: I don't believe this.. */
tprintf ( " [ " ) ;
printxval ( domains , tcp - > u_arg [ 2 ] , " PF_??? " ) ;
tprintf ( " ] " ) ;
break ;
# endif /* PF_IPX */
2002-12-30 03:51:30 +03:00
default :
1999-05-09 04:29:58 +04:00
tprintf ( " %lu " , tcp - > u_arg [ 2 ] ) ;
1999-02-19 03:21:36 +03:00
break ;
}
} else {
if ( syserror ( tcp ) ) {
1999-05-09 04:29:58 +04:00
tprintf ( " , %#lx " , tcp - > u_arg [ 3 ] ) ;
1999-02-19 03:21:36 +03:00
return 0 ;
}
# ifdef LINUX
if ( umoven ( tcp , tcp - > u_arg [ 3 ] , sizeof fds , ( char * ) fds ) < 0 )
1999-05-09 04:29:58 +04:00
tprintf ( " , [...] " ) ;
1999-02-19 03:21:36 +03:00
else
tprintf ( " , [%u, %u] " , fds [ 0 ] , fds [ 1 ] ) ;
# endif /* LINUX */
2000-09-04 03:57:48 +04:00
# if defined(SUNOS4) || defined(SVR4) || defined(FREEBSD)
1999-02-19 03:21:36 +03:00
tprintf ( " , [%lu, %lu] " , tcp - > u_rval , getrval2 ( tcp ) ) ;
2000-09-04 03:57:48 +04:00
# endif /* SUNOS4 || SVR4 || FREEBSD */
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
int
sys_getsockopt ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
2002-05-22 19:46:49 +04:00
printxval ( socketlayers , tcp - > u_arg [ 1 ] , " SOL_??? " ) ;
tprintf ( " , " ) ;
1999-02-19 03:21:36 +03:00
switch ( tcp - > u_arg [ 1 ] ) {
case SOL_SOCKET :
printxval ( sockoptions , tcp - > u_arg [ 2 ] , " SO_??? " ) ;
break ;
# ifdef SOL_IP
case SOL_IP :
printxval ( sockipoptions , tcp - > u_arg [ 2 ] , " IP_??? " ) ;
break ;
# endif
# ifdef SOL_IPX
case SOL_IPX :
printxval ( sockipxoptions , tcp - > u_arg [ 2 ] , " IPX_??? " ) ;
break ;
# endif
2000-07-05 20:05:39 +04:00
# ifdef SOL_PACKET
case SOL_PACKET :
printxval ( sockpacketoptions , tcp - > u_arg [ 2 ] , " PACKET_??? " ) ;
break ;
# endif
1999-02-19 03:21:36 +03:00
# ifdef SOL_TCP
case SOL_TCP :
printxval ( socktcpoptions , tcp - > u_arg [ 2 ] , " TCP_??? " ) ;
break ;
# endif
/* SOL_AX25 SOL_ROSE SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
* etc . still need work */
2002-12-30 03:51:30 +03:00
default :
2002-05-22 19:46:49 +04:00
tprintf ( " %lu " , tcp - > u_arg [ 2 ] ) ;
1999-02-19 03:21:36 +03:00
break ;
}
} else {
2002-05-22 19:46:49 +04:00
long len ;
if ( syserror ( tcp ) | | umove ( tcp , tcp - > u_arg [ 4 ] , & len ) < 0 ) {
tprintf ( " , %#lx, %#lx " ,
1999-02-19 03:21:36 +03:00
tcp - > u_arg [ 3 ] , tcp - > u_arg [ 4 ] ) ;
return 0 ;
}
2002-05-22 19:46:49 +04:00
switch ( tcp - > u_arg [ 1 ] ) {
case SOL_SOCKET :
switch ( tcp - > u_arg [ 2 ] ) {
# ifdef SO_LINGER
case SO_LINGER :
if ( len = = sizeof ( struct linger ) ) {
struct linger linger ;
if ( umove ( tcp ,
tcp - > u_arg [ 3 ] ,
& linger ) < 0 )
break ;
tprintf ( " , {onoff=%d, linger=%d}, "
" [%ld] " ,
linger . l_onoff ,
linger . l_linger ,
len ) ;
return 0 ;
}
break ;
# endif
}
break ;
}
tprintf ( " , " ) ;
if ( len = = sizeof ( int ) ) {
printnum ( tcp , tcp - > u_arg [ 3 ] , " %ld " ) ;
}
else {
printstr ( tcp , tcp - > u_arg [ 3 ] , len ) ;
}
tprintf ( " , [%ld] " , len ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
2000-07-05 20:05:39 +04:00
# if defined(ICMP_FILTER)
static void printicmpfilter ( tcp , addr )
struct tcb * tcp ;
long addr ;
{
struct icmp_filter filter ;
if ( ! addr ) {
tprintf ( " NULL " ) ;
return ;
}
if ( syserror ( tcp ) | | ! verbose ( tcp ) ) {
tprintf ( " %#lx " , addr ) ;
return ;
}
if ( umove ( tcp , addr , & filter ) < 0 ) {
tprintf ( " {...} " ) ;
return ;
}
tprintf ( " ~( " ) ;
if ( printflags ( icmpfilterflags , ~ filter . data ) = = 0 )
tprintf ( " 0 " ) ;
tprintf ( " ) " ) ;
}
# endif /* ICMP_FILTER */
2002-05-23 15:48:58 +04:00
static int
printsockopt ( tcp , level , name , addr , len )
1999-02-19 03:21:36 +03:00
struct tcb * tcp ;
2002-05-23 15:48:58 +04:00
int level ;
int name ;
long addr ;
int len ;
1999-02-19 03:21:36 +03:00
{
2002-05-23 15:48:58 +04:00
printxval ( socketlayers , level , " SOL_?? " ) ;
tprintf ( " , " ) ;
switch ( level ) {
case SOL_SOCKET :
printxval ( sockoptions , name , " SO_??? " ) ;
switch ( name ) {
2002-05-22 19:46:49 +04:00
# if defined(SO_LINGER)
2002-05-23 15:48:58 +04:00
case SO_LINGER :
if ( len = = sizeof ( struct linger ) ) {
struct linger linger ;
if ( umove ( tcp , addr , & linger ) < 0 )
break ;
tprintf ( " , {onoff=%d, linger=%d} " ,
linger . l_onoff ,
linger . l_linger ) ;
return 0 ;
2002-05-22 19:46:49 +04:00
}
1999-02-19 03:21:36 +03:00
break ;
2002-05-23 15:48:58 +04:00
# endif
}
break ;
1999-02-19 03:21:36 +03:00
# ifdef SOL_IP
2002-05-23 15:48:58 +04:00
case SOL_IP :
printxval ( sockipoptions , name , " IP_??? " ) ;
break ;
1999-02-19 03:21:36 +03:00
# endif
# ifdef SOL_IPX
2002-05-23 15:48:58 +04:00
case SOL_IPX :
printxval ( sockipxoptions , name , " IPX_??? " ) ;
break ;
2000-07-05 20:05:39 +04:00
# endif
# ifdef SOL_PACKET
2002-05-23 15:48:58 +04:00
case SOL_PACKET :
printxval ( sockpacketoptions , name , " PACKET_??? " ) ;
/* TODO: decode packate_mreq for PACKET_*_MEMBERSHIP */
break ;
1999-02-19 03:21:36 +03:00
# endif
# ifdef SOL_TCP
2002-05-23 15:48:58 +04:00
case SOL_TCP :
printxval ( socktcpoptions , name , " TCP_??? " ) ;
break ;
2000-07-05 20:05:39 +04:00
# endif
# ifdef SOL_RAW
2002-05-23 15:48:58 +04:00
case SOL_RAW :
printxval ( sockrawoptions , name , " RAW_??? " ) ;
switch ( name ) {
2000-07-05 20:05:39 +04:00
# if defined(ICMP_FILTER)
2002-05-23 15:48:58 +04:00
case ICMP_FILTER :
tprintf ( " , " ) ;
printicmpfilter ( tcp , addr ) ;
return 0 ;
2000-07-05 20:05:39 +04:00
# endif
2002-05-23 15:48:58 +04:00
}
break ;
1999-02-19 03:21:36 +03:00
# endif
2002-12-30 03:51:30 +03:00
/* SOL_AX25 SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
1999-02-19 03:21:36 +03:00
* etc . still need work */
2002-05-22 19:46:49 +04:00
2002-05-23 15:48:58 +04:00
default :
tprintf ( " %u " , name ) ;
}
2002-05-22 19:46:49 +04:00
2002-05-23 15:48:58 +04:00
/* default arg printing */
2002-05-22 19:46:49 +04:00
2002-05-23 15:48:58 +04:00
tprintf ( " , " ) ;
2002-12-30 03:51:30 +03:00
2002-05-23 15:48:58 +04:00
if ( len = = sizeof ( int ) ) {
printnum ( tcp , addr , " %ld " ) ;
}
else {
printstr ( tcp , addr , len ) ;
}
return 0 ;
}
2003-01-14 10:53:38 +03:00
# ifdef HAVE_STRUCT_OPTHDR
2002-05-23 15:48:58 +04:00
void
print_sock_optmgmt ( tcp , addr , len )
struct tcb * tcp ;
long addr ;
int len ;
{
int c = 0 ;
struct opthdr hdr ;
2002-05-24 14:19:44 +04:00
while ( len > = ( int ) sizeof hdr ) {
2002-05-23 15:48:58 +04:00
if ( umove ( tcp , addr , & hdr ) < 0 ) break ;
if ( c + + ) {
tprintf ( " , " ) ;
1999-02-19 03:21:36 +03:00
}
2002-05-23 15:48:58 +04:00
else if ( len > hdr . len + sizeof hdr ) {
tprintf ( " [ " ) ;
2002-05-22 19:46:49 +04:00
}
2002-05-23 15:48:58 +04:00
tprintf ( " { " ) ;
addr + = sizeof hdr ;
len - = sizeof hdr ;
printsockopt ( tcp , hdr . level , hdr . name , addr , hdr . len ) ;
2002-05-24 14:19:44 +04:00
if ( hdr . len > 0 ) {
addr + = hdr . len ;
len - = hdr . len ;
}
2002-05-23 15:48:58 +04:00
tprintf ( " } " ) ;
}
if ( len > 0 ) {
if ( c + + ) tprintf ( " , " ) ;
printstr ( tcp , addr , len ) ;
}
if ( c > 1 ) tprintf ( " ] " ) ;
}
# endif
int
sys_setsockopt ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
tprintf ( " %ld, " , tcp - > u_arg [ 0 ] ) ;
printsockopt ( tcp , tcp - > u_arg [ 1 ] , tcp - > u_arg [ 2 ] ,
tcp - > u_arg [ 3 ] , tcp - > u_arg [ 4 ] ) ;
2002-05-22 19:46:49 +04:00
tprintf ( " , %lu " , tcp - > u_arg [ 4 ] ) ;
1999-02-19 03:21:36 +03:00
}
return 0 ;
}
2000-08-10 06:14:04 +04:00
# if UNIXWARE >= 7
static struct xlat sock_version [ ] = {
{ __NETLIB_UW211_SVR4 , " UW211_SVR4 " } ,
{ __NETLIB_UW211_XPG4 , " UW211_XPG4 " } ,
{ __NETLIB_GEMINI_SVR4 , " GEMINI_SVR4 " } ,
{ __NETLIB_GEMINI_XPG4 , " GEMINI_XPG4 " } ,
{ __NETLIB_FP1_SVR4 , " FP1_SVR4 " } ,
{ __NETLIB_FP1_XPG4 , " FP1_XPG4 " } ,
{ 0 , NULL } ,
} ;
int
netlib_call ( tcp , func )
struct tcb * tcp ;
int ( * func ) ( ) ;
{
if ( entering ( tcp ) ) {
int i ;
printxval ( sock_version , tcp - > u_arg [ 0 ] , " __NETLIB_??? " ) ;
tprintf ( " , " ) ;
- - tcp - > u_nargs ;
for ( i = 0 ; i < tcp - > u_nargs ; i + + )
tcp - > u_arg [ i ] = tcp - > u_arg [ i + 1 ] ;
return func ( tcp ) ;
2002-12-30 03:51:30 +03:00
2000-08-10 06:14:04 +04:00
}
return func ( tcp ) ;
}
int
sys_xsocket ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_socket ) ;
}
int
sys_xsocketpair ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_socketpair ) ;
}
int
sys_xbind ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_bind ) ;
}
int
sys_xconnect ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_connect ) ;
}
int
sys_xlisten ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_listen ) ;
}
int
sys_xaccept ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_accept ) ;
}
int
sys_xsendmsg ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_sendmsg ) ;
}
int
sys_xrecvmsg ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_recvmsg ) ;
}
int
sys_xgetsockaddr ( tcp )
struct tcb * tcp ;
{
if ( entering ( tcp ) ) {
printxval ( sock_version , tcp - > u_arg [ 0 ] , " __NETLIB_??? " ) ;
tprintf ( " , " ) ;
if ( tcp - > u_arg [ 1 ] = = 0 ) {
tprintf ( " LOCALNAME, " ) ;
}
else if ( tcp - > u_arg [ 1 ] = = 1 ) {
tprintf ( " REMOTENAME, " ) ;
}
else {
tprintf ( " %ld, " , tcp - > u_arg [ 1 ] ) ;
}
tprintf ( " %ld, " , tcp - > u_arg [ 2 ] ) ;
2002-12-30 03:51:30 +03:00
}
2000-08-10 06:14:04 +04:00
else {
if ( tcp - > u_arg [ 3 ] = = 0 | | syserror ( tcp ) ) {
tprintf ( " %#lx " , tcp - > u_arg [ 3 ] ) ;
} else {
printsock ( tcp , tcp - > u_arg [ 3 ] , tcp - > u_arg [ 4 ] ) ;
}
tprintf ( " , " ) ;
printnum ( tcp , tcp - > u_arg [ 4 ] , " %lu " ) ;
}
return 0 ;
}
#if 0
int
sys_xsetsockaddr ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_setsockaddr ) ;
}
# endif
int
sys_xgetsockopt ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_getsockopt ) ;
}
int
sys_xsetsockopt ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_setsockopt ) ;
}
int
sys_xshutdown ( tcp )
struct tcb * tcp ;
{
return netlib_call ( tcp , sys_shutdown ) ;
}
# endif