Skip to content

Commit fb063da

Browse files
committed
-T and -U flags to specify TCP and UDP protocol filters
1 parent b786c0d commit fb063da

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@
3333

3434
* 2024.06.11 v1.0.3
3535
* `-v` flag typo fix in description
36+
37+
* 2024.06.26 v1.1.0
38+
* `-T` and `-U` flags to specify TCP and UDP protocol filters

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,13 @@ make uninstall
4141

4242
### Usage
4343

44-
```
45-
Usage: sockstat [-46klNrquhv]
44+
```sh
45+
Usage: sockstat [-46TUklnrquhv]
4646

4747
-4 Show AF_INET (IPv4) sockets
4848
-6 Show AF_INET6 (IPv6) sockets
49+
-T Show TCP protocol
50+
-U Show UDP protocol
4951
-k Show AF_SYSTEM (Kernel) sockets
5052
-n Show AF_NDRV sockets
5153
-r Show AF_ROUTE sockets
@@ -58,7 +60,7 @@ Usage: sockstat [-46klNrquhv]
5860
-v Show program version
5961
```
6062

61-
Run `sockstat` as `root` to see all sockets
63+
Run `sockstat` as `root` to see **all**, (not only the current user's) sockets
6264

6365
### Performance
6466

sockstat.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ void usage(int ecode);
4444

4545
/* ------------------------------------------------------------------------------------------------------------------ */
4646
#define PROG_NAME "sockstat"
47-
#define PROG_VERSION "1.0.3"
47+
#define PROG_VERSION "1.1.0"
4848

4949
#define MAXPROC 16384;
5050
/* ------------------------------------------------------------------------------------------------------------------ */
@@ -70,14 +70,19 @@ int main(int argc, char* argv[]) {
7070
int flg_l = 0; /* TCP LISTENing sockets */
7171
int flg_n = 0; /* NDRV sockets */
7272
int flg_q = 0; /* Quiet - hide header */
73+
int flg_T = 0; /* Include TCP */
74+
int flg_U = 0; /* Include UDP */
7375
int flg_r = 0; /* ROUTE sockets */
7476
int flg_u = 0; /* UNIX aka LOCAL sockets */
7577
int flg_a = 0; /* pseudo-flag ALL socket flags are on */
7678

77-
while ((flg = getopt(argc, argv, "46klnrquhv")) != -1)
79+
80+
while ((flg = getopt(argc, argv, "46TUklnrquhv")) != -1)
7881
switch(flg) {
7982
case '4': flg_i4 = 1; break;
8083
case '6': flg_i6 = 1; break;
84+
case 'T': flg_T = 1; break;
85+
case 'U': flg_U = 1; break;
8186
case 'k': flg_k = 1; break;
8287
case 'l': flg_l = 1; break;
8388
case 'n': flg_n = 1; break;
@@ -89,7 +94,7 @@ int main(int argc, char* argv[]) {
8994
default: (void)usage(1);
9095
}
9196

92-
if (!flg_i4 && !flg_i6 && !flg_k && !flg_n && !flg_r && !flg_u) flg_a = 1;
97+
if (!flg_i4 && !flg_i6 && !flg_T && !flg_U && !flg_k && !flg_n && !flg_r && !flg_u) flg_a = 1;
9398

9499
if (sysctlbyname("kern.maxproc", &mproc, &mproc_len, NULL, 0) == -1) {
95100
perror("Unable to get the maximum allowed number of processes");
@@ -127,8 +132,8 @@ int main(int argc, char* argv[]) {
127132

128133
switch (si.psi.soi_family) {
129134
case AF_INET:
130-
if (flg_i4 || flg_a) {
131-
if (si.psi.soi_kind == SOCKINFO_TCP) { /* IPv4 TCP */
135+
if (flg_i4 || flg_a || flg_T || flg_U) {
136+
if (si.psi.soi_kind == SOCKINFO_TCP && (flg_a || flg_T)) { /* IPv4 TCP */
132137
/* Local address and port */
133138
if (si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_lport) {
134139
sprintf(outstr + strlen(outstr), "\ttcp4\t%s:%d",
@@ -153,7 +158,7 @@ int main(int argc, char* argv[]) {
153158
sprintf(outstr + strlen(outstr), "\t*:*");
154159
ready = 1;
155160
}
156-
} else { /* IPv4 UDP */
161+
} else if (flg_a || flg_U) { /* IPv4 UDP */
157162
/* Local address and port */
158163
if (si.psi.soi_proto.pri_in.insi_lport) {
159164
sprintf(outstr + strlen(outstr), "\tudp4\t%s:%d",
@@ -179,8 +184,8 @@ int main(int argc, char* argv[]) {
179184
break;
180185

181186
case AF_INET6:
182-
if (flg_i6 || flg_a) {
183-
if (si.psi.soi_kind == SOCKINFO_TCP) { /* IPv6 TCP */
187+
if (flg_i6 || flg_a || flg_T || flg_U) {
188+
if (si.psi.soi_kind == SOCKINFO_TCP && (flg_a || flg_T)) { /* IPv6 TCP */
184189
/* Local address and port */
185190
if (si.psi.soi_proto.pri_tcp.tcpsi_ini.insi_lport) {
186191
sprintf(outstr + strlen(outstr), "\ttcp6\t%s:%d",
@@ -205,7 +210,7 @@ int main(int argc, char* argv[]) {
205210
sprintf(outstr + strlen(outstr), "\t*:*");
206211
ready = 1;
207212
}
208-
} else { /* IPv6 UDP */
213+
} else if (flg_a || flg_U) { /* IPv6 UDP */
209214
listen = 1;
210215
/* Local address and port */
211216
if (si.psi.soi_proto.pri_in.insi_lport) {
@@ -324,9 +329,11 @@ int main(int argc, char* argv[]) {
324329

325330
/* ------------------------------------------------------------------------------------------------------------------ */
326331
void usage(int ecode) {
327-
printf("Usage: sockstat [-46klNrquhv]\n\n\
332+
printf("Usage: sockstat [-46TUklnrquhv]\n\n\
328333
-4\tShow AF_INET (IPv4) sockets\n\
329334
-6\tShow AF_INET6 (IPv6) sockets\n\
335+
-T\tShow TCP protocol\n\
336+
-U\tShow UDP protocol\n\
330337
-k\tShow AF_SYSTEM (Kernel) sockets\n\
331338
-n\tShow AF_NDRV sockets\n\
332339
-r\tShow AF_ROUTE sockets\n\

0 commit comments

Comments
 (0)