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.
- data/CHANGELOG +15 -0
- data/LICENSE +28 -0
- data/README +187 -0
- data/Rakefile +110 -0
- data/ext/extconf.rb +60 -0
- data/ext/libnet.c +705 -0
- data/ext/libnet_arp.c +152 -0
- data/ext/libnet_ethernet.c +115 -0
- data/ext/libnet_ipv4.c +140 -0
- data/ext/libnet_ipv6.c +138 -0
- data/ext/libnet_udp.c +112 -0
- data/ext/libnet_vlan.c +131 -0
- data/lib/libnet4r/header.rb +609 -0
- data/lib/libnet4r/helpers.rb +19 -0
- data/lib/libnet4r/libnet.rb +39 -0
- data/libnet/CVS/Entries +24 -0
- data/libnet/CVS/Repository +1 -0
- data/libnet/CVS/Root +1 -0
- data/libnet/Makefile.am +15 -0
- data/libnet/Makefile.am.common +10 -0
- data/libnet/Makefile.in +443 -0
- data/libnet/README +21 -0
- data/libnet/VERSION +1 -0
- data/libnet/acconfig.h +36 -0
- data/libnet/acinclude.m4 +463 -0
- data/libnet/aclocal.m4 +1337 -0
- data/libnet/autom4te.cache/CVS/Entries +1 -0
- data/libnet/autom4te.cache/CVS/Repository +1 -0
- data/libnet/autom4te.cache/CVS/Root +1 -0
- data/libnet/autom4te.cache/output.0 +6225 -0
- data/libnet/autom4te.cache/requests +111 -0
- data/libnet/autom4te.cache/traces.0 +272 -0
- data/libnet/config.guess +1314 -0
- data/libnet/config.sub +1410 -0
- data/libnet/configure +6225 -0
- data/libnet/configure.in +235 -0
- data/libnet/doc/BUGS +19 -0
- data/libnet/doc/CHANGELOG +527 -0
- data/libnet/doc/CONTRIB +53 -0
- data/libnet/doc/COPYING +31 -0
- data/libnet/doc/CVS/Entries +12 -0
- data/libnet/doc/CVS/Repository +1 -0
- data/libnet/doc/CVS/Root +1 -0
- data/libnet/doc/DESIGN_NOTES +134 -0
- data/libnet/doc/MIGRATION +172 -0
- data/libnet/doc/PACKET_BUILDING +161 -0
- data/libnet/doc/PORTED +45 -0
- data/libnet/doc/RAWSOCKET_NON_SEQUITUR +41 -0
- data/libnet/doc/TODO +96 -0
- data/libnet/doc/html/acconfig_8h-source.html +49 -0
- data/libnet/doc/html/annotated.html +17 -0
- data/libnet/doc/html/bpf_8h-source.html +277 -0
- data/libnet/doc/html/config_8h-source.html +125 -0
- data/libnet/doc/html/doxygen.css +169 -0
- data/libnet/doc/html/doxygen.png +0 -0
- data/libnet/doc/html/files.html +29 -0
- data/libnet/doc/html/functions.html +26 -0
- data/libnet/doc/html/functions_vars.html +26 -0
- data/libnet/doc/html/getopt_8h-source.html +97 -0
- data/libnet/doc/html/globals.html +219 -0
- data/libnet/doc/html/globals_defs.html +104 -0
- data/libnet/doc/html/globals_func.html +136 -0
- data/libnet/doc/html/gnuc_8h-source.html +56 -0
- data/libnet/doc/html/graph_legend.dot +22 -0
- data/libnet/doc/html/graph_legend.html +75 -0
- data/libnet/doc/html/ifaddrlist_8h-source.html +65 -0
- data/libnet/doc/html/in__systm_8h-source.html +90 -0
- data/libnet/doc/html/index.html +17 -0
- data/libnet/doc/html/libnet-asn1_8h-source.html +268 -0
- data/libnet/doc/html/libnet-functions_8h-source.html +742 -0
- data/libnet/doc/html/libnet-functions_8h.html +8844 -0
- data/libnet/doc/html/libnet-headers_8h-source.html +1655 -0
- data/libnet/doc/html/libnet-headers_8h.html +3053 -0
- data/libnet/doc/html/libnet-macros_8h-source.html +161 -0
- data/libnet/doc/html/libnet-macros_8h.html +358 -0
- data/libnet/doc/html/libnet-structures_8h-source.html +233 -0
- data/libnet/doc/html/libnet-types_8h-source.html +58 -0
- data/libnet/doc/html/libnet_8h-source.html +119 -0
- data/libnet/doc/html/libnet_8h.html +24 -0
- data/libnet/doc/html/structlibnet__802__1q__hdr.html +145 -0
- data/libnet/doc/html/structlibnet__802__1x__hdr.html +97 -0
- data/libnet/doc/libnet.doxygen.conf +1102 -0
- data/libnet/doc/man/CVS/Entries +1 -0
- data/libnet/doc/man/CVS/Repository +1 -0
- data/libnet/doc/man/CVS/Root +1 -0
- data/libnet/doc/man/man3/libnet-functions.h.3 +3136 -0
- data/libnet/doc/man/man3/libnet-headers.h.3 +1872 -0
- data/libnet/doc/man/man3/libnet-macros.h.3 +172 -0
- data/libnet/doc/man/man3/libnet.h.3 +17 -0
- data/libnet/doc/man/man3/libnet_802_1q_hdr.3 +53 -0
- data/libnet/doc/man/man3/libnet_802_1x_hdr.3 +41 -0
- data/libnet/include/CVS/Entries +10 -0
- data/libnet/include/CVS/Repository +1 -0
- data/libnet/include/CVS/Root +1 -0
- data/libnet/include/Makefile.am +7 -0
- data/libnet/include/Makefile.in +395 -0
- data/libnet/include/bpf.h +264 -0
- data/libnet/include/config.h.in +118 -0
- data/libnet/include/gnuc.h +43 -0
- data/libnet/include/ifaddrlist.h +52 -0
- data/libnet/include/libnet/CVS/Entries +9 -0
- data/libnet/include/libnet/CVS/Repository +1 -0
- data/libnet/include/libnet/CVS/Root +1 -0
- data/libnet/include/libnet/Makefile.am +12 -0
- data/libnet/include/libnet/Makefile.in +294 -0
- data/libnet/include/libnet/libnet-asn1.h +255 -0
- data/libnet/include/libnet/libnet-functions.h +2157 -0
- data/libnet/include/libnet/libnet-headers.h +1662 -0
- data/libnet/include/libnet/libnet-macros.h +186 -0
- data/libnet/include/libnet/libnet-structures.h +222 -0
- data/libnet/include/libnet/libnet-types.h +45 -0
- data/libnet/include/libnet.h.in +132 -0
- data/libnet/include/stamp-h.in +1 -0
- data/libnet/include/win32/CVS/Entries +5 -0
- data/libnet/include/win32/CVS/Repository +1 -0
- data/libnet/include/win32/CVS/Root +1 -0
- data/libnet/include/win32/config.h +112 -0
- data/libnet/include/win32/getopt.h +84 -0
- data/libnet/include/win32/in_systm.h +77 -0
- data/libnet/include/win32/libnet.h +106 -0
- data/libnet/install-sh +250 -0
- data/libnet/libnet-config.in +62 -0
- data/libnet/libnet.doxygen.conf +1102 -0
- data/libnet/man/CVS/Entries +1 -0
- data/libnet/man/CVS/Repository +1 -0
- data/libnet/man/CVS/Root +1 -0
- data/libnet/missing +283 -0
- data/libnet/mkinstalldirs +40 -0
- data/libnet/sample/CVS/Entries +47 -0
- data/libnet/sample/CVS/Repository +1 -0
- data/libnet/sample/CVS/Root +1 -0
- data/libnet/sample/Makefile.am +63 -0
- data/libnet/sample/Makefile.in +729 -0
- data/libnet/sample/arp-new.c +144 -0
- data/libnet/sample/arp.c +151 -0
- data/libnet/sample/bgp4_hdr.c +225 -0
- data/libnet/sample/bgp4_notification.c +242 -0
- data/libnet/sample/bgp4_open.c +266 -0
- data/libnet/sample/bgp4_update.c +337 -0
- data/libnet/sample/cdp.c +187 -0
- data/libnet/sample/dhcp_discover.c +257 -0
- data/libnet/sample/dns.c +260 -0
- data/libnet/sample/dot1x.c +113 -0
- data/libnet/sample/fddi_tcp1.c +213 -0
- data/libnet/sample/fddi_tcp2.c +209 -0
- data/libnet/sample/get_addr.c +112 -0
- data/libnet/sample/gre.c +410 -0
- data/libnet/sample/icmp6_echoreq.c +184 -0
- data/libnet/sample/icmp_echo_cq.c +201 -0
- data/libnet/sample/icmp_redirect.c +200 -0
- data/libnet/sample/icmp_timeexceed.c +190 -0
- data/libnet/sample/icmp_timestamp.c +157 -0
- data/libnet/sample/icmp_unreach.c +204 -0
- data/libnet/sample/ieee.c +177 -0
- data/libnet/sample/ip_link.c +201 -0
- data/libnet/sample/ip_raw.c +180 -0
- data/libnet/sample/isl.c +167 -0
- data/libnet/sample/libnet_test.h +60 -0
- data/libnet/sample/mpls.c +251 -0
- data/libnet/sample/ntp.c +193 -0
- data/libnet/sample/ospf_hello.c +179 -0
- data/libnet/sample/ospf_lsa.c +190 -0
- data/libnet/sample/ping_of_death.c +171 -0
- data/libnet/sample/rpc_tcp.c +214 -0
- data/libnet/sample/rpc_udp.c +213 -0
- data/libnet/sample/sebek.c +299 -0
- data/libnet/sample/smurf.c +194 -0
- data/libnet/sample/stp.c +227 -0
- data/libnet/sample/synflood.c +200 -0
- data/libnet/sample/synflood6.c +209 -0
- data/libnet/sample/synflood6_frag.c +234 -0
- data/libnet/sample/tcp1.c +227 -0
- data/libnet/sample/tcp2.c +192 -0
- data/libnet/sample/tftp.c +207 -0
- data/libnet/sample/tring_tcp1.c +214 -0
- data/libnet/sample/tring_tcp2.c +210 -0
- data/libnet/sample/udp1.c +223 -0
- data/libnet/sample/udp2.c +232 -0
- data/libnet/sample/win32/CVS/Entries +9 -0
- data/libnet/sample/win32/CVS/Repository +1 -0
- data/libnet/sample/win32/CVS/Root +1 -0
- data/libnet/sample/win32/arp/CVS/Entries +2 -0
- data/libnet/sample/win32/arp/CVS/Repository +1 -0
- data/libnet/sample/win32/arp/CVS/Root +1 -0
- data/libnet/sample/win32/arp/arp.vcproj +136 -0
- data/libnet/sample/win32/cdp/CVS/Entries +2 -0
- data/libnet/sample/win32/cdp/CVS/Repository +1 -0
- data/libnet/sample/win32/cdp/CVS/Root +1 -0
- data/libnet/sample/win32/cdp/cdp.vcproj +136 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Entries +2 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Repository +1 -0
- data/libnet/sample/win32/dhcp_discover/CVS/Root +1 -0
- data/libnet/sample/win32/dhcp_discover/dhcp_discover.vcproj +139 -0
- data/libnet/sample/win32/dns/CVS/Entries +2 -0
- data/libnet/sample/win32/dns/CVS/Repository +1 -0
- data/libnet/sample/win32/dns/CVS/Root +1 -0
- data/libnet/sample/win32/dns/dns.vcproj +139 -0
- data/libnet/sample/win32/get_addr/CVS/Entries +2 -0
- data/libnet/sample/win32/get_addr/CVS/Repository +1 -0
- data/libnet/sample/win32/get_addr/CVS/Root +1 -0
- data/libnet/sample/win32/get_addr/get_addr.vcproj +139 -0
- data/libnet/sample/win32/getopt.c +121 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Entries +2 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Repository +1 -0
- data/libnet/sample/win32/icmp_echo_cq/CVS/Root +1 -0
- data/libnet/sample/win32/icmp_echo_cq/icmp_echo_cq.vcproj +139 -0
- data/libnet/sample/win32/tcp1/CVS/Entries +2 -0
- data/libnet/sample/win32/tcp1/CVS/Repository +1 -0
- data/libnet/sample/win32/tcp1/CVS/Root +1 -0
- data/libnet/sample/win32/tcp1/tcp1.vcproj +142 -0
- data/libnet/sample/win32/udp1/CVS/Entries +3 -0
- data/libnet/sample/win32/udp1/CVS/Repository +1 -0
- data/libnet/sample/win32/udp1/CVS/Root +1 -0
- data/libnet/sample/win32/udp1/dns.vcproj +125 -0
- data/libnet/sample/win32/udp1/udp1.vcproj +139 -0
- data/libnet/src/CVS/Entries +60 -0
- data/libnet/src/CVS/Repository +1 -0
- data/libnet/src/CVS/Root +1 -0
- data/libnet/src/Makefile.am +71 -0
- data/libnet/src/Makefile.in +428 -0
- data/libnet/src/libnet_advanced.c +136 -0
- data/libnet/src/libnet_asn1.c +436 -0
- data/libnet/src/libnet_build_802.1q.c +115 -0
- data/libnet/src/libnet_build_802.1x.c +103 -0
- data/libnet/src/libnet_build_802.2.c +167 -0
- data/libnet/src/libnet_build_802.3.c +101 -0
- data/libnet/src/libnet_build_arp.c +169 -0
- data/libnet/src/libnet_build_bgp.c +350 -0
- data/libnet/src/libnet_build_cdp.c +191 -0
- data/libnet/src/libnet_build_data.c +90 -0
- data/libnet/src/libnet_build_dhcp.c +156 -0
- data/libnet/src/libnet_build_dns.c +129 -0
- data/libnet/src/libnet_build_ethernet.c +173 -0
- data/libnet/src/libnet_build_fddi.c +191 -0
- data/libnet/src/libnet_build_gre.c +427 -0
- data/libnet/src/libnet_build_icmp.c +437 -0
- data/libnet/src/libnet_build_igmp.c +112 -0
- data/libnet/src/libnet_build_ip.c +892 -0
- data/libnet/src/libnet_build_ipsec.c +232 -0
- data/libnet/src/libnet_build_isl.c +113 -0
- data/libnet/src/libnet_build_link.c +90 -0
- data/libnet/src/libnet_build_mpls.c +112 -0
- data/libnet/src/libnet_build_ntp.c +121 -0
- data/libnet/src/libnet_build_ospf.c +699 -0
- data/libnet/src/libnet_build_rip.c +108 -0
- data/libnet/src/libnet_build_rpc.c +138 -0
- data/libnet/src/libnet_build_sebek.c +108 -0
- data/libnet/src/libnet_build_snmp.c +52 -0
- data/libnet/src/libnet_build_stp.c +222 -0
- data/libnet/src/libnet_build_tcp.c +365 -0
- data/libnet/src/libnet_build_token_ring.c +193 -0
- data/libnet/src/libnet_build_udp.c +111 -0
- data/libnet/src/libnet_build_vrrp.c +117 -0
- data/libnet/src/libnet_checksum.c +376 -0
- data/libnet/src/libnet_cq.c +395 -0
- data/libnet/src/libnet_crc.c +113 -0
- data/libnet/src/libnet_dll.c +47 -0
- data/libnet/src/libnet_error.c +55 -0
- data/libnet/src/libnet_if_addr.c +415 -0
- data/libnet/src/libnet_init.c +234 -0
- data/libnet/src/libnet_internal.c +310 -0
- data/libnet/src/libnet_link_bpf.c +348 -0
- data/libnet/src/libnet_link_dlpi.c +785 -0
- data/libnet/src/libnet_link_linux.c +310 -0
- data/libnet/src/libnet_link_nit.c +125 -0
- data/libnet/src/libnet_link_none.c +66 -0
- data/libnet/src/libnet_link_pf.c +179 -0
- data/libnet/src/libnet_link_snit.c +149 -0
- data/libnet/src/libnet_link_snoop.c +166 -0
- data/libnet/src/libnet_link_win32.c +346 -0
- data/libnet/src/libnet_pblock.c +511 -0
- data/libnet/src/libnet_port_list.c +295 -0
- data/libnet/src/libnet_prand.c +106 -0
- data/libnet/src/libnet_raw.c +257 -0
- data/libnet/src/libnet_resolve.c +414 -0
- data/libnet/src/libnet_version.c +54 -0
- data/libnet/src/libnet_write.c +502 -0
- data/libnet/version.h.in +6 -0
- data/libnet/win32/CVS/Entries +15 -0
- data/libnet/win32/CVS/Repository +1 -0
- data/libnet/win32/CVS/Root +1 -0
- data/libnet/win32/Libnet-1.1.1-2002.sln +77 -0
- data/libnet/win32/Libnet-1.1.1-2003.ncb +0 -0
- data/libnet/win32/Libnet-1.1.1-2003.sln +84 -0
- data/libnet/win32/Libnet-1.1.1-2003.suo +0 -0
- data/libnet/win32/Libnet-1.1.1.vcproj +311 -0
- data/libnet/win32/Libnet-latest.ncb +0 -0
- data/libnet/win32/Libnet-latest.opt +0 -0
- data/libnet/win32/Libnet-latest.sln +77 -0
- data/libnet/win32/Libnet-latest.suo +0 -0
- data/libnet/win32/Libnet-latest.vcproj +311 -0
- data/libnet/win32/Libnet.dsp +337 -0
- data/libnet/win32/Libnet.dsw +32 -0
- data/libnet/win32/README.txt +57 -0
- data/libnet/win32/libnet_dll.def +164 -0
- data/test/tc_arp.rb +169 -0
- data/test/tc_class.rb +219 -0
- data/test/tc_ethernet.rb +97 -0
- data/test/tc_header.rb +163 -0
- data/test/tc_init.rb +25 -0
- data/test/tc_ipv4.rb +219 -0
- data/test/tc_ipv6.rb +235 -0
- data/test/tc_udp.rb +229 -0
- data/test/tc_vlan.rb +118 -0
- data/test/ts_all.rb +15 -0
- 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 */
|