xref: /freebsd/usr.bin/sockstat/sockstat.c (revision cb2887746f8b9dd4ad6b1e757cdc053a08b25a2e)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2025 ConnectWise
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  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include <ctype.h>
30 #include <stdlib.h>
31 #include <libxo/xo.h>
32 
33 #include "sockstat.h"
34 
35 int	*ports;
36 
37 int
38 parse_ports(const char *portspec)
39 {
40 	const char *p;
41 
42 	if (ports == NULL)
43 		if ((ports = calloc(65536 / INT_BIT, sizeof(int))) == NULL)
44 			xo_err(1, "calloc()");
45 	p = portspec;
46 	while (*p != '\0') {
47 		long port, end;
48 		char *endptr = NULL;
49 
50 		errno = 0;
51 		port = strtol(p, &endptr, 10);
52 		if (errno)
53 			return (errno);
54 		if (port < 0 || port > 65535)
55 			return (ERANGE);
56 		SET_PORT(port);
57 		switch (*endptr) {
58 		case '-':
59 			p = endptr + 1;
60 			end = strtol(p, &endptr, 10);
61 			break;
62 		case ',':
63 			p = endptr + 1;
64 			continue;
65 		default:
66 			p = endptr;
67 			continue;
68 		}
69 		if (errno)
70 			return (errno);
71 		if (end < port || end > 65535)
72 			return (ERANGE);
73 		while (port++ < end)
74 			SET_PORT(port);
75 	}
76 	return (0);
77 }
78