blob: 17ace6996f7b147b8398edd8d166bc121fe0a2d5 [file] [log] [blame]
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
Wichert Akkerman7987cdf2000-07-05 16:05:39 +00005 * Copyright (c) 1996-2000 Wichert Akkerman <wichert@cistron.nl>
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00006 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. The name of the author may not be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * $Id$
31 */
32
33#include "defs.h"
34
35#include <sys/stat.h>
36#include <sys/socket.h>
37#include <sys/un.h>
38#include <netinet/in.h>
Wichert Akkermanbf79f2e2000-09-01 21:03:06 +000039#ifdef FREEBSD
40#include <netinet/tcp.h>
41#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000042#include <arpa/inet.h>
43#if defined(LINUX)
44#include <asm/types.h>
45#if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC__ + __GLIBC_MINOR__ >= 3)
46# include <netipx/ipx.h>
47#else
48# include <linux/ipx.h>
49#endif
50#endif /* LINUX */
51
Wichert Akkerman4dc8a2a1999-12-23 14:20:14 +000052#if defined (__GLIBC__) && ((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1))
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +000053#if defined(HAVE_LINUX_IN6_H)
Wichert Akkerman505e1761999-11-01 19:39:08 +000054#include <linux/in6.h>
55#endif
Wichert Akkerman2f473da1999-11-01 19:53:31 +000056#endif
Wichert Akkerman505e1761999-11-01 19:39:08 +000057
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +000058#if defined(HAVE_SYS_UIO_H)
59#include <sys/uio.h>
60#endif
61
62#if defined(HAVE_LINUX_NETLINK_H)
63#include <linux/netlink.h>
64#endif
65
66#if defined(HAVE_LINUX_IF_PACKET_H)
67#include <linux/if_packet.h>
68#endif
69
Wichert Akkerman7987cdf2000-07-05 16:05:39 +000070#if defined(HAVE_LINUX_ICMP_H)
71#include <linux/icmp.h>
72#endif
73
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000074#ifndef PF_UNSPEC
75#define PF_UNSPEC AF_UNSPEC
76#endif
77
Wichert Akkerman16a03d22000-08-10 02:14:04 +000078#if UNIXWARE >= 7
79#define HAVE_SENDMSG 1 /* HACK - *FIXME* */
80#endif
81
Wichert Akkerman76baf7c1999-02-19 00:21:36 +000082#ifdef LINUX
83/* Under Linux these are enums so we can't test for them with ifdef. */
84#define IPPROTO_EGP IPPROTO_EGP
85#define IPPROTO_PUP IPPROTO_PUP
86#define IPPROTO_IDP IPPROTO_IDP
87#define IPPROTO_IGMP IPPROTO_IGMP
88#define IPPROTO_RAW IPPROTO_RAW
89#define IPPROTO_MAX IPPROTO_MAX
90#endif
91
92static struct xlat domains[] = {
93 { PF_UNSPEC, "PF_UNSPEC" },
94 { PF_UNIX, "PF_UNIX" },
95 { PF_INET, "PF_INET" },
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +000096#ifdef PF_NETLINK
97 { PF_NETLINK, "PF_NETLINK" },
98#endif
99#ifdef PF_PACKET
100 { PF_PACKET, "PF_PACKET" },
101#endif
102#ifdef PF_INET6
103 { PF_INET6, "PF_INET6" },
104#endif
105#ifdef PF_ATMSVC
106 { PF_ATMSVC, "PF_INET6" },
107#endif
108#ifdef PF_INET6
109 { PF_INET6, "PF_INET6" },
110#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000111#ifdef PF_LOCAL
112 { PF_LOCAL, "PS_LOCAL" },
113#endif
114#ifdef PF_ISO
115 { PF_ISO, "PF_ISO" },
116#endif
117#ifdef PF_AX25
118 { PF_AX25, "PF_AX25" },
119#endif
120#ifdef PF_IPX
121 { PF_IPX, "PF_IPX" },
122#endif
123#ifdef PF_APPLETALK
124 { PF_APPLETALK, "PF_APPLETALK" },
125#endif
126#ifdef PF_NETROM
127 { PF_NETROM, "PF_NETROM" },
128#endif
129#ifdef PF_BRIDGE
130 { PF_BRIDGE, "PF_BRIDGE" },
131#endif
132#ifdef PF_AAL5
133 { PF_AAL5, "PF_AAL5" },
134#endif
135#ifdef PF_X25
136 { PF_X25, "PF_X25" },
137#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000138#ifdef PF_ROSE
139 { PF_ROSE, "PF_ROSE" },
140#endif
141#ifdef PF_DECNET
142 { PF_DECNET, "PF_DECNET" },
143#endif
144#ifdef PF_NETBEUI
145 { PF_NETBEUI, "PF_NETBEUI" },
146#endif
147#ifdef PF_IMPLINK
148 { PF_IMPLINK, "PF_IMPLINK" },
149#endif
150 { 0, NULL },
151};
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000152static struct xlat addrfams[] = {
153 { AF_UNSPEC, "AF_UNSPEC" },
154 { AF_UNIX, "AF_UNIX" },
155 { AF_INET, "AF_INET" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000156#ifdef AF_INET6
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000157 { AF_INET6, "AF_INET6" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000158#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000159 { AF_DECnet, "AF_DECnet" },
160#ifdef PF_ATMSVC
161 { AF_ATMSVC, "AF_ATMSVC" },
162#endif
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000163#ifdef AF_PACKET
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000164 { AF_PACKET, "AF_PACKET" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000165#endif
166#ifdef AF_NETLINK
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000167 { AF_NETLINK, "AF_NETLINK" },
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000168#endif
169#ifdef AF_ISO
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000170 { AF_ISO, "AF_ISO" },
171#endif
Wichert Akkermane4aafd41999-11-26 09:54:08 +0000172#ifdef AF_IMPLINK
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000173 { AF_IMPLINK, "AF_IMPLINK" },
174#endif
175 { 0, NULL },
176};
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000177static struct xlat socktypes[] = {
178 { SOCK_STREAM, "SOCK_STREAM" },
179 { SOCK_DGRAM, "SOCK_DGRAM" },
180#ifdef SOCK_RAW
181 { SOCK_RAW, "SOCK_RAW" },
182#endif
183#ifdef SOCK_SEQPACKET
184 { SOCK_SEQPACKET,"SOCK_SEQPACKET"},
185#endif
186#ifdef SOCK_RDM
187 { SOCK_RDM, "SOCK_RDM" },
188#endif
189#ifdef SOCK_PACKET
190 { SOCK_PACKET, "SOCK_PACKET" },
191#endif
192 { 0, NULL },
193};
Wichert Akkermanefdecac2000-11-26 03:59:21 +0000194static struct xlat socketlayers[] = {
195 { SOL_IP, "SOL_IP" },
196#if defined(SOL_ICMP)
197 { SOL_ICMP, "SOL_ICMP" },
198#endif
199 { SOL_TCP, "SOL_TCP" },
200 { SOL_UDP, "SOL_UDP" },
201#if defined(SOL_IPV6)
202 { SOL_IPV6, "SOL_IPV6" },
203#endif
204#if defined(SOL_ICMPV6)
205 { SOL_ICMPV6, "SOL_ICMPV6" },
206#endif
207#if defined(SOL_RAW)
208 { SOL_RAW, "SOL_RAW" },
209#endif
210#if defined(SOL_IPX)
211 { SOL_IPX, "SOL_IPX" },
212#endif
213#if defined(SOL_IPX)
214 { SOL_IPX, "SOL_IPX" },
215#endif
216#if defined(SOL_AX25)
217 { SOL_AX25, "SOL_AX25" },
218#endif
219#if defined(SOL_ATALK)
220 { SOL_ATALK, "SOL_ATALK" },
221#endif
222#if defined(SOL_NETROM)
223 { SOL_NETROM, "SOL_NETROM" },
224#endif
225#if defined(SOL_ROSE)
226 { SOL_ROSE, "SOL_ROSE" },
227#endif
228#if defined(SOL_DECNET)
229 { SOL_DECNET, "SOL_DECNET" },
230#endif
231#if defined(SOL_X25)
232 { SOL_X25, "SOL_X25" },
233#endif
234#if defined(SOL_PACKET)
235 { SOL_PACKET, "SOL_PACKET" },
236#endif
237#if defined(SOL_ATM)
238 { SOL_ATM, "SOL_ATM" },
239#endif
240#if defined(SOL_AAL)
241 { SOL_AAL, "SOL_AAL" },
242#endif
243#if defined(SOL_IRDA)
244 { SOL_IRDA, "SOL_IRDA" },
245#endif
246};
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000247static struct xlat protocols[] = {
248 { IPPROTO_IP, "IPPROTO_IP" },
249 { IPPROTO_ICMP, "IPPROTO_ICMP" },
250 { IPPROTO_TCP, "IPPROTO_TCP" },
251 { IPPROTO_UDP, "IPPROTO_UDP" },
252#ifdef IPPROTO_GGP
253 { IPPROTO_GGP, "IPPROTO_GGP" },
254#endif
255#ifdef IPPROTO_EGP
256 { IPPROTO_EGP, "IPPROTO_EGP" },
257#endif
258#ifdef IPPROTO_PUP
259 { IPPROTO_PUP, "IPPROTO_PUP" },
260#endif
261#ifdef IPPROTO_IDP
262 { IPPROTO_IDP, "IPPROTO_IDP" },
263#endif
264#ifdef IPPROTO_IPV6
265 { IPPROTO_IPV6, "IPPROTO_IPV6" },
266#endif
267#ifdef IPPROTO_ICMPV6
268 { IPPROTO_ICMPV6,"IPPROTO_ICMPV6"},
269#endif
270#ifdef IPPROTO_IGMP
271 { IPPROTO_IGMP, "IPPROTO_IGMP" },
272#endif
273#ifdef IPPROTO_HELLO
274 { IPPROTO_HELLO,"IPPROTO_HELLO" },
275#endif
276#ifdef IPPROTO_ND
277 { IPPROTO_ND, "IPPROTO_ND" },
278#endif
279#ifdef IPPROTO_RAW
280 { IPPROTO_RAW, "IPPROTO_RAW" },
281#endif
282#ifdef IPPROTO_MAX
283 { IPPROTO_MAX, "IPPROTO_MAX" },
284#endif
285#ifdef IPPROTO_IPIP
286 { IPPROTO_IPIP, "IPPROTO_IPIP" },
287#endif
288 { 0, NULL },
289};
290static struct xlat msg_flags[] = {
291 { MSG_OOB, "MSG_OOB" },
292#ifdef MSG_DONTROUTE
293 { MSG_DONTROUTE,"MSG_DONTROUTE" },
294#endif
295#ifdef MSG_PEEK
296 { MSG_PEEK, "MSG_PEEK" },
297#endif
298#ifdef MSG_CTRUNC
299 { MSG_CTRUNC, "MSG_CTRUNC" },
300#endif
301#ifdef MSG_PROXY
302 { MSG_PROXY, "MSG_PROXY" },
303#endif
304#ifdef MSG_EOR
305 { MSG_EOR, "MSG_EOR" },
306#endif
307#ifdef MSG_WAITALL
308 { MSG_WAITALL, "MSG_WAITALL" },
309#endif
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000310#ifdef MSG_TRUNC
311 { MSG_TRUNC, "MSG_TRUNC" },
312#endif
313#ifdef MSG_CTRUNC
314 { MSG_CTRUNC, "MSG_CTRUNC" },
315#endif
316#ifdef MSG_ERRQUEUE
317 { MSG_ERRQUEUE, "MSG_ERRQUEUE" },
318#endif
319#ifdef MSG_DONTWAIT
320 { MSG_DONTWAIT, "MSG_DONTWAIT" },
321#endif
322#ifdef MSG_CONFIRM
323 { MSG_CONFIRM, "MSG_CONFIRM" },
324#endif
325#ifdef MSG_PROBE
326 { MSG_PROBE, "MSG_PROBE" },
327#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000328 { 0, NULL },
329};
330
331static struct xlat sockoptions[] = {
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000332#ifdef SO_PEERCRED
333 { SO_PEERCRED, "SO_PEERCRED" },
334#endif
335#ifdef SO_PASSCRED
336 { SO_PASSCRED, "SO_PASSCRED" },
337#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000338#ifdef SO_DEBUG
339 { SO_DEBUG, "SO_DEBUG" },
340#endif
341#ifdef SO_REUSEADDR
342 { SO_REUSEADDR, "SO_REUSEADDR" },
343#endif
344#ifdef SO_KEEPALIVE
345 { SO_KEEPALIVE, "SO_KEEPALIVE" },
346#endif
347#ifdef SO_DONTROUTE
348 { SO_DONTROUTE, "SO_DONTROUTE" },
349#endif
350#ifdef SO_BROADCAST
351 { SO_BROADCAST, "SO_BROADCAST" },
352#endif
353#ifdef SO_LINGER
354 { SO_LINGER, "SO_LINGER" },
355#endif
356#ifdef SO_OOBINLINE
357 { SO_OOBINLINE, "SO_OOBINLINE" },
358#endif
359#ifdef SO_TYPE
360 { SO_TYPE, "SO_TYPE" },
361#endif
362#ifdef SO_ERROR
363 { SO_ERROR, "SO_ERROR" },
364#endif
365#ifdef SO_SNDBUF
366 { SO_SNDBUF, "SO_SNDBUF" },
367#endif
368#ifdef SO_RCVBUF
369 { SO_RCVBUF, "SO_RCVBUF" },
370#endif
371#ifdef SO_NO_CHECK
372 { SO_NO_CHECK, "SO_NO_CHECK" },
373#endif
374#ifdef SO_PRIORITY
375 { SO_PRIORITY, "SO_PRIORITY" },
376#endif
377#ifdef SO_ACCEPTCONN
378 { SO_ACCEPTCONN,"SO_ACCEPTCONN" },
379#endif
380#ifdef SO_USELOOPBACK
381 { SO_USELOOPBACK,"SO_USELOOPBACK"},
382#endif
383#ifdef SO_SNDLOWAT
384 { SO_SNDLOWAT, "SO_SNDLOWAT" },
385#endif
386#ifdef SO_RCVLOWAT
387 { SO_RCVLOWAT, "SO_RCVLOWAT" },
388#endif
389#ifdef SO_SNDTIMEO
390 { SO_SNDTIMEO, "SO_SNDTIMEO" },
391#endif
392#ifdef SO_RCVTIMEO
393 { SO_RCVTIMEO, "SO_RCVTIMEO" },
394#endif
395#ifdef SO_BSDCOMPAT
396 { SO_BSDCOMPAT, "SO_BSDCOMPAT" },
397#endif
398#ifdef SO_REUSEPORT
399 { SO_REUSEPORT, "SO_REUSEPORT" },
400#endif
401#ifdef SO_RCVLOWAT
402 { SO_RCVLOWAT, "SO_RCVLOWAT" },
403#endif
404#ifdef SO_SNDLOWAT
405 { SO_SNDLOWAT, "SO_SNDLOWAT" },
406#endif
407#ifdef SO_RCVTIMEO
408 { SO_RCVTIMEO, "SO_RCVTIMEO" },
409#endif
410#ifdef SO_SNDTIMEO
411 { SO_SNDTIMEO, "SO_SNDTIMEO" },
412#endif
413 { 0, NULL },
414};
415
416#ifdef SOL_IP
417static struct xlat sockipoptions[] = {
Wichert Akkerman7987cdf2000-07-05 16:05:39 +0000418 { IP_TOS, "IP_TOS" },
419 { IP_TTL, "IP_TTL" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000420#if defined(IP_HDRINCL)
Wichert Akkerman7987cdf2000-07-05 16:05:39 +0000421 { IP_HDRINCL, "IP_HDRINCL" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000422#endif
423#if defined(IP_OPTIONS)
Wichert Akkerman7987cdf2000-07-05 16:05:39 +0000424 { IP_OPTIONS, "IP_OPTIONS" },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000425#endif
Wichert Akkerman7987cdf2000-07-05 16:05:39 +0000426 { IP_ROUTER_ALERT, "IP_ROUTER_ALERT" },
427#if defined(IP_RECVOPTIONS)
428 { IP_RECVOPTIONS, "IP_RECVOPTIONS" },
429#endif
430 { IP_RETOPTS, "IP_RETOPTS" },
431 { IP_PKTINFO, "IP_PKTINFO" },
432 { IP_PKTOPTIONS, "IP_PKTOPTIONS" },
433 { IP_MTU_DISCOVER, "IP_MTU_DISCOVER" },
434 { IP_MTU_DISCOVER, "IP_MTU_DISCOVER" },
435 { IP_RECVERR, "IP_RECVERR" },
436 { IP_RECVTTL, "IP_RECRECVTTL" },
437 { IP_RECVTOS, "IP_RECRECVTOS" },
438#if defined(IP_MTU)
439 { IP_MTU, "IP_MTU" },
440#endif
441 { IP_MULTICAST_IF, "IP_MULTICAST_IF" },
442 { IP_MULTICAST_TTL, "IP_MULTICAST_TTL" },
443 { IP_MULTICAST_LOOP, "IP_MULTICAST_LOOP" },
444 { IP_ADD_MEMBERSHIP, "IP_ADD_MEMBERSHIP" },
445 { IP_DROP_MEMBERSHIP, "IP_DROP_MEMBERSHIP" },
446 { 0, NULL },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000447};
448#endif /* SOL_IP */
449
450#ifdef SOL_IPX
451static struct xlat sockipxoptions[] = {
452 { IPX_TYPE, "IPX_TYPE" },
453 { 0, NULL },
454};
455#endif /* SOL_IPX */
456
Wichert Akkerman7987cdf2000-07-05 16:05:39 +0000457#ifdef SOL_RAW
458static struct xlat sockrawoptions[] = {
459#if defined(ICMP_FILTER)
460 { ICMP_FILTER, "ICMP_FILTER" },
461#endif
462 { 0, NULL },
463};
464#endif /* SOL_RAW */
465
466#ifdef SOL_PACKET
467static struct xlat sockpacketoptions[] = {
468 { PACKET_ADD_MEMBERSHIP, "PACKET_ADD_MEMBERSHIP" },
469 { PACKET_DROP_MEMBERSHIP, "PACKET_DROP_MEMBERSHIP"},
470#if defined(PACKET_RECV_OUTPUT)
471 { PACKET_RECV_OUTPUT, "PACKET_RECV_OUTPUT" },
472#endif
473#if defined(PACKET_RX_RING)
474 { PACKET_RX_RING, "PACKET_RX_RING" },
475#endif
476#if defined(PACKET_STATISTICS)
477 { PACKET_STATISTICS, "PACKET_STATISTICS" },
478#endif
479 { 0, NULL },
480};
481#endif /* SOL_PACKET */
482
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000483#ifdef SOL_TCP
484static struct xlat socktcpoptions[] = {
Wichert Akkerman7987cdf2000-07-05 16:05:39 +0000485 { TCP_NODELAY, "TCP_NODELAY" },
486 { TCP_MAXSEG, "TCP_MAXSEG" },
487#if defined(TCP_CORK)
488 { TCP_CORK, "TCP_CORK" },
489#endif
490 { 0, NULL },
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000491};
492#endif /* SOL_TCP */
493
Wichert Akkerman7987cdf2000-07-05 16:05:39 +0000494#ifdef SOL_RAW
495static struct xlat icmpfilterflags[] = {
496#if defined(ICMP_ECHOREPLY)
497 { (1<<ICMP_ECHOREPLY), "ICMP_ECHOREPLY" },
498#endif
499#if defined(ICMP_DEST_UNREACH)
500 { (1<<ICMP_DEST_UNREACH), "ICMP_DEST_UNREACH" },
501#endif
502#if defined(ICMP_SOURCE_QUENCH)
503 { (1<<ICMP_SOURCE_QUENCH), "ICMP_SOURCE_QUENCH" },
504#endif
505#if defined(ICMP_REDIRECT)
506 { (1<<ICMP_REDIRECT), "ICMP_REDIRECT" },
507#endif
508#if defined(ICMP_ECHO)
509 { (1<<ICMP_ECHO), "ICMP_ECHO" },
510#endif
511#if defined(ICMP_TIME_EXCEEDED)
512 { (1<<ICMP_TIME_EXCEEDED), "ICMP_TIME_EXCEEDED" },
513#endif
514#if defined(ICMP_PARAMETERPROB)
515 { (1<<ICMP_PARAMETERPROB), "ICMP_PARAMETERPROB" },
516#endif
517#if defined(ICMP_TIMESTAMP)
518 { (1<<ICMP_TIMESTAMP), "ICMP_TIMESTAMP" },
519#endif
520#if defined(ICMP_TIMESTAMPREPLY)
521 { (1<<ICMP_TIMESTAMPREPLY), "ICMP_TIMESTAMPREPLY" },
522#endif
523#if defined(ICMP_INFO_REQUEST)
524 { (1<<ICMP_INFO_REQUEST), "ICMP_INFO_REQUEST" },
525#endif
526#if defined(ICMP_INFO_REPLY)
527 { (1<<ICMP_INFO_REPLY), "ICMP_INFO_REPLY" },
528#endif
529#if defined(ICMP_ADDRESS)
530 { (1<<ICMP_ADDRESS), "ICMP_ADDRESS" },
531#endif
532#if defined(ICMP_ADDRESSREPLY)
533 { (1<<ICMP_ADDRESSREPLY), "ICMP_ADDRESSREPLY" },
534#endif
535 { 0, NULL },
536};
537#endif /* SOL_RAW */
538
Wichert Akkerman16a03d22000-08-10 02:14:04 +0000539
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000540void
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000541printsock(tcp, addr, addrlen)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000542struct tcb *tcp;
543long addr;
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000544int addrlen;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000545{
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000546 union {
547 char pad[128];
548 struct sockaddr sa;
549 struct sockaddr_in sin;
550 struct sockaddr_un sau;
Wichert Akkerman9ce1a631999-08-29 23:15:07 +0000551#ifdef HAVE_INET_NTOP
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000552 struct sockaddr_in6 sa6;
553#endif
554#if defined(LINUX) && defined(AF_IPX)
555 struct sockaddr_ipx sipx;
556#endif
557#ifdef AF_PACKET
558 struct sockaddr_ll ll;
559#endif
560#ifdef AF_NETLINK
561 struct sockaddr_nl nl;
562#endif
563 } addrbuf;
Wichert Akkerman9ce1a631999-08-29 23:15:07 +0000564 char string_addr[100];
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000565
566 if (addr == 0) {
567 tprintf("NULL");
568 return;
569 }
570 if (!verbose(tcp)) {
571 tprintf("%#lx", addr);
572 return;
573 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000574 if ((addrlen<2) || (addrlen>sizeof(addrbuf)))
575 addrlen=sizeof(addrbuf);
576
577 if (umoven(tcp, addr, addrlen, (char*)&addrbuf) < 0) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000578 tprintf("{...}");
579 return;
580 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000581
582 tprintf("{sin_family=");
583 printxval(addrfams, addrbuf.sa.sa_family, "AF_???");
584 tprintf(", ");
585
586 switch (addrbuf.sa.sa_family) {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000587 case AF_UNIX:
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000588 if (addrlen==2) {
589 tprintf("<nil>");
590 } else if (addrbuf.sau.sun_path[0]) {
591 tprintf("path=\"%*.*s\"", addrlen-2, addrlen-2, addrbuf.sau.sun_path);
592 } else {
593 tprintf("path=@%*.*s", addrlen-3, addrlen-3, addrbuf.sau.sun_path+1);
594 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000595 break;
596 case AF_INET:
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000597 tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")}",
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000598 ntohs(addrbuf.sin.sin_port), inet_ntoa(addrbuf.sin.sin_addr));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000599 break;
Wichert Akkerman9ce1a631999-08-29 23:15:07 +0000600#ifdef HAVE_INET_NTOP
601 case AF_INET6:
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000602 inet_ntop(AF_INET6, &addrbuf.sa6.sin6_addr, string_addr, sizeof(string_addr));
603 tprintf("sin6_port=htons(%u), inet_pton(AF_INET6, \"%s\", &sin6_addr), sin6_flowinfo=htonl(%u)}",
604 ntohs(addrbuf.sa6.sin6_port), string_addr, ntohl(addrbuf.sa6.sin6_flowinfo));
Wichert Akkerman9ce1a631999-08-29 23:15:07 +0000605 break;
606#endif
Wichert Akkermandbb440e1999-05-11 15:06:44 +0000607#if defined(AF_IPX) && defined(linux)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000608 case AF_IPX:
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000609 {
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000610 int i;
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000611 tprintf("{sipx_port=htons(%u), ",
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000612 ntohs(addrbuf.sipx.sipx_port));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000613 /* Yes, I know, this does not look too
614 * strace-ish, but otherwise the IPX
615 * addresses just look monstrous...
616 * Anyways, feel free if you don't like
617 * this way.. :)
618 */
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000619 tprintf("%08lx:", (unsigned long)ntohl(addrbuf.sipx.sipx_network));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000620 for (i = 0; i<IPX_NODE_LEN; i++)
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000621 tprintf("%02x", addrbuf.sipx.sipx_node[i]);
622 tprintf("/[%02x]", addrbuf.sipx.sipx_type);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000623 }
624 break;
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000625#endif /* AF_IPX && linux */
626#ifdef AF_PACKET
627 case AF_PACKET:
628 {
629 int i;
630 tprintf("proto=%#04x, if%d, pkttype=%d, addr(%d)={%d, ",
631 ntohs(addrbuf.ll.sll_protocol),
632 addrbuf.ll.sll_ifindex,
633 addrbuf.ll.sll_pkttype,
634 addrbuf.ll.sll_halen,
635 addrbuf.ll.sll_hatype);
636 for (i=0; i<addrbuf.ll.sll_addr[i]; i++)
637 tprintf("%02x", addrbuf.ll.sll_addr[i]);
638 }
639 break;
640
641#endif /* AF_APACKET */
642#ifdef AF_NETLINLK
643 case AF_NETLINK:
644 tprintf("pid=%d, groups=%08x", addrbuf.nl.nl_pid, addrbuf.nl.nl_groups);
645 break;
646#endif /* AF_NETLINK */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000647 /* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000648 AF_X25 AF_ROSE etc. still need to be done */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000649
650 default:
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000651 tprintf("{sa_family=%u, sa_data=", addrbuf.sa.sa_family);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000652 printstr(tcp, (long) &((struct sockaddr *) addr)->sa_data,
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000653 sizeof addrbuf.sa.sa_data);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000654 break;
655 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000656 tprintf("}");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000657}
658
659#if HAVE_SENDMSG
660
661static void
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000662printiovec(tcp, iovec, len)
663struct tcb *tcp;
664struct iovec *iovec;
665long len;
666{
667 struct iovec *iov;
668 int i;
669
670 iov = (struct iovec *) malloc(len * sizeof *iov);
671 if (iov == NULL) {
672 fprintf(stderr, "No memory");
673 return;
674 }
675 if (umoven(tcp, (long)iovec,
676 len * sizeof *iov, (char *) iov) < 0) {
677 tprintf("%#lx", (unsigned long)iovec);
678 } else {
679 tprintf("[");
680 for (i = 0; i < len; i++) {
681 if (i)
682 tprintf(", ");
683 tprintf("{");
684 printstr(tcp, (long) iov[i].iov_base,
685 iov[i].iov_len);
686 tprintf(", %lu}", (unsigned long)iov[i].iov_len);
687 }
688 tprintf("]");
689 }
690 free((char *) iov);
691}
692
693static void
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000694printmsghdr(tcp, addr)
695struct tcb *tcp;
696long addr;
697{
698 struct msghdr msg;
699
Wichert Akkerman2e2553a1999-05-09 00:29:58 +0000700 if (umove(tcp, addr, &msg) < 0) {
701 tprintf("%#lx", addr);
702 return;
703 }
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000704 tprintf("{msg_name(%d)=", msg.msg_namelen);
705 printsock(tcp, (long)msg.msg_name, msg.msg_namelen);
706
707 tprintf(", msg_iov(%lu)=", (unsigned long)msg.msg_iovlen);
708 printiovec(tcp, msg.msg_iov, msg.msg_iovlen);
709
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000710#ifdef HAVE_MSG_CONTROL
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000711 tprintf(", msg_controllen=%lu", (unsigned long)msg.msg_controllen);
712 if (msg.msg_controllen)
713 tprintf(", msg_control=%#lx, ", (unsigned long) msg.msg_control);
714 tprintf(", msg_flags=");
715 if (printflags(msg_flags, msg.msg_flags)==0)
716 tprintf("0");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000717#else /* !HAVE_MSG_CONTROL */
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000718 tprintf("msg_accrights=%#lx, msg_accrightslen=%u",
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000719 (unsigned long) msg.msg_accrights, msg.msg_accrightslen);
720#endif /* !HAVE_MSG_CONTROL */
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000721 tprintf("}");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000722}
723
724#endif /* HAVE_SENDMSG */
725
726int
727sys_socket(tcp)
728struct tcb *tcp;
729{
730 if (entering(tcp)) {
731 printxval(domains, tcp->u_arg[0], "PF_???");
732 tprintf(", ");
733 printxval(socktypes, tcp->u_arg[1], "SOCK_???");
734 tprintf(", ");
735 switch (tcp->u_arg[0]) {
736 case PF_INET:
737 printxval(protocols, tcp->u_arg[2], "IPPROTO_???");
738 break;
739#ifdef PF_IPX
740 case PF_IPX:
741 /* BTW: I don't believe this.. */
742 tprintf("[");
743 printxval(domains, tcp->u_arg[2], "PF_???");
744 tprintf("]");
745 break;
746#endif /* PF_IPX */
747 default:
748 tprintf("%lu", tcp->u_arg[2]);
749 break;
750 }
751 }
752 return 0;
753}
754
755int
756sys_bind(tcp)
757struct tcb *tcp;
758{
759 if (entering(tcp)) {
760 tprintf("%ld, ", tcp->u_arg[0]);
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000761 printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000762 tprintf(", %lu", tcp->u_arg[2]);
763 }
764 return 0;
765}
766
767int
768sys_connect(tcp)
769struct tcb *tcp;
770{
771 return sys_bind(tcp);
772}
773
774int
775sys_listen(tcp)
776struct tcb *tcp;
777{
778 if (entering(tcp)) {
779 tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]);
780 }
781 return 0;
782}
783
784int
785sys_accept(tcp)
786struct tcb *tcp;
787{
788 if (entering(tcp)) {
789 tprintf("%ld, ", tcp->u_arg[0]);
790 } else if (!tcp->u_arg[2])
791 tprintf("%#lx, NULL", tcp->u_arg[1]);
792 else {
793 if (tcp->u_arg[1] == 0 || syserror(tcp)) {
794 tprintf("%#lx", tcp->u_arg[1]);
795 } else {
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000796 printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000797 }
798 tprintf(", ");
799 printnum(tcp, tcp->u_arg[2], "%lu");
800 }
801 return 0;
802}
803
804int
805sys_send(tcp)
806struct tcb *tcp;
807{
808 if (entering(tcp)) {
809 tprintf("%ld, ", tcp->u_arg[0]);
810 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
811 tprintf(", %lu, ", tcp->u_arg[2]);
812 /* flags */
813 if (printflags(msg_flags, tcp->u_arg[3]) == 0)
814 tprintf("0");
815 }
816 return 0;
817}
818
819int
820sys_sendto(tcp)
821struct tcb *tcp;
822{
823 if (entering(tcp)) {
824 tprintf("%ld, ", tcp->u_arg[0]);
825 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
826 tprintf(", %lu, ", tcp->u_arg[2]);
827 /* flags */
828 if (printflags(msg_flags, tcp->u_arg[3]) == 0)
829 tprintf("0");
830 /* to address */
831 tprintf(", ");
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000832 printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000833 /* to length */
834 tprintf(", %lu", tcp->u_arg[5]);
835 }
836 return 0;
837}
838
839#ifdef HAVE_SENDMSG
840
841int
842sys_sendmsg(tcp)
843struct tcb *tcp;
844{
845 if (entering(tcp)) {
846 tprintf("%ld, ", tcp->u_arg[0]);
847 printmsghdr(tcp, tcp->u_arg[1]);
848 /* flags */
849 tprintf(", ");
850 if (printflags(msg_flags, tcp->u_arg[2]) == 0)
851 tprintf("0");
852 }
853 return 0;
854}
855
856#endif /* HAVE_SENDMSG */
857
858int
859sys_recv(tcp)
860struct tcb *tcp;
861{
862 if (entering(tcp)) {
863 tprintf("%ld, ", tcp->u_arg[0]);
864 } else {
865 if (syserror(tcp))
866 tprintf("%#lx", tcp->u_arg[1]);
867 else
868 printstr(tcp, tcp->u_arg[1], tcp->u_rval);
869
870 tprintf(", %lu, ", tcp->u_arg[2]);
871 if (printflags(msg_flags, tcp->u_arg[3]) == 0)
872 tprintf("0");
873 }
874 return 0;
875}
876
877int
878sys_recvfrom(tcp)
879struct tcb *tcp;
880{
881 int fromlen;
882
883 if (entering(tcp)) {
884 tprintf("%ld, ", tcp->u_arg[0]);
885 } else {
886 if (syserror(tcp)) {
887 tprintf("%#lx, %lu, %lu, %#lx, %#lx",
888 tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3],
889 tcp->u_arg[4], tcp->u_arg[5]);
890 return 0;
891 }
892 /* buf */
893 printstr(tcp, tcp->u_arg[1], tcp->u_rval);
894 /* len */
895 tprintf(", %lu, ", tcp->u_arg[2]);
896 /* flags */
897 if (printflags(msg_flags, tcp->u_arg[3]) == 0)
898 tprintf("0");
899 /* from address, len */
900 if (!tcp->u_arg[4] || !tcp->u_arg[5]) {
901 if (tcp->u_arg[4] == 0)
902 tprintf(", NULL");
903 else
904 tprintf(", %#lx", tcp->u_arg[4]);
905 if (tcp->u_arg[5] == 0)
906 tprintf(", NULL");
907 else
908 tprintf(", %#lx", tcp->u_arg[5]);
909 return 0;
910 }
911 if (umove(tcp, tcp->u_arg[5], &fromlen) < 0) {
912 tprintf(", {...}, [?]");
913 return 0;
914 }
915 tprintf(", ");
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +0000916 printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +0000917 /* from length */
918 tprintf(", [%u]", fromlen);
919 }
920 return 0;
921}
922
923#ifdef HAVE_SENDMSG
924
925int
926sys_recvmsg(tcp)
927struct tcb *tcp;
928{
929 if (entering(tcp)) {
930 tprintf("%ld, ", tcp->u_arg[0]);
931 } else {
932 if (syserror(tcp) || !verbose(tcp))
933 tprintf("%#lx", tcp->u_arg[1]);
934 else
935 printmsghdr(tcp, tcp->u_arg[1]);
936 /* flags */
937 tprintf(", ");
938 if (printflags(msg_flags, tcp->u_arg[2]) == 0)
939 tprintf("0");
940 }
941 return 0;
942}
943
944#endif /* HAVE_SENDMSG */
945
946int
947sys_shutdown(tcp)
948struct tcb *tcp;
949{
950 if (entering(tcp)) {
951 tprintf("%ld, %ld", tcp->u_arg[0], tcp->u_arg[1]);
952 switch (tcp->u_arg[1]) {
953 case 0:
954 tprintf("%s", " /* receive */");
955 break;
956 case 1:
957 tprintf("%s", " /* send */");
958 break;
959 case 2:
960 tprintf("%s", " /* send and receive */");
961 break;
962 }
963 }
964 return 0;
965}
966
967int
968sys_getsockname(tcp)
969struct tcb *tcp;
970{
971 return sys_accept(tcp);
972}
973
974int
975sys_getpeername(tcp)
976struct tcb *tcp;
977{
978 return sys_accept(tcp);
979}
980
981int
982sys_pipe(tcp)
983struct tcb *tcp;
984{
985
986#if defined(LINUX) && !defined(SPARC)
987 int fds[2];
988
989 if (exiting(tcp)) {
990 if (syserror(tcp)) {
991 tprintf("%#lx", tcp->u_arg[0]);
992 return 0;
993 }
994 if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0)
995 tprintf("[...]");
996 else
997 tprintf("[%u, %u]", fds[0], fds[1]);
998 }
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +0000999#elif defined(SPARC) || defined(SVR4) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001000 if (exiting(tcp))
1001 tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp));
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001002#endif
1003 return 0;
1004}
1005
1006int
1007sys_socketpair(tcp)
1008struct tcb *tcp;
1009{
1010#ifdef LINUX
1011 int fds[2];
1012#endif
1013
1014 if (entering(tcp)) {
1015 printxval(domains, tcp->u_arg[0], "PF_???");
1016 tprintf(", ");
1017 printxval(socktypes, tcp->u_arg[1], "SOCK_???");
1018 tprintf(", ");
1019 switch (tcp->u_arg[0]) {
1020 case PF_INET:
1021 printxval(protocols, tcp->u_arg[2], "IPPROTO_???");
1022 break;
1023#ifdef PF_IPX
1024 case PF_IPX:
1025 /* BTW: I don't believe this.. */
1026 tprintf("[");
1027 printxval(domains, tcp->u_arg[2], "PF_???");
1028 tprintf("]");
1029 break;
1030#endif /* PF_IPX */
1031 default:
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001032 tprintf("%lu", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001033 break;
1034 }
1035 } else {
1036 if (syserror(tcp)) {
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001037 tprintf(", %#lx", tcp->u_arg[3]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001038 return 0;
1039 }
1040#ifdef LINUX
1041 if (umoven(tcp, tcp->u_arg[3], sizeof fds, (char *) fds) < 0)
Wichert Akkerman2e2553a1999-05-09 00:29:58 +00001042 tprintf(", [...]");
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001043 else
1044 tprintf(", [%u, %u]", fds[0], fds[1]);
1045#endif /* LINUX */
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +00001046#if defined(SUNOS4) || defined(SVR4) || defined(FREEBSD)
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001047 tprintf(", [%lu, %lu]", tcp->u_rval, getrval2(tcp));
Wichert Akkerman2e4ffe52000-09-03 23:57:48 +00001048#endif /* SUNOS4 || SVR4 || FREEBSD */
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001049 }
1050 return 0;
1051}
1052
1053int
1054sys_getsockopt(tcp)
1055struct tcb *tcp;
1056{
1057 if (entering(tcp)) {
1058 tprintf("%ld, ", tcp->u_arg[0]);
1059 switch (tcp->u_arg[1]) {
1060 case SOL_SOCKET:
1061 tprintf("SOL_SOCKET, ");
1062 printxval(sockoptions, tcp->u_arg[2], "SO_???");
1063 tprintf(", ");
1064 break;
1065#ifdef SOL_IP
1066 case SOL_IP:
1067 tprintf("SOL_IP, ");
1068 printxval(sockipoptions, tcp->u_arg[2], "IP_???");
1069 tprintf(", ");
1070 break;
1071#endif
1072#ifdef SOL_IPX
1073 case SOL_IPX:
1074 tprintf("SOL_IPX, ");
1075 printxval(sockipxoptions, tcp->u_arg[2], "IPX_???");
1076 tprintf(", ");
1077 break;
1078#endif
Wichert Akkerman7987cdf2000-07-05 16:05:39 +00001079#ifdef SOL_PACKET
1080 case SOL_PACKET:
1081 tprintf("SOL_PACKET, ");
1082 printxval(sockpacketoptions, tcp->u_arg[2], "PACKET_???");
1083 tprintf(", ");
1084 break;
1085#endif
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001086#ifdef SOL_TCP
1087 case SOL_TCP:
1088 tprintf("SOL_TCP, ");
1089 printxval(socktcpoptions, tcp->u_arg[2], "TCP_???");
1090 tprintf(", ");
1091 break;
1092#endif
1093
1094 /* SOL_AX25 SOL_ROSE SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
1095 * etc. still need work */
1096 default:
1097 /* XXX - should know socket family here */
Wichert Akkermanefdecac2000-11-26 03:59:21 +00001098 printxval(socketlayers, tcp->u_arg[1], "SOL_???");
Wichert Akkermanf5eeabb1999-11-18 17:09:47 +00001099 tprintf(", %lu, ", tcp->u_arg[2]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001100 break;
1101 }
1102 } else {
1103 if (syserror(tcp)) {
1104 tprintf("%#lx, %#lx",
1105 tcp->u_arg[3], tcp->u_arg[4]);
1106 return 0;
1107 }
1108 printnum(tcp, tcp->u_arg[3], "%ld");
1109 tprintf(", ");
1110 printnum(tcp, tcp->u_arg[4], "%ld");
1111 }
1112 return 0;
1113}
1114
Wichert Akkerman7987cdf2000-07-05 16:05:39 +00001115#if defined(ICMP_FILTER)
1116static void printicmpfilter(tcp, addr)
1117struct tcb *tcp;
1118long addr;
1119{
1120 struct icmp_filter filter;
1121
1122 if (!addr) {
1123 tprintf("NULL");
1124 return;
1125 }
1126 if (syserror(tcp) || !verbose(tcp)) {
1127 tprintf("%#lx", addr);
1128 return;
1129 }
1130 if (umove(tcp, addr, &filter) < 0) {
1131 tprintf("{...}");
1132 return;
1133 }
1134
1135 tprintf("~(");
1136 if (printflags(icmpfilterflags, ~filter.data) == 0)
1137 tprintf("0");
1138 tprintf(")");
1139}
1140#endif /* ICMP_FILTER */
1141
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001142int
1143sys_setsockopt(tcp)
1144struct tcb *tcp;
1145{
1146 if (entering(tcp)) {
1147 tprintf("%ld, ", tcp->u_arg[0]);
1148 switch (tcp->u_arg[1]) {
1149 case SOL_SOCKET:
1150 tprintf("SOL_SOCKET, ");
1151 printxval(sockoptions, tcp->u_arg[2], "SO_???");
1152 tprintf(", ");
Wichert Akkerman7987cdf2000-07-05 16:05:39 +00001153 printnum(tcp, tcp->u_arg[3], "%ld");
1154 tprintf(", %lu", tcp->u_arg[4]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001155 break;
1156#ifdef SOL_IP
1157 case SOL_IP:
1158 tprintf("SOL_IP, ");
1159 printxval(sockipoptions, tcp->u_arg[2], "IP_???");
1160 tprintf(", ");
Wichert Akkerman7987cdf2000-07-05 16:05:39 +00001161 printnum(tcp, tcp->u_arg[3], "%ld");
1162 tprintf(", %lu", tcp->u_arg[4]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001163 break;
1164#endif
1165#ifdef SOL_IPX
1166 case SOL_IPX:
1167 tprintf("SOL_IPX, ");
1168 printxval(sockipxoptions, tcp->u_arg[2], "IPX_???");
1169 tprintf(", ");
Wichert Akkerman7987cdf2000-07-05 16:05:39 +00001170 printnum(tcp, tcp->u_arg[3], "%ld");
1171 tprintf(", %lu", tcp->u_arg[4]);
1172 break;
1173#endif
1174#ifdef SOL_PACKET
1175 case SOL_PACKET:
1176 tprintf("SOL_PACKET, ");
1177 printxval(sockpacketoptions, tcp->u_arg[2], "PACKET_???");
1178 tprintf(", ");
1179 /* TODO: decode packate_mreq for PACKET_*_MEMBERSHIP */
1180 printnum(tcp, tcp->u_arg[3], "%ld");
1181 tprintf(", %lu", tcp->u_arg[4]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001182 break;
1183#endif
1184#ifdef SOL_TCP
1185 case SOL_TCP:
1186 tprintf("SOL_TCP, ");
1187 printxval(socktcpoptions, tcp->u_arg[2], "TCP_???");
1188 tprintf(", ");
Wichert Akkerman7987cdf2000-07-05 16:05:39 +00001189 printnum(tcp, tcp->u_arg[3], "%ld");
1190 tprintf(", %lu", tcp->u_arg[4]);
1191 break;
1192#endif
1193#ifdef SOL_RAW
1194 case SOL_RAW:
1195 tprintf("SOL_RAW, ");
1196 printxval(sockrawoptions, tcp->u_arg[2], "RAW_???");
1197 tprintf(", ");
1198 switch (tcp->u_arg[2]) {
1199#if defined(ICMP_FILTER)
1200 case ICMP_FILTER:
1201 printicmpfilter(tcp, tcp->u_arg[3]);
1202 break;
1203#endif
1204 default:
1205 printnum(tcp, tcp->u_arg[3], "%ld");
1206 break;
1207 }
1208 tprintf(", %lu", tcp->u_arg[4]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001209 break;
1210#endif
1211
1212 /* SOL_AX25 SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
1213 * etc. still need work */
1214 default:
1215 /* XXX - should know socket family here */
Wichert Akkermanefdecac2000-11-26 03:59:21 +00001216 printxval(socketlayers, tcp->u_arg[1], "IPPROTO_???");
1217 tprintf(", %lu, ", tcp->u_arg[2]);
Wichert Akkerman7987cdf2000-07-05 16:05:39 +00001218 printnum(tcp, tcp->u_arg[3], "%ld");
1219 tprintf(", %lu", tcp->u_arg[4]);
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001220 break;
1221 }
Wichert Akkerman76baf7c1999-02-19 00:21:36 +00001222 }
1223 return 0;
1224}
Wichert Akkerman16a03d22000-08-10 02:14:04 +00001225
1226#if UNIXWARE >= 7
1227
1228static struct xlat sock_version[] = {
1229 { __NETLIB_UW211_SVR4, "UW211_SVR4" },
1230 { __NETLIB_UW211_XPG4, "UW211_XPG4" },
1231 { __NETLIB_GEMINI_SVR4, "GEMINI_SVR4" },
1232 { __NETLIB_GEMINI_XPG4, "GEMINI_XPG4" },
1233 { __NETLIB_FP1_SVR4, "FP1_SVR4" },
1234 { __NETLIB_FP1_XPG4, "FP1_XPG4" },
1235 { 0, NULL },
1236};
1237
1238
1239int
1240netlib_call(tcp, func)
1241struct tcb *tcp;
1242int (*func) ();
1243{
1244 if (entering(tcp)) {
1245 int i;
1246 printxval (sock_version, tcp->u_arg[0], "__NETLIB_???");
1247 tprintf(", ");
1248 --tcp->u_nargs;
1249 for (i = 0; i < tcp->u_nargs; i++)
1250 tcp->u_arg[i] = tcp->u_arg[i + 1];
1251 return func (tcp);
1252
1253 }
1254
1255 return func (tcp);
1256}
1257
1258int
1259sys_xsocket(tcp)
1260struct tcb *tcp;
1261{
1262 return netlib_call (tcp, sys_socket);
1263}
1264
1265int
1266sys_xsocketpair(tcp)
1267struct tcb *tcp;
1268{
1269 return netlib_call (tcp, sys_socketpair);
1270}
1271
1272int
1273sys_xbind(tcp)
1274struct tcb *tcp;
1275{
1276 return netlib_call (tcp, sys_bind);
1277}
1278
1279int
1280sys_xconnect(tcp)
1281struct tcb *tcp;
1282{
1283 return netlib_call (tcp, sys_connect);
1284}
1285
1286int
1287sys_xlisten(tcp)
1288struct tcb *tcp;
1289{
1290 return netlib_call (tcp, sys_listen);
1291}
1292
1293int
1294sys_xaccept(tcp)
1295struct tcb *tcp;
1296{
1297 return netlib_call (tcp, sys_accept);
1298}
1299
1300int
1301sys_xsendmsg(tcp)
1302struct tcb *tcp;
1303{
1304 return netlib_call (tcp, sys_sendmsg);
1305}
1306
1307int
1308sys_xrecvmsg(tcp)
1309struct tcb *tcp;
1310{
1311 return netlib_call (tcp, sys_recvmsg);
1312}
1313
1314int
1315sys_xgetsockaddr(tcp)
1316struct tcb *tcp;
1317{
1318 if (entering(tcp)) {
1319 printxval (sock_version, tcp->u_arg[0], "__NETLIB_???");
1320 tprintf(", ");
1321 if (tcp->u_arg[1] == 0) {
1322 tprintf ("LOCALNAME, ");
1323 }
1324 else if (tcp->u_arg[1] == 1) {
1325 tprintf ("REMOTENAME, ");
1326 }
1327 else {
1328 tprintf ("%ld, ", tcp->u_arg [1]);
1329 }
1330 tprintf ("%ld, ", tcp->u_arg [2]);
1331 }
1332 else {
1333 if (tcp->u_arg[3] == 0 || syserror(tcp)) {
1334 tprintf("%#lx", tcp->u_arg[3]);
1335 } else {
1336 printsock(tcp, tcp->u_arg[3], tcp->u_arg[4]);
1337 }
1338 tprintf(", ");
1339 printnum(tcp, tcp->u_arg[4], "%lu");
1340 }
1341
1342 return 0;
1343
1344}
1345
1346#if 0
1347
1348int
1349sys_xsetsockaddr(tcp)
1350struct tcb *tcp;
1351{
1352 return netlib_call (tcp, sys_setsockaddr);
1353}
1354
1355#endif
1356
1357int
1358sys_xgetsockopt(tcp)
1359struct tcb *tcp;
1360{
1361 return netlib_call (tcp, sys_getsockopt);
1362}
1363
1364int
1365sys_xsetsockopt(tcp)
1366struct tcb *tcp;
1367{
1368 return netlib_call (tcp, sys_setsockopt);
1369}
1370
1371int
1372sys_xshutdown(tcp)
1373struct tcb *tcp;
1374{
1375 return netlib_call (tcp, sys_shutdown);
1376}
1377
1378#endif