~ubuntu-branches/debian/sid/cde/sid

« back to all changes in this revision

Viewing changes to strace-4.6/net.c

  • Committer: Package Import Robot
  • Author(s): Yaroslav Halchenko
  • Date: 2012-02-03 19:27:05 UTC
  • Revision ID: package-import@ubuntu.com-20120203192705-ll6f1nr45ead65ed
Tags: upstream-0.1
ImportĀ upstreamĀ versionĀ 0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
 
3
 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
 
4
 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
 
5
 * Copyright (c) 1996-2000 Wichert Akkerman <wichert@cistron.nl>
 
6
 * All rights reserved.
 
7
 *
 
8
 * Redistribution and use in source and binary forms, with or without
 
9
 * modification, are permitted provided that the following conditions
 
10
 * are met:
 
11
 * 1. Redistributions of source code must retain the above copyright
 
12
 *    notice, this list of conditions and the following disclaimer.
 
13
 * 2. Redistributions in binary form must reproduce the above copyright
 
14
 *    notice, this list of conditions and the following disclaimer in the
 
15
 *    documentation and/or other materials provided with the distribution.
 
16
 * 3. The name of the author may not be used to endorse or promote products
 
17
 *    derived from this software without specific prior written permission.
 
18
 *
 
19
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 
20
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 
21
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 
22
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 
23
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
24
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 
25
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 
26
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
27
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
28
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
29
 *
 
30
 *      $Id$
 
31
 */
 
32
 
 
33
#include "defs.h"
 
34
 
 
35
#include <sys/stat.h>
 
36
#include <sys/socket.h>
 
37
#include <sys/un.h>
 
38
 
 
39
#if defined(HAVE_SIN6_SCOPE_ID_LINUX)
 
40
#define in6_addr in6_addr_libc
 
41
#define ipv6_mreq ipv6_mreq_libc
 
42
#define sockaddr_in6 sockaddr_in6_libc
 
43
#endif
 
44
 
 
45
#include <netinet/in.h>
 
46
#ifdef HAVE_NETINET_TCP_H
 
47
#include <netinet/tcp.h>
 
48
#endif
 
49
#ifdef HAVE_NETINET_UDP_H
 
50
#include <netinet/udp.h>
 
51
#endif
 
52
#ifdef HAVE_NETINET_SCTP_H
 
53
#include <netinet/sctp.h>
 
54
#endif
 
55
#include <arpa/inet.h>
 
56
#include <net/if.h>
 
57
#if defined(LINUX)
 
58
#include <asm/types.h>
 
59
#if defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC__ + __GLIBC_MINOR__ >= 3)
 
60
#  include <netipx/ipx.h>
 
61
#else
 
62
#  include <linux/ipx.h>
 
63
#endif
 
64
#endif /* LINUX */
 
65
 
 
66
#if defined (__GLIBC__) && (((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 1)) || defined(HAVE_SIN6_SCOPE_ID_LINUX))
 
67
#if defined(HAVE_LINUX_IN6_H)
 
68
#if defined(HAVE_SIN6_SCOPE_ID_LINUX)
 
69
#undef in6_addr
 
70
#undef ipv6_mreq
 
71
#undef sockaddr_in6
 
72
#define in6_addr in6_addr_kernel
 
73
#define ipv6_mreq ipv6_mreq_kernel
 
74
#define sockaddr_in6 sockaddr_in6_kernel
 
75
#endif
 
76
#include <linux/in6.h>
 
77
#if defined(HAVE_SIN6_SCOPE_ID_LINUX)
 
78
#undef in6_addr
 
79
#undef ipv6_mreq
 
80
#undef sockaddr_in6
 
81
#define in6_addr in6_addr_libc
 
82
#define ipv6_mreq ipv6_mreq_libc
 
83
#define sockaddr_in6 sockaddr_in6_kernel
 
84
#endif
 
85
#endif
 
86
#endif
 
87
 
 
88
#if defined(HAVE_SYS_UIO_H)
 
89
#include <sys/uio.h>
 
90
#endif
 
91
 
 
92
#if defined(HAVE_LINUX_NETLINK_H)
 
93
#include <linux/netlink.h>
 
94
#endif
 
95
 
 
96
#if defined(HAVE_LINUX_IF_PACKET_H)
 
97
#include <linux/if_packet.h>
 
98
#endif
 
99
 
 
100
#if defined(HAVE_LINUX_ICMP_H)
 
101
#include <linux/icmp.h>
 
102
#endif
 
103
 
 
104
#ifndef PF_UNSPEC
 
105
#define PF_UNSPEC AF_UNSPEC
 
106
#endif
 
107
 
 
108
#if UNIXWARE >= 7
 
109
#define HAVE_SENDMSG            1               /* HACK - *FIXME* */
 
110
#endif
 
111
 
 
112
#ifdef LINUX
 
113
/* Under Linux these are enums so we can't test for them with ifdef. */
 
114
#define IPPROTO_EGP IPPROTO_EGP
 
115
#define IPPROTO_PUP IPPROTO_PUP
 
116
#define IPPROTO_IDP IPPROTO_IDP
 
117
#define IPPROTO_IGMP IPPROTO_IGMP
 
118
#define IPPROTO_RAW IPPROTO_RAW
 
119
#define IPPROTO_MAX IPPROTO_MAX
 
120
#endif
 
121
 
 
122
 
 
123
// pgbovine
 
124
extern void CDE_begin_socket_bind_or_connect(struct tcb* tcp);
 
125
 
 
126
 
 
127
static const struct xlat domains[] = {
 
128
#ifdef PF_AAL5
 
129
        { PF_AAL5,      "PF_AAL5"       },
 
130
#endif
 
131
#ifdef PF_APPLETALK
 
132
        { PF_APPLETALK, "PF_APPLETALK"  },
 
133
#endif
 
134
#ifdef PF_ASH
 
135
        { PF_ASH,       "PF_ASH"        },
 
136
#endif
 
137
#ifdef PF_ATMPVC
 
138
        { PF_ATMPVC,    "PF_ATMPVC"     },
 
139
#endif
 
140
#ifdef PF_ATMSVC
 
141
        { PF_ATMSVC,    "PF_ATMSVC"     },
 
142
#endif
 
143
#ifdef PF_AX25
 
144
        { PF_AX25,      "PF_AX25"       },
 
145
#endif
 
146
#ifdef PF_BLUETOOTH
 
147
        { PF_BLUETOOTH, "PF_BLUETOOTH"  },
 
148
#endif
 
149
#ifdef PF_BRIDGE
 
150
        { PF_BRIDGE,    "PF_BRIDGE"     },
 
151
#endif
 
152
#ifdef PF_DECnet
 
153
        { PF_DECnet,    "PF_DECnet"     },
 
154
#endif
 
155
#ifdef PF_DECNET
 
156
        { PF_DECNET,    "PF_DECNET"     },
 
157
#endif
 
158
#ifdef PF_ECONET
 
159
        { PF_ECONET,    "PF_ECONET"     },
 
160
#endif
 
161
#ifdef PF_FILE
 
162
        { PF_FILE,      "PF_FILE"       },
 
163
#endif
 
164
#ifdef PF_IMPLINK
 
165
        { PF_IMPLINK,   "PF_IMPLINK"    },
 
166
#endif
 
167
#ifdef PF_INET
 
168
        { PF_INET,      "PF_INET"       },
 
169
#endif
 
170
#ifdef PF_INET6
 
171
        { PF_INET6,     "PF_INET6"      },
 
172
#endif
 
173
#ifdef PF_IPX
 
174
        { PF_IPX,       "PF_IPX"        },
 
175
#endif
 
176
#ifdef PF_IRDA
 
177
        { PF_IRDA,      "PF_IRDA"       },
 
178
#endif
 
179
#ifdef PF_ISO
 
180
        { PF_ISO,       "PF_ISO"        },
 
181
#endif
 
182
#ifdef PF_KEY
 
183
        { PF_KEY,       "PF_KEY"        },
 
184
#endif
 
185
#ifdef PF_UNIX
 
186
        { PF_UNIX,      "PF_UNIX"       },
 
187
#endif
 
188
#ifdef PF_LOCAL
 
189
        { PF_LOCAL,     "PF_LOCAL"      },
 
190
#endif
 
191
#ifdef PF_NETBEUI
 
192
        { PF_NETBEUI,   "PF_NETBEUI"    },
 
193
#endif
 
194
#ifdef PF_NETLINK
 
195
        { PF_NETLINK,   "PF_NETLINK"    },
 
196
#endif
 
197
#ifdef PF_NETROM
 
198
        { PF_NETROM,    "PF_NETROM"     },
 
199
#endif
 
200
#ifdef PF_PACKET
 
201
        { PF_PACKET,    "PF_PACKET"     },
 
202
#endif
 
203
#ifdef PF_PPPOX
 
204
        { PF_PPPOX,     "PF_PPPOX"      },
 
205
#endif
 
206
#ifdef PF_ROSE
 
207
        { PF_ROSE,      "PF_ROSE"       },
 
208
#endif
 
209
#ifdef PF_ROUTE
 
210
        { PF_ROUTE,     "PF_ROUTE"      },
 
211
#endif
 
212
#ifdef PF_SECURITY
 
213
        { PF_SECURITY,  "PF_SECURITY"   },
 
214
#endif
 
215
#ifdef PF_SNA
 
216
        { PF_SNA,       "PF_SNA"        },
 
217
#endif
 
218
#ifdef PF_UNSPEC
 
219
        { PF_UNSPEC,    "PF_UNSPEC"     },
 
220
#endif
 
221
#ifdef PF_WANPIPE
 
222
        { PF_WANPIPE,   "PF_WANPIPE"    },
 
223
#endif
 
224
#ifdef PF_X25
 
225
        { PF_X25,       "PF_X25"        },
 
226
#endif
 
227
        { 0,            NULL            },
 
228
};
 
229
const struct xlat addrfams[] = {
 
230
#ifdef AF_APPLETALK
 
231
        { AF_APPLETALK, "AF_APPLETALK"  },
 
232
#endif
 
233
#ifdef AF_ASH
 
234
        { AF_ASH,       "AF_ASH"        },
 
235
#endif
 
236
#ifdef AF_ATMPVC
 
237
        { AF_ATMPVC,    "AF_ATMPVC"     },
 
238
#endif
 
239
#ifdef AF_ATMSVC
 
240
        { AF_ATMSVC,    "AF_ATMSVC"     },
 
241
#endif
 
242
#ifdef AF_AX25
 
243
        { AF_AX25,      "AF_AX25"       },
 
244
#endif
 
245
#ifdef AF_BLUETOOTH
 
246
        { AF_BLUETOOTH, "AF_BLUETOOTH"  },
 
247
#endif
 
248
#ifdef AF_BRIDGE
 
249
        { AF_BRIDGE,    "AF_BRIDGE"     },
 
250
#endif
 
251
#ifdef AF_DECnet
 
252
        { AF_DECnet,    "AF_DECnet"     },
 
253
#endif
 
254
#ifdef AF_ECONET
 
255
        { AF_ECONET,    "AF_ECONET"     },
 
256
#endif
 
257
#ifdef AF_FILE
 
258
        { AF_FILE,      "AF_FILE"       },
 
259
#endif
 
260
#ifdef AF_IMPLINK
 
261
        { AF_IMPLINK,   "AF_IMPLINK"    },
 
262
#endif
 
263
#ifdef AF_INET
 
264
        { AF_INET,      "AF_INET"       },
 
265
#endif
 
266
#ifdef AF_INET6
 
267
        { AF_INET6,     "AF_INET6"      },
 
268
#endif
 
269
#ifdef AF_IPX
 
270
        { AF_IPX,       "AF_IPX"        },
 
271
#endif
 
272
#ifdef AF_IRDA
 
273
        { AF_IRDA,      "AF_IRDA"       },
 
274
#endif
 
275
#ifdef AF_ISO
 
276
        { AF_ISO,       "AF_ISO"        },
 
277
#endif
 
278
#ifdef AF_KEY
 
279
        { AF_KEY,       "AF_KEY"        },
 
280
#endif
 
281
#ifdef AF_UNIX
 
282
        { AF_UNIX,      "AF_UNIX"       },
 
283
#endif
 
284
#ifdef AF_LOCAL
 
285
        { AF_LOCAL,     "AF_LOCAL"      },
 
286
#endif
 
287
#ifdef AF_NETBEUI
 
288
        { AF_NETBEUI,   "AF_NETBEUI"    },
 
289
#endif
 
290
#ifdef AF_NETLINK
 
291
        { AF_NETLINK,   "AF_NETLINK"    },
 
292
#endif
 
293
#ifdef AF_NETROM
 
294
        { AF_NETROM,    "AF_NETROM"     },
 
295
#endif
 
296
#ifdef AF_PACKET
 
297
        { AF_PACKET,    "AF_PACKET"     },
 
298
#endif
 
299
#ifdef AF_PPPOX
 
300
        { AF_PPPOX,     "AF_PPPOX"      },
 
301
#endif
 
302
#ifdef AF_ROSE
 
303
        { AF_ROSE,      "AF_ROSE"       },
 
304
#endif
 
305
#ifdef AF_ROUTE
 
306
        { AF_ROUTE,     "AF_ROUTE"      },
 
307
#endif
 
308
#ifdef AF_SECURITY
 
309
        { AF_SECURITY,  "AF_SECURITY"   },
 
310
#endif
 
311
#ifdef AF_SNA
 
312
        { AF_SNA,       "AF_SNA"        },
 
313
#endif
 
314
#ifdef AF_UNSPEC
 
315
        { AF_UNSPEC,    "AF_UNSPEC"     },
 
316
#endif
 
317
#ifdef AF_WANPIPE
 
318
        { AF_WANPIPE,   "AF_WANPIPE"    },
 
319
#endif
 
320
#ifdef AF_X25
 
321
        { AF_X25,       "AF_X25"        },
 
322
#endif
 
323
        { 0,            NULL            },
 
324
};
 
325
static const struct xlat socktypes[] = {
 
326
        { SOCK_STREAM,  "SOCK_STREAM"   },
 
327
        { SOCK_DGRAM,   "SOCK_DGRAM"    },
 
328
#ifdef SOCK_RAW
 
329
        { SOCK_RAW,     "SOCK_RAW"      },
 
330
#endif
 
331
#ifdef SOCK_RDM
 
332
        { SOCK_RDM,     "SOCK_RDM"      },
 
333
#endif
 
334
#ifdef SOCK_SEQPACKET
 
335
        { SOCK_SEQPACKET,"SOCK_SEQPACKET"},
 
336
#endif
 
337
#ifdef SOCK_DCCP
 
338
        { SOCK_DCCP,    "SOCK_DCCP"     },
 
339
#endif
 
340
#ifdef SOCK_PACKET
 
341
        { SOCK_PACKET,  "SOCK_PACKET"   },
 
342
#endif
 
343
        { 0,            NULL            },
 
344
};
 
345
static const struct xlat sock_type_flags[] = {
 
346
#ifdef SOCK_CLOEXEC
 
347
        { SOCK_CLOEXEC, "SOCK_CLOEXEC"  },
 
348
#endif
 
349
#ifdef SOCK_NONBLOCK
 
350
        { SOCK_NONBLOCK,"SOCK_NONBLOCK" },
 
351
#endif
 
352
        { 0,            NULL            },
 
353
};
 
354
#ifndef SOCK_TYPE_MASK
 
355
# define SOCK_TYPE_MASK 0xf
 
356
#endif
 
357
static const struct xlat socketlayers[] = {
 
358
#if defined(SOL_IP)
 
359
        { SOL_IP,       "SOL_IP"        },
 
360
#endif
 
361
#if defined(SOL_ICMP)
 
362
        { SOL_ICMP,     "SOL_ICMP"      },
 
363
#endif
 
364
#if defined(SOL_TCP)
 
365
        { SOL_TCP,      "SOL_TCP"       },
 
366
#endif
 
367
#if defined(SOL_UDP)
 
368
        { SOL_UDP,      "SOL_UDP"       },
 
369
#endif
 
370
#if defined(SOL_IPV6)
 
371
        { SOL_IPV6,     "SOL_IPV6"      },
 
372
#endif
 
373
#if defined(SOL_ICMPV6)
 
374
        { SOL_ICMPV6,   "SOL_ICMPV6"    },
 
375
#endif
 
376
#if defined(SOL_SCTP)
 
377
        { SOL_SCTP,     "SOL_SCTP"      },
 
378
#endif
 
379
#if defined(SOL_UDPLITE)
 
380
        { SOL_UDPLITE,  "SOL_UDPLITE"   },
 
381
#endif
 
382
#if defined(SOL_RAW)
 
383
        { SOL_RAW,      "SOL_RAW"       },
 
384
#endif
 
385
#if defined(SOL_IPX)
 
386
        { SOL_IPX,      "SOL_IPX"       },
 
387
#endif
 
388
#if defined(SOL_AX25)
 
389
        { SOL_AX25,     "SOL_AX25"      },
 
390
#endif
 
391
#if defined(SOL_ATALK)
 
392
        { SOL_ATALK,    "SOL_ATALK"     },
 
393
#endif
 
394
#if defined(SOL_NETROM)
 
395
        { SOL_NETROM,   "SOL_NETROM"    },
 
396
#endif
 
397
#if defined(SOL_ROSE)
 
398
        { SOL_ROSE,     "SOL_ROSE"      },
 
399
#endif
 
400
#if defined(SOL_DECNET)
 
401
        { SOL_DECNET,   "SOL_DECNET"    },
 
402
#endif
 
403
#if defined(SOL_X25)
 
404
        { SOL_X25,      "SOL_X25"       },
 
405
#endif
 
406
#if defined(SOL_PACKET)
 
407
        { SOL_PACKET,   "SOL_PACKET"    },
 
408
#endif
 
409
#if defined(SOL_ATM)
 
410
        { SOL_ATM,      "SOL_ATM"       },
 
411
#endif
 
412
#if defined(SOL_AAL)
 
413
        { SOL_AAL,      "SOL_AAL"       },
 
414
#endif
 
415
#if defined(SOL_IRDA)
 
416
        { SOL_IRDA,     "SOL_IRDA"      },
 
417
#endif
 
418
#if defined(SOL_NETBEUI)
 
419
        { SOL_NETBEUI,  "SOL_NETBEUI"   },
 
420
#endif
 
421
#if defined(SOL_LLC)
 
422
        { SOL_LLC,      "SOL_LLC"       },
 
423
#endif
 
424
#if defined(SOL_DCCP)
 
425
        { SOL_DCCP,     "SOL_DCCP"      },
 
426
#endif
 
427
#if defined(SOL_NETLINK)
 
428
        { SOL_NETLINK,  "SOL_NETLINK"   },
 
429
#endif
 
430
#if defined(SOL_TIPC)
 
431
        { SOL_TIPC,     "SOL_TIPC"      },
 
432
#endif
 
433
#if defined(SOL_RXRPC)
 
434
        { SOL_RXRPC,    "SOL_RXRPC"     },
 
435
#endif
 
436
#if defined(SOL_PPPOL2TP)
 
437
        { SOL_PPPOL2TP, "SOL_PPPOL2TP"  },
 
438
#endif
 
439
#if defined(SOL_BLUETOOTH)
 
440
        { SOL_BLUETOOTH,"SOL_BLUETOOTH" },
 
441
#endif
 
442
#if defined(SOL_PNPIPE)
 
443
        { SOL_PNPIPE,   "SOL_PNPIPE"    },
 
444
#endif
 
445
#if defined(SOL_RDS)
 
446
        { SOL_RDS,      "SOL_RDS"       },
 
447
#endif
 
448
#if defined(SOL_IUVC)
 
449
        { SOL_IUCV,     "SOL_IUCV"      },
 
450
#endif
 
451
#if defined(SOL_CAIF)
 
452
        { SOL_CAIF,     "SOL_CAIF"      },
 
453
#endif
 
454
        { SOL_SOCKET,   "SOL_SOCKET"    },      /* Never used! */
 
455
        /* The SOL_* array should remain not NULL-terminated. */
 
456
};
 
457
/*** WARNING: DANGER WILL ROBINSON: NOTE "socketlayers" array above
 
458
     falls into "protocols" array below!!!!   This is intended!!! ***/
 
459
static const struct xlat protocols[] = {
 
460
        { IPPROTO_IP,   "IPPROTO_IP"    },
 
461
        { IPPROTO_ICMP, "IPPROTO_ICMP"  },
 
462
        { IPPROTO_TCP,  "IPPROTO_TCP"   },
 
463
        { IPPROTO_UDP,  "IPPROTO_UDP"   },
 
464
#ifdef IPPROTO_IGMP
 
465
        { IPPROTO_IGMP, "IPPROTO_IGMP"  },
 
466
#endif
 
467
#ifdef IPPROTO_GGP
 
468
        { IPPROTO_GGP,  "IPPROTO_GGP"   },
 
469
#endif
 
470
#ifdef IPPROTO_IPIP
 
471
        { IPPROTO_IPIP, "IPPROTO_IPIP"  },
 
472
#endif
 
473
#ifdef IPPROTO_EGP
 
474
        { IPPROTO_EGP,  "IPPROTO_EGP"   },
 
475
#endif
 
476
#ifdef IPPROTO_PUP
 
477
        { IPPROTO_PUP,  "IPPROTO_PUP"   },
 
478
#endif
 
479
#ifdef IPPROTO_IDP
 
480
        { IPPROTO_IDP,  "IPPROTO_IDP"   },
 
481
#endif
 
482
#ifdef IPPROTO_TP
 
483
        { IPPROTO_TP,   "IPPROTO_TP"    },
 
484
#endif
 
485
#ifdef IPPROTO_DCCP
 
486
        { IPPROTO_DCCP, "IPPROTO_DCCP"  },
 
487
#endif
 
488
#ifdef IPPROTO_IPV6
 
489
        { IPPROTO_IPV6, "IPPROTO_IPV6"  },
 
490
#endif
 
491
#ifdef IPPROTO_ROUTING
 
492
        { IPPROTO_ROUTING, "IPPROTO_ROUTING" },
 
493
#endif
 
494
#ifdef IPPROTO_FRAGMENT
 
495
        { IPPROTO_FRAGMENT, "IPPROTO_FRAGMENT" },
 
496
#endif
 
497
#ifdef IPPROTO_RSVP
 
498
        { IPPROTO_RSVP, "IPPROTO_RSVP"  },
 
499
#endif
 
500
#ifdef IPPROTO_GRE
 
501
        { IPPROTO_GRE,  "IPPROTO_GRE"   },
 
502
#endif
 
503
#ifdef IPPROTO_ESP
 
504
        { IPPROTO_ESP,  "IPPROTO_ESP"   },
 
505
#endif
 
506
#ifdef IPPROTO_AH
 
507
        { IPPROTO_AH,   "IPPROTO_AH"    },
 
508
#endif
 
509
#ifdef IPPROTO_ICMPV6
 
510
        { IPPROTO_ICMPV6, "IPPROTO_ICMPV6" },
 
511
#endif
 
512
#ifdef IPPROTO_NONE
 
513
        { IPPROTO_NONE, "IPPROTO_NONE"  },
 
514
#endif
 
515
#ifdef IPPROTO_DSTOPTS
 
516
        { IPPROTO_DSTOPTS, "IPPROTO_DSTOPTS" },
 
517
#endif
 
518
#ifdef IPPROTO_HELLO
 
519
        { IPPROTO_HELLO, "IPPROTO_HELLO" },
 
520
#endif
 
521
#ifdef IPPROTO_ND
 
522
        { IPPROTO_ND,   "IPPROTO_ND"    },
 
523
#endif
 
524
#ifdef IPPROTO_MTP
 
525
        { IPPROTO_MTP,  "IPPROTO_MTP"   },
 
526
#endif
 
527
#ifdef IPPROTO_ENCAP
 
528
        { IPPROTO_ENCAP, "IPPROTO_ENCAP" },
 
529
#endif
 
530
#ifdef IPPROTO_PIM
 
531
        { IPPROTO_PIM,  "IPPROTO_PIM"   },
 
532
#endif
 
533
#ifdef IPPROTO_COMP
 
534
        { IPPROTO_COMP, "IPPROTO_COMP"  },
 
535
#endif
 
536
#ifdef IPPROTO_SCTP
 
537
        { IPPROTO_SCTP, "IPPROTO_SCTP"  },
 
538
#endif
 
539
#ifdef IPPROTO_UDPLITE
 
540
        { IPPROTO_UDPLITE, "IPPROTO_UDPLITE" },
 
541
#endif
 
542
#ifdef IPPROTO_RAW
 
543
        { IPPROTO_RAW,  "IPPROTO_RAW"   },
 
544
#endif
 
545
#ifdef IPPROTO_MAX
 
546
        { IPPROTO_MAX,  "IPPROTO_MAX"   },
 
547
#endif
 
548
        { 0,            NULL            },
 
549
};
 
550
static const struct xlat msg_flags[] = {
 
551
        { MSG_OOB,              "MSG_OOB"               },
 
552
#ifdef MSG_DONTROUTE
 
553
        { MSG_DONTROUTE,        "MSG_DONTROUTE"         },
 
554
#endif
 
555
#ifdef MSG_PEEK
 
556
        { MSG_PEEK,             "MSG_PEEK"              },
 
557
#endif
 
558
#ifdef MSG_CTRUNC
 
559
        { MSG_CTRUNC,           "MSG_CTRUNC"            },
 
560
#endif
 
561
#ifdef MSG_PROXY
 
562
        { MSG_PROXY,            "MSG_PROXY"             },
 
563
#endif
 
564
#ifdef MSG_EOR
 
565
        { MSG_EOR,              "MSG_EOR"               },
 
566
#endif
 
567
#ifdef MSG_WAITALL
 
568
        { MSG_WAITALL,          "MSG_WAITALL"           },
 
569
#endif
 
570
#ifdef MSG_TRUNC
 
571
        { MSG_TRUNC,            "MSG_TRUNC"             },
 
572
#endif
 
573
#ifdef MSG_CTRUNC
 
574
        { MSG_CTRUNC,           "MSG_CTRUNC"            },
 
575
#endif
 
576
#ifdef MSG_ERRQUEUE
 
577
        { MSG_ERRQUEUE,         "MSG_ERRQUEUE"          },
 
578
#endif
 
579
#ifdef MSG_DONTWAIT
 
580
        { MSG_DONTWAIT,         "MSG_DONTWAIT"          },
 
581
#endif
 
582
#ifdef MSG_CONFIRM
 
583
        { MSG_CONFIRM,          "MSG_CONFIRM"           },
 
584
#endif
 
585
#ifdef MSG_PROBE
 
586
        { MSG_PROBE,            "MSG_PROBE"             },
 
587
#endif
 
588
#ifdef MSG_FIN
 
589
        { MSG_FIN,              "MSG_FIN"               },
 
590
#endif
 
591
#ifdef MSG_SYN
 
592
        { MSG_SYN,              "MSG_SYN"               },
 
593
#endif
 
594
#ifdef MSG_RST
 
595
        { MSG_RST,              "MSG_RST"               },
 
596
#endif
 
597
#ifdef MSG_NOSIGNAL
 
598
        { MSG_NOSIGNAL,         "MSG_NOSIGNAL"          },
 
599
#endif
 
600
#ifdef MSG_MORE
 
601
        { MSG_MORE,             "MSG_MORE"              },
 
602
#endif
 
603
#ifdef MSG_CMSG_CLOEXEC
 
604
        { MSG_CMSG_CLOEXEC,     "MSG_CMSG_CLOEXEC"      },
 
605
#endif
 
606
        { 0,                    NULL                    },
 
607
};
 
608
 
 
609
static const struct xlat sockoptions[] = {
 
610
#ifdef SO_ACCEPTCONN
 
611
        { SO_ACCEPTCONN,        "SO_ACCEPTCONN" },
 
612
#endif
 
613
#ifdef SO_ALLRAW
 
614
        { SO_ALLRAW,    "SO_ALLRAW"     },
 
615
#endif
 
616
#ifdef SO_ATTACH_FILTER
 
617
        { SO_ATTACH_FILTER,     "SO_ATTACH_FILTER"      },
 
618
#endif
 
619
#ifdef SO_BINDTODEVICE
 
620
        { SO_BINDTODEVICE,      "SO_BINDTODEVICE"       },
 
621
#endif
 
622
#ifdef SO_BROADCAST
 
623
        { SO_BROADCAST, "SO_BROADCAST"  },
 
624
#endif
 
625
#ifdef SO_BSDCOMPAT
 
626
        { SO_BSDCOMPAT, "SO_BSDCOMPAT"  },
 
627
#endif
 
628
#ifdef SO_DEBUG
 
629
        { SO_DEBUG,     "SO_DEBUG"      },
 
630
#endif
 
631
#ifdef SO_DETACH_FILTER
 
632
        { SO_DETACH_FILTER,     "SO_DETACH_FILTER"      },
 
633
#endif
 
634
#ifdef SO_DONTROUTE
 
635
        { SO_DONTROUTE, "SO_DONTROUTE"  },
 
636
#endif
 
637
#ifdef SO_ERROR
 
638
        { SO_ERROR,     "SO_ERROR"      },
 
639
#endif
 
640
#ifdef SO_ICS
 
641
        { SO_ICS,       "SO_ICS"        },
 
642
#endif
 
643
#ifdef SO_IMASOCKET
 
644
        { SO_IMASOCKET, "SO_IMASOCKET"  },
 
645
#endif
 
646
#ifdef SO_KEEPALIVE
 
647
        { SO_KEEPALIVE, "SO_KEEPALIVE"  },
 
648
#endif
 
649
#ifdef SO_LINGER
 
650
        { SO_LINGER,    "SO_LINGER"     },
 
651
#endif
 
652
#ifdef SO_LISTENING
 
653
        { SO_LISTENING, "SO_LISTENING"  },
 
654
#endif
 
655
#ifdef SO_MGMT
 
656
        { SO_MGMT,      "SO_MGMT"       },
 
657
#endif
 
658
#ifdef SO_NO_CHECK
 
659
        { SO_NO_CHECK,  "SO_NO_CHECK"   },
 
660
#endif
 
661
#ifdef SO_OOBINLINE
 
662
        { SO_OOBINLINE, "SO_OOBINLINE"  },
 
663
#endif
 
664
#ifdef SO_ORDREL
 
665
        { SO_ORDREL,    "SO_ORDREL"     },
 
666
#endif
 
667
#ifdef SO_PARALLELSVR
 
668
        { SO_PARALLELSVR,       "SO_PARALLELSVR"        },
 
669
#endif
 
670
#ifdef SO_PASSCRED
 
671
        { SO_PASSCRED,  "SO_PASSCRED"   },
 
672
#endif
 
673
#ifdef SO_PEERCRED
 
674
        { SO_PEERCRED,  "SO_PEERCRED"   },
 
675
#endif
 
676
#ifdef SO_PEERNAME
 
677
        { SO_PEERNAME,  "SO_PEERNAME"   },
 
678
#endif
 
679
#ifdef SO_PEERSEC
 
680
        { SO_PEERSEC,   "SO_PEERSEC"    },
 
681
#endif
 
682
#ifdef SO_PRIORITY
 
683
        { SO_PRIORITY,  "SO_PRIORITY"   },
 
684
#endif
 
685
#ifdef SO_PROTOTYPE
 
686
        { SO_PROTOTYPE, "SO_PROTOTYPE"  },
 
687
#endif
 
688
#ifdef SO_RCVBUF
 
689
        { SO_RCVBUF,    "SO_RCVBUF"     },
 
690
#endif
 
691
#ifdef SO_RCVLOWAT
 
692
        { SO_RCVLOWAT,  "SO_RCVLOWAT"   },
 
693
#endif
 
694
#ifdef SO_RCVTIMEO
 
695
        { SO_RCVTIMEO,  "SO_RCVTIMEO"   },
 
696
#endif
 
697
#ifdef SO_RDWR
 
698
        { SO_RDWR,      "SO_RDWR"       },
 
699
#endif
 
700
#ifdef SO_REUSEADDR
 
701
        { SO_REUSEADDR, "SO_REUSEADDR"  },
 
702
#endif
 
703
#ifdef SO_REUSEPORT
 
704
        { SO_REUSEPORT, "SO_REUSEPORT"  },
 
705
#endif
 
706
#ifdef SO_SECURITY_AUTHENTICATION
 
707
        { SO_SECURITY_AUTHENTICATION,"SO_SECURITY_AUTHENTICATION"},
 
708
#endif
 
709
#ifdef SO_SECURITY_ENCRYPTION_NETWORK
 
710
        { SO_SECURITY_ENCRYPTION_NETWORK,"SO_SECURITY_ENCRYPTION_NETWORK"},
 
711
#endif
 
712
#ifdef SO_SECURITY_ENCRYPTION_TRANSPORT
 
713
        { SO_SECURITY_ENCRYPTION_TRANSPORT,"SO_SECURITY_ENCRYPTION_TRANSPORT"},
 
714
#endif
 
715
#ifdef SO_SEMA
 
716
        { SO_SEMA,      "SO_SEMA"       },
 
717
#endif
 
718
#ifdef SO_SNDBUF
 
719
        { SO_SNDBUF,    "SO_SNDBUF"     },
 
720
#endif
 
721
#ifdef SO_SNDLOWAT
 
722
        { SO_SNDLOWAT,  "SO_SNDLOWAT"   },
 
723
#endif
 
724
#ifdef SO_SNDTIMEO
 
725
        { SO_SNDTIMEO,  "SO_SNDTIMEO"   },
 
726
#endif
 
727
#ifdef SO_TIMESTAMP
 
728
        { SO_TIMESTAMP, "SO_TIMESTAMP"  },
 
729
#endif
 
730
#ifdef SO_TYPE
 
731
        { SO_TYPE,      "SO_TYPE"       },
 
732
#endif
 
733
#ifdef SO_USELOOPBACK
 
734
        { SO_USELOOPBACK,       "SO_USELOOPBACK"        },
 
735
#endif
 
736
        { 0,            NULL            },
 
737
};
 
738
 
 
739
#if !defined (SOL_IP) && defined (IPPROTO_IP)
 
740
#define SOL_IP IPPROTO_IP
 
741
#endif
 
742
 
 
743
#ifdef SOL_IP
 
744
static const struct xlat sockipoptions[] = {
 
745
#ifdef IP_TOS
 
746
        { IP_TOS,               "IP_TOS"                },
 
747
#endif
 
748
#ifdef IP_TTL
 
749
        { IP_TTL,               "IP_TTL"                },
 
750
#endif
 
751
#ifdef IP_HDRINCL
 
752
        { IP_HDRINCL,           "IP_HDRINCL"            },
 
753
#endif
 
754
#ifdef IP_OPTIONS
 
755
        { IP_OPTIONS,           "IP_OPTIONS"            },
 
756
#endif
 
757
#ifdef IP_ROUTER_ALERT
 
758
        { IP_ROUTER_ALERT,      "IP_ROUTER_ALERT"       },
 
759
#endif
 
760
#ifdef IP_RECVOPTIONS
 
761
        { IP_RECVOPTIONS,       "IP_RECVOPTIONS"        },
 
762
#endif
 
763
#ifdef IP_RECVOPTS
 
764
        { IP_RECVOPTS,          "IP_RECVOPTS"           },
 
765
#endif
 
766
#ifdef IP_RECVRETOPTS
 
767
        { IP_RECVRETOPTS,       "IP_RECVRETOPTS"        },
 
768
#endif
 
769
#ifdef IP_RECVDSTADDR
 
770
        { IP_RECVDSTADDR,       "IP_RECVDSTADDR"        },
 
771
#endif
 
772
#ifdef IP_RETOPTS
 
773
        { IP_RETOPTS,           "IP_RETOPTS"            },
 
774
#endif
 
775
#ifdef IP_PKTINFO
 
776
        { IP_PKTINFO,           "IP_PKTINFO"            },
 
777
#endif
 
778
#ifdef IP_PKTOPTIONS
 
779
        { IP_PKTOPTIONS,        "IP_PKTOPTIONS"         },
 
780
#endif
 
781
#ifdef IP_MTU_DISCOVER
 
782
        { IP_MTU_DISCOVER,      "IP_MTU_DISCOVER"       },
 
783
#endif
 
784
#ifdef IP_RECVERR
 
785
        { IP_RECVERR,           "IP_RECVERR"            },
 
786
#endif
 
787
#ifdef IP_RECVTTL
 
788
        { IP_RECVTTL,           "IP_RECVTTL"            },
 
789
#endif
 
790
#ifdef IP_RECVTOS
 
791
        { IP_RECVTOS,           "IP_RECVTOS"            },
 
792
#endif
 
793
#ifdef IP_MTU
 
794
        { IP_MTU,               "IP_MTU"                },
 
795
#endif
 
796
#ifdef IP_MULTICAST_IF
 
797
        { IP_MULTICAST_IF,      "IP_MULTICAST_IF"       },
 
798
#endif
 
799
#ifdef IP_MULTICAST_TTL
 
800
        { IP_MULTICAST_TTL,     "IP_MULTICAST_TTL"      },
 
801
#endif
 
802
#ifdef IP_MULTICAST_LOOP
 
803
        { IP_MULTICAST_LOOP,    "IP_MULTICAST_LOOP"     },
 
804
#endif
 
805
#ifdef IP_ADD_MEMBERSHIP
 
806
        { IP_ADD_MEMBERSHIP,    "IP_ADD_MEMBERSHIP"     },
 
807
#endif
 
808
#ifdef IP_DROP_MEMBERSHIP
 
809
        { IP_DROP_MEMBERSHIP,   "IP_DROP_MEMBERSHIP"    },
 
810
#endif
 
811
#ifdef IP_BROADCAST_IF
 
812
        { IP_BROADCAST_IF,      "IP_BROADCAST_IF"       },
 
813
#endif
 
814
#ifdef IP_RECVIFINDEX
 
815
        { IP_RECVIFINDEX,       "IP_RECVIFINDEX"        },
 
816
#endif
 
817
#ifdef IP_MSFILTER
 
818
        { IP_MSFILTER,          "IP_MSFILTER"           },
 
819
#endif
 
820
#ifdef MCAST_MSFILTER
 
821
        { MCAST_MSFILTER,       "MCAST_MSFILTER"        },
 
822
#endif
 
823
#ifdef IP_FREEBIND
 
824
        { IP_FREEBIND,          "IP_FREEBIND"           },
 
825
#endif
 
826
        { 0,                    NULL                    },
 
827
};
 
828
#endif /* SOL_IP */
 
829
 
 
830
#ifdef SOL_IPV6
 
831
static const struct xlat sockipv6options[] = {
 
832
#ifdef IPV6_ADDRFORM
 
833
        { IPV6_ADDRFORM,        "IPV6_ADDRFORM"         },
 
834
#endif
 
835
#ifdef MCAST_FILTER
 
836
        { MCAST_FILTER,         "MCAST_FILTER"          },
 
837
#endif
 
838
#ifdef IPV6_PKTOPTIONS
 
839
        { IPV6_PKTOPTIONS,      "IPV6_PKTOPTIONS"       },
 
840
#endif
 
841
#ifdef IPV6_MTU
 
842
        { IPV6_MTU,             "IPV6_MTU"              },
 
843
#endif
 
844
#ifdef IPV6_V6ONLY
 
845
        { IPV6_V6ONLY,          "IPV6_V6ONLY"           },
 
846
#endif
 
847
#ifdef IPV6_PKTINFO
 
848
        { IPV6_PKTINFO,         "IPV6_PKTINFO"          },
 
849
#endif
 
850
#ifdef IPV6_HOPLIMIT
 
851
        { IPV6_HOPLIMIT,        "IPV6_HOPLIMIT"         },
 
852
#endif
 
853
#ifdef IPV6_RTHDR
 
854
        { IPV6_RTHDR,           "IPV6_RTHDR"            },
 
855
#endif
 
856
#ifdef IPV6_HOPOPTS
 
857
        { IPV6_HOPOPTS,         "IPV6_HOPOPTS"          },
 
858
#endif
 
859
#ifdef IPV6_DSTOPTS
 
860
        { IPV6_DSTOPTS,         "IPV6_DSTOPTS"          },
 
861
#endif
 
862
#ifdef IPV6_FLOWINFO
 
863
        { IPV6_FLOWINFO,        "IPV6_FLOWINFO"         },
 
864
#endif
 
865
#ifdef IPV6_UNICAST_HOPS
 
866
        { IPV6_UNICAST_HOPS,    "IPV6_UNICAST_HOPS"     },
 
867
#endif
 
868
#ifdef IPV6_MULTICAST_HOPS
 
869
        { IPV6_MULTICAST_HOPS,  "IPV6_MULTICAST_HOPS"   },
 
870
#endif
 
871
#ifdef IPV6_MULTICAST_LOOP
 
872
        { IPV6_MULTICAST_LOOP,  "IPV6_MULTICAST_LOOP"   },
 
873
#endif
 
874
#ifdef IPV6_MULTICAST_IF
 
875
        { IPV6_MULTICAST_IF,    "IPV6_MULTICAST_IF"     },
 
876
#endif
 
877
#ifdef IPV6_MTU_DISCOVER
 
878
        { IPV6_MTU_DISCOVER,    "IPV6_MTU_DISCOVER"     },
 
879
#endif
 
880
#ifdef IPV6_RECVERR
 
881
        { IPV6_RECVERR,         "IPV6_RECVERR"          },
 
882
#endif
 
883
#ifdef IPV6_FLOWINFO_SEND
 
884
        { IPV6_FLOWINFO_SEND,   "IPV6_FLOWINFO_SEND"    },
 
885
#endif
 
886
#ifdef IPV6_ADD_MEMBERSHIP
 
887
        { IPV6_ADD_MEMBERSHIP,  "IPV6_ADD_MEMBERSHIP"   },
 
888
#endif
 
889
#ifdef IPV6_DROP_MEMBERSHIP
 
890
        { IPV6_DROP_MEMBERSHIP, "IPV6_DROP_MEMBERSHIP"  },
 
891
#endif
 
892
#ifdef IPV6_ROUTER_ALERT
 
893
        { IPV6_ROUTER_ALERT,    "IPV6_ROUTER_ALERT"     },
 
894
#endif
 
895
        { 0,                    NULL                    },
 
896
};
 
897
#endif /* SOL_IPV6 */
 
898
 
 
899
#ifdef SOL_IPX
 
900
static const struct xlat sockipxoptions[] = {
 
901
        { IPX_TYPE,     "IPX_TYPE"      },
 
902
        { 0,            NULL            },
 
903
};
 
904
#endif /* SOL_IPX */
 
905
 
 
906
#ifdef SOL_RAW
 
907
static const struct xlat sockrawoptions[] = {
 
908
#if defined(ICMP_FILTER)
 
909
        { ICMP_FILTER,          "ICMP_FILTER"   },
 
910
#endif
 
911
        { 0,                    NULL            },
 
912
};
 
913
#endif /* SOL_RAW */
 
914
 
 
915
#ifdef SOL_PACKET
 
916
static const struct xlat sockpacketoptions[] = {
 
917
#ifdef PACKET_ADD_MEMBERSHIP
 
918
        { PACKET_ADD_MEMBERSHIP,        "PACKET_ADD_MEMBERSHIP" },
 
919
#endif
 
920
#ifdef PACKET_DROP_MEMBERSHIP
 
921
        { PACKET_DROP_MEMBERSHIP,       "PACKET_DROP_MEMBERSHIP"},
 
922
#endif
 
923
#if defined(PACKET_RECV_OUTPUT)
 
924
        { PACKET_RECV_OUTPUT,           "PACKET_RECV_OUTPUT"    },
 
925
#endif
 
926
#if defined(PACKET_RX_RING)
 
927
        { PACKET_RX_RING,               "PACKET_RX_RING"        },
 
928
#endif
 
929
#if defined(PACKET_STATISTICS)
 
930
        { PACKET_STATISTICS,            "PACKET_STATISTICS"     },
 
931
#endif
 
932
#if defined(PACKET_COPY_THRESH)
 
933
        { PACKET_COPY_THRESH,           "PACKET_COPY_THRESH"    },
 
934
#endif
 
935
#if defined(PACKET_AUXDATA)
 
936
        { PACKET_AUXDATA,               "PACKET_AUXDATA"        },
 
937
#endif
 
938
#if defined(PACKET_ORIGDEV)
 
939
        { PACKET_ORIGDEV,               "PACKET_ORIGDEV"        },
 
940
#endif
 
941
#if defined(PACKET_VERSION)
 
942
        { PACKET_VERSION,               "PACKET_VERSION"        },
 
943
#endif
 
944
#if defined(PACKET_HDRLEN)
 
945
        { PACKET_HDRLEN,                "PACKET_HDRLEN" },
 
946
#endif
 
947
#if defined(PACKET_RESERVE)
 
948
        { PACKET_RESERVE,               "PACKET_RESERVE"        },
 
949
#endif
 
950
#if defined(PACKET_TX_RING)
 
951
        { PACKET_TX_RING,               "PACKET_TX_RING"        },
 
952
#endif
 
953
#if defined(PACKET_LOSS)
 
954
        { PACKET_LOSS,                  "PACKET_LOSS"   },
 
955
#endif
 
956
        { 0,                            NULL                    },
 
957
};
 
958
#endif /* SOL_PACKET */
 
959
 
 
960
#ifdef SOL_SCTP
 
961
static const struct xlat socksctpoptions[] = {
 
962
#if defined(SCTP_RTOINFO)
 
963
        { SCTP_RTOINFO,                 "SCTP_RTOINFO"  },
 
964
#endif
 
965
#if defined(SCTP_ASSOCINFO)
 
966
        { SCTP_ASSOCINFO,               "SCTP_ASSOCINFO"},
 
967
#endif
 
968
#if defined(SCTP_INITMSG)
 
969
        { SCTP_INITMSG,                 "SCTP_INITMSG"  },
 
970
#endif
 
971
#if defined(SCTP_NODELAY)
 
972
        { SCTP_NODELAY,                 "SCTP_NODELAY"  },
 
973
#endif
 
974
#if defined(SCTP_AUTOCLOSE)
 
975
        { SCTP_AUTOCLOSE,               "SCTP_AUTOCLOSE"},
 
976
#endif
 
977
#if defined(SCTP_SET_PEER_PRIMARY_ADDR)
 
978
        { SCTP_SET_PEER_PRIMARY_ADDR,   "SCTP_SET_PEER_PRIMARY_ADDR"},
 
979
#endif
 
980
#if defined(SCTP_PRIMARY_ADDR)
 
981
        { SCTP_PRIMARY_ADDR,            "SCTP_PRIMARY_ADDR"     },
 
982
#endif
 
983
#if defined(SCTP_ADAPTATION_LAYER)
 
984
        { SCTP_ADAPTATION_LAYER,        "SCTP_ADAPTATION_LAYER" },
 
985
#endif
 
986
#if defined(SCTP_DISABLE_FRAGMENTS)
 
987
        { SCTP_DISABLE_FRAGMENTS,       "SCTP_DISABLE_FRAGMENTS"},
 
988
#endif
 
989
#if defined(SCTP_PEER_ADDR_PARAMS)
 
990
        { SCTP_PEER_ADDR_PARAMS,        "SCTP_PEER_ADDR_PARAMS" },
 
991
#endif
 
992
#if defined(SCTP_DEFAULT_SEND_PARAM)
 
993
        { SCTP_DEFAULT_SEND_PARAM,      "SCTP_DEFAULT_SEND_PARAM"},
 
994
#endif
 
995
#if defined(SCTP_EVENTS)
 
996
        { SCTP_EVENTS,                  "SCTP_EVENTS"           },
 
997
#endif
 
998
#if defined(SCTP_I_WANT_MAPPED_V4_ADDR)
 
999
        { SCTP_I_WANT_MAPPED_V4_ADDR,   "SCTP_I_WANT_MAPPED_V4_ADDR"},
 
1000
#endif
 
1001
#if defined(SCTP_MAXSEG)
 
1002
        { SCTP_MAXSEG,                  "SCTP_MAXSEG"           },
 
1003
#endif
 
1004
#if defined(SCTP_STATUS)
 
1005
        { SCTP_STATUS,                  "SCTP_STATUS"           },
 
1006
#endif
 
1007
#if defined(SCTP_GET_PEER_ADDR_INFO)
 
1008
        { SCTP_GET_PEER_ADDR_INFO,      "SCTP_GET_PEER_ADDR_INFO"},
 
1009
#endif
 
1010
#if defined(SCTP_DELAYED_ACK)
 
1011
        { SCTP_DELAYED_ACK,             "SCTP_DELAYED_ACK"      },
 
1012
#endif
 
1013
#if defined(SCTP_CONTEXT)
 
1014
        { SCTP_CONTEXT,                 "SCTP_CONTEXT"          },
 
1015
#endif
 
1016
#if defined(SCTP_FRAGMENT_INTERLEAVE)
 
1017
        { SCTP_FRAGMENT_INTERLEAVE,     "SCTP_FRAGMENT_INTERLEAVE"},
 
1018
#endif
 
1019
#if defined(SCTP_PARTIAL_DELIVERY_POINT)
 
1020
        { SCTP_PARTIAL_DELIVERY_POINT,  "SCTP_PARTIAL_DELIVERY_POINT"},
 
1021
#endif
 
1022
#if defined(SCTP_MAX_BURST)
 
1023
        { SCTP_MAX_BURST,               "SCTP_MAX_BURST"        },
 
1024
#endif
 
1025
#if defined(SCTP_AUTH_CHUNK)
 
1026
        { SCTP_AUTH_CHUNK,              "SCTP_AUTH_CHUNK"       },
 
1027
#endif
 
1028
#if defined(SCTP_HMAC_IDENT)
 
1029
        { SCTP_HMAC_IDENT,              "SCTP_HMAC_IDENT"       },
 
1030
#endif
 
1031
#if defined(SCTP_AUTH_KEY)
 
1032
        { SCTP_AUTH_KEY,                "SCTP_AUTH_KEY"         },
 
1033
#endif
 
1034
#if defined(SCTP_AUTH_ACTIVE_KEY)
 
1035
        { SCTP_AUTH_ACTIVE_KEY,         "SCTP_AUTH_ACTIVE_KEY"  },
 
1036
#endif
 
1037
#if defined(SCTP_AUTH_DELETE_KEY)
 
1038
        { SCTP_AUTH_DELETE_KEY,         "SCTP_AUTH_DELETE_KEY"  },
 
1039
#endif
 
1040
#if defined(SCTP_PEER_AUTH_CHUNKS)
 
1041
        { SCTP_PEER_AUTH_CHUNKS,        "SCTP_PEER_AUTH_CHUNKS" },
 
1042
#endif
 
1043
#if defined(SCTP_LOCAL_AUTH_CHUNKS)
 
1044
        { SCTP_LOCAL_AUTH_CHUNKS,       "SCTP_LOCAL_AUTH_CHUNKS"},
 
1045
#endif
 
1046
#if defined(SCTP_GET_ASSOC_NUMBER)
 
1047
        { SCTP_GET_ASSOC_NUMBER,        "SCTP_GET_ASSOC_NUMBER" },
 
1048
#endif
 
1049
 
 
1050
        /* linux specific things */
 
1051
#if defined(SCTP_SOCKOPT_BINDX_ADD)
 
1052
        { SCTP_SOCKOPT_BINDX_ADD,       "SCTP_SOCKOPT_BINDX_ADD"        },
 
1053
#endif
 
1054
#if defined(SCTP_SOCKOPT_BINDX_REM)
 
1055
        { SCTP_SOCKOPT_BINDX_REM,       "SCTP_SOCKOPT_BINDX_REM"        },
 
1056
#endif
 
1057
#if defined(SCTP_SOCKOPT_PEELOFF)
 
1058
        { SCTP_SOCKOPT_PEELOFF,         "SCTP_SOCKOPT_PEELOFF"          },
 
1059
#endif
 
1060
#if defined(SCTP_GET_PEER_ADDRS_NUM_OLD)
 
1061
        { SCTP_GET_PEER_ADDRS_NUM_OLD,  "SCTP_GET_PEER_ADDRS_NUM_OLD"   },
 
1062
#endif
 
1063
#if defined(SCTP_GET_PEER_ADDRS_OLD)
 
1064
        { SCTP_GET_PEER_ADDRS_OLD,      "SCTP_GET_PEER_ADDRS_OLD"       },
 
1065
#endif
 
1066
#if defined(SCTP_GET_LOCAL_ADDRS_NUM_OLD)
 
1067
        { SCTP_GET_LOCAL_ADDRS_NUM_OLD, "SCTP_GET_LOCAL_ADDRS_NUM_OLD"  },
 
1068
#endif
 
1069
#if defined(SCTP_GET_LOCAL_ADDRS_OLD)
 
1070
        { SCTP_GET_LOCAL_ADDRS_OLD,     "SCTP_GET_LOCAL_ADDRS_OLD"      },
 
1071
#endif
 
1072
#if defined(SCTP_SOCKOPT_CONNECTX_OLD)
 
1073
        { SCTP_SOCKOPT_CONNECTX_OLD,    "SCTP_SOCKOPT_CONNECTX_OLD"     },
 
1074
#endif
 
1075
#if defined(SCTP_GET_PEER_ADDRS)
 
1076
        { SCTP_GET_PEER_ADDRS,          "SCTP_GET_PEER_ADDRS"           },
 
1077
#endif
 
1078
#if defined(SCTP_GET_LOCAL_ADDRS)
 
1079
        { SCTP_GET_LOCAL_ADDRS,         "SCTP_GET_LOCAL_ADDRS"          },
 
1080
#endif
 
1081
 
 
1082
        { 0,    NULL    },
 
1083
};
 
1084
#endif
 
1085
 
 
1086
#if  !defined (SOL_TCP) && defined (IPPROTO_TCP)
 
1087
#define SOL_TCP IPPROTO_TCP
 
1088
#endif
 
1089
 
 
1090
#ifdef SOL_TCP
 
1091
static const struct xlat socktcpoptions[] = {
 
1092
        { TCP_NODELAY,          "TCP_NODELAY"   },
 
1093
        { TCP_MAXSEG,           "TCP_MAXSEG"    },
 
1094
#if defined(TCP_CORK)
 
1095
        { TCP_CORK,             "TCP_CORK"      },
 
1096
#endif
 
1097
#if defined(TCP_KEEPIDLE)
 
1098
        { TCP_KEEPIDLE,         "TCP_KEEPIDLE" },
 
1099
#endif
 
1100
#if defined(TCP_KEEPINTVL)
 
1101
        { TCP_KEEPINTVL,        "TCP_KEEPINTVL" },
 
1102
#endif
 
1103
#if defined(TCP_KEEPCNT)
 
1104
        { TCP_KEEPCNT,          "TCP_KEEPCNT" },
 
1105
#endif
 
1106
#if defined(TCP_NKEEP)
 
1107
        { TCP_NKEEP,            "TCP_NKEEP"     },
 
1108
#endif
 
1109
#if defined(TCP_SYNCNT)
 
1110
        { TCP_SYNCNT,           "TCP_SYNCNT" },
 
1111
#endif
 
1112
#if defined(TCP_LINGER2)
 
1113
        { TCP_LINGER2,          "TCP_LINGER2" },
 
1114
#endif
 
1115
#if defined(TCP_DEFER_ACCEPT)
 
1116
        { TCP_DEFER_ACCEPT,     "TCP_DEFER_ACCEPT" },
 
1117
#endif
 
1118
#if defined(TCP_WINDOW_CLAMP)
 
1119
        { TCP_WINDOW_CLAMP,     "TCP_WINDOW_CLAMP" },
 
1120
#endif
 
1121
#if defined(TCP_INFO)
 
1122
        { TCP_INFO,             "TCP_INFO" },
 
1123
#endif
 
1124
#if defined(TCP_QUICKACK)
 
1125
        { TCP_QUICKACK,         "TCP_QUICKACK" },
 
1126
#endif
 
1127
        { 0,                    NULL            },
 
1128
};
 
1129
#endif /* SOL_TCP */
 
1130
 
 
1131
#ifdef SOL_RAW
 
1132
static const struct xlat icmpfilterflags[] = {
 
1133
#if defined(ICMP_ECHOREPLY)
 
1134
        { (1<<ICMP_ECHOREPLY),          "ICMP_ECHOREPLY"        },
 
1135
#endif
 
1136
#if defined(ICMP_DEST_UNREACH)
 
1137
        { (1<<ICMP_DEST_UNREACH),       "ICMP_DEST_UNREACH"     },
 
1138
#endif
 
1139
#if defined(ICMP_SOURCE_QUENCH)
 
1140
        { (1<<ICMP_SOURCE_QUENCH),      "ICMP_SOURCE_QUENCH"    },
 
1141
#endif
 
1142
#if defined(ICMP_REDIRECT)
 
1143
        { (1<<ICMP_REDIRECT),           "ICMP_REDIRECT"         },
 
1144
#endif
 
1145
#if defined(ICMP_ECHO)
 
1146
        { (1<<ICMP_ECHO),               "ICMP_ECHO"             },
 
1147
#endif
 
1148
#if defined(ICMP_TIME_EXCEEDED)
 
1149
        { (1<<ICMP_TIME_EXCEEDED),      "ICMP_TIME_EXCEEDED"    },
 
1150
#endif
 
1151
#if defined(ICMP_PARAMETERPROB)
 
1152
        { (1<<ICMP_PARAMETERPROB),      "ICMP_PARAMETERPROB"    },
 
1153
#endif
 
1154
#if defined(ICMP_TIMESTAMP)
 
1155
        { (1<<ICMP_TIMESTAMP),          "ICMP_TIMESTAMP"        },
 
1156
#endif
 
1157
#if defined(ICMP_TIMESTAMPREPLY)
 
1158
        { (1<<ICMP_TIMESTAMPREPLY),     "ICMP_TIMESTAMPREPLY"   },
 
1159
#endif
 
1160
#if defined(ICMP_INFO_REQUEST)
 
1161
        { (1<<ICMP_INFO_REQUEST),       "ICMP_INFO_REQUEST"     },
 
1162
#endif
 
1163
#if defined(ICMP_INFO_REPLY)
 
1164
        { (1<<ICMP_INFO_REPLY),         "ICMP_INFO_REPLY"       },
 
1165
#endif
 
1166
#if defined(ICMP_ADDRESS)
 
1167
        { (1<<ICMP_ADDRESS),            "ICMP_ADDRESS"          },
 
1168
#endif
 
1169
#if defined(ICMP_ADDRESSREPLY)
 
1170
        { (1<<ICMP_ADDRESSREPLY),       "ICMP_ADDRESSREPLY"     },
 
1171
#endif
 
1172
        { 0,                            NULL                    },
 
1173
};
 
1174
#endif /* SOL_RAW */
 
1175
 
 
1176
#if defined(AF_PACKET) /* from e.g. linux/if_packet.h */
 
1177
static const struct xlat af_packet_types[] = {
 
1178
#if defined(PACKET_HOST)
 
1179
        { PACKET_HOST,                  "PACKET_HOST"           },
 
1180
#endif
 
1181
#if defined(PACKET_BROADCAST)
 
1182
        { PACKET_BROADCAST,             "PACKET_BROADCAST"      },
 
1183
#endif
 
1184
#if defined(PACKET_MULTICAST)
 
1185
        { PACKET_MULTICAST,             "PACKET_MULTICAST"      },
 
1186
#endif
 
1187
#if defined(PACKET_OTHERHOST)
 
1188
        { PACKET_OTHERHOST,             "PACKET_OTHERHOST"      },
 
1189
#endif
 
1190
#if defined(PACKET_OUTGOING)
 
1191
        { PACKET_OUTGOING,              "PACKET_OUTGOING"       },
 
1192
#endif
 
1193
#if defined(PACKET_LOOPBACK)
 
1194
        { PACKET_LOOPBACK,              "PACKET_LOOPBACK"       },
 
1195
#endif
 
1196
#if defined(PACKET_FASTROUTE)
 
1197
        { PACKET_FASTROUTE,             "PACKET_FASTROUTE"      },
 
1198
#endif
 
1199
        { 0,                            NULL                    },
 
1200
};
 
1201
#endif /* defined(AF_PACKET) */
 
1202
 
 
1203
 
 
1204
void
 
1205
printsock(struct tcb *tcp, long addr, int addrlen)
 
1206
{
 
1207
        union {
 
1208
                char pad[128];
 
1209
                struct sockaddr sa;
 
1210
                struct sockaddr_in sin;
 
1211
                struct sockaddr_un sau;
 
1212
#ifdef HAVE_INET_NTOP
 
1213
                struct sockaddr_in6 sa6;
 
1214
#endif
 
1215
#if defined(LINUX) && defined(AF_IPX)
 
1216
                struct sockaddr_ipx sipx;
 
1217
#endif
 
1218
#ifdef AF_PACKET
 
1219
                struct sockaddr_ll ll;
 
1220
#endif
 
1221
#ifdef AF_NETLINK
 
1222
                struct sockaddr_nl nl;
 
1223
#endif
 
1224
        } addrbuf;
 
1225
        char string_addr[100];
 
1226
 
 
1227
        if (addr == 0) {
 
1228
                tprintf("NULL");
 
1229
                return;
 
1230
        }
 
1231
        if (!verbose(tcp)) {
 
1232
                tprintf("%#lx", addr);
 
1233
                return;
 
1234
        }
 
1235
 
 
1236
        if (addrlen < 2 || addrlen > sizeof(addrbuf))
 
1237
                addrlen = sizeof(addrbuf);
 
1238
 
 
1239
        memset(&addrbuf, 0, sizeof(addrbuf));
 
1240
        if (umoven(tcp, addr, addrlen, addrbuf.pad) < 0) {
 
1241
                tprintf("{...}");
 
1242
                return;
 
1243
        }
 
1244
        addrbuf.pad[sizeof(addrbuf.pad) - 1] = '\0';
 
1245
 
 
1246
        tprintf("{sa_family=");
 
1247
        printxval(addrfams, addrbuf.sa.sa_family, "AF_???");
 
1248
        tprintf(", ");
 
1249
 
 
1250
        switch (addrbuf.sa.sa_family) {
 
1251
        case AF_UNIX:
 
1252
                if (addrlen == 2) {
 
1253
                        tprintf("NULL");
 
1254
                } else if (addrbuf.sau.sun_path[0]) {
 
1255
                        tprintf("path=");
 
1256
                        printpathn(tcp, addr + 2, strlen(addrbuf.sau.sun_path));
 
1257
                } else {
 
1258
                        tprintf("path=@");
 
1259
                        printpathn(tcp, addr + 3, strlen(addrbuf.sau.sun_path + 1));
 
1260
                }
 
1261
                break;
 
1262
        case AF_INET:
 
1263
                tprintf("sin_port=htons(%u), sin_addr=inet_addr(\"%s\")",
 
1264
                        ntohs(addrbuf.sin.sin_port), inet_ntoa(addrbuf.sin.sin_addr));
 
1265
                break;
 
1266
#ifdef HAVE_INET_NTOP
 
1267
        case AF_INET6:
 
1268
                inet_ntop(AF_INET6, &addrbuf.sa6.sin6_addr, string_addr, sizeof(string_addr));
 
1269
                tprintf("sin6_port=htons(%u), inet_pton(AF_INET6, \"%s\", &sin6_addr), sin6_flowinfo=%u",
 
1270
                                ntohs(addrbuf.sa6.sin6_port), string_addr,
 
1271
                                addrbuf.sa6.sin6_flowinfo);
 
1272
#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
 
1273
                {
 
1274
#if defined(HAVE_IF_INDEXTONAME) && defined(IN6_IS_ADDR_LINKLOCAL) && defined(IN6_IS_ADDR_MC_LINKLOCAL)
 
1275
                    int numericscope = 0;
 
1276
                    if (IN6_IS_ADDR_LINKLOCAL (&addrbuf.sa6.sin6_addr)
 
1277
                            || IN6_IS_ADDR_MC_LINKLOCAL (&addrbuf.sa6.sin6_addr)) {
 
1278
                        char scopebuf[IFNAMSIZ + 1];
 
1279
 
 
1280
                        if (if_indextoname (addrbuf.sa6.sin6_scope_id, scopebuf) == NULL)
 
1281
                            numericscope++;
 
1282
                        else
 
1283
                            tprintf(", sin6_scope_id=if_nametoindex(\"%s\")", scopebuf);
 
1284
                    } else
 
1285
                        numericscope++;
 
1286
 
 
1287
                    if (numericscope)
 
1288
#endif
 
1289
                        tprintf(", sin6_scope_id=%u", addrbuf.sa6.sin6_scope_id);
 
1290
                }
 
1291
#endif
 
1292
                    break;
 
1293
#endif
 
1294
#if defined(AF_IPX) && defined(linux)
 
1295
        case AF_IPX:
 
1296
                {
 
1297
                        int i;
 
1298
                        tprintf("sipx_port=htons(%u), ",
 
1299
                                        ntohs(addrbuf.sipx.sipx_port));
 
1300
                        /* Yes, I know, this does not look too
 
1301
                         * strace-ish, but otherwise the IPX
 
1302
                         * addresses just look monstrous...
 
1303
                         * Anyways, feel free if you don't like
 
1304
                         * this way.. :)
 
1305
                         */
 
1306
                        tprintf("%08lx:", (unsigned long)ntohl(addrbuf.sipx.sipx_network));
 
1307
                        for (i = 0; i<IPX_NODE_LEN; i++)
 
1308
                                tprintf("%02x", addrbuf.sipx.sipx_node[i]);
 
1309
                        tprintf("/[%02x]", addrbuf.sipx.sipx_type);
 
1310
                }
 
1311
                break;
 
1312
#endif /* AF_IPX && linux */
 
1313
#ifdef AF_PACKET
 
1314
        case AF_PACKET:
 
1315
                {
 
1316
                        int i;
 
1317
                        tprintf("proto=%#04x, if%d, pkttype=",
 
1318
                                        ntohs(addrbuf.ll.sll_protocol),
 
1319
                                        addrbuf.ll.sll_ifindex);
 
1320
                        printxval(af_packet_types, addrbuf.ll.sll_pkttype, "?");
 
1321
                        tprintf(", addr(%d)={%d, ",
 
1322
                                        addrbuf.ll.sll_halen,
 
1323
                                        addrbuf.ll.sll_hatype);
 
1324
                        for (i=0; i<addrbuf.ll.sll_halen; i++)
 
1325
                                tprintf("%02x", addrbuf.ll.sll_addr[i]);
 
1326
                }
 
1327
                break;
 
1328
 
 
1329
#endif /* AF_APACKET */
 
1330
#ifdef AF_NETLINK
 
1331
        case AF_NETLINK:
 
1332
                tprintf("pid=%d, groups=%08x", addrbuf.nl.nl_pid, addrbuf.nl.nl_groups);
 
1333
                break;
 
1334
#endif /* AF_NETLINK */
 
1335
        /* AF_AX25 AF_APPLETALK AF_NETROM AF_BRIDGE AF_AAL5
 
1336
        AF_X25 AF_ROSE etc. still need to be done */
 
1337
 
 
1338
        default:
 
1339
                tprintf("sa_data=");
 
1340
                printstr(tcp, (long) &((struct sockaddr *) addr)->sa_data,
 
1341
                        sizeof addrbuf.sa.sa_data);
 
1342
                break;
 
1343
        }
 
1344
        tprintf("}");
 
1345
}
 
1346
 
 
1347
#if HAVE_SENDMSG
 
1348
static const struct xlat scmvals[] = {
 
1349
#ifdef SCM_RIGHTS
 
1350
        { SCM_RIGHTS,           "SCM_RIGHTS"            },
 
1351
#endif
 
1352
#ifdef SCM_CREDENTIALS
 
1353
        { SCM_CREDENTIALS,      "SCM_CREDENTIALS"       },
 
1354
#endif
 
1355
        { 0,                    NULL                    }
 
1356
};
 
1357
 
 
1358
static void
 
1359
printcmsghdr(struct tcb *tcp, unsigned long addr, unsigned long len)
 
1360
{
 
1361
        struct cmsghdr *cmsg = len < sizeof(struct cmsghdr) ?
 
1362
                               NULL : malloc(len);
 
1363
        if (cmsg == NULL || umoven(tcp, addr, len, (char *) cmsg) < 0) {
 
1364
                tprintf(", msg_control=%#lx", addr);
 
1365
                free(cmsg);
 
1366
                return;
 
1367
        }
 
1368
 
 
1369
        tprintf(", {cmsg_len=%u, cmsg_level=", (unsigned) cmsg->cmsg_len);
 
1370
        printxval(socketlayers, cmsg->cmsg_level, "SOL_???");
 
1371
        tprintf(", cmsg_type=");
 
1372
 
 
1373
        if (cmsg->cmsg_level == SOL_SOCKET) {
 
1374
                unsigned long cmsg_len;
 
1375
 
 
1376
                printxval(scmvals, cmsg->cmsg_type, "SCM_???");
 
1377
                cmsg_len = (len < cmsg->cmsg_len) ? len : cmsg->cmsg_len;
 
1378
 
 
1379
                if (cmsg->cmsg_type == SCM_RIGHTS
 
1380
                    && CMSG_LEN(sizeof(int)) <= cmsg_len) {
 
1381
                        int *fds = (int *) CMSG_DATA (cmsg);
 
1382
                        int first = 1;
 
1383
 
 
1384
                        tprintf(", {");
 
1385
                        while ((char *) fds < ((char *) cmsg + cmsg_len)) {
 
1386
                                if (!first)
 
1387
                                        tprintf(", ");
 
1388
                                tprintf("%d", *fds++);
 
1389
                                first = 0;
 
1390
                        }
 
1391
                        tprintf("}}");
 
1392
                        free(cmsg);
 
1393
                        return;
 
1394
                }
 
1395
                if (cmsg->cmsg_type == SCM_CREDENTIALS
 
1396
                    && CMSG_LEN(sizeof(struct ucred)) <= cmsg_len) {
 
1397
                        struct ucred *uc = (struct ucred *) CMSG_DATA (cmsg);
 
1398
 
 
1399
                        tprintf("{pid=%ld, uid=%ld, gid=%ld}}",
 
1400
                                (long)uc->pid, (long)uc->uid, (long)uc->gid);
 
1401
                        free(cmsg);
 
1402
                        return;
 
1403
                }
 
1404
        }
 
1405
        free(cmsg);
 
1406
        tprintf(", ...}");
 
1407
}
 
1408
 
 
1409
static void
 
1410
do_msghdr(struct tcb *tcp, struct msghdr *msg)
 
1411
{
 
1412
        tprintf("{msg_name(%d)=", msg->msg_namelen);
 
1413
        printsock(tcp, (long)msg->msg_name, msg->msg_namelen);
 
1414
 
 
1415
        tprintf(", msg_iov(%lu)=", (unsigned long)msg->msg_iovlen);
 
1416
        tprint_iov(tcp, (unsigned long)msg->msg_iovlen,
 
1417
                   (unsigned long)msg->msg_iov);
 
1418
 
 
1419
#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
 
1420
        tprintf(", msg_controllen=%lu", (unsigned long)msg->msg_controllen);
 
1421
        if (msg->msg_controllen)
 
1422
                printcmsghdr(tcp, (unsigned long) msg->msg_control,
 
1423
                             msg->msg_controllen);
 
1424
        tprintf(", msg_flags=");
 
1425
        printflags(msg_flags, msg->msg_flags, "MSG_???");
 
1426
#else /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
 
1427
        tprintf("msg_accrights=%#lx, msg_accrightslen=%u",
 
1428
                (unsigned long) msg->msg_accrights, msg->msg_accrightslen);
 
1429
#endif /* !HAVE_STRUCT_MSGHDR_MSG_CONTROL */
 
1430
        tprintf("}");
 
1431
}
 
1432
 
 
1433
static void
 
1434
printmsghdr(tcp, addr)
 
1435
struct tcb *tcp;
 
1436
long addr;
 
1437
{
 
1438
        struct msghdr msg;
 
1439
 
 
1440
        if (umove(tcp, addr, &msg) < 0) {
 
1441
                tprintf("%#lx", addr);
 
1442
                return;
 
1443
        }
 
1444
        do_msghdr(tcp, &msg);
 
1445
}
 
1446
 
 
1447
#ifdef LINUX
 
1448
static void
 
1449
printmmsghdr(struct tcb *tcp, long addr)
 
1450
{
 
1451
        struct mmsghdr {
 
1452
                struct msghdr msg_hdr;
 
1453
                unsigned msg_len;
 
1454
        } mmsg;
 
1455
 
 
1456
        if (umove(tcp, addr, &mmsg) < 0) {
 
1457
                tprintf("%#lx", addr);
 
1458
                return;
 
1459
        }
 
1460
        tprintf("{");
 
1461
        do_msghdr(tcp, &mmsg.msg_hdr);
 
1462
        tprintf(", %u}", mmsg.msg_len);
 
1463
}
 
1464
#endif
 
1465
 
 
1466
#endif /* HAVE_SENDMSG */
 
1467
 
 
1468
/*
 
1469
 * low bits of the socket type define real socket type,
 
1470
 * other bits are socket type flags.
 
1471
 */
 
1472
static void
 
1473
tprint_sock_type(struct tcb *tcp, int flags)
 
1474
{
 
1475
        const char *str = xlookup(socktypes, flags & SOCK_TYPE_MASK);
 
1476
 
 
1477
        if (str)
 
1478
        {
 
1479
                tprintf("%s", str);
 
1480
                flags &= ~SOCK_TYPE_MASK;
 
1481
                if (!flags)
 
1482
                        return;
 
1483
                tprintf("|");
 
1484
        }
 
1485
        printflags(sock_type_flags, flags, "SOCK_???");
 
1486
}
 
1487
 
 
1488
int
 
1489
sys_socket(struct tcb *tcp)
 
1490
{
 
1491
        if (entering(tcp)) {
 
1492
                printxval(domains, tcp->u_arg[0], "PF_???");
 
1493
                tprintf(", ");
 
1494
                tprint_sock_type(tcp, tcp->u_arg[1]);
 
1495
                tprintf(", ");
 
1496
                switch (tcp->u_arg[0]) {
 
1497
                case PF_INET:
 
1498
#ifdef PF_INET6
 
1499
                case PF_INET6:
 
1500
#endif
 
1501
                        printxval(protocols, tcp->u_arg[2], "IPPROTO_???");
 
1502
                        break;
 
1503
#ifdef PF_IPX
 
1504
                case PF_IPX:
 
1505
                        /* BTW: I don't believe this.. */
 
1506
                        tprintf("[");
 
1507
                        printxval(domains, tcp->u_arg[2], "PF_???");
 
1508
                        tprintf("]");
 
1509
                        break;
 
1510
#endif /* PF_IPX */
 
1511
                default:
 
1512
                        tprintf("%lu", tcp->u_arg[2]);
 
1513
                        break;
 
1514
                }
 
1515
        }
 
1516
        return 0;
 
1517
}
 
1518
 
 
1519
#ifdef SVR4
 
1520
int
 
1521
sys_so_socket(tcp)
 
1522
struct tcb *tcp;
 
1523
{
 
1524
        if (entering(tcp)) {
 
1525
                /* not sure really what these args are... but this
 
1526
                 * is how truss prints it
 
1527
                 */
 
1528
                tprintf("%ld, %ld, %ld, ",
 
1529
                  tcp->u_arg[0], tcp->u_arg[1], tcp->u_arg[2]);
 
1530
                printpath(tcp, tcp->u_arg[3]);
 
1531
                tprintf(", %ld", tcp->u_arg[4]);
 
1532
        }
 
1533
        return 0;
 
1534
}
 
1535
 
 
1536
int
 
1537
sys_so_socketpair(tcp)
 
1538
struct tcb *tcp;
 
1539
{
 
1540
        if (entering(tcp)) {
 
1541
                /* not sure what this arg is */
 
1542
                tprintf("0x%lx", tcp->u_arg[0]);
 
1543
        }
 
1544
        return 0;
 
1545
}
 
1546
#endif /* SVR4 */
 
1547
 
 
1548
int
 
1549
sys_bind(tcp)
 
1550
struct tcb *tcp;
 
1551
{
 
1552
  CDE_begin_socket_bind_or_connect(tcp); // pgbovine
 
1553
 
 
1554
  /*
 
1555
        if (entering(tcp)) {
 
1556
                tprintf("%ld, ", tcp->u_arg[0]);
 
1557
                printsock(tcp, tcp->u_arg[1], tcp->u_arg[2]);
 
1558
                tprintf(", %lu", tcp->u_arg[2]);
 
1559
        }
 
1560
        return 0;
 
1561
  */
 
1562
}
 
1563
 
 
1564
int
 
1565
sys_connect(tcp)
 
1566
struct tcb *tcp;
 
1567
{
 
1568
  // pgbovine - handle connect in the same way as bind (see above)
 
1569
        return sys_bind(tcp);
 
1570
}
 
1571
 
 
1572
int
 
1573
sys_listen(tcp)
 
1574
struct tcb *tcp;
 
1575
{
 
1576
        if (entering(tcp)) {
 
1577
                tprintf("%ld, %lu", tcp->u_arg[0], tcp->u_arg[1]);
 
1578
        }
 
1579
        return 0;
 
1580
}
 
1581
 
 
1582
static int
 
1583
do_accept(struct tcb *tcp, int flags_arg)
 
1584
{
 
1585
        if (entering(tcp)) {
 
1586
                tprintf("%ld, ", tcp->u_arg[0]);
 
1587
                return 0;
 
1588
        }
 
1589
        if (!tcp->u_arg[2])
 
1590
                tprintf("%#lx, NULL", tcp->u_arg[1]);
 
1591
        else {
 
1592
                int len;
 
1593
                if (tcp->u_arg[1] == 0 || syserror(tcp)
 
1594
                    || umove (tcp, tcp->u_arg[2], &len) < 0) {
 
1595
                        tprintf("%#lx", tcp->u_arg[1]);
 
1596
                } else {
 
1597
                        printsock(tcp, tcp->u_arg[1], len);
 
1598
                }
 
1599
                tprintf(", ");
 
1600
                printnum_int(tcp, tcp->u_arg[2], "%u");
 
1601
        }
 
1602
        if (flags_arg >= 0) {
 
1603
                tprintf(", ");
 
1604
                printflags(sock_type_flags, tcp->u_arg[flags_arg],
 
1605
                           "SOCK_???");
 
1606
        }
 
1607
        return 0;
 
1608
}
 
1609
 
 
1610
int
 
1611
sys_accept(struct tcb *tcp)
 
1612
{
 
1613
        return do_accept(tcp, -1);
 
1614
}
 
1615
 
 
1616
#ifdef LINUX
 
1617
int
 
1618
sys_accept4(struct tcb *tcp)
 
1619
{
 
1620
        return do_accept(tcp, 3);
 
1621
}
 
1622
#endif
 
1623
 
 
1624
int
 
1625
sys_send(tcp)
 
1626
struct tcb *tcp;
 
1627
{
 
1628
        if (entering(tcp)) {
 
1629
                tprintf("%ld, ", tcp->u_arg[0]);
 
1630
                printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
 
1631
                tprintf(", %lu, ", tcp->u_arg[2]);
 
1632
                /* flags */
 
1633
                printflags(msg_flags, tcp->u_arg[3], "MSG_???");
 
1634
        }
 
1635
        return 0;
 
1636
}
 
1637
 
 
1638
int
 
1639
sys_sendto(tcp)
 
1640
struct tcb *tcp;
 
1641
{
 
1642
        if (entering(tcp)) {
 
1643
                tprintf("%ld, ", tcp->u_arg[0]);
 
1644
                printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]);
 
1645
                tprintf(", %lu, ", tcp->u_arg[2]);
 
1646
                /* flags */
 
1647
                printflags(msg_flags, tcp->u_arg[3], "MSG_???");
 
1648
                /* to address */
 
1649
                tprintf(", ");
 
1650
                printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
 
1651
                /* to length */
 
1652
                tprintf(", %lu", tcp->u_arg[5]);
 
1653
        }
 
1654
        return 0;
 
1655
}
 
1656
 
 
1657
#ifdef HAVE_SENDMSG
 
1658
 
 
1659
int
 
1660
sys_sendmsg(tcp)
 
1661
struct tcb *tcp;
 
1662
{
 
1663
        if (entering(tcp)) {
 
1664
                tprintf("%ld, ", tcp->u_arg[0]);
 
1665
                printmsghdr(tcp, tcp->u_arg[1]);
 
1666
                /* flags */
 
1667
                tprintf(", ");
 
1668
                printflags(msg_flags, tcp->u_arg[2], "MSG_???");
 
1669
        }
 
1670
        return 0;
 
1671
}
 
1672
 
 
1673
#endif /* HAVE_SENDMSG */
 
1674
 
 
1675
int
 
1676
sys_recv(tcp)
 
1677
struct tcb *tcp;
 
1678
{
 
1679
        if (entering(tcp)) {
 
1680
                tprintf("%ld, ", tcp->u_arg[0]);
 
1681
        } else {
 
1682
                if (syserror(tcp))
 
1683
                        tprintf("%#lx", tcp->u_arg[1]);
 
1684
                else
 
1685
                        printstr(tcp, tcp->u_arg[1], tcp->u_rval);
 
1686
 
 
1687
                tprintf(", %lu, ", tcp->u_arg[2]);
 
1688
                printflags(msg_flags, tcp->u_arg[3], "MSG_???");
 
1689
        }
 
1690
        return 0;
 
1691
}
 
1692
 
 
1693
int
 
1694
sys_recvfrom(tcp)
 
1695
struct tcb *tcp;
 
1696
{
 
1697
        int fromlen;
 
1698
 
 
1699
        if (entering(tcp)) {
 
1700
                tprintf("%ld, ", tcp->u_arg[0]);
 
1701
        } else {
 
1702
                if (syserror(tcp)) {
 
1703
                        tprintf("%#lx, %lu, %lu, %#lx, %#lx",
 
1704
                                tcp->u_arg[1], tcp->u_arg[2], tcp->u_arg[3],
 
1705
                                tcp->u_arg[4], tcp->u_arg[5]);
 
1706
                        return 0;
 
1707
                }
 
1708
                /* buf */
 
1709
                printstr(tcp, tcp->u_arg[1], tcp->u_rval);
 
1710
                /* len */
 
1711
                tprintf(", %lu, ", tcp->u_arg[2]);
 
1712
                /* flags */
 
1713
                printflags(msg_flags, tcp->u_arg[3], "MSG_???");
 
1714
                /* from address, len */
 
1715
                if (!tcp->u_arg[4] || !tcp->u_arg[5]) {
 
1716
                        if (tcp->u_arg[4] == 0)
 
1717
                                tprintf(", NULL");
 
1718
                        else
 
1719
                                tprintf(", %#lx", tcp->u_arg[4]);
 
1720
                        if (tcp->u_arg[5] == 0)
 
1721
                                tprintf(", NULL");
 
1722
                        else
 
1723
                                tprintf(", %#lx", tcp->u_arg[5]);
 
1724
                        return 0;
 
1725
                }
 
1726
                if (umove(tcp, tcp->u_arg[5], &fromlen) < 0) {
 
1727
                        tprintf(", {...}, [?]");
 
1728
                        return 0;
 
1729
                }
 
1730
                tprintf(", ");
 
1731
                printsock(tcp, tcp->u_arg[4], tcp->u_arg[5]);
 
1732
                /* from length */
 
1733
                tprintf(", [%u]", fromlen);
 
1734
        }
 
1735
        return 0;
 
1736
}
 
1737
 
 
1738
#ifdef HAVE_SENDMSG
 
1739
 
 
1740
int
 
1741
sys_recvmsg(tcp)
 
1742
struct tcb *tcp;
 
1743
{
 
1744
        if (entering(tcp)) {
 
1745
                tprintf("%ld, ", tcp->u_arg[0]);
 
1746
        } else {
 
1747
                if (syserror(tcp) || !verbose(tcp))
 
1748
                        tprintf("%#lx", tcp->u_arg[1]);
 
1749
                else
 
1750
                        printmsghdr(tcp, tcp->u_arg[1]);
 
1751
                /* flags */
 
1752
                tprintf(", ");
 
1753
                printflags(msg_flags, tcp->u_arg[2], "MSG_???");
 
1754
        }
 
1755
        return 0;
 
1756
}
 
1757
 
 
1758
#ifdef LINUX
 
1759
int
 
1760
sys_recvmmsg(struct tcb *tcp)
 
1761
{
 
1762
        static char str[128];
 
1763
        if (entering(tcp)) {
 
1764
 
 
1765
                tprintf("%ld, ", tcp->u_arg[0]);
 
1766
                if (verbose(tcp)) {
 
1767
                        sprint_timespec(str, tcp, tcp->u_arg[4]);
 
1768
                        tcp->auxstr = strdup(str);
 
1769
                } else {
 
1770
                        tprintf("%#lx, %ld, ", tcp->u_arg[1], tcp->u_arg[2]);
 
1771
                        printflags(msg_flags, tcp->u_arg[3], "MSG_???");
 
1772
                        tprintf(", ");
 
1773
                        print_timespec(tcp, tcp->u_arg[4]);
 
1774
                }
 
1775
                return 0;
 
1776
        } else {
 
1777
                if (verbose(tcp)) {
 
1778
                        if (syserror(tcp))
 
1779
                                tprintf("%#lx", tcp->u_arg[1]);
 
1780
                        else
 
1781
                                printmmsghdr(tcp, tcp->u_arg[1]);
 
1782
                        tprintf(", %ld, ", tcp->u_arg[2]);
 
1783
                        /* flags */
 
1784
                        printflags(msg_flags, tcp->u_arg[3], "MSG_???");
 
1785
                        /* timeout on entrance */
 
1786
                        tprintf(", %s", tcp->auxstr ? tcp->auxstr : "{...}");
 
1787
                        free((void *) tcp->auxstr);
 
1788
                        tcp->auxstr = NULL;
 
1789
                }
 
1790
                if (syserror(tcp))
 
1791
                        return 0;
 
1792
                if (tcp->u_rval == 0) {
 
1793
                        tcp->auxstr = "Timeout";
 
1794
                        return RVAL_STR;
 
1795
                }
 
1796
                if (!verbose(tcp))
 
1797
                        return 0;
 
1798
                /* timeout on exit */
 
1799
                strcpy(str, "left ");
 
1800
                sprint_timespec(str + strlen(str), tcp, tcp->u_arg[4]);
 
1801
                tcp->auxstr = str;
 
1802
                return RVAL_STR;
 
1803
        }
 
1804
}
 
1805
#endif
 
1806
 
 
1807
#endif /* HAVE_SENDMSG */
 
1808
 
 
1809
static const struct xlat shutdown_modes[] = {
 
1810
       { 0,     "SHUT_RD"       },
 
1811
       { 1,     "SHUT_WR"       },
 
1812
       { 2,     "SHUT_RDWR"     },
 
1813
       { 0,     NULL            }
 
1814
};
 
1815
 
 
1816
int
 
1817
sys_shutdown(tcp)
 
1818
struct tcb *tcp;
 
1819
{
 
1820
        if (entering(tcp)) {
 
1821
                tprintf("%ld, ", tcp->u_arg[0]);
 
1822
                printxval(shutdown_modes, tcp->u_arg[1], "SHUT_???");
 
1823
        }
 
1824
        return 0;
 
1825
}
 
1826
 
 
1827
int
 
1828
sys_getsockname(tcp)
 
1829
struct tcb *tcp;
 
1830
{
 
1831
        return sys_accept(tcp);
 
1832
}
 
1833
 
 
1834
int
 
1835
sys_getpeername(tcp)
 
1836
struct tcb *tcp;
 
1837
{
 
1838
        return sys_accept(tcp);
 
1839
}
 
1840
 
 
1841
static int
 
1842
do_pipe(struct tcb *tcp, int flags_arg)
 
1843
{
 
1844
        if (exiting(tcp)) {
 
1845
                if (syserror(tcp)) {
 
1846
                        tprintf("%#lx", tcp->u_arg[0]);
 
1847
                } else {
 
1848
#if defined(LINUX) && !defined(SPARC) && !defined(SPARC64) && !defined(SH) && !defined(IA64)
 
1849
                        int fds[2];
 
1850
 
 
1851
                        if (umoven(tcp, tcp->u_arg[0], sizeof fds, (char *) fds) < 0)
 
1852
                                tprintf("[...]");
 
1853
                        else
 
1854
                                tprintf("[%u, %u]", fds[0], fds[1]);
 
1855
#elif defined(SPARC) || defined(SPARC64) || defined(SH) || defined(SVR4) || defined(FREEBSD) || defined(IA64)
 
1856
                        tprintf("[%lu, %lu]", tcp->u_rval, getrval2(tcp));
 
1857
#else
 
1858
                        tprintf("%#lx", tcp->u_arg[0]);
 
1859
#endif
 
1860
                }
 
1861
                if (flags_arg >= 0) {
 
1862
                        tprintf(", ");
 
1863
                        printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
 
1864
                }
 
1865
        }
 
1866
        return 0;
 
1867
}
 
1868
 
 
1869
int
 
1870
sys_pipe(struct tcb *tcp)
 
1871
{
 
1872
        return do_pipe(tcp, -1);
 
1873
}
 
1874
 
 
1875
#ifdef LINUX
 
1876
int
 
1877
sys_pipe2(struct tcb *tcp)
 
1878
{
 
1879
        return do_pipe(tcp, 1);
 
1880
}
 
1881
#endif
 
1882
 
 
1883
int
 
1884
sys_socketpair(struct tcb *tcp)
 
1885
{
 
1886
#ifdef LINUX
 
1887
        int fds[2];
 
1888
#endif
 
1889
 
 
1890
        if (entering(tcp)) {
 
1891
                printxval(domains, tcp->u_arg[0], "PF_???");
 
1892
                tprintf(", ");
 
1893
                tprint_sock_type(tcp, tcp->u_arg[1]);
 
1894
                tprintf(", ");
 
1895
                switch (tcp->u_arg[0]) {
 
1896
                case PF_INET:
 
1897
                        printxval(protocols, tcp->u_arg[2], "IPPROTO_???");
 
1898
                        break;
 
1899
#ifdef PF_IPX
 
1900
                case PF_IPX:
 
1901
                        /* BTW: I don't believe this.. */
 
1902
                        tprintf("[");
 
1903
                        printxval(domains, tcp->u_arg[2], "PF_???");
 
1904
                        tprintf("]");
 
1905
                        break;
 
1906
#endif /* PF_IPX */
 
1907
                default:
 
1908
                        tprintf("%lu", tcp->u_arg[2]);
 
1909
                        break;
 
1910
                }
 
1911
        } else {
 
1912
                if (syserror(tcp)) {
 
1913
                        tprintf(", %#lx", tcp->u_arg[3]);
 
1914
                        return 0;
 
1915
                }
 
1916
#ifdef LINUX
 
1917
                if (umoven(tcp, tcp->u_arg[3], sizeof fds, (char *) fds) < 0)
 
1918
                        tprintf(", [...]");
 
1919
                else
 
1920
                        tprintf(", [%u, %u]", fds[0], fds[1]);
 
1921
#endif /* LINUX */
 
1922
#if defined(SUNOS4) || defined(SVR4) || defined(FREEBSD)
 
1923
                tprintf(", [%lu, %lu]", tcp->u_rval, getrval2(tcp));
 
1924
#endif /* SUNOS4 || SVR4 || FREEBSD */
 
1925
        }
 
1926
        return 0;
 
1927
}
 
1928
 
 
1929
int
 
1930
sys_getsockopt(struct tcb *tcp)
 
1931
{
 
1932
        if (entering(tcp)) {
 
1933
                tprintf("%ld, ", tcp->u_arg[0]);
 
1934
                printxval(socketlayers, tcp->u_arg[1], "SOL_???");
 
1935
                tprintf (", ");
 
1936
                switch (tcp->u_arg[1]) {
 
1937
                case SOL_SOCKET:
 
1938
                        printxval(sockoptions, tcp->u_arg[2], "SO_???");
 
1939
                        break;
 
1940
#ifdef SOL_IP
 
1941
                case SOL_IP:
 
1942
                        printxval(sockipoptions, tcp->u_arg[2], "IP_???");
 
1943
                        break;
 
1944
#endif
 
1945
#ifdef SOL_IPV6
 
1946
                case SOL_IPV6:
 
1947
                        printxval(sockipv6options, tcp->u_arg[2], "IPV6_???");
 
1948
                        break;
 
1949
#endif
 
1950
#ifdef SOL_IPX
 
1951
                case SOL_IPX:
 
1952
                        printxval(sockipxoptions, tcp->u_arg[2], "IPX_???");
 
1953
                        break;
 
1954
#endif
 
1955
#ifdef SOL_PACKET
 
1956
                case SOL_PACKET:
 
1957
                        printxval(sockpacketoptions, tcp->u_arg[2], "PACKET_???");
 
1958
                        break;
 
1959
#endif
 
1960
#ifdef SOL_TCP
 
1961
                case SOL_TCP:
 
1962
                        printxval(socktcpoptions, tcp->u_arg[2], "TCP_???");
 
1963
                        break;
 
1964
#endif
 
1965
#ifdef SOL_SCTP
 
1966
                case SOL_SCTP:
 
1967
                        printxval(socksctpoptions, tcp->u_arg[2], "SCTP_???");
 
1968
                        break;
 
1969
#endif
 
1970
 
 
1971
                /* SOL_AX25 SOL_ROSE SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
 
1972
                 * etc. still need work */
 
1973
                default:
 
1974
                        tprintf("%lu", tcp->u_arg[2]);
 
1975
                        break;
 
1976
                }
 
1977
                tprintf (", ");
 
1978
        } else {
 
1979
                int len;
 
1980
                if (syserror(tcp) || umove (tcp, tcp->u_arg[4], &len) < 0) {
 
1981
                        tprintf("%#lx, %#lx",
 
1982
                                tcp->u_arg[3], tcp->u_arg[4]);
 
1983
                        return 0;
 
1984
                }
 
1985
 
 
1986
                switch (tcp->u_arg[1]) {
 
1987
                case SOL_SOCKET:
 
1988
                        switch (tcp->u_arg[2]) {
 
1989
#ifdef SO_LINGER
 
1990
                        case SO_LINGER:
 
1991
                                if (len == sizeof (struct linger)) {
 
1992
                                        struct linger linger;
 
1993
                                        if (umove (tcp,
 
1994
                                                   tcp->u_arg[3],
 
1995
                                                   &linger) < 0)
 
1996
                                                break;
 
1997
                                        tprintf("{onoff=%d, linger=%d}, "
 
1998
                                                "[%d]",
 
1999
                                                linger.l_onoff,
 
2000
                                                linger.l_linger,
 
2001
                                                len);
 
2002
                                        return 0;
 
2003
                                }
 
2004
                                break;
 
2005
#endif
 
2006
#ifdef SO_PEERCRED
 
2007
                        case SO_PEERCRED:
 
2008
                                if (len == sizeof (struct ucred)) {
 
2009
                                        struct ucred uc;
 
2010
                                        if (umove (tcp,
 
2011
                                                   tcp->u_arg[3],
 
2012
                                                   &uc) < 0)
 
2013
                                                break;
 
2014
                                        tprintf("{pid=%ld, uid=%ld, gid=%ld}, "
 
2015
                                                "[%d]",
 
2016
                                                (long)uc.pid,
 
2017
                                                (long)uc.uid,
 
2018
                                                (long)uc.gid,
 
2019
                                                len);
 
2020
                                        return 0;
 
2021
                                }
 
2022
                                break;
 
2023
#endif
 
2024
                        }
 
2025
                        break;
 
2026
                case SOL_PACKET:
 
2027
                        switch (tcp->u_arg[2]) {
 
2028
#ifdef PACKET_STATISTICS
 
2029
                        case PACKET_STATISTICS:
 
2030
                                if (len == sizeof(struct tpacket_stats)) {
 
2031
                                        struct tpacket_stats stats;
 
2032
                                        if (umove (tcp,
 
2033
                                                   tcp->u_arg[3],
 
2034
                                                   &stats) < 0)
 
2035
                                                break;
 
2036
                                        tprintf("{packets=%u, drops=%u}, "
 
2037
                                                "[%d]",
 
2038
                                                stats.tp_packets,
 
2039
                                                stats.tp_drops,
 
2040
                                                len);
 
2041
                                        return 0;
 
2042
                                }
 
2043
                                break;
 
2044
#endif
 
2045
                        }
 
2046
                        break;
 
2047
                }
 
2048
 
 
2049
                if (len == sizeof (int)) {
 
2050
                        printnum_int(tcp, tcp->u_arg[3], "%d");
 
2051
                }
 
2052
                else {
 
2053
                        printstr (tcp, tcp->u_arg[3], len);
 
2054
                }
 
2055
                tprintf(", [%d]", len);
 
2056
        }
 
2057
        return 0;
 
2058
}
 
2059
 
 
2060
#if defined(ICMP_FILTER)
 
2061
static void printicmpfilter(tcp, addr)
 
2062
struct tcb *tcp;
 
2063
long addr;
 
2064
{
 
2065
        struct icmp_filter      filter;
 
2066
 
 
2067
        if (!addr) {
 
2068
                tprintf("NULL");
 
2069
                return;
 
2070
        }
 
2071
        if (syserror(tcp) || !verbose(tcp)) {
 
2072
                tprintf("%#lx", addr);
 
2073
                return;
 
2074
        }
 
2075
        if (umove(tcp, addr, &filter) < 0) {
 
2076
                tprintf("{...}");
 
2077
                return;
 
2078
        }
 
2079
 
 
2080
        tprintf("~(");
 
2081
        printflags(icmpfilterflags, ~filter.data, "ICMP_???");
 
2082
        tprintf(")");
 
2083
}
 
2084
#endif /* ICMP_FILTER */
 
2085
 
 
2086
static int
 
2087
printsockopt (tcp, level, name, addr, len)
 
2088
struct tcb *tcp;
 
2089
int level;
 
2090
int name;
 
2091
long addr;
 
2092
int len;
 
2093
{
 
2094
        printxval(socketlayers, level, "SOL_??");
 
2095
        tprintf (", ");
 
2096
        switch (level) {
 
2097
            case SOL_SOCKET:
 
2098
                printxval(sockoptions, name, "SO_???");
 
2099
                switch (name) {
 
2100
#if defined(SO_LINGER)
 
2101
                    case SO_LINGER:
 
2102
                        if (len == sizeof (struct linger)) {
 
2103
                                struct linger linger;
 
2104
                                if (umove (tcp, addr, &linger) < 0)
 
2105
                                        break;
 
2106
                                tprintf(", {onoff=%d, linger=%d}",
 
2107
                                        linger.l_onoff,
 
2108
                                        linger.l_linger);
 
2109
                                return 0;
 
2110
                        }
 
2111
                        break;
 
2112
#endif
 
2113
                }
 
2114
                break;
 
2115
#ifdef SOL_IP
 
2116
            case SOL_IP:
 
2117
                printxval(sockipoptions, name, "IP_???");
 
2118
                break;
 
2119
#endif
 
2120
#ifdef SOL_IPV6
 
2121
            case SOL_IPV6:
 
2122
                printxval(sockipv6options, name, "IPV6_???");
 
2123
                break;
 
2124
#endif
 
2125
#ifdef SOL_IPX
 
2126
            case SOL_IPX:
 
2127
                printxval(sockipxoptions, name, "IPX_???");
 
2128
                break;
 
2129
#endif
 
2130
#ifdef SOL_PACKET
 
2131
            case SOL_PACKET:
 
2132
                printxval(sockpacketoptions, name, "PACKET_???");
 
2133
                /* TODO: decode packate_mreq for PACKET_*_MEMBERSHIP */
 
2134
                switch (name) {
 
2135
#ifdef PACKET_RX_RING
 
2136
                    case PACKET_RX_RING:
 
2137
#endif
 
2138
#ifdef PACKET_TX_RING
 
2139
                    case PACKET_TX_RING:
 
2140
#endif
 
2141
#if defined(PACKET_RX_RING) || defined(PACKET_TX_RING)
 
2142
                        if (len == sizeof(struct tpacket_req)) {
 
2143
                                struct tpacket_req req;
 
2144
                                if (umove(tcp, addr, &req) < 0)
 
2145
                                        break;
 
2146
                                tprintf(", {block_size=%u, block_nr=%u, frame_size=%u, frame_nr=%u}",
 
2147
                                        req.tp_block_size,
 
2148
                                        req.tp_block_nr,
 
2149
                                        req.tp_frame_size,
 
2150
                                        req.tp_frame_nr);
 
2151
                                return 0;
 
2152
                        }
 
2153
                        break;
 
2154
#endif /* PACKET_RX_RING || PACKET_TX_RING */
 
2155
                }
 
2156
                break;
 
2157
#endif
 
2158
#ifdef SOL_TCP
 
2159
            case SOL_TCP:
 
2160
                printxval(socktcpoptions, name, "TCP_???");
 
2161
                break;
 
2162
#endif
 
2163
#ifdef SOL_SCTP
 
2164
           case SOL_SCTP:
 
2165
                printxval(socksctpoptions, name, "SCTP_???");
 
2166
                break;
 
2167
#endif
 
2168
#ifdef SOL_RAW
 
2169
            case SOL_RAW:
 
2170
                printxval(sockrawoptions, name, "RAW_???");
 
2171
                switch (name) {
 
2172
#if defined(ICMP_FILTER)
 
2173
                    case ICMP_FILTER:
 
2174
                        tprintf(", ");
 
2175
                        printicmpfilter(tcp, addr);
 
2176
                        return 0;
 
2177
#endif
 
2178
                }
 
2179
                break;
 
2180
#endif
 
2181
 
 
2182
                /* SOL_AX25 SOL_ATALK SOL_NETROM SOL_UDP SOL_DECNET SOL_X25
 
2183
                 * etc. still need work  */
 
2184
 
 
2185
            default:
 
2186
                tprintf("%u", name);
 
2187
        }
 
2188
 
 
2189
        /* default arg printing */
 
2190
 
 
2191
        tprintf (", ");
 
2192
 
 
2193
        if (len == sizeof (int)) {
 
2194
                printnum_int (tcp, addr, "%d");
 
2195
        }
 
2196
        else {
 
2197
                printstr (tcp, addr, len);
 
2198
        }
 
2199
        return 0;
 
2200
}
 
2201
 
 
2202
 
 
2203
#ifdef HAVE_STRUCT_OPTHDR
 
2204
 
 
2205
void
 
2206
print_sock_optmgmt (tcp, addr, len)
 
2207
struct tcb *tcp;
 
2208
long addr;
 
2209
int len;
 
2210
{
 
2211
        int c = 0;
 
2212
        struct opthdr hdr;
 
2213
 
 
2214
        while (len >= (int) sizeof hdr) {
 
2215
                if (umove(tcp, addr, &hdr) < 0) break;
 
2216
                if (c++) {
 
2217
                        tprintf (", ");
 
2218
                }
 
2219
                else if (len > hdr.len + sizeof hdr) {
 
2220
                        tprintf ("[");
 
2221
                }
 
2222
                tprintf ("{");
 
2223
                addr += sizeof hdr;
 
2224
                len -= sizeof hdr;
 
2225
                printsockopt (tcp, hdr.level, hdr.name, addr, hdr.len);
 
2226
                if (hdr.len > 0) {
 
2227
                        addr += hdr.len;
 
2228
                        len -= hdr.len;
 
2229
                }
 
2230
                tprintf ("}");
 
2231
        }
 
2232
        if (len > 0) {
 
2233
                if (c++) tprintf (", ");
 
2234
                printstr (tcp, addr, len);
 
2235
        }
 
2236
        if (c > 1) tprintf ("]");
 
2237
}
 
2238
 
 
2239
#endif
 
2240
 
 
2241
int
 
2242
sys_setsockopt(tcp)
 
2243
struct tcb *tcp;
 
2244
{
 
2245
        if (entering(tcp)) {
 
2246
                tprintf("%ld, ", tcp->u_arg[0]);
 
2247
                printsockopt (tcp, tcp->u_arg[1], tcp->u_arg[2],
 
2248
                              tcp->u_arg[3], tcp->u_arg[4]);
 
2249
                tprintf(", %lu", tcp->u_arg[4]);
 
2250
        }
 
2251
        return 0;
 
2252
}
 
2253
 
 
2254
#if UNIXWARE >= 7
 
2255
 
 
2256
static const struct xlat sock_version[] = {
 
2257
        { __NETLIB_UW211_SVR4,  "UW211_SVR4" },
 
2258
        { __NETLIB_UW211_XPG4,  "UW211_XPG4" },
 
2259
        { __NETLIB_GEMINI_SVR4, "GEMINI_SVR4" },
 
2260
        { __NETLIB_GEMINI_XPG4, "GEMINI_XPG4" },
 
2261
        { __NETLIB_FP1_SVR4,    "FP1_SVR4" },
 
2262
        { __NETLIB_FP1_XPG4,    "FP1_XPG4" },
 
2263
        { 0,            NULL            },
 
2264
};
 
2265
 
 
2266
 
 
2267
int
 
2268
netlib_call(tcp, func)
 
2269
struct tcb *tcp;
 
2270
int (*func) ();
 
2271
{
 
2272
        if (entering(tcp)) {
 
2273
                int i;
 
2274
                printxval (sock_version, tcp->u_arg[0], "__NETLIB_???");
 
2275
                tprintf(", ");
 
2276
                --tcp->u_nargs;
 
2277
                for (i = 0; i < tcp->u_nargs; i++)
 
2278
                        tcp->u_arg[i] = tcp->u_arg[i + 1];
 
2279
                return func (tcp);
 
2280
 
 
2281
        }
 
2282
 
 
2283
        return func (tcp);
 
2284
}
 
2285
 
 
2286
int
 
2287
sys_xsocket(tcp)
 
2288
struct tcb *tcp;
 
2289
{
 
2290
        return netlib_call (tcp, sys_socket);
 
2291
}
 
2292
 
 
2293
int
 
2294
sys_xsocketpair(tcp)
 
2295
struct tcb *tcp;
 
2296
{
 
2297
        return netlib_call (tcp, sys_socketpair);
 
2298
}
 
2299
 
 
2300
int
 
2301
sys_xbind(tcp)
 
2302
struct tcb *tcp;
 
2303
{
 
2304
        return netlib_call (tcp, sys_bind);
 
2305
}
 
2306
 
 
2307
int
 
2308
sys_xconnect(tcp)
 
2309
struct tcb *tcp;
 
2310
{
 
2311
        return netlib_call (tcp, sys_connect);
 
2312
}
 
2313
 
 
2314
int
 
2315
sys_xlisten(tcp)
 
2316
struct tcb *tcp;
 
2317
{
 
2318
        return netlib_call (tcp, sys_listen);
 
2319
}
 
2320
 
 
2321
int
 
2322
sys_xaccept(tcp)
 
2323
struct tcb *tcp;
 
2324
{
 
2325
        return netlib_call (tcp, sys_accept);
 
2326
}
 
2327
 
 
2328
int
 
2329
sys_xsendmsg(tcp)
 
2330
struct tcb *tcp;
 
2331
{
 
2332
        return netlib_call (tcp, sys_sendmsg);
 
2333
}
 
2334
 
 
2335
int
 
2336
sys_xrecvmsg(tcp)
 
2337
struct tcb *tcp;
 
2338
{
 
2339
        return netlib_call (tcp, sys_recvmsg);
 
2340
}
 
2341
 
 
2342
int
 
2343
sys_xgetsockaddr(tcp)
 
2344
struct tcb *tcp;
 
2345
{
 
2346
        if (entering(tcp)) {
 
2347
                printxval (sock_version, tcp->u_arg[0], "__NETLIB_???");
 
2348
                tprintf(", ");
 
2349
                if (tcp->u_arg[1] == 0) {
 
2350
                        tprintf ("LOCALNAME, ");
 
2351
                }
 
2352
                else if (tcp->u_arg[1] == 1) {
 
2353
                        tprintf ("REMOTENAME, ");
 
2354
                }
 
2355
                else {
 
2356
                        tprintf ("%ld, ", tcp->u_arg [1]);
 
2357
                }
 
2358
                tprintf ("%ld, ", tcp->u_arg [2]);
 
2359
        }
 
2360
        else {
 
2361
                if (tcp->u_arg[3] == 0 || syserror(tcp)) {
 
2362
                        tprintf("%#lx", tcp->u_arg[3]);
 
2363
                } else {
 
2364
                        printsock(tcp, tcp->u_arg[3], tcp->u_arg[4]);
 
2365
                }
 
2366
                tprintf(", ");
 
2367
                printnum(tcp, tcp->u_arg[4], "%lu");
 
2368
        }
 
2369
 
 
2370
        return 0;
 
2371
 
 
2372
}
 
2373
 
 
2374
int
 
2375
sys_xgetsockopt(tcp)
 
2376
struct tcb *tcp;
 
2377
{
 
2378
        return netlib_call (tcp, sys_getsockopt);
 
2379
}
 
2380
 
 
2381
int
 
2382
sys_xsetsockopt(tcp)
 
2383
struct tcb *tcp;
 
2384
{
 
2385
        return netlib_call (tcp, sys_setsockopt);
 
2386
}
 
2387
 
 
2388
int
 
2389
sys_xshutdown(tcp)
 
2390
struct tcb *tcp;
 
2391
{
 
2392
        return netlib_call (tcp, sys_shutdown);
 
2393
}
 
2394
 
 
2395
#endif /* UNIXWARE */