4 Created: March 2001 by Philip Homburg <philip@f-mnx.phicoh.com>
8 #define _POSIX_C_SOURCE 2
10 #include <inet/inet.h>
18 #include <sys/svrctl.h>
20 #include <sys/times.h>
22 #include <net/netlib.h>
23 #include <net/gen/inet.h>
24 #include <net/gen/netdb.h>
25 #include <net/gen/socket.h>
26 #include <minix/queryparam.h>
28 #include <inet/generic/buf.h>
29 #include <inet/generic/clock.h>
30 #include <inet/generic/event.h>
31 #include <inet/generic/type.h>
32 #include <inet/generic/udp_int.h>
35 udp_fd_t udp_fd_table
[UDP_FD_NR
];
36 udp_port_t
*udp_port_table
;
37 udp_port_t
*udp_port_tablep
;
38 size_t udp_port_table_s
;
39 size_t udp_port_table_rs
;
41 char values
[6 * sizeof(void *) + 3];
44 int inclSel
, numerical
;
46 void print_fd(int i
, clock_t now
);
49 int main(int argc
, char*argv
[])
55 struct timeval uptime
;
60 (prog_name
=strrchr(argv
[0], '/')) ? prog_name
++ : (prog_name
=argv
[0]);
64 while ((fl
= getopt(argc
, argv
, "?an")) != -1)
77 fprintf(stderr
, "%s: getopt failed: '%c'\n",
85 ipstat_device
= IPSTAT_DEVICE
;
86 if ((fd
= open(ipstat_device
, O_RDWR
)) == -1)
88 fprintf(stderr
, "%s: unable to open '%s': %s\n", prog_name
,
89 ipstat_device
, strerror(errno
));
93 v_size
= 2*sizeof(udp_fd_table
)+1;
94 valuesl
= realloc(valuesl
, v_size
);
97 fprintf(stderr
, "%s: unable to malloc %u bytes for valuesl\n",
102 param
= "udp_fd_table";
103 psize
= strlen(param
);
104 r
= write(fd
, param
, psize
);
107 fprintf(stderr
, "%s: write to %s failed: %s\n", prog_name
,
109 r
< 0 ? strerror(errno
) : "short write");
112 r
= read(fd
, valuesl
, v_size
);
115 fprintf(stderr
, "%s: read from %s failed: %s\n", prog_name
,
116 ipstat_device
, strerror(errno
));
120 if (paramvalue(&pval
, udp_fd_table
, sizeof(udp_fd_table
)) !=
121 sizeof(udp_fd_table
))
124 "%s: unable to decode the results from queryparam (udp_fd_table)\n",
129 /* Get address, size, and element size of the UDP port table */
130 param
= "&udp_port_table,$udp_port_table,$udp_port_table[0]";
131 psize
= strlen(param
);
132 r
= write(fd
, param
, psize
);
135 fprintf(stderr
, "%s: write to %s failed: %s\n", prog_name
,
137 r
< 0 ? strerror(errno
) : "short write");
140 r
= read(fd
, values
, sizeof(values
));
143 fprintf(stderr
, "%s: read from %s failed: %s\n", prog_name
,
144 ipstat_device
, strerror(errno
));
148 if (paramvalue(&pval
, &udp_port_tablep
, sizeof(udp_port_tablep
)) !=
149 sizeof(udp_port_tablep
) ||
150 paramvalue(&pval
, &udp_port_table_s
, sizeof(udp_port_table_s
))
151 != sizeof(udp_port_table_s
) ||
152 paramvalue(&pval
, &udp_port_table_rs
, sizeof(udp_port_table_rs
))
153 != sizeof(udp_port_table_rs
))
156 "%s: unable to decode the results from queryparam (&udp_port_table, ...)\n",
161 if (udp_port_table_rs
!= sizeof(udp_port_table
[0]))
164 "%s: size mismatch in udp_port_table (different version of inet?)\n",
168 udp_port_nr
= udp_port_table_s
/udp_port_table_rs
;
169 assert(udp_port_table_s
== udp_port_nr
*udp_port_table_rs
);
170 udp_port_table
= malloc(udp_port_table_s
);
174 "%s: unable to malloc %u bytes for udp_port_table\n",
175 prog_name
, udp_port_table_s
);
178 v_size
= 2*udp_port_table_s
+1;
179 valuesl
= realloc(valuesl
, v_size
);
182 fprintf(stderr
, "%s: unable to malloc %u bytes for valuesl\n",
187 param
= "udp_port_table";
188 psize
= strlen(param
);
189 r
= write(fd
, param
, psize
);
192 fprintf(stderr
, "%s: write to %s failed: %s\n", prog_name
,
194 r
< 0 ? strerror(errno
) : "short write");
197 r
= read(fd
, valuesl
, v_size
);
200 fprintf(stderr
, "%s: read from %s failed: %s\n", prog_name
,
201 ipstat_device
, strerror(errno
));
205 if (paramvalue(&pval
, udp_port_table
, udp_port_table_s
) !=
209 "%s: unable to decode the results from queryparam (udp_port_table)\n",
214 /* Get the uptime in clock ticks. */
216 if (sysutime(UTIME_UPTIME
, &uptime
) == -1)
218 fprintf(stderr
, "%s: sysutime failed: %s\n", prog_name
,
222 now
= uptime
.tv_sec
* HZ
+ (uptime
.tv_usec
*HZ
/1000000);
227 for (i
= 0; i
<UDP_FD_NR
; i
++)
232 void print_fd(int i
, clock_t now
)
234 unsigned long nwuo_flags
;
237 udp_port_t
*udp_port
;
238 char *locaddr_str
, *remaddr_str
;
239 struct hostent
*hostent
;
240 struct servent
*servent
;
241 nwio_udpopt_t uf_udpopt
;
243 udp_fd
= &udp_fd_table
[i
];
244 if (!(udp_fd
->uf_flags
& UFF_INUSE
))
246 uf_udpopt
= udp_fd
->uf_udpopt
;
247 nwuo_flags
= uf_udpopt
.nwuo_flags
;
248 if (((nwuo_flags
& NWUO_LOCPORT_MASK
) != NWUO_LP_SET
) && !inclSel
)
251 port_nr
= udp_fd
->uf_port
-udp_port_tablep
;
252 udp_port
= &udp_port_table
[port_nr
];
256 if (nwuo_flags
& NWUO_EN_LOC
)
258 if (!numerical
&& (hostent
=
259 gethostbyaddr((char *)&udp_port
->up_ipaddr
,
260 sizeof(ipaddr_t
), AF_INET
)) != NULL
)
262 locaddr_str
= hostent
->h_name
;
265 locaddr_str
= inet_ntoa(udp_port
->up_ipaddr
);
267 else if (nwuo_flags
& NWUO_EN_BROAD
)
268 locaddr_str
= "255.255.255.255";
270 locaddr_str
= "0.0.0.0";
272 printf(" %s:", locaddr_str
);
274 if ((nwuo_flags
& NWUO_LOCPORT_MASK
) != NWUO_LP_SEL
&&
275 (nwuo_flags
& NWUO_LOCPORT_MASK
) != NWUO_LP_SET
)
279 else if ((servent
= getservbyport(uf_udpopt
.nwuo_locport
, "udp")) !=
282 printf("%s", servent
->s_name
);
285 printf("%u", ntohs(uf_udpopt
.nwuo_locport
));
289 if (!(nwuo_flags
& NWUO_RA_SET
))
291 else if (!numerical
&&
292 (hostent
= gethostbyaddr((char *)&uf_udpopt
.nwuo_remaddr
,
293 sizeof(ipaddr_t
), AF_INET
)) != NULL
)
295 remaddr_str
= hostent
->h_name
;
298 remaddr_str
= inet_ntoa(uf_udpopt
.nwuo_remaddr
);
299 printf("%s:", remaddr_str
);
301 if (!(nwuo_flags
& NWUO_RP_SET
))
303 else if ((servent
= getservbyport(uf_udpopt
.nwuo_remport
, "udp")) !=
306 printf("%s", servent
->s_name
);
309 printf("%u", ntohs(uf_udpopt
.nwuo_remport
));
315 fprintf(stderr
, "Usage: %s [-a] [-n]\n", prog_name
);
320 * $PchId: udpstat.c,v 1.4 2005/01/30 01:04:57 philip Exp $