]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/sockstat/sockstat.c
Move SYSCTL_ADD_PROC() to unlocked context in if_ure to avoid lock order reversal.
[FreeBSD/FreeBSD.git] / usr.bin / sockstat / sockstat.c
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2002 Dag-Erling Coïdan Smørgrav
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer
12  *    in this position and unchanged.
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
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
33
34 #include <sys/param.h>
35 #include <sys/file.h>
36 #include <sys/socket.h>
37 #include <sys/socketvar.h>
38 #include <sys/sysctl.h>
39 #include <sys/jail.h>
40 #include <sys/user.h>
41
42 #include <sys/un.h>
43 #define _WANT_UNPCB
44 #include <sys/unpcb.h>
45
46 #include <net/route.h>
47
48 #include <netinet/in.h>
49 #include <netinet/in_pcb.h>
50 #include <netinet/sctp.h>
51 #include <netinet/tcp.h>
52 #define TCPSTATES /* load state names */
53 #include <netinet/tcp_fsm.h>
54 #include <netinet/tcp_seq.h>
55 #include <netinet/tcp_var.h>
56 #include <arpa/inet.h>
57
58 #include <ctype.h>
59 #include <err.h>
60 #include <errno.h>
61 #include <jail.h>
62 #include <netdb.h>
63 #include <pwd.h>
64 #include <stdarg.h>
65 #include <stdio.h>
66 #include <stdlib.h>
67 #include <string.h>
68 #include <unistd.h>
69
70 #define sstosin(ss)     ((struct sockaddr_in *)(ss))
71 #define sstosin6(ss)    ((struct sockaddr_in6 *)(ss))
72 #define sstosun(ss)     ((struct sockaddr_un *)(ss))
73 #define sstosa(ss)      ((struct sockaddr *)(ss))
74
75 static int       opt_4;         /* Show IPv4 sockets */
76 static int       opt_6;         /* Show IPv6 sockets */
77 static int       opt_C;         /* Show congestion control */
78 static int       opt_c;         /* Show connected sockets */
79 static int       opt_j;         /* Show specified jail */
80 static int       opt_L;         /* Don't show IPv4 or IPv6 loopback sockets */
81 static int       opt_l;         /* Show listening sockets */
82 static int       opt_q;         /* Don't show header */
83 static int       opt_S;         /* Show protocol stack if applicable */
84 static int       opt_s;         /* Show protocol state if applicable */
85 static int       opt_U;         /* Show remote UDP encapsulation port number */
86 static int       opt_u;         /* Show Unix domain sockets */
87 static int       opt_v;         /* Verbose mode */
88 static int       opt_w;         /* Wide print area for addresses */
89
90 /*
91  * Default protocols to use if no -P was defined.
92  */
93 static const char *default_protos[] = {"sctp", "tcp", "udp", "divert" };
94 static size_t      default_numprotos = nitems(default_protos);
95
96 static int      *protos;        /* protocols to use */
97 static size_t    numprotos;     /* allocated size of protos[] */
98
99 static int      *ports;
100
101 #define INT_BIT (sizeof(int)*CHAR_BIT)
102 #define SET_PORT(p) do { ports[p / INT_BIT] |= 1 << (p % INT_BIT); } while (0)
103 #define CHK_PORT(p) (ports[p / INT_BIT] & (1 << (p % INT_BIT)))
104
105 struct addr {
106         struct sockaddr_storage address;
107         unsigned int encaps_port;
108         int state;
109         struct addr *next;
110 };
111
112 struct sock {
113         kvaddr_t socket;
114         kvaddr_t pcb;
115         int shown;
116         int vflag;
117         int family;
118         int proto;
119         int state;
120         const char *protoname;
121         char stack[TCP_FUNCTION_NAME_LEN_MAX];
122         char cc[TCP_CA_NAME_MAX];
123         struct addr *laddr;
124         struct addr *faddr;
125         struct sock *next;
126 };
127
128 #define HASHSIZE 1009
129 static struct sock *sockhash[HASHSIZE];
130
131 static struct xfile *xfiles;
132 static int nxfiles;
133
134 static int
135 xprintf(const char *fmt, ...)
136 {
137         va_list ap;
138         int len;
139
140         va_start(ap, fmt);
141         len = vprintf(fmt, ap);
142         va_end(ap);
143         if (len < 0)
144                 err(1, "printf()");
145         return (len);
146 }
147
148 static int
149 get_proto_type(const char *proto)
150 {
151         struct protoent *pent;
152
153         if (strlen(proto) == 0)
154                 return (0);
155         pent = getprotobyname(proto);
156         if (pent == NULL) {
157                 warn("getprotobyname");
158                 return (-1);
159         }
160         return (pent->p_proto);
161 }
162
163 static void
164 init_protos(int num)
165 {
166         int proto_count = 0;
167
168         if (num > 0) {
169                 proto_count = num;
170         } else {
171                 /* Find the maximum number of possible protocols. */
172                 while (getprotoent() != NULL)
173                         proto_count++;
174                 endprotoent();
175         }
176
177         if ((protos = malloc(sizeof(int) * proto_count)) == NULL)
178                 err(1, "malloc");
179         numprotos = proto_count;
180 }
181
182 static int
183 parse_protos(char *protospec)
184 {
185         char *prot;
186         int proto_type, proto_index;
187
188         if (protospec == NULL)
189                 return (-1);
190
191         init_protos(0);
192         proto_index = 0;
193         while ((prot = strsep(&protospec, ",")) != NULL) {
194                 if (strlen(prot) == 0)
195                         continue;
196                 proto_type = get_proto_type(prot);
197                 if (proto_type != -1)
198                         protos[proto_index++] = proto_type;
199         }
200         numprotos = proto_index;
201         return (proto_index);
202 }
203
204 static void
205 parse_ports(const char *portspec)
206 {
207         const char *p, *q;
208         int port, end;
209
210         if (ports == NULL)
211                 if ((ports = calloc(65536 / INT_BIT, sizeof(int))) == NULL)
212                         err(1, "calloc()");
213         p = portspec;
214         while (*p != '\0') {
215                 if (!isdigit(*p))
216                         errx(1, "syntax error in port range");
217                 for (q = p; *q != '\0' && isdigit(*q); ++q)
218                         /* nothing */ ;
219                 for (port = 0; p < q; ++p)
220                         port = port * 10 + digittoint(*p);
221                 if (port < 0 || port > 65535)
222                         errx(1, "invalid port number");
223                 SET_PORT(port);
224                 switch (*p) {
225                 case '-':
226                         ++p;
227                         break;
228                 case ',':
229                         ++p;
230                         /* fall through */
231                 case '\0':
232                 default:
233                         continue;
234                 }
235                 for (q = p; *q != '\0' && isdigit(*q); ++q)
236                         /* nothing */ ;
237                 for (end = 0; p < q; ++p)
238                         end = end * 10 + digittoint(*p);
239                 if (end < port || end > 65535)
240                         errx(1, "invalid port number");
241                 while (port++ < end)
242                         SET_PORT(port);
243                 if (*p == ',')
244                         ++p;
245         }
246 }
247
248 static void
249 sockaddr(struct sockaddr_storage *ss, int af, void *addr, int port)
250 {
251         struct sockaddr_in *sin4;
252         struct sockaddr_in6 *sin6;
253
254         bzero(ss, sizeof(*ss));
255         switch (af) {
256         case AF_INET:
257                 sin4 = sstosin(ss);
258                 sin4->sin_len = sizeof(*sin4);
259                 sin4->sin_family = af;
260                 sin4->sin_port = port;
261                 sin4->sin_addr = *(struct in_addr *)addr;
262                 break;
263         case AF_INET6:
264                 sin6 = sstosin6(ss);
265                 sin6->sin6_len = sizeof(*sin6);
266                 sin6->sin6_family = af;
267                 sin6->sin6_port = port;
268                 sin6->sin6_addr = *(struct in6_addr *)addr;
269 #define s6_addr16       __u6_addr.__u6_addr16
270                 if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) {
271                         sin6->sin6_scope_id =
272                             ntohs(sin6->sin6_addr.s6_addr16[1]);
273                         sin6->sin6_addr.s6_addr16[1] = 0;
274                 }
275                 break;
276         default:
277                 abort();
278         }
279 }
280
281 static void
282 free_socket(struct sock *sock)
283 {
284         struct addr *cur, *next;
285
286         cur = sock->laddr;
287         while (cur != NULL) {
288                 next = cur->next;
289                 free(cur);
290                 cur = next;
291         }
292         cur = sock->faddr;
293         while (cur != NULL) {
294                 next = cur->next;
295                 free(cur);
296                 cur = next;
297         }
298         free(sock);
299 }
300
301 static void
302 gather_sctp(void)
303 {
304         struct sock *sock;
305         struct addr *laddr, *prev_laddr, *faddr, *prev_faddr;
306         struct xsctp_inpcb *xinpcb;
307         struct xsctp_tcb *xstcb;
308         struct xsctp_raddr *xraddr;
309         struct xsctp_laddr *xladdr;
310         const char *varname;
311         size_t len, offset;
312         char *buf;
313         int hash, vflag;
314         int no_stcb, local_all_loopback, foreign_all_loopback;
315
316         vflag = 0;
317         if (opt_4)
318                 vflag |= INP_IPV4;
319         if (opt_6)
320                 vflag |= INP_IPV6;
321
322         varname = "net.inet.sctp.assoclist";
323         if (sysctlbyname(varname, 0, &len, 0, 0) < 0) {
324                 if (errno != ENOENT)
325                         err(1, "sysctlbyname()");
326                 return;
327         }
328         if ((buf = (char *)malloc(len)) == NULL) {
329                 err(1, "malloc()");
330                 return;
331         }
332         if (sysctlbyname(varname, buf, &len, 0, 0) < 0) {
333                 err(1, "sysctlbyname()");
334                 free(buf);
335                 return;
336         }
337         xinpcb = (struct xsctp_inpcb *)(void *)buf;
338         offset = sizeof(struct xsctp_inpcb);
339         while ((offset < len) && (xinpcb->last == 0)) {
340                 if ((sock = calloc(1, sizeof *sock)) == NULL)
341                         err(1, "malloc()");
342                 sock->socket = xinpcb->socket;
343                 sock->proto = IPPROTO_SCTP;
344                 sock->protoname = "sctp";
345                 if (xinpcb->maxqlen == 0)
346                         sock->state = SCTP_CLOSED;
347                 else
348                         sock->state = SCTP_LISTEN;
349                 if (xinpcb->flags & SCTP_PCB_FLAGS_BOUND_V6) {
350                         sock->family = AF_INET6;
351                         /*
352                          * Currently there is no way to distinguish between
353                          * IPv6 only sockets or dual family sockets.
354                          * So mark it as dual socket.
355                          */
356                         sock->vflag = INP_IPV6 | INP_IPV4;
357                 } else {
358                         sock->family = AF_INET;
359                         sock->vflag = INP_IPV4;
360                 }
361                 prev_laddr = NULL;
362                 local_all_loopback = 1;
363                 while (offset < len) {
364                         xladdr = (struct xsctp_laddr *)(void *)(buf + offset);
365                         offset += sizeof(struct xsctp_laddr);
366                         if (xladdr->last == 1)
367                                 break;
368                         if ((laddr = calloc(1, sizeof(struct addr))) == NULL)
369                                 err(1, "malloc()");
370                         switch (xladdr->address.sa.sa_family) {
371                         case AF_INET:
372 #define __IN_IS_ADDR_LOOPBACK(pina) \
373         ((ntohl((pina)->s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
374                                 if (!__IN_IS_ADDR_LOOPBACK(
375                                     &xladdr->address.sin.sin_addr))
376                                         local_all_loopback = 0;
377 #undef  __IN_IS_ADDR_LOOPBACK
378                                 sockaddr(&laddr->address, AF_INET,
379                                     &xladdr->address.sin.sin_addr,
380                                     htons(xinpcb->local_port));
381                                 break;
382                         case AF_INET6:
383                                 if (!IN6_IS_ADDR_LOOPBACK(
384                                     &xladdr->address.sin6.sin6_addr))
385                                         local_all_loopback = 0;
386                                 sockaddr(&laddr->address, AF_INET6,
387                                     &xladdr->address.sin6.sin6_addr,
388                                     htons(xinpcb->local_port));
389                                 break;
390                         default:
391                                 errx(1, "address family %d not supported",
392                                     xladdr->address.sa.sa_family);
393                         }
394                         laddr->next = NULL;
395                         if (prev_laddr == NULL)
396                                 sock->laddr = laddr;
397                         else
398                                 prev_laddr->next = laddr;
399                         prev_laddr = laddr;
400                 }
401                 if (sock->laddr == NULL) {
402                         if ((sock->laddr =
403                             calloc(1, sizeof(struct addr))) == NULL)
404                                 err(1, "malloc()");
405                         sock->laddr->address.ss_family = sock->family;
406                         if (sock->family == AF_INET)
407                                 sock->laddr->address.ss_len =
408                                     sizeof(struct sockaddr_in);
409                         else
410                                 sock->laddr->address.ss_len =
411                                     sizeof(struct sockaddr_in6);
412                         local_all_loopback = 0;
413                 }
414                 if ((sock->faddr = calloc(1, sizeof(struct addr))) == NULL)
415                         err(1, "malloc()");
416                 sock->faddr->address.ss_family = sock->family;
417                 if (sock->family == AF_INET)
418                         sock->faddr->address.ss_len =
419                             sizeof(struct sockaddr_in);
420                 else
421                         sock->faddr->address.ss_len =
422                             sizeof(struct sockaddr_in6);
423                 no_stcb = 1;
424                 while (offset < len) {
425                         xstcb = (struct xsctp_tcb *)(void *)(buf + offset);
426                         offset += sizeof(struct xsctp_tcb);
427                         if (no_stcb) {
428                                 if (opt_l && (sock->vflag & vflag) &&
429                                     (!opt_L || !local_all_loopback) &&
430                                     ((xinpcb->flags & SCTP_PCB_FLAGS_UDPTYPE) ||
431                                      (xstcb->last == 1))) {
432                                         hash = (int)((uintptr_t)sock->socket %
433                                             HASHSIZE);
434                                         sock->next = sockhash[hash];
435                                         sockhash[hash] = sock;
436                                 } else {
437                                         free_socket(sock);
438                                 }
439                         }
440                         if (xstcb->last == 1)
441                                 break;
442                         no_stcb = 0;
443                         if (opt_c) {
444                                 if ((sock = calloc(1, sizeof *sock)) == NULL)
445                                         err(1, "malloc()");
446                                 sock->socket = xinpcb->socket;
447                                 sock->proto = IPPROTO_SCTP;
448                                 sock->protoname = "sctp";
449                                 sock->state = (int)xstcb->state;
450                                 if (xinpcb->flags & SCTP_PCB_FLAGS_BOUND_V6) {
451                                         sock->family = AF_INET6;
452                                 /*
453                                  * Currently there is no way to distinguish
454                                  * between IPv6 only sockets or dual family
455                                  *  sockets. So mark it as dual socket.
456                                  */
457                                         sock->vflag = INP_IPV6 | INP_IPV4;
458                                 } else {
459                                         sock->family = AF_INET;
460                                         sock->vflag = INP_IPV4;
461                                 }
462                         }
463                         prev_laddr = NULL;
464                         local_all_loopback = 1;
465                         while (offset < len) {
466                                 xladdr = (struct xsctp_laddr *)(void *)(buf +
467                                     offset);
468                                 offset += sizeof(struct xsctp_laddr);
469                                 if (xladdr->last == 1)
470                                         break;
471                                 if (!opt_c)
472                                         continue;
473                                 laddr = calloc(1, sizeof(struct addr));
474                                 if (laddr == NULL)
475                                         err(1, "malloc()");
476                                 switch (xladdr->address.sa.sa_family) {
477                                 case AF_INET:
478 #define __IN_IS_ADDR_LOOPBACK(pina) \
479         ((ntohl((pina)->s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
480                                         if (!__IN_IS_ADDR_LOOPBACK(
481                                             &xladdr->address.sin.sin_addr))
482                                                 local_all_loopback = 0;
483 #undef  __IN_IS_ADDR_LOOPBACK
484                                         sockaddr(&laddr->address, AF_INET,
485                                             &xladdr->address.sin.sin_addr,
486                                             htons(xstcb->local_port));
487                                         break;
488                                 case AF_INET6:
489                                         if (!IN6_IS_ADDR_LOOPBACK(
490                                             &xladdr->address.sin6.sin6_addr))
491                                                 local_all_loopback = 0;
492                                         sockaddr(&laddr->address, AF_INET6,
493                                             &xladdr->address.sin6.sin6_addr,
494                                             htons(xstcb->local_port));
495                                         break;
496                                 default:
497                                         errx(1,
498                                             "address family %d not supported",
499                                             xladdr->address.sa.sa_family);
500                                 }
501                                 laddr->next = NULL;
502                                 if (prev_laddr == NULL)
503                                         sock->laddr = laddr;
504                                 else
505                                         prev_laddr->next = laddr;
506                                 prev_laddr = laddr;
507                         }
508                         prev_faddr = NULL;
509                         foreign_all_loopback = 1;
510                         while (offset < len) {
511                                 xraddr = (struct xsctp_raddr *)(void *)(buf +
512                                     offset);
513                                 offset += sizeof(struct xsctp_raddr);
514                                 if (xraddr->last == 1)
515                                         break;
516                                 if (!opt_c)
517                                         continue;
518                                 faddr = calloc(1, sizeof(struct addr));
519                                 if (faddr == NULL)
520                                         err(1, "malloc()");
521                                 switch (xraddr->address.sa.sa_family) {
522                                 case AF_INET:
523 #define __IN_IS_ADDR_LOOPBACK(pina) \
524         ((ntohl((pina)->s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
525                                         if (!__IN_IS_ADDR_LOOPBACK(
526                                             &xraddr->address.sin.sin_addr))
527                                                 foreign_all_loopback = 0;
528 #undef  __IN_IS_ADDR_LOOPBACK
529                                         sockaddr(&faddr->address, AF_INET,
530                                             &xraddr->address.sin.sin_addr,
531                                             htons(xstcb->remote_port));
532                                         break;
533                                 case AF_INET6:
534                                         if (!IN6_IS_ADDR_LOOPBACK(
535                                             &xraddr->address.sin6.sin6_addr))
536                                                 foreign_all_loopback = 0;
537                                         sockaddr(&faddr->address, AF_INET6,
538                                             &xraddr->address.sin6.sin6_addr,
539                                             htons(xstcb->remote_port));
540                                         break;
541                                 default:
542                                         errx(1,
543                                             "address family %d not supported",
544                                             xraddr->address.sa.sa_family);
545                                 }
546                                 faddr->encaps_port = xraddr->encaps_port;
547                                 faddr->state = xraddr->state;
548                                 faddr->next = NULL;
549                                 if (prev_faddr == NULL)
550                                         sock->faddr = faddr;
551                                 else
552                                         prev_faddr->next = faddr;
553                                 prev_faddr = faddr;
554                         }
555                         if (opt_c) {
556                                 if ((sock->vflag & vflag) &&
557                                     (!opt_L ||
558                                      !(local_all_loopback ||
559                                      foreign_all_loopback))) {
560                                         hash = (int)((uintptr_t)sock->socket %
561                                             HASHSIZE);
562                                         sock->next = sockhash[hash];
563                                         sockhash[hash] = sock;
564                                 } else {
565                                         free_socket(sock);
566                                 }
567                         }
568                 }
569                 xinpcb = (struct xsctp_inpcb *)(void *)(buf + offset);
570                 offset += sizeof(struct xsctp_inpcb);
571         }
572         free(buf);
573 }
574
575 static void
576 gather_inet(int proto)
577 {
578         struct xinpgen *xig, *exig;
579         struct xinpcb *xip;
580         struct xtcpcb *xtp = NULL;
581         struct xsocket *so;
582         struct sock *sock;
583         struct addr *laddr, *faddr;
584         const char *varname, *protoname;
585         size_t len, bufsize;
586         void *buf;
587         int hash, retry, vflag;
588
589         vflag = 0;
590         if (opt_4)
591                 vflag |= INP_IPV4;
592         if (opt_6)
593                 vflag |= INP_IPV6;
594
595         switch (proto) {
596         case IPPROTO_TCP:
597                 varname = "net.inet.tcp.pcblist";
598                 protoname = "tcp";
599                 break;
600         case IPPROTO_UDP:
601                 varname = "net.inet.udp.pcblist";
602                 protoname = "udp";
603                 break;
604         case IPPROTO_DIVERT:
605                 varname = "net.inet.divert.pcblist";
606                 protoname = "div";
607                 break;
608         default:
609                 errx(1, "protocol %d not supported", proto);
610         }
611
612         buf = NULL;
613         bufsize = 8192;
614         retry = 5;
615         do {
616                 for (;;) {
617                         if ((buf = realloc(buf, bufsize)) == NULL)
618                                 err(1, "realloc()");
619                         len = bufsize;
620                         if (sysctlbyname(varname, buf, &len, NULL, 0) == 0)
621                                 break;
622                         if (errno == ENOENT)
623                                 goto out;
624                         if (errno != ENOMEM || len != bufsize)
625                                 err(1, "sysctlbyname()");
626                         bufsize *= 2;
627                 }
628                 xig = (struct xinpgen *)buf;
629                 exig = (struct xinpgen *)(void *)
630                     ((char *)buf + len - sizeof *exig);
631                 if (xig->xig_len != sizeof *xig ||
632                     exig->xig_len != sizeof *exig)
633                         errx(1, "struct xinpgen size mismatch");
634         } while (xig->xig_gen != exig->xig_gen && retry--);
635
636         if (xig->xig_gen != exig->xig_gen && opt_v)
637                 warnx("warning: data may be inconsistent");
638
639         for (;;) {
640                 xig = (struct xinpgen *)(void *)((char *)xig + xig->xig_len);
641                 if (xig >= exig)
642                         break;
643                 switch (proto) {
644                 case IPPROTO_TCP:
645                         xtp = (struct xtcpcb *)xig;
646                         xip = &xtp->xt_inp;
647                         if (xtp->xt_len != sizeof(*xtp)) {
648                                 warnx("struct xtcpcb size mismatch");
649                                 goto out;
650                         }
651                         protoname = xtp->t_flags & TF_TOE ? "toe" : "tcp";
652                         break;
653                 case IPPROTO_UDP:
654                 case IPPROTO_DIVERT:
655                         xip = (struct xinpcb *)xig;
656                         if (xip->xi_len != sizeof(*xip)) {
657                                 warnx("struct xinpcb size mismatch");
658                                 goto out;
659                         }
660                         break;
661                 default:
662                         errx(1, "protocol %d not supported", proto);
663                 }
664                 so = &xip->xi_socket;
665                 if ((xip->inp_vflag & vflag) == 0)
666                         continue;
667                 if (xip->inp_vflag & INP_IPV4) {
668                         if ((xip->inp_fport == 0 && !opt_l) ||
669                             (xip->inp_fport != 0 && !opt_c))
670                                 continue;
671 #define __IN_IS_ADDR_LOOPBACK(pina) \
672         ((ntohl((pina)->s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
673                         if (opt_L &&
674                             (__IN_IS_ADDR_LOOPBACK(&xip->inp_faddr) ||
675                              __IN_IS_ADDR_LOOPBACK(&xip->inp_laddr)))
676                                 continue;
677 #undef  __IN_IS_ADDR_LOOPBACK
678                 } else if (xip->inp_vflag & INP_IPV6) {
679                         if ((xip->inp_fport == 0 && !opt_l) ||
680                             (xip->inp_fport != 0 && !opt_c))
681                                 continue;
682                         if (opt_L &&
683                             (IN6_IS_ADDR_LOOPBACK(&xip->in6p_faddr) ||
684                              IN6_IS_ADDR_LOOPBACK(&xip->in6p_laddr)))
685                                 continue;
686                 } else {
687                         if (opt_v)
688                                 warnx("invalid vflag 0x%x", xip->inp_vflag);
689                         continue;
690                 }
691                 if ((sock = calloc(1, sizeof(*sock))) == NULL)
692                         err(1, "malloc()");
693                 if ((laddr = calloc(1, sizeof *laddr)) == NULL)
694                         err(1, "malloc()");
695                 if ((faddr = calloc(1, sizeof *faddr)) == NULL)
696                         err(1, "malloc()");
697                 sock->socket = so->xso_so;
698                 sock->proto = proto;
699                 if (xip->inp_vflag & INP_IPV4) {
700                         sock->family = AF_INET;
701                         sockaddr(&laddr->address, sock->family,
702                             &xip->inp_laddr, xip->inp_lport);
703                         sockaddr(&faddr->address, sock->family,
704                             &xip->inp_faddr, xip->inp_fport);
705                 } else if (xip->inp_vflag & INP_IPV6) {
706                         sock->family = AF_INET6;
707                         sockaddr(&laddr->address, sock->family,
708                             &xip->in6p_laddr, xip->inp_lport);
709                         sockaddr(&faddr->address, sock->family,
710                             &xip->in6p_faddr, xip->inp_fport);
711                 }
712                 laddr->next = NULL;
713                 faddr->next = NULL;
714                 sock->laddr = laddr;
715                 sock->faddr = faddr;
716                 sock->vflag = xip->inp_vflag;
717                 if (proto == IPPROTO_TCP) {
718                         sock->state = xtp->t_state;
719                         memcpy(sock->stack, xtp->xt_stack,
720                             TCP_FUNCTION_NAME_LEN_MAX);
721                         memcpy(sock->cc, xtp->xt_cc, TCP_CA_NAME_MAX);
722                 }
723                 sock->protoname = protoname;
724                 hash = (int)((uintptr_t)sock->socket % HASHSIZE);
725                 sock->next = sockhash[hash];
726                 sockhash[hash] = sock;
727         }
728 out:
729         free(buf);
730 }
731
732 static void
733 gather_unix(int proto)
734 {
735         struct xunpgen *xug, *exug;
736         struct xunpcb *xup;
737         struct sock *sock;
738         struct addr *laddr, *faddr;
739         const char *varname, *protoname;
740         size_t len, bufsize;
741         void *buf;
742         int hash, retry;
743
744         switch (proto) {
745         case SOCK_STREAM:
746                 varname = "net.local.stream.pcblist";
747                 protoname = "stream";
748                 break;
749         case SOCK_DGRAM:
750                 varname = "net.local.dgram.pcblist";
751                 protoname = "dgram";
752                 break;
753         case SOCK_SEQPACKET:
754                 varname = "net.local.seqpacket.pcblist";
755                 protoname = "seqpac";
756                 break;
757         default:
758                 abort();
759         }
760         buf = NULL;
761         bufsize = 8192;
762         retry = 5;
763         do {
764                 for (;;) {
765                         if ((buf = realloc(buf, bufsize)) == NULL)
766                                 err(1, "realloc()");
767                         len = bufsize;
768                         if (sysctlbyname(varname, buf, &len, NULL, 0) == 0)
769                                 break;
770                         if (errno != ENOMEM || len != bufsize)
771                                 err(1, "sysctlbyname()");
772                         bufsize *= 2;
773                 }
774                 xug = (struct xunpgen *)buf;
775                 exug = (struct xunpgen *)(void *)
776                     ((char *)buf + len - sizeof(*exug));
777                 if (xug->xug_len != sizeof(*xug) ||
778                     exug->xug_len != sizeof(*exug)) {
779                         warnx("struct xinpgen size mismatch");
780                         goto out;
781                 }
782         } while (xug->xug_gen != exug->xug_gen && retry--);
783
784         if (xug->xug_gen != exug->xug_gen && opt_v)
785                 warnx("warning: data may be inconsistent");
786
787         for (;;) {
788                 xug = (struct xunpgen *)(void *)((char *)xug + xug->xug_len);
789                 if (xug >= exug)
790                         break;
791                 xup = (struct xunpcb *)xug;
792                 if (xup->xu_len != sizeof(*xup)) {
793                         warnx("struct xunpcb size mismatch");
794                         goto out;
795                 }
796                 if ((xup->unp_conn == 0 && !opt_l) ||
797                     (xup->unp_conn != 0 && !opt_c))
798                         continue;
799                 if ((sock = calloc(1, sizeof(*sock))) == NULL)
800                         err(1, "malloc()");
801                 if ((laddr = calloc(1, sizeof *laddr)) == NULL)
802                         err(1, "malloc()");
803                 if ((faddr = calloc(1, sizeof *faddr)) == NULL)
804                         err(1, "malloc()");
805                 sock->socket = xup->xu_socket.xso_so;
806                 sock->pcb = xup->xu_unpp;
807                 sock->proto = proto;
808                 sock->family = AF_UNIX;
809                 sock->protoname = protoname;
810                 if (xup->xu_addr.sun_family == AF_UNIX)
811                         laddr->address =
812                             *(struct sockaddr_storage *)(void *)&xup->xu_addr;
813                 else if (xup->unp_conn != 0)
814                         *(kvaddr_t*)&(faddr->address) = xup->unp_conn;
815                 laddr->next = NULL;
816                 faddr->next = NULL;
817                 sock->laddr = laddr;
818                 sock->faddr = faddr;
819                 hash = (int)((uintptr_t)sock->socket % HASHSIZE);
820                 sock->next = sockhash[hash];
821                 sockhash[hash] = sock;
822         }
823 out:
824         free(buf);
825 }
826
827 static void
828 getfiles(void)
829 {
830         size_t len, olen;
831
832         olen = len = sizeof(*xfiles);
833         if ((xfiles = malloc(len)) == NULL)
834                 err(1, "malloc()");
835         while (sysctlbyname("kern.file", xfiles, &len, 0, 0) == -1) {
836                 if (errno != ENOMEM || len != olen)
837                         err(1, "sysctlbyname()");
838                 olen = len *= 2;
839                 if ((xfiles = realloc(xfiles, len)) == NULL)
840                         err(1, "realloc()");
841         }
842         if (len > 0 && xfiles->xf_size != sizeof(*xfiles))
843                 errx(1, "struct xfile size mismatch");
844         nxfiles = len / sizeof(*xfiles);
845 }
846
847 static int
848 printaddr(struct sockaddr_storage *ss)
849 {
850         struct sockaddr_un *sun;
851         char addrstr[NI_MAXHOST] = { '\0', '\0' };
852         int error, off, port = 0;
853
854         switch (ss->ss_family) {
855         case AF_INET:
856                 if (inet_lnaof(sstosin(ss)->sin_addr) == INADDR_ANY)
857                         addrstr[0] = '*';
858                 port = ntohs(sstosin(ss)->sin_port);
859                 break;
860         case AF_INET6:
861                 if (IN6_IS_ADDR_UNSPECIFIED(&sstosin6(ss)->sin6_addr))
862                         addrstr[0] = '*';
863                 port = ntohs(sstosin6(ss)->sin6_port);
864                 break;
865         case AF_UNIX:
866                 sun = sstosun(ss);
867                 off = (int)((char *)&sun->sun_path - (char *)sun);
868                 return (xprintf("%.*s", sun->sun_len - off, sun->sun_path));
869         }
870         if (addrstr[0] == '\0') {
871                 error = getnameinfo(sstosa(ss), ss->ss_len, addrstr,
872                     sizeof(addrstr), NULL, 0, NI_NUMERICHOST);
873                 if (error)
874                         errx(1, "getnameinfo()");
875         }
876         if (port == 0)
877                 return xprintf("%s:*", addrstr);
878         else
879                 return xprintf("%s:%d", addrstr, port);
880 }
881
882 static const char *
883 getprocname(pid_t pid)
884 {
885         static struct kinfo_proc proc;
886         size_t len;
887         int mib[4];
888
889         mib[0] = CTL_KERN;
890         mib[1] = KERN_PROC;
891         mib[2] = KERN_PROC_PID;
892         mib[3] = (int)pid;
893         len = sizeof(proc);
894         if (sysctl(mib, nitems(mib), &proc, &len, NULL, 0) == -1) {
895                 /* Do not warn if the process exits before we get its name. */
896                 if (errno != ESRCH)
897                         warn("sysctl()");
898                 return ("??");
899         }
900         return (proc.ki_comm);
901 }
902
903 static int
904 getprocjid(pid_t pid)
905 {
906         static struct kinfo_proc proc;
907         size_t len;
908         int mib[4];
909
910         mib[0] = CTL_KERN;
911         mib[1] = KERN_PROC;
912         mib[2] = KERN_PROC_PID;
913         mib[3] = (int)pid;
914         len = sizeof(proc);
915         if (sysctl(mib, nitems(mib), &proc, &len, NULL, 0) == -1) {
916                 /* Do not warn if the process exits before we get its jid. */
917                 if (errno != ESRCH)
918                         warn("sysctl()");
919                 return (-1);
920         }
921         return (proc.ki_jid);
922 }
923
924 static int
925 check_ports(struct sock *s)
926 {
927         int port;
928         struct addr *addr;
929
930         if (ports == NULL)
931                 return (1);
932         if ((s->family != AF_INET) && (s->family != AF_INET6))
933                 return (1);
934         for (addr = s->laddr; addr != NULL; addr = addr->next) {
935                 if (s->family == AF_INET)
936                         port = ntohs(sstosin(&addr->address)->sin_port);
937                 else
938                         port = ntohs(sstosin6(&addr->address)->sin6_port);
939                 if (CHK_PORT(port))
940                         return (1);
941         }
942         for (addr = s->faddr; addr != NULL; addr = addr->next) {
943                 if (s->family == AF_INET)
944                         port = ntohs(sstosin(&addr->address)->sin_port);
945                 else
946                         port = ntohs(sstosin6(&addr->address)->sin6_port);
947                 if (CHK_PORT(port))
948                         return (1);
949         }
950         return (0);
951 }
952
953 static const char *
954 sctp_conn_state(int state)
955 {
956         switch (state) {
957         case SCTP_CLOSED:
958                 return "CLOSED";
959                 break;
960         case SCTP_BOUND:
961                 return "BOUND";
962                 break;
963         case SCTP_LISTEN:
964                 return "LISTEN";
965                 break;
966         case SCTP_COOKIE_WAIT:
967                 return "COOKIE_WAIT";
968                 break;
969         case SCTP_COOKIE_ECHOED:
970                 return "COOKIE_ECHOED";
971                 break;
972         case SCTP_ESTABLISHED:
973                 return "ESTABLISHED";
974                 break;
975         case SCTP_SHUTDOWN_SENT:
976                 return "SHUTDOWN_SENT";
977                 break;
978         case SCTP_SHUTDOWN_RECEIVED:
979                 return "SHUTDOWN_RECEIVED";
980                 break;
981         case SCTP_SHUTDOWN_ACK_SENT:
982                 return "SHUTDOWN_ACK_SENT";
983                 break;
984         case SCTP_SHUTDOWN_PENDING:
985                 return "SHUTDOWN_PENDING";
986                 break;
987         default:
988                 return "UNKNOWN";
989                 break;
990         }
991 }
992
993 static const char *
994 sctp_path_state(int state)
995 {
996         switch (state) {
997         case SCTP_UNCONFIRMED:
998                 return "UNCONFIRMED";
999                 break;
1000         case SCTP_ACTIVE:
1001                 return "ACTIVE";
1002                 break;
1003         case SCTP_INACTIVE:
1004                 return "INACTIVE";
1005                 break;
1006         default:
1007                 return "UNKNOWN";
1008                 break;
1009         }
1010 }
1011
1012 static void
1013 displaysock(struct sock *s, int pos)
1014 {
1015         kvaddr_t p;
1016         int hash, first, offset;
1017         struct addr *laddr, *faddr;
1018         struct sock *s_tmp;
1019
1020         while (pos < 29)
1021                 pos += xprintf(" ");
1022         pos += xprintf("%s", s->protoname);
1023         if (s->vflag & INP_IPV4)
1024                 pos += xprintf("4");
1025         if (s->vflag & INP_IPV6)
1026                 pos += xprintf("6");
1027         if (s->vflag & (INP_IPV4 | INP_IPV6))
1028                 pos += xprintf(" ");
1029         laddr = s->laddr;
1030         faddr = s->faddr;
1031         first = 1;
1032         while (laddr != NULL || faddr != NULL) {
1033                 offset = 36;
1034                 while (pos < offset)
1035                         pos += xprintf(" ");
1036                 switch (s->family) {
1037                 case AF_INET:
1038                 case AF_INET6:
1039                         if (laddr != NULL) {
1040                                 pos += printaddr(&laddr->address);
1041                                 if (s->family == AF_INET6 && pos >= 58)
1042                                         pos += xprintf(" ");
1043                         }
1044                         offset += opt_w ? 46 : 22;
1045                         while (pos < offset)
1046                                 pos += xprintf(" ");
1047                         if (faddr != NULL)
1048                                 pos += printaddr(&faddr->address);
1049                         offset += opt_w ? 46 : 22;
1050                         break;
1051                 case AF_UNIX:
1052                         if ((laddr == NULL) || (faddr == NULL))
1053                                 errx(1, "laddr = %p or faddr = %p is NULL",
1054                                     (void *)laddr, (void *)faddr);
1055                         /* server */
1056                         if (laddr->address.ss_len > 0) {
1057                                 pos += printaddr(&laddr->address);
1058                                 break;
1059                         }
1060                         /* client */
1061                         p = *(kvaddr_t*)&(faddr->address);
1062                         if (p == 0) {
1063                                 pos += xprintf("(not connected)");
1064                                 offset += opt_w ? 92 : 44;
1065                                 break;
1066                         }
1067                         pos += xprintf("-> ");
1068                         for (hash = 0; hash < HASHSIZE; ++hash) {
1069                                 for (s_tmp = sockhash[hash];
1070                                     s_tmp != NULL;
1071                                     s_tmp = s_tmp->next)
1072                                         if (s_tmp->pcb == p)
1073                                                 break;
1074                                 if (s_tmp != NULL)
1075                                         break;
1076                         }
1077                         if (s_tmp == NULL || s_tmp->laddr == NULL ||
1078                             s_tmp->laddr->address.ss_len == 0)
1079                                 pos += xprintf("??");
1080                         else
1081                                 pos += printaddr(&s_tmp->laddr->address);
1082                         offset += opt_w ? 92 : 44;
1083                         break;
1084                 default:
1085                         abort();
1086                 }
1087                 if (opt_U) {
1088                         if (faddr != NULL &&
1089                             s->proto == IPPROTO_SCTP &&
1090                             s->state != SCTP_CLOSED &&
1091                             s->state != SCTP_BOUND &&
1092                             s->state != SCTP_LISTEN) {
1093                                 while (pos < offset)
1094                                         pos += xprintf(" ");
1095                                 pos += xprintf("%u",
1096                                     ntohs(faddr->encaps_port));
1097                         }
1098                         offset += 7;
1099                 }
1100                 if (opt_s) {
1101                         if (faddr != NULL &&
1102                             s->proto == IPPROTO_SCTP &&
1103                             s->state != SCTP_CLOSED &&
1104                             s->state != SCTP_BOUND &&
1105                             s->state != SCTP_LISTEN) {
1106                                 while (pos < offset)
1107                                         pos += xprintf(" ");
1108                                 pos += xprintf("%s",
1109                                     sctp_path_state(faddr->state));
1110                         }
1111                         offset += 13;
1112                 }
1113                 if (first) {
1114                         if (opt_s) {
1115                                 if (s->proto == IPPROTO_SCTP ||
1116                                     s->proto == IPPROTO_TCP) {
1117                                         while (pos < offset)
1118                                                 pos += xprintf(" ");
1119                                         switch (s->proto) {
1120                                         case IPPROTO_SCTP:
1121                                                 pos += xprintf("%s",
1122                                                     sctp_conn_state(s->state));
1123                                                 break;
1124                                         case IPPROTO_TCP:
1125                                                 if (s->state >= 0 &&
1126                                                     s->state < TCP_NSTATES)
1127                                                         pos += xprintf("%s",
1128                                                             tcpstates[s->state]);
1129                                                 else
1130                                                         pos += xprintf("?");
1131                                                 break;
1132                                         }
1133                                 }
1134                                 offset += 13;
1135                         }
1136                         if (opt_S) {
1137                                 if (s->proto == IPPROTO_TCP) {
1138                                         while (pos < offset)
1139                                                 pos += xprintf(" ");
1140                                         pos += xprintf("%.*s",
1141                                             TCP_FUNCTION_NAME_LEN_MAX,
1142                                             s->stack);
1143                                 }
1144                                 offset += TCP_FUNCTION_NAME_LEN_MAX + 1;
1145                         }
1146                         if (opt_C) {
1147                                 if (s->proto == IPPROTO_TCP) {
1148                                         while (pos < offset)
1149                                                 pos += xprintf(" ");
1150                                         xprintf("%.*s", TCP_CA_NAME_MAX, s->cc);
1151                                 }
1152                                 offset += TCP_CA_NAME_MAX + 1;
1153                         }
1154                 }
1155                 if (laddr != NULL)
1156                         laddr = laddr->next;
1157                 if (faddr != NULL)
1158                         faddr = faddr->next;
1159                 if ((laddr != NULL) || (faddr != NULL)) {
1160                         xprintf("\n");
1161                         pos = 0;
1162                 }
1163                 first = 0;
1164         }
1165         xprintf("\n");
1166 }
1167
1168 static void
1169 display(void)
1170 {
1171         struct passwd *pwd;
1172         struct xfile *xf;
1173         struct sock *s;
1174         int hash, n, pos;
1175
1176         if (opt_q != 1) {
1177                 printf("%-8s %-10s %-5s %-2s %-6s %-*s %-*s",
1178                     "USER", "COMMAND", "PID", "FD", "PROTO",
1179                     opt_w ? 45 : 21, "LOCAL ADDRESS",
1180                     opt_w ? 45 : 21, "FOREIGN ADDRESS");
1181                 if (opt_U)
1182                         printf(" %-6s", "ENCAPS");
1183                 if (opt_s) {
1184                         printf(" %-12s", "PATH STATE");
1185                         printf(" %-12s", "CONN STATE");
1186                 }
1187                 if (opt_S)
1188                         printf(" %-*.*s", TCP_FUNCTION_NAME_LEN_MAX,
1189                             TCP_FUNCTION_NAME_LEN_MAX, "STACK");
1190                 if (opt_C)
1191                         printf(" %-.*s", TCP_CA_NAME_MAX, "CC");
1192                 printf("\n");
1193         }
1194         setpassent(1);
1195         for (xf = xfiles, n = 0; n < nxfiles; ++n, ++xf) {
1196                 if (xf->xf_data == 0)
1197                         continue;
1198                 if (opt_j >= 0 && opt_j != getprocjid(xf->xf_pid))
1199                         continue;
1200                 hash = (int)((uintptr_t)xf->xf_data % HASHSIZE);
1201                 for (s = sockhash[hash]; s != NULL; s = s->next) {
1202                         if (s->socket != xf->xf_data)
1203                                 continue;
1204                         if (!check_ports(s))
1205                                 continue;
1206                         s->shown = 1;
1207                         pos = 0;
1208                         if ((pwd = getpwuid(xf->xf_uid)) == NULL)
1209                                 pos += xprintf("%lu ", (u_long)xf->xf_uid);
1210                         else
1211                                 pos += xprintf("%s ", pwd->pw_name);
1212                         while (pos < 9)
1213                                 pos += xprintf(" ");
1214                         pos += xprintf("%.10s", getprocname(xf->xf_pid));
1215                         while (pos < 20)
1216                                 pos += xprintf(" ");
1217                         pos += xprintf("%lu ", (u_long)xf->xf_pid);
1218                         while (pos < 26)
1219                                 pos += xprintf(" ");
1220                         pos += xprintf("%d ", xf->xf_fd);
1221                         displaysock(s, pos);
1222                 }
1223         }
1224         if (opt_j >= 0)
1225                 return;
1226         for (hash = 0; hash < HASHSIZE; hash++) {
1227                 for (s = sockhash[hash]; s != NULL; s = s->next) {
1228                         if (s->shown)
1229                                 continue;
1230                         if (!check_ports(s))
1231                                 continue;
1232                         pos = 0;
1233                         pos += xprintf("%-8s %-10s %-5s %-2s ",
1234                             "?", "?", "?", "?");
1235                         displaysock(s, pos);
1236                 }
1237         }
1238 }
1239
1240 static int
1241 set_default_protos(void)
1242 {
1243         struct protoent *prot;
1244         const char *pname;
1245         size_t pindex;
1246
1247         init_protos(default_numprotos);
1248
1249         for (pindex = 0; pindex < default_numprotos; pindex++) {
1250                 pname = default_protos[pindex];
1251                 prot = getprotobyname(pname);
1252                 if (prot == NULL)
1253                         err(1, "getprotobyname: %s", pname);
1254                 protos[pindex] = prot->p_proto;
1255         }
1256         numprotos = pindex;
1257         return (pindex);
1258 }
1259
1260 /*
1261  * Return the vnet property of the jail, or -1 on error.
1262  */
1263 static int
1264 jail_getvnet(int jid)
1265 {
1266         struct iovec jiov[6];
1267         int vnet;
1268
1269         vnet = -1;
1270         jiov[0].iov_base = __DECONST(char *, "jid");
1271         jiov[0].iov_len = sizeof("jid");
1272         jiov[1].iov_base = &jid;
1273         jiov[1].iov_len = sizeof(jid);
1274         jiov[2].iov_base = __DECONST(char *, "vnet");
1275         jiov[2].iov_len = sizeof("vnet");
1276         jiov[3].iov_base = &vnet;
1277         jiov[3].iov_len = sizeof(vnet);
1278         jiov[4].iov_base = __DECONST(char *, "errmsg");
1279         jiov[4].iov_len = sizeof("errmsg");
1280         jiov[5].iov_base = jail_errmsg;
1281         jiov[5].iov_len = JAIL_ERRMSGLEN;
1282         jail_errmsg[0] = '\0';
1283         if (jail_get(jiov, nitems(jiov), 0) < 0) {
1284                 if (!jail_errmsg[0])
1285                         snprintf(jail_errmsg, JAIL_ERRMSGLEN,
1286                             "jail_get: %s", strerror(errno));
1287                 return (-1);
1288         }
1289         return (vnet);
1290 }
1291
1292 static void
1293 usage(void)
1294 {
1295         fprintf(stderr,
1296             "usage: sockstat [-46cLlSsUuvw] [-j jid] [-p ports] [-P protocols]\n");
1297         exit(1);
1298 }
1299
1300 int
1301 main(int argc, char *argv[])
1302 {
1303         int protos_defined = -1;
1304         int o, i;
1305
1306         opt_j = -1;
1307         while ((o = getopt(argc, argv, "46Ccj:Llp:P:qSsUuvw")) != -1)
1308                 switch (o) {
1309                 case '4':
1310                         opt_4 = 1;
1311                         break;
1312                 case '6':
1313                         opt_6 = 1;
1314                         break;
1315                 case 'C':
1316                         opt_C = 1;
1317                         break;
1318                 case 'c':
1319                         opt_c = 1;
1320                         break;
1321                 case 'j':
1322                         opt_j = jail_getid(optarg);
1323                         if (opt_j < 0)
1324                                 errx(1, "%s", jail_errmsg);
1325                         break;
1326                 case 'L':
1327                         opt_L = 1;
1328                         break;
1329                 case 'l':
1330                         opt_l = 1;
1331                         break;
1332                 case 'p':
1333                         parse_ports(optarg);
1334                         break;
1335                 case 'P':
1336                         protos_defined = parse_protos(optarg);
1337                         break;
1338                 case 'q':
1339                         opt_q = 1;
1340                         break;
1341                 case 'S':
1342                         opt_S = 1;
1343                         break;
1344                 case 's':
1345                         opt_s = 1;
1346                         break;
1347                 case 'U':
1348                         opt_U = 1;
1349                         break;
1350                 case 'u':
1351                         opt_u = 1;
1352                         break;
1353                 case 'v':
1354                         ++opt_v;
1355                         break;
1356                 case 'w':
1357                         opt_w = 1;
1358                         break;
1359                 default:
1360                         usage();
1361                 }
1362
1363         argc -= optind;
1364         argv += optind;
1365
1366         if (argc > 0)
1367                 usage();
1368
1369         if (opt_j > 0) {
1370                 switch (jail_getvnet(opt_j)) {
1371                 case -1:
1372                         errx(2, "%s", jail_errmsg);
1373                 case JAIL_SYS_NEW:
1374                         if (jail_attach(opt_j) < 0)
1375                                 err(3, "jail_attach()");
1376                         /* Set back to -1 for normal output in vnet jail. */
1377                         opt_j = -1;
1378                         break;
1379                 default:
1380                         break;
1381                 }
1382         }
1383
1384         if ((!opt_4 && !opt_6) && protos_defined != -1)
1385                 opt_4 = opt_6 = 1;
1386         if (!opt_4 && !opt_6 && !opt_u)
1387                 opt_4 = opt_6 = opt_u = 1;
1388         if ((opt_4 || opt_6) && protos_defined == -1)
1389                 protos_defined = set_default_protos();
1390         if (!opt_c && !opt_l)
1391                 opt_c = opt_l = 1;
1392
1393         if (opt_4 || opt_6) {
1394                 for (i = 0; i < protos_defined; i++)
1395                         if (protos[i] == IPPROTO_SCTP)
1396                                 gather_sctp();
1397                         else
1398                                 gather_inet(protos[i]);
1399         }
1400
1401         if (opt_u || (protos_defined == -1 && !opt_4 && !opt_6)) {
1402                 gather_unix(SOCK_STREAM);
1403                 gather_unix(SOCK_DGRAM);
1404                 gather_unix(SOCK_SEQPACKET);
1405         }
1406         getfiles();
1407         display();
1408         exit(0);
1409 }