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 [ ] = {
2004-06-04 06:24:14 +04:00
# ifdef PF_AAL5
{ PF_AAL5 , " PF_AAL5 " } ,
1999-11-18 20:09:47 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_APPLETALK
{ PF_APPLETALK , " PF_APPLETALK " } ,
1999-11-18 20:09:47 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_ASH
{ PF_ASH , " PF_ASH " } ,
# endif
# ifdef PF_ATMPVC
{ PF_ATMPVC , " PF_ATMPVC " } ,
1999-11-18 20:09:47 +03:00
# endif
# ifdef PF_ATMSVC
2004-06-04 06:24:14 +04:00
{ PF_ATMSVC , " PF_ATMSVC " } ,
# endif
# ifdef PF_AX25
{ PF_AX25 , " PF_AX25 " } ,
# endif
# ifdef PF_BLUETOOTH
{ PF_BLUETOOTH , " PF_BLUETOOTH " } ,
# endif
# ifdef PF_BRIDGE
{ PF_BRIDGE , " PF_BRIDGE " } ,
# endif
# ifdef PF_DECnet
{ PF_DECnet , " PF_DECnet " } ,
# endif
# ifdef PF_DECNET
{ PF_DECNET , " PF_DECNET " } ,
# endif
# ifdef PF_ECONET
{ PF_ECONET , " PF_ECONET " } ,
# endif
# ifdef PF_FILE
{ PF_FILE , " PF_FILE " } ,
# endif
# ifdef PF_IMPLINK
{ PF_IMPLINK , " PF_IMPLINK " } ,
# endif
# ifdef PF_INET
{ PF_INET , " PF_INET " } ,
1999-11-18 20:09:47 +03:00
# endif
# ifdef PF_INET6
{ PF_INET6 , " PF_INET6 " } ,
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_IPX
{ PF_IPX , " PF_IPX " } ,
# endif
# ifdef PF_IRDA
{ PF_IRDA , " PF_IRDA " } ,
1999-02-19 03:21:36 +03:00
# endif
# ifdef PF_ISO
{ PF_ISO , " PF_ISO " } ,
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_KEY
{ PF_KEY , " PF_KEY " } ,
1999-02-19 03:21:36 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_UNIX
{ PF_UNIX , " PF_UNIX " } ,
1999-02-19 03:21:36 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_LOCAL
{ PF_LOCAL , " PF_LOCAL " } ,
# endif
# ifdef PF_NETBEUI
{ PF_NETBEUI , " PF_NETBEUI " } ,
# endif
# ifdef PF_NETLINK
{ PF_NETLINK , " PF_NETLINK " } ,
1999-02-19 03:21:36 +03:00
# endif
# ifdef PF_NETROM
{ PF_NETROM , " PF_NETROM " } ,
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_PACKET
{ PF_PACKET , " PF_PACKET " } ,
1999-02-19 03:21:36 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_PPPOX
{ PF_PPPOX , " PF_PPPOX " } ,
1999-02-19 03:21:36 +03:00
# endif
# ifdef PF_ROSE
{ PF_ROSE , " PF_ROSE " } ,
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_ROUTE
{ PF_ROUTE , " PF_ROUTE " } ,
1999-02-19 03:21:36 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_SECURITY
{ PF_SECURITY , " PF_SECURITY " } ,
1999-02-19 03:21:36 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef PF_SNA
{ PF_SNA , " PF_SNA " } ,
# endif
# ifdef PF_UNSPEC
{ PF_UNSPEC , " PF_UNSPEC " } ,
# endif
# ifdef PF_WANPIPE
{ PF_WANPIPE , " PF_WANPIPE " } ,
# endif
# ifdef PF_X25
{ PF_X25 , " PF_X25 " } ,
1999-02-19 03:21:36 +03:00
# endif
{ 0 , NULL } ,
} ;
2004-07-12 11:13:06 +04:00
struct xlat addrfams [ ] = {
2004-06-04 06:24:14 +04:00
# ifdef AF_APPLETALK
{ AF_APPLETALK , " AF_APPLETALK " } ,
# endif
# ifdef AF_ASH
{ AF_ASH , " AF_ASH " } ,
# endif
# ifdef AF_ATMPVC
{ AF_ATMPVC , " AF_ATMPVC " } ,
# endif
# ifdef AF_ATMSVC
{ AF_ATMSVC , " AF_ATMSVC " } ,
# endif
# ifdef AF_AX25
{ AF_AX25 , " AF_AX25 " } ,
# endif
# ifdef AF_BLUETOOTH
{ AF_BLUETOOTH , " AF_BLUETOOTH " } ,
# endif
# ifdef AF_BRIDGE
{ AF_BRIDGE , " AF_BRIDGE " } ,
# endif
# ifdef AF_DECnet
{ AF_DECnet , " AF_DECnet " } ,
# endif
# ifdef AF_ECONET
{ AF_ECONET , " AF_ECONET " } ,
# endif
# ifdef AF_FILE
{ AF_FILE , " AF_FILE " } ,
# endif
# ifdef AF_IMPLINK
{ AF_IMPLINK , " AF_IMPLINK " } ,
# endif
# ifdef AF_INET
1999-11-18 20:09:47 +03:00
{ AF_INET , " AF_INET " } ,
2004-06-04 06:24:14 +04:00
# endif
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
2004-06-04 06:24:14 +04:00
# ifdef AF_IPX
{ AF_IPX , " AF_IPX " } ,
1999-11-18 20:09:47 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef AF_IRDA
{ AF_IRDA , " AF_IRDA " } ,
# endif
# ifdef AF_ISO
{ AF_ISO , " AF_ISO " } ,
# endif
# ifdef AF_KEY
{ AF_KEY , " AF_KEY " } ,
# endif
# ifdef AF_UNIX
{ AF_UNIX , " AF_UNIX " } ,
# endif
# ifdef AF_LOCAL
{ AF_LOCAL , " AF_LOCAL " } ,
# endif
# ifdef AF_NETBEUI
{ AF_NETBEUI , " AF_NETBEUI " } ,
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
2004-06-04 06:24:14 +04:00
# ifdef AF_NETROM
{ AF_NETROM , " AF_NETROM " } ,
1999-11-18 20:09:47 +03:00
# endif
2004-06-04 06:24:14 +04:00
# ifdef AF_PACKET
{ AF_PACKET , " AF_PACKET " } ,
# endif
# ifdef AF_PPPOX
{ AF_PPPOX , " AF_PPPOX " } ,
# endif
# ifdef AF_ROSE
{ AF_ROSE , " AF_ROSE " } ,
# endif
# ifdef AF_ROUTE
{ AF_ROUTE , " AF_ROUTE " } ,
# endif
# ifdef AF_SECURITY
{ AF_SECURITY , " AF_SECURITY " } ,
# endif
# ifdef AF_SNA
{ AF_SNA , " AF_SNA " } ,
# endif
# ifdef AF_UNSPEC
{ AF_UNSPEC , " AF_UNSPEC " } ,
# endif
# ifdef AF_WANPIPE
{ AF_WANPIPE , " AF_WANPIPE " } ,
# endif
# ifdef AF_X25
{ AF_X25 , " AF_X25 " } ,
1999-11-18 20:09:47 +03:00
# 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 " } ,
2004-04-14 06:53:54 +04:00
# endif
# ifdef MSG_FIN
{ MSG_FIN , " MSG_FIN " } ,
# endif
# ifdef MSG_SYN
{ MSG_SYN , " MSG_SYN " } ,
# endif
# ifdef MSG_RST
{ MSG_RST , " MSG_RST " } ,
# endif
# ifdef MSG_NOSIGNAL
{ MSG_NOSIGNAL , " MSG_NOSIGNAL " } ,
# endif
# ifdef MSG_MORE
{ MSG_MORE , " MSG_MORE " } ,
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 " } ,
2004-08-31 11:01:26 +04:00
# endif
# ifdef IP_MSFILTER
{ IP_MSFILTER , " IP_MSFILTER " } ,
# endif
# ifdef MCAST_MSFILTER
{ MCAST_MSFILTER , " MCAST_MSFILTER " } ,
# endif
# ifdef IP_FREEBIND
{ IP_FREEBIND , " IP_FREEBIND " } ,
2002-05-22 19:46:49 +04:00
# endif
2000-07-05 20:05:39 +04:00
{ 0 , NULL } ,
1999-02-19 03:21:36 +03:00
} ;
# endif /* SOL_IP */
2004-08-31 11:01:26 +04:00
# ifdef SOL_IPV6
static struct xlat sockipv6options [ ] = {
# ifdef IPV6_ADDRFORM
{ IPV6_ADDRFORM , " IPV6_ADDRFORM " } ,
# endif
# ifdef MCAST_FILTER
{ MCAST_FILTER , " MCAST_FILTER " } ,
# endif
# ifdef IPV6_PKTOPTIONS
{ IPV6_PKTOPTIONS , " IPV6_PKTOPTIONS " } ,
# endif
# ifdef IPV6_MTU
{ IPV6_MTU , " IPV6_MTU " } ,
# endif
# ifdef IPV6_V6ONLY
{ IPV6_V6ONLY , " IPV6_V6ONLY " } ,
# endif
# ifdef IPV6_PKTINFO
{ IPV6_PKTINFO , " IPV6_PKTINFO " } ,
# endif
# ifdef IPV6_HOPLIMIT
{ IPV6_HOPLIMIT , " IPV6_HOPLIMIT " } ,
# endif
# ifdef IPV6_RTHDR
{ IPV6_RTHDR , " IPV6_RTHDR " } ,
# endif
# ifdef IPV6_HOPOPTS
{ IPV6_HOPOPTS , " IPV6_HOPOPTS " } ,
# endif
# ifdef IPV6_DSTOPTS
{ IPV6_DSTOPTS , " IPV6_DSTOPTS " } ,
# endif
# ifdef IPV6_FLOWINFO
{ IPV6_FLOWINFO , " IPV6_FLOWINFO " } ,
# endif
# ifdef IPV6_UNICAST_HOPS
{ IPV6_UNICAST_HOPS , " IPV6_UNICAST_HOPS " } ,
# endif
# ifdef IPV6_MULTICAST_HOPS
{ IPV6_MULTICAST_HOPS , " IPV6_MULTICAST_HOPS " } ,
# endif
# ifdef IPV6_MULTICAST_LOOP
{ IPV6_MULTICAST_LOOP , " IPV6_MULTICAST_LOOP " } ,
# endif
# ifdef IPV6_MULTICAST_IF
{ IPV6_MULTICAST_IF , " IPV6_MULTICAST_IF " } ,
# endif
# ifdef IPV6_MTU_DISCOVER
{ IPV6_MTU_DISCOVER , " IPV6_MTU_DISCOVER " } ,
# endif
# ifdef IPV6_RECVERR
{ IPV6_RECVERR , " IPV6_RECVERR " } ,
# endif
# ifdef IPV6_FLOWINFO_SEND
{ IPV6_FLOWINFO_SEND , " IPV6_FLOWINFO_SEND " } ,
# endif
{ 0 , NULL } ,
} ;
# endif /* SOL_IPV6 */
1999-02-19 03:21:36 +03:00
# 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-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# if defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !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-07-07 David S. Miller <davem@nuts.davemloft.net>
* linux/sparc/syscallent.h: Sync with reality.
* linux/sparc/syscall.h (sys_sendfile64, sys_futex, sys_gettid,
sys_sched_setaffinity, sys_sched_getaffinity, sys_setxattr,
sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr,
sys_fgetxattr, sys_listxattr, sys_llistxattr, sys_flistxattr,
sys_removexattr, sys_lremovexattr, sys_fremovexattr,
sys_remap_file_pages, sys_readahead, sys_tgkill, sys_statfs64,
sys_fstatfs64, sys_clock_settime, sys_clock_gettime,
sys_clock_getres, sys_clock_nanosleep, sys_timer_create,
sys_timer_settime, sys_timer_gettime): New declarations.
* linux/sparc64/dummy2.h, linux/sparc64/syscallent2.h,
linux/sparc64/syscall.h, linux/sparc64/errnoent.h,
linux/sparc64/errnoent1.h, linux/sparc64/errnoent2.h,
linux/sparc64/ioctlent.h, linux/sparc64/ioctlent1.h,
linux/sparc64/ioctlent2.h, linux/sparc64/signalent.h,
linux/sparc64/signalent.h, linux/sparc64/signalent.h,
linux/sparc64/signalent1.h, linux/sparc64/signalent2.h,
linux/sparc64/syscall1.h, linux/sparc64/syscallent.h,
linux/sparc64/syscallent1.h: New files.
* defs.h (LINUXSPARC): Define also when SPARC64.
(LINUX && SPARC64): Set SUPPORTED_PERSONALITIES to 3.
Ignore SIGTRAP after execve by defining TCB_WAITEXECVE.
Define possibly missing __NR_exit_group. Declare getrval2.
* configure.ac (sparc64): New architecture case.
* config.h.in (SPARC64): New define.
* file.c (stat_sparc64): New structure.
(printstat_sparc64): New output routine for that.
(printstat): Call it, if personality is 2.
(printstat64): Likewise.
* util.c: Conditionalize ptrace defines on LINUXSPARC
not LINUX && SPARC.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(_hack_syscall5): Correct trap number when SPARC64.
(PTRACE_WRITE{TEXT,DATA}): Add SPARC64 to ifdef guard.
(getpc): Handle SPARC64 && LINUX.
(printcall): Likewise.
(arg fetching/setting): Use same code for SPARC64 LINUX
as for SPARC.
(setbpt): Handle SPARC64 && LINUX.
(clearbpt): Likewise.
* signal.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(m_siginfo): Use same definition on SPARC64 as SPARC.
(sys_sigreturn): Handle LINUX && SPARC64.
* syscall.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(getscno): Use same static state on SPARC64 as SPARC,
and add SPARC64 handling.
(get_error): Handle LINUX && SPARC64.
(force_result): Likewise.
(syscall_enter): Likewise.
(trace_syscall): Handle sys_socketcall and sys_ipc on SPARC64
just like SPARC.
(getrval2): Handle LINUX && SPARC64.
* process.c: Conditionalize ptrace defines on SPARC and
SPARC64.
(SPARC64 && LINUX): Define r_pc to r_tpc, and PTRACE_FOOREGS
to PTRACE_FOOREGS64 so that more sparc code can be shared
between 64-bit and 32-bit.
(change_syscall): Handle LINUX && SPARC64.
(struct_user_offsets): Ifdef out those which do not exist
on SPARC64.
* net.c (sys_pipe): Handle LINUX && SPARC64.
* ioctl.c: Fix initializer typo for nioctlents2, was
nioctlents1 by accident.
2004-07-12 11:44:08 +04:00
# elif defined(SPARC) || defined(SPARC64) || 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
2004-08-31 11:01:26 +04:00
# ifdef SOL_IPV6
case SOL_IPV6 :
printxval ( sockipv6options , tcp - > u_arg [ 2 ] , " IPV6_??? " ) ;
break ;
# endif
1999-02-19 03:21:36 +03:00
# 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
2004-08-31 11:01:26 +04:00
# ifdef SOL_IPV6
case SOL_IPV6 :
printxval ( sockipv6options , name , " IPV6_??? " ) ;
break ;
# endif
1999-02-19 03:21:36 +03:00
# 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