PageRenderTime 1485ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

commands/udpstat/udpstat.c

http://www.minix3.org/
C | 323 lines | 284 code | 29 blank | 10 comment | 49 complexity | d43fb217450a9040702ed8a4f6aca3fb MD5 | raw file
Possible License(s): MIT, WTFPL, AGPL-1.0, BSD-3-Clause, GPL-3.0, LGPL-2.0, JSON, 0BSD
  1. /*
  2. udpstat.c
  3. Created: March 2001 by Philip Homburg <philip@f-mnx.phicoh.com>
  4. */
  5. #define _MINIX_SOURCE
  6. #define _POSIX_C_SOURCE 2
  7. #include <inet/inet.h>
  8. #undef printf
  9. #undef send
  10. #include <assert.h>
  11. #include <fcntl.h>
  12. #include <stdio.h>
  13. #include <time.h>
  14. #include <unistd.h>
  15. #include <sys/svrctl.h>
  16. #ifndef __minix_vmd
  17. #include <sys/times.h>
  18. #endif
  19. #include <net/netlib.h>
  20. #include <net/gen/inet.h>
  21. #include <net/gen/netdb.h>
  22. #include <net/gen/socket.h>
  23. #include <minix/queryparam.h>
  24. #include <inet/generic/buf.h>
  25. #include <inet/generic/clock.h>
  26. #include <inet/generic/event.h>
  27. #include <inet/generic/type.h>
  28. #include <inet/generic/udp_int.h>
  29. char *prog_name;
  30. udp_fd_t udp_fd_table[UDP_FD_NR];
  31. udp_port_t *udp_port_table;
  32. udp_port_t *udp_port_tablep;
  33. size_t udp_port_table_s;
  34. size_t udp_port_table_rs;
  35. int udp_port_nr;
  36. char values[6 * sizeof(void *) + 3];
  37. char *valuesl= NULL;
  38. size_t v_size;
  39. int inclSel, numerical;
  40. void print_fd(int i, clock_t now);
  41. void usage(void);
  42. int main(int argc, char*argv[])
  43. {
  44. char *ipstat_device;
  45. int fd, i, r;
  46. size_t psize;
  47. char *pval, *param;
  48. struct timeval uptime;
  49. clock_t now;
  50. int fl;
  51. int a_flag, n_flag;
  52. struct tms tmsbuf;
  53. (prog_name=strrchr(argv[0], '/')) ? prog_name++ : (prog_name=argv[0]);
  54. a_flag= 0;
  55. n_flag= 0;
  56. while ((fl= getopt(argc, argv, "?an")) != -1)
  57. {
  58. switch(fl)
  59. {
  60. case '?':
  61. usage();
  62. case 'a':
  63. a_flag= 1;
  64. break;
  65. case 'n':
  66. n_flag= 1;
  67. break;
  68. default:
  69. fprintf(stderr, "%s: getopt failed: '%c'\n",
  70. prog_name, fl);
  71. exit(1);
  72. }
  73. }
  74. inclSel= !!a_flag;
  75. numerical= !!n_flag;
  76. ipstat_device= IPSTAT_DEVICE;
  77. if ((fd= open(ipstat_device, O_RDWR)) == -1)
  78. {
  79. fprintf(stderr, "%s: unable to open '%s': %s\n", prog_name,
  80. ipstat_device, strerror(errno));
  81. exit(1);
  82. }
  83. v_size= 2*sizeof(udp_fd_table)+1;
  84. valuesl= realloc(valuesl, v_size);
  85. if (!valuesl)
  86. {
  87. fprintf(stderr, "%s: unable to malloc %u bytes for valuesl\n",
  88. prog_name, v_size);
  89. exit(1);
  90. }
  91. param= "udp_fd_table";
  92. psize= strlen(param);
  93. r= write(fd, param, psize);
  94. if (r != psize)
  95. {
  96. fprintf(stderr, "%s: write to %s failed: %s\n", prog_name,
  97. ipstat_device,
  98. r < 0 ? strerror(errno) : "short write");
  99. exit(1);
  100. }
  101. r= read(fd, valuesl, v_size);
  102. if (r < 0)
  103. {
  104. fprintf(stderr, "%s: read from %s failed: %s\n", prog_name,
  105. ipstat_device, strerror(errno));
  106. exit(1);
  107. }
  108. pval= valuesl;
  109. if (paramvalue(&pval, udp_fd_table, sizeof(udp_fd_table)) !=
  110. sizeof(udp_fd_table))
  111. {
  112. fprintf(stderr,
  113. "%s: unable to decode the results from queryparam (udp_fd_table)\n",
  114. prog_name);
  115. exit(1);
  116. }
  117. /* Get address, size, and element size of the UDP port table */
  118. param = "&udp_port_table,$udp_port_table,$udp_port_table[0]";
  119. psize = strlen(param);
  120. r= write(fd, param, psize);
  121. if (r != psize)
  122. {
  123. fprintf(stderr, "%s: write to %s failed: %s\n", prog_name,
  124. ipstat_device,
  125. r < 0 ? strerror(errno) : "short write");
  126. exit(1);
  127. }
  128. r= read(fd, values, sizeof(values));
  129. if (r < 0)
  130. {
  131. fprintf(stderr, "%s: read from %s failed: %s\n", prog_name,
  132. ipstat_device, strerror(errno));
  133. exit(1);
  134. }
  135. pval= values;
  136. if (paramvalue(&pval, &udp_port_tablep, sizeof(udp_port_tablep)) !=
  137. sizeof(udp_port_tablep) ||
  138. paramvalue(&pval, &udp_port_table_s, sizeof(udp_port_table_s))
  139. != sizeof(udp_port_table_s) ||
  140. paramvalue(&pval, &udp_port_table_rs, sizeof(udp_port_table_rs))
  141. != sizeof(udp_port_table_rs))
  142. {
  143. fprintf(stderr,
  144. "%s: unable to decode the results from queryparam (&udp_port_table, ...)\n",
  145. prog_name);
  146. exit(1);
  147. }
  148. if (udp_port_table_rs != sizeof(udp_port_table[0]))
  149. {
  150. fprintf(stderr,
  151. "%s: size mismatch in udp_port_table (different version of inet?)\n",
  152. prog_name);
  153. exit(1);
  154. }
  155. udp_port_nr= udp_port_table_s/udp_port_table_rs;
  156. assert(udp_port_table_s == udp_port_nr*udp_port_table_rs);
  157. udp_port_table= malloc(udp_port_table_s);
  158. if (!udp_port_table)
  159. {
  160. fprintf(stderr,
  161. "%s: unable to malloc %u bytes for udp_port_table\n",
  162. prog_name, udp_port_table_s);
  163. exit(1);
  164. }
  165. v_size= 2*udp_port_table_s+1;
  166. valuesl= realloc(valuesl, v_size);
  167. if (!valuesl)
  168. {
  169. fprintf(stderr, "%s: unable to malloc %u bytes for valuesl\n",
  170. prog_name, v_size);
  171. exit(1);
  172. }
  173. param = "udp_port_table";
  174. psize = strlen(param);
  175. r= write(fd, param, psize);
  176. if (r != psize)
  177. {
  178. fprintf(stderr, "%s: write to %s failed: %s\n", prog_name,
  179. ipstat_device,
  180. r < 0 ? strerror(errno) : "short write");
  181. exit(1);
  182. }
  183. r= read(fd, valuesl, v_size);
  184. if (r < 0)
  185. {
  186. fprintf(stderr, "%s: read from %s failed: %s\n", prog_name,
  187. ipstat_device, strerror(errno));
  188. exit(1);
  189. }
  190. pval= valuesl;
  191. if (paramvalue(&pval, udp_port_table, udp_port_table_s) !=
  192. udp_port_table_s)
  193. {
  194. fprintf(stderr,
  195. "%s: unable to decode the results from queryparam (udp_port_table)\n",
  196. prog_name);
  197. exit(1);
  198. }
  199. /* Get the uptime in clock ticks. */
  200. #ifdef __minix_vmd
  201. if (sysutime(UTIME_UPTIME, &uptime) == -1)
  202. {
  203. fprintf(stderr, "%s: sysutime failed: %s\n", prog_name,
  204. strerror(errno));
  205. exit(1);
  206. }
  207. now= uptime.tv_sec * HZ + (uptime.tv_usec*HZ/1000000);
  208. #else /* Minix 3 */
  209. now= times(&tmsbuf);
  210. #endif
  211. for (i= 0; i<UDP_FD_NR; i++)
  212. print_fd(i, now);
  213. exit(0);
  214. }
  215. void print_fd(int i, clock_t now)
  216. {
  217. unsigned long nwuo_flags;
  218. int port_nr;
  219. udp_fd_t *udp_fd;
  220. udp_port_t *udp_port;
  221. char *locaddr_str, *remaddr_str;
  222. struct hostent *hostent;
  223. struct servent *servent;
  224. nwio_udpopt_t uf_udpopt;
  225. udp_fd= &udp_fd_table[i];
  226. if (!(udp_fd->uf_flags & UFF_INUSE))
  227. return;
  228. uf_udpopt= udp_fd->uf_udpopt;
  229. nwuo_flags= uf_udpopt.nwuo_flags;
  230. if (((nwuo_flags & NWUO_LOCPORT_MASK) != NWUO_LP_SET) && !inclSel)
  231. return;
  232. port_nr= udp_fd->uf_port-udp_port_tablep;
  233. udp_port= &udp_port_table[port_nr];
  234. printf("%3d", i);
  235. if (nwuo_flags & NWUO_EN_LOC)
  236. {
  237. if (!numerical && (hostent=
  238. gethostbyaddr((char *)&udp_port->up_ipaddr,
  239. sizeof(ipaddr_t), AF_INET)) != NULL)
  240. {
  241. locaddr_str= hostent->h_name;
  242. }
  243. else
  244. locaddr_str= inet_ntoa(udp_port->up_ipaddr);
  245. }
  246. else if (nwuo_flags & NWUO_EN_BROAD)
  247. locaddr_str= "255.255.255.255";
  248. else
  249. locaddr_str= "0.0.0.0";
  250. printf(" %s:", locaddr_str);
  251. if ((nwuo_flags & NWUO_LOCPORT_MASK) != NWUO_LP_SEL &&
  252. (nwuo_flags & NWUO_LOCPORT_MASK) != NWUO_LP_SET)
  253. {
  254. printf("*");
  255. }
  256. else if ((servent= getservbyport(uf_udpopt.nwuo_locport, "udp")) !=
  257. NULL)
  258. {
  259. printf("%s", servent->s_name);
  260. }
  261. else
  262. printf("%u", ntohs(uf_udpopt.nwuo_locport));
  263. printf(" -> ");
  264. if (!(nwuo_flags & NWUO_RA_SET))
  265. remaddr_str= "*";
  266. else if (!numerical &&
  267. (hostent= gethostbyaddr((char *)&uf_udpopt.nwuo_remaddr,
  268. sizeof(ipaddr_t), AF_INET)) != NULL)
  269. {
  270. remaddr_str= hostent->h_name;
  271. }
  272. else
  273. remaddr_str= inet_ntoa(uf_udpopt.nwuo_remaddr);
  274. printf("%s:", remaddr_str);
  275. if (!(nwuo_flags & NWUO_RP_SET))
  276. printf("*");
  277. else if ((servent= getservbyport(uf_udpopt.nwuo_remport, "udp")) !=
  278. NULL)
  279. {
  280. printf("%s", servent->s_name);
  281. }
  282. else
  283. printf("%u", ntohs(uf_udpopt.nwuo_remport));
  284. printf("\n");
  285. }
  286. void usage(void)
  287. {
  288. fprintf(stderr, "Usage: %s [-a] [-n]\n", prog_name);
  289. exit(1);
  290. }
  291. /*
  292. * $PchId: udpstat.c,v 1.4 2005/01/30 01:04:57 philip Exp $
  293. */