libnet4r 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. data/CHANGELOG +15 -0
  2. data/LICENSE +28 -0
  3. data/README +187 -0
  4. data/Rakefile +110 -0
  5. data/ext/extconf.rb +60 -0
  6. data/ext/libnet.c +705 -0
  7. data/ext/libnet_arp.c +152 -0
  8. data/ext/libnet_ethernet.c +115 -0
  9. data/ext/libnet_ipv4.c +140 -0
  10. data/ext/libnet_ipv6.c +138 -0
  11. data/ext/libnet_udp.c +112 -0
  12. data/ext/libnet_vlan.c +131 -0
  13. data/lib/libnet4r/header.rb +609 -0
  14. data/lib/libnet4r/helpers.rb +19 -0
  15. data/lib/libnet4r/libnet.rb +39 -0
  16. data/libnet/CVS/Entries +24 -0
  17. data/libnet/CVS/Repository +1 -0
  18. data/libnet/CVS/Root +1 -0
  19. data/libnet/Makefile.am +15 -0
  20. data/libnet/Makefile.am.common +10 -0
  21. data/libnet/Makefile.in +443 -0
  22. data/libnet/README +21 -0
  23. data/libnet/VERSION +1 -0
  24. data/libnet/acconfig.h +36 -0
  25. data/libnet/acinclude.m4 +463 -0
  26. data/libnet/aclocal.m4 +1337 -0
  27. data/libnet/autom4te.cache/CVS/Entries +1 -0
  28. data/libnet/autom4te.cache/CVS/Repository +1 -0
  29. data/libnet/autom4te.cache/CVS/Root +1 -0
  30. data/libnet/autom4te.cache/output.0 +6225 -0
  31. data/libnet/autom4te.cache/requests +111 -0
  32. data/libnet/autom4te.cache/traces.0 +272 -0
  33. data/libnet/config.guess +1314 -0
  34. data/libnet/config.sub +1410 -0
  35. data/libnet/configure +6225 -0
  36. data/libnet/configure.in +235 -0
  37. data/libnet/doc/BUGS +19 -0
  38. data/libnet/doc/CHANGELOG +527 -0
  39. data/libnet/doc/CONTRIB +53 -0
  40. data/libnet/doc/COPYING +31 -0
  41. data/libnet/doc/CVS/Entries +12 -0
  42. data/libnet/doc/CVS/Repository +1 -0
  43. data/libnet/doc/CVS/Root +1 -0
  44. data/libnet/doc/DESIGN_NOTES +134 -0
  45. data/libnet/doc/MIGRATION +172 -0
  46. data/libnet/doc/PACKET_BUILDING +161 -0
  47. data/libnet/doc/PORTED +45 -0
  48. data/libnet/doc/RAWSOCKET_NON_SEQUITUR +41 -0
  49. data/libnet/doc/TODO +96 -0
  50. data/libnet/doc/html/acconfig_8h-source.html +49 -0
  51. data/libnet/doc/html/annotated.html +17 -0
  52. data/libnet/doc/html/bpf_8h-source.html +277 -0
  53. data/libnet/doc/html/config_8h-source.html +125 -0
  54. data/libnet/doc/html/doxygen.css +169 -0
  55. data/libnet/doc/html/doxygen.png +0 -0
  56. data/libnet/doc/html/files.html +29 -0
  57. data/libnet/doc/html/functions.html +26 -0
  58. data/libnet/doc/html/functions_vars.html +26 -0
  59. data/libnet/doc/html/getopt_8h-source.html +97 -0
  60. data/libnet/doc/html/globals.html +219 -0
  61. data/libnet/doc/html/globals_defs.html +104 -0
  62. data/libnet/doc/html/globals_func.html +136 -0
  63. data/libnet/doc/html/gnuc_8h-source.html +56 -0
  64. data/libnet/doc/html/graph_legend.dot +22 -0
  65. data/libnet/doc/html/graph_legend.html +75 -0
  66. data/libnet/doc/html/ifaddrlist_8h-source.html +65 -0
  67. data/libnet/doc/html/in__systm_8h-source.html +90 -0
  68. data/libnet/doc/html/index.html +17 -0
  69. data/libnet/doc/html/libnet-asn1_8h-source.html +268 -0
  70. data/libnet/doc/html/libnet-functions_8h-source.html +742 -0
  71. data/libnet/doc/html/libnet-functions_8h.html +8844 -0
  72. data/libnet/doc/html/libnet-headers_8h-source.html +1655 -0
  73. data/libnet/doc/html/libnet-headers_8h.html +3053 -0
  74. data/libnet/doc/html/libnet-macros_8h-source.html +161 -0
  75. data/libnet/doc/html/libnet-macros_8h.html +358 -0
  76. data/libnet/doc/html/libnet-structures_8h-source.html +233 -0
  77. data/libnet/doc/html/libnet-types_8h-source.html +58 -0
  78. data/libnet/doc/html/libnet_8h-source.html +119 -0
  79. data/libnet/doc/html/libnet_8h.html +24 -0
  80. data/libnet/doc/html/structlibnet__802__1q__hdr.html +145 -0
  81. data/libnet/doc/html/structlibnet__802__1x__hdr.html +97 -0
  82. data/libnet/doc/libnet.doxygen.conf +1102 -0
  83. data/libnet/doc/man/CVS/Entries +1 -0
  84. data/libnet/doc/man/CVS/Repository +1 -0
  85. data/libnet/doc/man/CVS/Root +1 -0
  86. data/libnet/doc/man/man3/libnet-functions.h.3 +3136 -0
  87. data/libnet/doc/man/man3/libnet-headers.h.3 +1872 -0
  88. data/libnet/doc/man/man3/libnet-macros.h.3 +172 -0
  89. data/libnet/doc/man/man3/libnet.h.3 +17 -0
  90. data/libnet/doc/man/man3/libnet_802_1q_hdr.3 +53 -0
  91. data/libnet/doc/man/man3/libnet_802_1x_hdr.3 +41 -0
  92. data/libnet/include/CVS/Entries +10 -0
  93. data/libnet/include/CVS/Repository +1 -0
  94. data/libnet/include/CVS/Root +1 -0
  95. data/libnet/include/Makefile.am +7 -0
  96. data/libnet/include/Makefile.in +395 -0
  97. data/libnet/include/bpf.h +264 -0
  98. data/libnet/include/config.h.in +118 -0
  99. data/libnet/include/gnuc.h +43 -0
  100. data/libnet/include/ifaddrlist.h +52 -0
  101. data/libnet/include/libnet/CVS/Entries +9 -0
  102. data/libnet/include/libnet/CVS/Repository +1 -0
  103. data/libnet/include/libnet/CVS/Root +1 -0
  104. data/libnet/include/libnet/Makefile.am +12 -0
  105. data/libnet/include/libnet/Makefile.in +294 -0
  106. data/libnet/include/libnet/libnet-asn1.h +255 -0
  107. data/libnet/include/libnet/libnet-functions.h +2157 -0
  108. data/libnet/include/libnet/libnet-headers.h +1662 -0
  109. data/libnet/include/libnet/libnet-macros.h +186 -0
  110. data/libnet/include/libnet/libnet-structures.h +222 -0
  111. data/libnet/include/libnet/libnet-types.h +45 -0
  112. data/libnet/include/libnet.h.in +132 -0
  113. data/libnet/include/stamp-h.in +1 -0
  114. data/libnet/include/win32/CVS/Entries +5 -0
  115. data/libnet/include/win32/CVS/Repository +1 -0
  116. data/libnet/include/win32/CVS/Root +1 -0
  117. data/libnet/include/win32/config.h +112 -0
  118. data/libnet/include/win32/getopt.h +84 -0
  119. data/libnet/include/win32/in_systm.h +77 -0
  120. data/libnet/include/win32/libnet.h +106 -0
  121. data/libnet/install-sh +250 -0
  122. data/libnet/libnet-config.in +62 -0
  123. data/libnet/libnet.doxygen.conf +1102 -0
  124. data/libnet/man/CVS/Entries +1 -0
  125. data/libnet/man/CVS/Repository +1 -0
  126. data/libnet/man/CVS/Root +1 -0
  127. data/libnet/missing +283 -0
  128. data/libnet/mkinstalldirs +40 -0
  129. data/libnet/sample/CVS/Entries +47 -0
  130. data/libnet/sample/CVS/Repository +1 -0
  131. data/libnet/sample/CVS/Root +1 -0
  132. data/libnet/sample/Makefile.am +63 -0
  133. data/libnet/sample/Makefile.in +729 -0
  134. data/libnet/sample/arp-new.c +144 -0
  135. data/libnet/sample/arp.c +151 -0
  136. data/libnet/sample/bgp4_hdr.c +225 -0
  137. data/libnet/sample/bgp4_notification.c +242 -0
  138. data/libnet/sample/bgp4_open.c +266 -0
  139. data/libnet/sample/bgp4_update.c +337 -0
  140. data/libnet/sample/cdp.c +187 -0
  141. data/libnet/sample/dhcp_discover.c +257 -0
  142. data/libnet/sample/dns.c +260 -0
  143. data/libnet/sample/dot1x.c +113 -0
  144. data/libnet/sample/fddi_tcp1.c +213 -0
  145. data/libnet/sample/fddi_tcp2.c +209 -0
  146. data/libnet/sample/get_addr.c +112 -0
  147. data/libnet/sample/gre.c +410 -0
  148. data/libnet/sample/icmp6_echoreq.c +184 -0
  149. data/libnet/sample/icmp_echo_cq.c +201 -0
  150. data/libnet/sample/icmp_redirect.c +200 -0
  151. data/libnet/sample/icmp_timeexceed.c +190 -0
  152. data/libnet/sample/icmp_timestamp.c +157 -0
  153. data/libnet/sample/icmp_unreach.c +204 -0
  154. data/libnet/sample/ieee.c +177 -0
  155. data/libnet/sample/ip_link.c +201 -0
  156. data/libnet/sample/ip_raw.c +180 -0
  157. data/libnet/sample/isl.c +167 -0
  158. data/libnet/sample/libnet_test.h +60 -0
  159. data/libnet/sample/mpls.c +251 -0
  160. data/libnet/sample/ntp.c +193 -0
  161. data/libnet/sample/ospf_hello.c +179 -0
  162. data/libnet/sample/ospf_lsa.c +190 -0
  163. data/libnet/sample/ping_of_death.c +171 -0
  164. data/libnet/sample/rpc_tcp.c +214 -0
  165. data/libnet/sample/rpc_udp.c +213 -0
  166. data/libnet/sample/sebek.c +299 -0
  167. data/libnet/sample/smurf.c +194 -0
  168. data/libnet/sample/stp.c +227 -0
  169. data/libnet/sample/synflood.c +200 -0
  170. data/libnet/sample/synflood6.c +209 -0
  171. data/libnet/sample/synflood6_frag.c +234 -0
  172. data/libnet/sample/tcp1.c +227 -0
  173. data/libnet/sample/tcp2.c +192 -0
  174. data/libnet/sample/tftp.c +207 -0
  175. data/libnet/sample/tring_tcp1.c +214 -0
  176. data/libnet/sample/tring_tcp2.c +210 -0
  177. data/libnet/sample/udp1.c +223 -0
  178. data/libnet/sample/udp2.c +232 -0
  179. data/libnet/sample/win32/CVS/Entries +9 -0
  180. data/libnet/sample/win32/CVS/Repository +1 -0
  181. data/libnet/sample/win32/CVS/Root +1 -0
  182. data/libnet/sample/win32/arp/CVS/Entries +2 -0
  183. data/libnet/sample/win32/arp/CVS/Repository +1 -0
  184. data/libnet/sample/win32/arp/CVS/Root +1 -0
  185. data/libnet/sample/win32/arp/arp.vcproj +136 -0
  186. data/libnet/sample/win32/cdp/CVS/Entries +2 -0
  187. data/libnet/sample/win32/cdp/CVS/Repository +1 -0
  188. data/libnet/sample/win32/cdp/CVS/Root +1 -0
  189. data/libnet/sample/win32/cdp/cdp.vcproj +136 -0
  190. data/libnet/sample/win32/dhcp_discover/CVS/Entries +2 -0
  191. data/libnet/sample/win32/dhcp_discover/CVS/Repository +1 -0
  192. data/libnet/sample/win32/dhcp_discover/CVS/Root +1 -0
  193. data/libnet/sample/win32/dhcp_discover/dhcp_discover.vcproj +139 -0
  194. data/libnet/sample/win32/dns/CVS/Entries +2 -0
  195. data/libnet/sample/win32/dns/CVS/Repository +1 -0
  196. data/libnet/sample/win32/dns/CVS/Root +1 -0
  197. data/libnet/sample/win32/dns/dns.vcproj +139 -0
  198. data/libnet/sample/win32/get_addr/CVS/Entries +2 -0
  199. data/libnet/sample/win32/get_addr/CVS/Repository +1 -0
  200. data/libnet/sample/win32/get_addr/CVS/Root +1 -0
  201. data/libnet/sample/win32/get_addr/get_addr.vcproj +139 -0
  202. data/libnet/sample/win32/getopt.c +121 -0
  203. data/libnet/sample/win32/icmp_echo_cq/CVS/Entries +2 -0
  204. data/libnet/sample/win32/icmp_echo_cq/CVS/Repository +1 -0
  205. data/libnet/sample/win32/icmp_echo_cq/CVS/Root +1 -0
  206. data/libnet/sample/win32/icmp_echo_cq/icmp_echo_cq.vcproj +139 -0
  207. data/libnet/sample/win32/tcp1/CVS/Entries +2 -0
  208. data/libnet/sample/win32/tcp1/CVS/Repository +1 -0
  209. data/libnet/sample/win32/tcp1/CVS/Root +1 -0
  210. data/libnet/sample/win32/tcp1/tcp1.vcproj +142 -0
  211. data/libnet/sample/win32/udp1/CVS/Entries +3 -0
  212. data/libnet/sample/win32/udp1/CVS/Repository +1 -0
  213. data/libnet/sample/win32/udp1/CVS/Root +1 -0
  214. data/libnet/sample/win32/udp1/dns.vcproj +125 -0
  215. data/libnet/sample/win32/udp1/udp1.vcproj +139 -0
  216. data/libnet/src/CVS/Entries +60 -0
  217. data/libnet/src/CVS/Repository +1 -0
  218. data/libnet/src/CVS/Root +1 -0
  219. data/libnet/src/Makefile.am +71 -0
  220. data/libnet/src/Makefile.in +428 -0
  221. data/libnet/src/libnet_advanced.c +136 -0
  222. data/libnet/src/libnet_asn1.c +436 -0
  223. data/libnet/src/libnet_build_802.1q.c +115 -0
  224. data/libnet/src/libnet_build_802.1x.c +103 -0
  225. data/libnet/src/libnet_build_802.2.c +167 -0
  226. data/libnet/src/libnet_build_802.3.c +101 -0
  227. data/libnet/src/libnet_build_arp.c +169 -0
  228. data/libnet/src/libnet_build_bgp.c +350 -0
  229. data/libnet/src/libnet_build_cdp.c +191 -0
  230. data/libnet/src/libnet_build_data.c +90 -0
  231. data/libnet/src/libnet_build_dhcp.c +156 -0
  232. data/libnet/src/libnet_build_dns.c +129 -0
  233. data/libnet/src/libnet_build_ethernet.c +173 -0
  234. data/libnet/src/libnet_build_fddi.c +191 -0
  235. data/libnet/src/libnet_build_gre.c +427 -0
  236. data/libnet/src/libnet_build_icmp.c +437 -0
  237. data/libnet/src/libnet_build_igmp.c +112 -0
  238. data/libnet/src/libnet_build_ip.c +892 -0
  239. data/libnet/src/libnet_build_ipsec.c +232 -0
  240. data/libnet/src/libnet_build_isl.c +113 -0
  241. data/libnet/src/libnet_build_link.c +90 -0
  242. data/libnet/src/libnet_build_mpls.c +112 -0
  243. data/libnet/src/libnet_build_ntp.c +121 -0
  244. data/libnet/src/libnet_build_ospf.c +699 -0
  245. data/libnet/src/libnet_build_rip.c +108 -0
  246. data/libnet/src/libnet_build_rpc.c +138 -0
  247. data/libnet/src/libnet_build_sebek.c +108 -0
  248. data/libnet/src/libnet_build_snmp.c +52 -0
  249. data/libnet/src/libnet_build_stp.c +222 -0
  250. data/libnet/src/libnet_build_tcp.c +365 -0
  251. data/libnet/src/libnet_build_token_ring.c +193 -0
  252. data/libnet/src/libnet_build_udp.c +111 -0
  253. data/libnet/src/libnet_build_vrrp.c +117 -0
  254. data/libnet/src/libnet_checksum.c +376 -0
  255. data/libnet/src/libnet_cq.c +395 -0
  256. data/libnet/src/libnet_crc.c +113 -0
  257. data/libnet/src/libnet_dll.c +47 -0
  258. data/libnet/src/libnet_error.c +55 -0
  259. data/libnet/src/libnet_if_addr.c +415 -0
  260. data/libnet/src/libnet_init.c +234 -0
  261. data/libnet/src/libnet_internal.c +310 -0
  262. data/libnet/src/libnet_link_bpf.c +348 -0
  263. data/libnet/src/libnet_link_dlpi.c +785 -0
  264. data/libnet/src/libnet_link_linux.c +310 -0
  265. data/libnet/src/libnet_link_nit.c +125 -0
  266. data/libnet/src/libnet_link_none.c +66 -0
  267. data/libnet/src/libnet_link_pf.c +179 -0
  268. data/libnet/src/libnet_link_snit.c +149 -0
  269. data/libnet/src/libnet_link_snoop.c +166 -0
  270. data/libnet/src/libnet_link_win32.c +346 -0
  271. data/libnet/src/libnet_pblock.c +511 -0
  272. data/libnet/src/libnet_port_list.c +295 -0
  273. data/libnet/src/libnet_prand.c +106 -0
  274. data/libnet/src/libnet_raw.c +257 -0
  275. data/libnet/src/libnet_resolve.c +414 -0
  276. data/libnet/src/libnet_version.c +54 -0
  277. data/libnet/src/libnet_write.c +502 -0
  278. data/libnet/version.h.in +6 -0
  279. data/libnet/win32/CVS/Entries +15 -0
  280. data/libnet/win32/CVS/Repository +1 -0
  281. data/libnet/win32/CVS/Root +1 -0
  282. data/libnet/win32/Libnet-1.1.1-2002.sln +77 -0
  283. data/libnet/win32/Libnet-1.1.1-2003.ncb +0 -0
  284. data/libnet/win32/Libnet-1.1.1-2003.sln +84 -0
  285. data/libnet/win32/Libnet-1.1.1-2003.suo +0 -0
  286. data/libnet/win32/Libnet-1.1.1.vcproj +311 -0
  287. data/libnet/win32/Libnet-latest.ncb +0 -0
  288. data/libnet/win32/Libnet-latest.opt +0 -0
  289. data/libnet/win32/Libnet-latest.sln +77 -0
  290. data/libnet/win32/Libnet-latest.suo +0 -0
  291. data/libnet/win32/Libnet-latest.vcproj +311 -0
  292. data/libnet/win32/Libnet.dsp +337 -0
  293. data/libnet/win32/Libnet.dsw +32 -0
  294. data/libnet/win32/README.txt +57 -0
  295. data/libnet/win32/libnet_dll.def +164 -0
  296. data/test/tc_arp.rb +169 -0
  297. data/test/tc_class.rb +219 -0
  298. data/test/tc_ethernet.rb +97 -0
  299. data/test/tc_header.rb +163 -0
  300. data/test/tc_init.rb +25 -0
  301. data/test/tc_ipv4.rb +219 -0
  302. data/test/tc_ipv6.rb +235 -0
  303. data/test/tc_udp.rb +229 -0
  304. data/test/tc_vlan.rb +118 -0
  305. data/test/ts_all.rb +15 -0
  306. metadata +401 -0
@@ -0,0 +1,295 @@
1
+ /*
2
+ * $Id: libnet_port_list.c,v 1.10 2004/01/28 19:45:00 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_port_list.c - transport layer port list chaining code
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * All rights reserved.
9
+ *
10
+ * Redistribution and use in source and binary forms, with or without
11
+ * modification, are permitted provided that the following conditions
12
+ * are met:
13
+ * 1. Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ * 2. Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in the
17
+ * documentation and/or other materials provided with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
+ * SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #if (HAVE_CONFIG_H)
34
+ #include "../include/config.h"
35
+ #endif
36
+ #if (!(_WIN32) || (__CYGWIN__))
37
+ #include "../include/libnet.h"
38
+ #else
39
+ #include "../include/win32/libnet.h"
40
+ #endif
41
+
42
+ u_int16_t *all_lists;
43
+
44
+ int
45
+ libnet_plist_chain_new(libnet_t *l, libnet_plist_t **plist, char *token_list)
46
+ {
47
+ int8_t libnet_plist_legal_tokens[] = "0123456789,- ";
48
+ libnet_plist_t *tmp;
49
+ int8_t *tok;
50
+ int i, j, valid_token, cur_node;
51
+ u_int16_t *all_lists_tmp;
52
+ static u_int8_t cur_id;
53
+
54
+ if (l == NULL)
55
+ {
56
+ return (-1);
57
+ }
58
+
59
+ if (token_list == NULL)
60
+ {
61
+ return (-1);
62
+ }
63
+
64
+ /*
65
+ * Make sure we have legal tokens.
66
+ */
67
+ for (i = 0; token_list[i]; i++)
68
+ {
69
+ for (j = 0, valid_token = 0; libnet_plist_legal_tokens[j]; j++)
70
+ {
71
+ if (libnet_plist_legal_tokens[j] == token_list[i])
72
+ {
73
+ valid_token = 1;
74
+ break;
75
+ }
76
+ }
77
+ if (!valid_token)
78
+ {
79
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
80
+ "libnet_build_plist_chain: illegal token # %d (%c)\n",
81
+ i + 1,
82
+ token_list[i]);
83
+ *plist = NULL;
84
+ return (-1);
85
+ }
86
+ }
87
+
88
+ /* head node */
89
+ *plist = malloc(sizeof (libnet_plist_t));
90
+
91
+ if (!(*plist))
92
+ {
93
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
94
+ "libnet_build_plist_chain: malloc %s\n", strerror(errno));
95
+ *plist = NULL;
96
+ return (-1);
97
+ }
98
+
99
+ tmp = *plist;
100
+ tmp->node = cur_node = 0;
101
+ tmp->next = NULL;
102
+ tmp->id = cur_id;
103
+ all_lists_tmp = all_lists;
104
+ all_lists = realloc(all_lists_tmp, (sizeof(u_int16_t) * (cur_id + 1)));
105
+ if (!all_lists)
106
+ {
107
+ all_lists = all_lists_tmp;
108
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
109
+ "libnet_build_plist_chain: realloc %s\n", strerror(errno));
110
+ *plist = NULL;
111
+ return(-1);
112
+ }
113
+
114
+ all_lists[cur_id++] = 0;
115
+
116
+ /*
117
+ * Using strtok successively proved problematic. We solve this by
118
+ * calling it once, then manually extracting the elements from the token.
119
+ * In the case of bport > eport, we swap them.
120
+ */
121
+ for (i = 0; (tok = strtok(!i ? token_list : NULL, ",")); i = 1, cur_node++)
122
+ {
123
+ /*
124
+ * The first iteration we will have a head node allocated so we don't
125
+ * need to malloc().
126
+ */
127
+ if (i)
128
+ {
129
+ tmp->next = malloc(sizeof (libnet_plist_t));
130
+ if (!tmp)
131
+ {
132
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
133
+ "libnet_build_plist_chain: malloc %s\n", strerror(errno));
134
+ /*
135
+ * XXX - potential memory leak if other nodes are allocated
136
+ * but not freed.
137
+ */
138
+ *plist = NULL;
139
+ return(-1);
140
+ }
141
+ tmp = tmp->next;
142
+ tmp->node = cur_node;
143
+ tmp->next = NULL;
144
+ }
145
+ tmp->bport = atoi(tok);
146
+
147
+ /*
148
+ * Step past this port number.
149
+ */
150
+ j = 0;
151
+ while (isdigit((int)tok[j]))
152
+ {
153
+ j++;
154
+ }
155
+
156
+ /*
157
+ * If we have a delimiting dash and are NOT at the end of the token
158
+ * array, we can assume it's the end port, otherwise if we just have
159
+ * a dash, we consider it int16_thand for `inclusive of all ports up to
160
+ * 65535. Finally, if we have no dash, we assume this token is a
161
+ * single port only.
162
+ */
163
+ if (tok[j] == '-')
164
+ {
165
+ tmp->eport = (++j != strlen(tok)) ? atoi(&tok[j]) : 65535;
166
+ }
167
+ else
168
+ {
169
+ tmp->eport = tmp->bport;
170
+ }
171
+
172
+ /*
173
+ * Do we need to swap the values?
174
+ */
175
+ if (tmp->bport > tmp->eport)
176
+ {
177
+ tmp->bport ^= tmp->eport;
178
+ tmp->eport ^= tmp->bport;
179
+ tmp->bport ^= tmp->eport;
180
+ }
181
+ }
182
+
183
+ /*
184
+ * The head node needs to hold the total node count.
185
+ */
186
+ (*plist)->node = cur_node;
187
+ return (1);
188
+ }
189
+
190
+ int
191
+ libnet_plist_chain_next_pair(libnet_plist_t *plist, u_int16_t *bport,
192
+ u_int16_t *eport)
193
+ {
194
+ u_int16_t *node_cnt;
195
+ u_int16_t tmp_cnt;
196
+
197
+ node_cnt = &(all_lists[plist->id]);
198
+ if (plist == NULL)
199
+ {
200
+ return (-1);
201
+ }
202
+
203
+ /*
204
+ * We are at the end of the list.
205
+ */
206
+ if (*node_cnt == plist->node)
207
+ {
208
+ *node_cnt = 0;
209
+ *bport = 0;
210
+ *eport = 0;
211
+ return (0);
212
+ }
213
+
214
+ for (tmp_cnt = *node_cnt; tmp_cnt; tmp_cnt--, plist = plist->next) ;
215
+ *bport = plist->bport;
216
+ *eport = plist->eport;
217
+ *node_cnt += 1;
218
+ return (1);
219
+ }
220
+
221
+ int
222
+ libnet_plist_chain_dump(libnet_plist_t *plist)
223
+ {
224
+ if (plist == NULL)
225
+ {
226
+ return (-1);
227
+ }
228
+
229
+ for (; plist; plist = plist->next)
230
+ {
231
+ if (plist->bport == plist->eport)
232
+ {
233
+ fprintf(stdout, "%d ", plist->bport);
234
+ }
235
+ else
236
+ {
237
+ fprintf(stdout, "%d-%d ", plist->bport, plist->eport);
238
+ }
239
+ }
240
+ fprintf(stdout, "\n");
241
+ return (1);
242
+ }
243
+
244
+ char *
245
+ libnet_plist_chain_dump_string(libnet_plist_t *plist)
246
+ {
247
+ char buf[BUFSIZ] = {0};
248
+ int i, j;
249
+
250
+ if (plist == NULL)
251
+ {
252
+ return (NULL);
253
+ }
254
+
255
+ for (i = 0, j = 0; plist; plist = plist->next)
256
+ {
257
+ if (plist->bport == plist->eport)
258
+ {
259
+ i = snprintf(&buf[j], BUFSIZ, "%d", plist->bport);
260
+ }
261
+ else
262
+ {
263
+ i = snprintf(&buf[j], BUFSIZ, "%d-%d", plist->bport, plist->eport);
264
+ }
265
+ j += i;
266
+ if (plist->next)
267
+ {
268
+ snprintf(&buf[j++], BUFSIZ, ",");
269
+ }
270
+ }
271
+ return (strdup(buf)); /* XXX - reentrancy == no */
272
+ }
273
+
274
+ int
275
+ libnet_plist_chain_free(libnet_plist_t *plist)
276
+ {
277
+ u_int16_t i;
278
+ libnet_plist_t *tmp;
279
+
280
+ if (plist == NULL)
281
+ {
282
+ return (-1);
283
+ }
284
+
285
+ for (i = plist->node; i; i--)
286
+ {
287
+ tmp = plist;
288
+ plist = plist->next;
289
+ free(tmp);
290
+ }
291
+ plist = NULL;
292
+ return (1);
293
+ }
294
+
295
+ /* EOF */
@@ -0,0 +1,106 @@
1
+ /*
2
+ * $Id: libnet_prand.c,v 1.7 2004/01/28 19:45:00 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_prand.c - pseudo-random number generation
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * All rights reserved.
9
+ *
10
+ * Redistribution and use in source and binary forms, with or without
11
+ * modification, are permitted provided that the following conditions
12
+ * are met:
13
+ * 1. Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ * 2. Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in the
17
+ * documentation and/or other materials provided with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
+ * SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #if (HAVE_CONFIG_H)
34
+ #include "../include/config.h"
35
+ #endif
36
+ #if (!(_WIN32) || (__CYGWIN__))
37
+ #include "../include/libnet.h"
38
+ #else
39
+ #include "../include/win32/libnet.h"
40
+ #endif
41
+ int
42
+ libnet_seed_prand(libnet_t *l)
43
+ {
44
+ #if !(__WIN32__)
45
+ struct timeval seed;
46
+ #endif
47
+
48
+ if (l == NULL)
49
+ {
50
+ return (-1);
51
+ }
52
+
53
+ #if __WIN32__
54
+ srand((unsigned)time(NULL));
55
+ #else
56
+ if (gettimeofday(&seed, NULL) == -1)
57
+ {
58
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
59
+ "%s(): cannot gettimeofday\n", __func__);
60
+ return (-1);
61
+ }
62
+
63
+ /*
64
+ * More entropy then just seeding with time(2).
65
+ */
66
+ srandom((unsigned)(seed.tv_sec ^ seed.tv_usec));
67
+ #endif
68
+ return (1);
69
+ }
70
+
71
+
72
+ u_int32_t
73
+ libnet_get_prand(int mod)
74
+ {
75
+ u_int32_t n; /* 0 to 4,294,967,295 */
76
+ #ifndef _WIN32
77
+ n = random();
78
+ #else
79
+ HCRYPTPROV hProv = 0;
80
+ CryptAcquireContext(&hProv,
81
+ 0, 0, PROV_RSA_FULL,
82
+ CRYPT_VERIFYCONTEXT);
83
+
84
+ CryptGenRandom(hProv,
85
+ sizeof(n), (BYTE*)&n);
86
+ CryptReleaseContext(hProv, 0);
87
+ #endif
88
+ switch (mod)
89
+ {
90
+ case LIBNET_PR2:
91
+ return (n % 0x2); /* 0 - 1 */
92
+ case LIBNET_PR8:
93
+ return (n % 0xff); /* 0 - 255 */
94
+ case LIBNET_PR16:
95
+ return (n % 0x7fff); /* 0 - 32767 */
96
+ case LIBNET_PRu16:
97
+ return (n % 0xffff); /* 0 - 65535 */
98
+ case LIBNET_PR32:
99
+ return (n % 0x7fffffff); /* 0 - 2147483647 */
100
+ case LIBNET_PRu32:
101
+ return (n); /* 0 - 4294967295 */
102
+ }
103
+ return (0); /* NOTTREACHED */
104
+ }
105
+
106
+ /* EOF */
@@ -0,0 +1,257 @@
1
+ /*
2
+ * $Id: libnet_raw.c,v 1.9 2004/02/18 18:19:00 mike Exp $
3
+ *
4
+ * libnet
5
+ * libnet_raw.c - raw sockets routines
6
+ *
7
+ * Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
8
+ * All rights reserved.
9
+ *
10
+ * Redistribution and use in source and binary forms, with or without
11
+ * modification, are permitted provided that the following conditions
12
+ * are met:
13
+ * 1. Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ * 2. Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in the
17
+ * documentation and/or other materials provided with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
+ * SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #if (HAVE_CONFIG_H)
34
+ #include "../include/config.h"
35
+ #endif
36
+ #if (!(_WIN32) || (__CYGWIN__))
37
+ #include "../include/libnet.h"
38
+ #else
39
+ #include "../include/win32/libnet.h"
40
+ #endif
41
+
42
+ #if defined (__WIN32__)
43
+ int
44
+ libnet_open_raw4(libnet_t *l)
45
+ {
46
+ return (libnet_open_link(l));
47
+ }
48
+
49
+ int
50
+ libnet_open_raw6(libnet_t *l)
51
+ {
52
+ return (libnet_open_link(l));
53
+ }
54
+
55
+ int
56
+ libnet_close_raw4(libnet_t *l)
57
+ {
58
+ return (libnet_close_link_interface(l));
59
+ }
60
+
61
+ int
62
+ libnet_close_raw6(libnet_t *l)
63
+ {
64
+ return (libnet_close_link_interface(l));
65
+ }
66
+ #else
67
+ int
68
+ libnet_open_raw4(libnet_t *l)
69
+ {
70
+ int len;
71
+
72
+ #if !(__WIN32__)
73
+ int n = 1;
74
+ #if (__svr4__)
75
+ void *nptr = &n;
76
+ #else
77
+ int *nptr = &n;
78
+ #endif /* __svr4__ */
79
+ #else
80
+ BOOL n;
81
+ #endif
82
+
83
+ if (l == NULL)
84
+ {
85
+ return (-1);
86
+ }
87
+
88
+ l->fd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
89
+ if (l->fd == -1)
90
+ {
91
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
92
+ "%s(): SOCK_RAW allocation failed: %s\n",
93
+ __func__, strerror(errno));
94
+ goto bad;
95
+ }
96
+
97
+ #ifdef IP_HDRINCL
98
+ /*
99
+ * man raw
100
+ *
101
+ * The IPv4 layer generates an IP header when sending a packet unless
102
+ * the IP_HDRINCL socket option is enabled on the socket. When it
103
+ * is enabled, the packet must contain an IP header. For
104
+ * receiving the IP header is always included in the packet.
105
+ */
106
+ #if !(__WIN32__)
107
+ if (setsockopt(l->fd, IPPROTO_IP, IP_HDRINCL, nptr, sizeof(n)) == -1)
108
+ #else
109
+ n = TRUE;
110
+ if (setsockopt(l->fd, IPPROTO_IP, IP_HDRINCL, (int8_t *)&n,
111
+ sizeof(n)) == -1)
112
+ #endif
113
+
114
+ {
115
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
116
+ "%s(): set IP_HDRINCL failed: %s\n",
117
+ __func__, strerror(errno));
118
+ goto bad;
119
+ }
120
+ #endif /* IP_HDRINCL */
121
+
122
+ #ifdef SO_SNDBUF
123
+
124
+ /*
125
+ * man 7 socket
126
+ *
127
+ * Sets and gets the maximum socket send buffer in bytes.
128
+ *
129
+ * Taken from libdnet by Dug Song
130
+ */
131
+ len = sizeof(n);
132
+ if (getsockopt(l->fd, SOL_SOCKET, SO_SNDBUF, &n, &len) < 0)
133
+ {
134
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
135
+ "%s(): get SO_SNDBUF failed: %s\n",
136
+ __func__, strerror(errno));
137
+ goto bad;
138
+ }
139
+
140
+ for (n += 128; n < 1048576; n += 128)
141
+ {
142
+ if (setsockopt(l->fd, SOL_SOCKET, SO_SNDBUF, &n, len) < 0)
143
+ {
144
+ if (errno == ENOBUFS)
145
+ {
146
+ break;
147
+ }
148
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
149
+ "%s(): set SO_SNDBUF failed: %s\n",
150
+ __func__, strerror(errno));
151
+ goto bad;
152
+ }
153
+ }
154
+ #endif
155
+
156
+ #ifdef SO_BROADCAST
157
+ /*
158
+ * man 7 socket
159
+ *
160
+ * Set or get the broadcast flag. When enabled, datagram sockets
161
+ * receive packets sent to a broadcast address and they are allowed
162
+ * to send packets to a broadcast address. This option has no
163
+ * effect on stream-oriented sockets.
164
+ */
165
+ if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, nptr, sizeof(n)) == -1)
166
+ {
167
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
168
+ "%s(): set SO_BROADCAST failed: %s\n",
169
+ __func__, strerror(errno));
170
+ goto bad;
171
+ }
172
+ #endif /* SO_BROADCAST */
173
+ return (l->fd);
174
+
175
+ bad:
176
+ return (-1);
177
+ }
178
+
179
+
180
+ int
181
+ libnet_close_raw4(libnet_t *l)
182
+ {
183
+ if (l == NULL)
184
+ {
185
+ return (-1);
186
+ }
187
+
188
+ return (close(l->fd));
189
+ }
190
+
191
+ #if ((defined HAVE_SOLARIS && !defined HAVE_SOLARIS_IPV6) || defined (__WIN32__))
192
+ int libnet_open_raw6(libnet_t *l)
193
+ {
194
+ return (-1);
195
+ }
196
+
197
+ #else
198
+ int
199
+ libnet_open_raw6(libnet_t *l)
200
+ {
201
+ #if !(__WIN32__)
202
+ #if (__svr4__)
203
+ int one = 1;
204
+ void *oneptr = &one;
205
+ #else
206
+ #if (__linux__)
207
+ int one = 1;
208
+ int *oneptr = &one;
209
+ #endif
210
+ #endif /* __svr4__ */
211
+ #else
212
+ BOOL one;
213
+ #endif
214
+
215
+ /* Solaris IPv6 stuff */
216
+
217
+ if (l == NULL)
218
+ {
219
+ return (-1);
220
+ }
221
+
222
+ l->fd = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW);
223
+ if (l->fd == -1)
224
+ {
225
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
226
+ "%s(): SOCK_RAW allocation failed: %s\n", __func__,
227
+ strerror(errno));
228
+ goto bad;
229
+ }
230
+
231
+ #if (__linux__)
232
+ if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, oneptr, sizeof(one)) == -1)
233
+ {
234
+ snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
235
+ "%s(): set SO_BROADCAST failed: %s\n", __func__,
236
+ strerror(errno));
237
+ goto bad;
238
+ }
239
+ #endif /* __linux__ */
240
+ return (l->fd);
241
+
242
+ bad:
243
+ return (-1);
244
+ }
245
+ #endif
246
+
247
+ int
248
+ libnet_close_raw6(libnet_t *l)
249
+ {
250
+ if (l == NULL)
251
+ {
252
+ return (-1);
253
+ }
254
+ return (close(l->fd));
255
+ }
256
+ #endif
257
+ /* EOF */