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,310 @@
|
|
1
|
+
/*
|
2
|
+
* $Id: libnet_link_linux.c,v 1.5 2004/01/03 20:31:02 mike Exp $
|
3
|
+
*
|
4
|
+
* libnet 1.1
|
5
|
+
* libnet_link_linux.c - linux packet socket and pack socket 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: (1) source code distributions
|
12
|
+
* retain the above copyright notice and this paragraph in its entirety, (2)
|
13
|
+
* distributions including binary code include the above copyright notice and
|
14
|
+
* this paragraph in its entirety in the documentation or other materials
|
15
|
+
* provided with the distribution, and (3) all advertising materials mentioning
|
16
|
+
* features or use of this software display the following acknowledgement:
|
17
|
+
* ``This product includes software developed by the University of California,
|
18
|
+
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
19
|
+
* the University nor the names of its contributors may be used to endorse
|
20
|
+
* or promote products derived from this software without specific prior
|
21
|
+
* written permission.
|
22
|
+
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
23
|
+
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
24
|
+
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
25
|
+
*/
|
26
|
+
|
27
|
+
#if (HAVE_CONFIG_H)
|
28
|
+
#include "../include/config.h"
|
29
|
+
#endif
|
30
|
+
#include <sys/time.h>
|
31
|
+
|
32
|
+
#include <net/if.h>
|
33
|
+
#if (__GLIBC__)
|
34
|
+
#include <netinet/if_ether.h>
|
35
|
+
#include <net/if_arp.h>
|
36
|
+
#else
|
37
|
+
#include <linux/if_arp.h>
|
38
|
+
#include <linux/if_ether.h>
|
39
|
+
#endif
|
40
|
+
|
41
|
+
#if (HAVE_PACKET_SOCKET)
|
42
|
+
#ifndef SOL_PACKET
|
43
|
+
#define SOL_PACKET 263
|
44
|
+
#endif /* SOL_PACKET */
|
45
|
+
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
|
46
|
+
#include <netpacket/packet.h>
|
47
|
+
#include <net/ethernet.h> /* the L2 protocols */
|
48
|
+
#else
|
49
|
+
#include <asm/types.h>
|
50
|
+
#include <linux/if_packet.h>
|
51
|
+
#include <linux/if_ether.h> /* The L2 protocols */
|
52
|
+
#endif
|
53
|
+
#endif /* HAVE_PACKET_SOCKET */
|
54
|
+
|
55
|
+
#include "../include/bpf.h"
|
56
|
+
#include "../include/libnet.h"
|
57
|
+
|
58
|
+
#include "../include/gnuc.h"
|
59
|
+
#ifdef HAVE_OS_PROTO_H
|
60
|
+
#include "../include/os-proto.h"
|
61
|
+
#endif
|
62
|
+
|
63
|
+
|
64
|
+
int
|
65
|
+
libnet_open_link(libnet_t *l)
|
66
|
+
{
|
67
|
+
struct ifreq ifr;
|
68
|
+
int n = 1;
|
69
|
+
|
70
|
+
if (l == NULL)
|
71
|
+
{
|
72
|
+
return (-1);
|
73
|
+
}
|
74
|
+
|
75
|
+
#if (HAVE_PACKET_SOCKET)
|
76
|
+
l->fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
|
77
|
+
#else
|
78
|
+
l->fd = socket(PF_INET, SOCK_PACKET, htons(ETH_P_ALL));
|
79
|
+
#endif
|
80
|
+
if (l->fd == -1)
|
81
|
+
{
|
82
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
83
|
+
"socket: %s", strerror(errno));
|
84
|
+
goto bad;
|
85
|
+
}
|
86
|
+
|
87
|
+
memset(&ifr, 0, sizeof (ifr));
|
88
|
+
strncpy(ifr.ifr_name, l->device, sizeof (ifr.ifr_name) -1);
|
89
|
+
ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
|
90
|
+
|
91
|
+
if (ioctl(l->fd, SIOCGIFHWADDR, &ifr) < 0 )
|
92
|
+
{
|
93
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
94
|
+
"SIOCGIFHWADDR: %s", strerror(errno));
|
95
|
+
goto bad;
|
96
|
+
}
|
97
|
+
|
98
|
+
switch (ifr.ifr_hwaddr.sa_family)
|
99
|
+
{
|
100
|
+
case ARPHRD_ETHER:
|
101
|
+
case ARPHRD_METRICOM:
|
102
|
+
#ifdef ARPHRD_LOOPBACK
|
103
|
+
case ARPHRD_LOOPBACK:
|
104
|
+
#endif
|
105
|
+
l->link_type = DLT_EN10MB;
|
106
|
+
l->link_offset = 0xe;
|
107
|
+
break;
|
108
|
+
case ARPHRD_SLIP:
|
109
|
+
case ARPHRD_CSLIP:
|
110
|
+
case ARPHRD_SLIP6:
|
111
|
+
case ARPHRD_CSLIP6:
|
112
|
+
case ARPHRD_PPP:
|
113
|
+
l->link_type = DLT_RAW;
|
114
|
+
break;
|
115
|
+
case ARPHRD_FDDI:
|
116
|
+
l->link_type = DLT_FDDI;
|
117
|
+
l->link_offset = 0x15;
|
118
|
+
break;
|
119
|
+
/* Token Ring */
|
120
|
+
case ARPHRD_IEEE802:
|
121
|
+
case ARPHRD_IEEE802_TR:
|
122
|
+
case ARPHRD_PRONET:
|
123
|
+
l->link_type = DLT_PRONET;
|
124
|
+
l->link_offset = 0x16;
|
125
|
+
break;
|
126
|
+
|
127
|
+
default:
|
128
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
129
|
+
"unknown physical layer type 0x%x\n",
|
130
|
+
ifr.ifr_hwaddr.sa_family);
|
131
|
+
goto bad;
|
132
|
+
}
|
133
|
+
#ifdef SO_BROADCAST
|
134
|
+
/*
|
135
|
+
* man 7 socket
|
136
|
+
*
|
137
|
+
* Set or get the broadcast flag. When enabled, datagram sockets
|
138
|
+
* receive packets sent to a broadcast address and they are allowed
|
139
|
+
* to send packets to a broadcast address. This option has no
|
140
|
+
* effect on stream-oriented sockets.
|
141
|
+
*/
|
142
|
+
if (setsockopt(l->fd, SOL_SOCKET, SO_BROADCAST, &n, sizeof(n)) == -1)
|
143
|
+
{
|
144
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
145
|
+
"%s: set SO_BROADCAST failed: %s\n",
|
146
|
+
__func__, strerror(errno));
|
147
|
+
goto bad;
|
148
|
+
}
|
149
|
+
#endif /* SO_BROADCAST */
|
150
|
+
|
151
|
+
return (1);
|
152
|
+
|
153
|
+
bad:
|
154
|
+
if (l->fd >= 0)
|
155
|
+
{
|
156
|
+
close(l->fd);
|
157
|
+
}
|
158
|
+
return (-1);
|
159
|
+
}
|
160
|
+
|
161
|
+
|
162
|
+
int
|
163
|
+
libnet_close_link(libnet_t *l)
|
164
|
+
{
|
165
|
+
if (close(l->fd) == 0)
|
166
|
+
{
|
167
|
+
return (1);
|
168
|
+
}
|
169
|
+
else
|
170
|
+
{
|
171
|
+
return (-1);
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
|
176
|
+
#if (HAVE_PACKET_SOCKET)
|
177
|
+
static int
|
178
|
+
get_iface_index(int fd, const int8_t *device)
|
179
|
+
{
|
180
|
+
struct ifreq ifr;
|
181
|
+
|
182
|
+
/* memset(&ifr, 0, sizeof(ifr)); */
|
183
|
+
strncpy (ifr.ifr_name, device, sizeof(ifr.ifr_name) - 1);
|
184
|
+
ifr.ifr_name[sizeof(ifr.ifr_name)-1] = '\0';
|
185
|
+
|
186
|
+
if (ioctl(fd, SIOCGIFINDEX, &ifr) == -1)
|
187
|
+
{
|
188
|
+
return (-1);
|
189
|
+
}
|
190
|
+
|
191
|
+
return ifr.ifr_ifindex;
|
192
|
+
}
|
193
|
+
#endif
|
194
|
+
|
195
|
+
|
196
|
+
int
|
197
|
+
libnet_write_link(libnet_t *l, u_int8_t *packet, u_int32_t size)
|
198
|
+
{
|
199
|
+
int c;
|
200
|
+
#if (HAVE_PACKET_SOCKET)
|
201
|
+
struct sockaddr_ll sa;
|
202
|
+
#else
|
203
|
+
struct sockaddr sa;
|
204
|
+
#endif
|
205
|
+
|
206
|
+
/* corey: move check for UID/EUID of 0 from libnet_init() to here */
|
207
|
+
if (getuid() && geteuid())
|
208
|
+
{
|
209
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
210
|
+
"%s(): UID or EUID of 0 required\n", __func__);
|
211
|
+
return -1;
|
212
|
+
}
|
213
|
+
|
214
|
+
if (l == NULL)
|
215
|
+
{
|
216
|
+
return (-1);
|
217
|
+
}
|
218
|
+
|
219
|
+
/* corey: open socket if necessary */
|
220
|
+
if (l->fd == -1) {
|
221
|
+
if (libnet_open_socket(l) == -1) {
|
222
|
+
return -1;
|
223
|
+
}
|
224
|
+
}
|
225
|
+
|
226
|
+
memset(&sa, 0, sizeof (sa));
|
227
|
+
#if (HAVE_PACKET_SOCKET)
|
228
|
+
sa.sll_family = AF_PACKET;
|
229
|
+
sa.sll_ifindex = get_iface_index(l->fd, l->device);
|
230
|
+
if (sa.sll_ifindex == -1)
|
231
|
+
{
|
232
|
+
return (-1);
|
233
|
+
}
|
234
|
+
sa.sll_protocol = htons(ETH_P_ALL);
|
235
|
+
#else
|
236
|
+
strncpy(sa.sa_data, l->device, sizeof (sa.sa_data) - 1);
|
237
|
+
sa.sa_data[sizeof (sa.sa_data) - 1] = 0;
|
238
|
+
#endif
|
239
|
+
|
240
|
+
c = sendto(l->fd, packet, size, 0,
|
241
|
+
(struct sockaddr *)&sa, sizeof (sa));
|
242
|
+
if (c != size)
|
243
|
+
{
|
244
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
245
|
+
"libnet_write_link(): only %d bytes written (%s)\n", c,
|
246
|
+
strerror(errno));
|
247
|
+
}
|
248
|
+
return (c);
|
249
|
+
}
|
250
|
+
|
251
|
+
|
252
|
+
struct libnet_ether_addr *
|
253
|
+
libnet_get_hwaddr(libnet_t *l)
|
254
|
+
{
|
255
|
+
int fd;
|
256
|
+
struct ifreq ifr;
|
257
|
+
struct libnet_ether_addr *eap;
|
258
|
+
/*
|
259
|
+
* XXX - non-re-entrant!
|
260
|
+
*/
|
261
|
+
static struct libnet_ether_addr ea;
|
262
|
+
|
263
|
+
if (l == NULL)
|
264
|
+
{
|
265
|
+
return (NULL);
|
266
|
+
}
|
267
|
+
|
268
|
+
if (l->device == NULL)
|
269
|
+
{
|
270
|
+
if (libnet_select_device(l) == -1)
|
271
|
+
{
|
272
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
273
|
+
"libnet_get_hwaddr: can't figure out a device to use\n");
|
274
|
+
return (NULL);
|
275
|
+
}
|
276
|
+
}
|
277
|
+
|
278
|
+
/*
|
279
|
+
* Create dummy socket to perform an ioctl upon.
|
280
|
+
*/
|
281
|
+
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
282
|
+
if (fd < 0)
|
283
|
+
{
|
284
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
285
|
+
"socket: %s", strerror(errno));
|
286
|
+
goto bad;
|
287
|
+
}
|
288
|
+
|
289
|
+
memset(&ifr, 0, sizeof(ifr));
|
290
|
+
eap = &ea;
|
291
|
+
strncpy(ifr.ifr_name, l->device, sizeof(ifr.ifr_name) - 1);
|
292
|
+
ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = '\0';
|
293
|
+
|
294
|
+
if (ioctl(fd, SIOCGIFHWADDR, (int8_t *)&ifr) < 0)
|
295
|
+
{
|
296
|
+
close(fd);
|
297
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
298
|
+
"ioctl: %s", strerror(errno));
|
299
|
+
goto bad;
|
300
|
+
}
|
301
|
+
memcpy(eap, &ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
|
302
|
+
close(fd);
|
303
|
+
return (eap);
|
304
|
+
|
305
|
+
bad:
|
306
|
+
return (NULL);
|
307
|
+
}
|
308
|
+
|
309
|
+
|
310
|
+
/* EOF */
|
@@ -0,0 +1,125 @@
|
|
1
|
+
/*
|
2
|
+
* $Id: libnet_link_nit.c,v 1.6 2004/01/03 20:31:02 mike Exp $
|
3
|
+
*
|
4
|
+
* libnet
|
5
|
+
* libnet_nit.c - network interface tap routines
|
6
|
+
*
|
7
|
+
* Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
|
8
|
+
* All rights reserved.
|
9
|
+
*
|
10
|
+
* Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
|
11
|
+
* The Regents of the University of California. All rights reserved.
|
12
|
+
*
|
13
|
+
* Redistribution and use in source and binary forms, with or without
|
14
|
+
* modification, are permitted provided that: (1) source code distributions
|
15
|
+
* retain the above copyright notice and this paragraph in its entirety, (2)
|
16
|
+
* distributions including binary code include the above copyright notice and
|
17
|
+
* this paragraph in its entirety in the documentation or other materials
|
18
|
+
* provided with the distribution, and (3) all advertising materials mentioning
|
19
|
+
* features or use of this software display the following acknowledgement:
|
20
|
+
* ``This product includes software developed by the University of California,
|
21
|
+
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
22
|
+
* the University nor the names of its contributors may be used to endorse
|
23
|
+
* or promote products derived from this software without specific prior
|
24
|
+
* written permission.
|
25
|
+
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
26
|
+
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
27
|
+
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#if (HAVE_CONFIG_H)
|
31
|
+
#include "../include/config.h"
|
32
|
+
#endif
|
33
|
+
#if (!(_WIN32) || (__CYGWIN__))
|
34
|
+
#include "../include/libnet.h"
|
35
|
+
#else
|
36
|
+
#include "../include/win32/libnet.h"
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#include "../include/gnuc.h"
|
40
|
+
#ifdef HAVE_OS_PROTO_H
|
41
|
+
#include "../include/os-proto.h"
|
42
|
+
#endif
|
43
|
+
|
44
|
+
struct libnet_link_int *
|
45
|
+
libnet_open_link_interface(int8_t *device, int8_t *ebuf)
|
46
|
+
{
|
47
|
+
struct sockaddr_nit snit;
|
48
|
+
register struct libnet_link_int *l;
|
49
|
+
|
50
|
+
l = (struct libnet_link_int *)malloc(sizeof(*p));
|
51
|
+
if (l == NULL)
|
52
|
+
{
|
53
|
+
strcpy(ebuf, strerror(errno));
|
54
|
+
return (NULL);
|
55
|
+
}
|
56
|
+
|
57
|
+
memset(l, 0, sizeof(*l));
|
58
|
+
|
59
|
+
l->fd = socket(AF_NIT, SOCK_RAW, NITPROTO_RAW);
|
60
|
+
if (l->fd < 0)
|
61
|
+
{
|
62
|
+
sprintf(ebuf, "socket: %s", strerror(errno));
|
63
|
+
goto bad;
|
64
|
+
}
|
65
|
+
snit.snit_family = AF_NIT;
|
66
|
+
strncpy(snit.snit_ifname, device, NITIFSIZ -1);
|
67
|
+
snit.snit_ifname[NITIFSIZ] = '\0';
|
68
|
+
|
69
|
+
if (bind(l->fd, (struct sockaddr *)&snit, sizeof(snit)))
|
70
|
+
{
|
71
|
+
sprintf(ebuf, "bind: %s: %s", snit.snit_ifname, strerror(errno));
|
72
|
+
goto bad;
|
73
|
+
}
|
74
|
+
|
75
|
+
/*
|
76
|
+
* NIT supports only ethernets.
|
77
|
+
*/
|
78
|
+
l->linktype = DLT_EN10MB;
|
79
|
+
|
80
|
+
return (l);
|
81
|
+
|
82
|
+
bad:
|
83
|
+
if (l->fd >= 0)
|
84
|
+
{
|
85
|
+
close(l->fd);
|
86
|
+
}
|
87
|
+
free(l);
|
88
|
+
return (NULL);
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
int
|
93
|
+
libnet_close_link_interface(struct libnet_link_int *l)
|
94
|
+
{
|
95
|
+
if (close(l->fd) == 0)
|
96
|
+
{
|
97
|
+
free(l);
|
98
|
+
return (1);
|
99
|
+
}
|
100
|
+
else
|
101
|
+
{
|
102
|
+
free(l);
|
103
|
+
return (-1);
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
107
|
+
|
108
|
+
int
|
109
|
+
write_link_layer(struct libnet_link_int *l, const int8_t *device,
|
110
|
+
u_int8_t *buf, int len)
|
111
|
+
{
|
112
|
+
int c;
|
113
|
+
struct sockaddr sa;
|
114
|
+
|
115
|
+
memset(&sa, 0, sizeof(sa));
|
116
|
+
strncpy(sa.sa_data, device, sizeof(sa.sa_data));
|
117
|
+
|
118
|
+
c = sendto(l->fd, buf, len, 0, &sa, sizeof(sa));
|
119
|
+
if (c != len)
|
120
|
+
{
|
121
|
+
/* error */
|
122
|
+
}
|
123
|
+
return (c);
|
124
|
+
}
|
125
|
+
|
@@ -0,0 +1,66 @@
|
|
1
|
+
/*
|
2
|
+
* $Id: libnet_link_none.c,v 1.5 2004/01/03 20:31:02 mike Exp $
|
3
|
+
*
|
4
|
+
* libnet
|
5
|
+
* libnet_none.c - dummy routines for suckers with no link-layer interface
|
6
|
+
*
|
7
|
+
* Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
|
8
|
+
* All rights reserved.
|
9
|
+
*
|
10
|
+
* Copyright (c) 1993, 1994, 1995, 1996, 1998
|
11
|
+
* The Regents of the University of California. All rights reserved.
|
12
|
+
*
|
13
|
+
* Redistribution and use in source and binary forms, with or without
|
14
|
+
* modification, are permitted provided that: (1) source code distributions
|
15
|
+
* retain the above copyright notice and this paragraph in its entirety, (2)
|
16
|
+
* distributions including binary code include the above copyright notice and
|
17
|
+
* this paragraph in its entirety in the documentation or other materials
|
18
|
+
* provided with the distribution, and (3) all advertising materials mentioning
|
19
|
+
* features or use of this software display the following acknowledgement:
|
20
|
+
* ``This product includes software developed by the University of California,
|
21
|
+
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
22
|
+
* the University nor the names of its contributors may be used to endorse
|
23
|
+
* or promote products derived from this software without specific prior
|
24
|
+
* written permission.
|
25
|
+
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
26
|
+
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
27
|
+
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
28
|
+
*/
|
29
|
+
|
30
|
+
#if (HAVE_CONFIG_H)
|
31
|
+
#include "../include/config.h"
|
32
|
+
#endif
|
33
|
+
#if (!(_WIN32) || (__CYGWIN__))
|
34
|
+
#include "../include/libnet.h"
|
35
|
+
#else
|
36
|
+
#include "../include/win32/libnet.h"
|
37
|
+
#endif
|
38
|
+
|
39
|
+
int
|
40
|
+
libnet_open_link(libnet_t *l)
|
41
|
+
{
|
42
|
+
return (NULL);
|
43
|
+
}
|
44
|
+
|
45
|
+
|
46
|
+
int
|
47
|
+
libnet_close_link(libnet_t *l)
|
48
|
+
{
|
49
|
+
return (-1);
|
50
|
+
}
|
51
|
+
|
52
|
+
|
53
|
+
int
|
54
|
+
libnet_write_link(libnet_t *l, u_int8_t *packet, u_int32_t size)
|
55
|
+
{
|
56
|
+
return (-1);
|
57
|
+
}
|
58
|
+
|
59
|
+
|
60
|
+
struct libnet_ether_addr *
|
61
|
+
libnet_get_hwaddr(libnet_t *l)
|
62
|
+
{
|
63
|
+
return (NULL);
|
64
|
+
}
|
65
|
+
|
66
|
+
/* EOF */
|
@@ -0,0 +1,179 @@
|
|
1
|
+
/*
|
2
|
+
* $Id: libnet_link_pf.c,v 1.3 2004/01/03 20:31:02 mike Exp $
|
3
|
+
*
|
4
|
+
* libnet
|
5
|
+
* libnet_pf.c - pf routines
|
6
|
+
*
|
7
|
+
* Copyright (c) 1998 - 2004 Mike D. Schiffman <mike@infonexus.com>
|
8
|
+
* All rights reserved.
|
9
|
+
*
|
10
|
+
* Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
|
11
|
+
* The Regents of the University of California. All rights reserved.
|
12
|
+
*
|
13
|
+
* Redistribution and use in source and binary forms, with or without
|
14
|
+
* modification, are permitted provided that: (1) source code distributions
|
15
|
+
* retain the above copyright notice and this paragraph in its entirety, (2)
|
16
|
+
* distributions including binary code include the above copyright notice and
|
17
|
+
* this paragraph in its entirety in the documentation or other materials
|
18
|
+
* provided with the distribution, and (3) all advertising materials mentioning
|
19
|
+
* features or use of this software display the following acknowledgement:
|
20
|
+
* ``This product includes software developed by the University of California,
|
21
|
+
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
22
|
+
* the University nor the names of its contributors may be used to endorse
|
23
|
+
* or promote products derived from this software without specific prior
|
24
|
+
* written permission.
|
25
|
+
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
26
|
+
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
27
|
+
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
28
|
+
*
|
29
|
+
* packet filter subroutines for tcpdump
|
30
|
+
* Extraction/creation by Jeffrey Mogul, DECWRL
|
31
|
+
*/
|
32
|
+
|
33
|
+
#if (HAVE_CONFIG_H)
|
34
|
+
#include "../include/config.h"
|
35
|
+
#endif
|
36
|
+
#include "../include/low_libnet.h"
|
37
|
+
|
38
|
+
#include "../include/gnuc.h"
|
39
|
+
#ifdef HAVE_OS_PROTO_H
|
40
|
+
#include "../include/os-proto.h"
|
41
|
+
#endif
|
42
|
+
|
43
|
+
struct libnet_link_int *
|
44
|
+
libnet_open_link_interface(int8_t *device, int8_t *ebuf)
|
45
|
+
{
|
46
|
+
register struct libnet_link_int *l;
|
47
|
+
int16_t enmode;
|
48
|
+
int backlog = -1; /* request the most */
|
49
|
+
struct enfilter Filter;
|
50
|
+
struct endevp devparams;
|
51
|
+
|
52
|
+
l = (struct libnet_link_int *)malloc(sizeof(*l));
|
53
|
+
if (l == NULL)
|
54
|
+
{
|
55
|
+
sprintf(ebuf, "libnet_open_link_int: %s", strerror(errno));
|
56
|
+
return (0);
|
57
|
+
}
|
58
|
+
memset(l, 0, sizeof(*l));
|
59
|
+
l->fd = pfopen(device, O_RDWR);
|
60
|
+
if (l->fd < 0)
|
61
|
+
{
|
62
|
+
sprintf(ebuf, "pf open: %s: %s\n\your system may not be properly configured; see \"man packetfilter(4)\"\n",
|
63
|
+
device, strerror(errno));
|
64
|
+
goto bad;
|
65
|
+
}
|
66
|
+
|
67
|
+
enmode = ENTSTAMP|ENBATCH|ENNONEXCL;
|
68
|
+
if (ioctl(l->fd, EIOCMBIS, (caddr_t)&enmode) < 0)
|
69
|
+
{
|
70
|
+
sprintf(ebuf, "EIOCMBIS: %s", strerror(errno));
|
71
|
+
goto bad;
|
72
|
+
}
|
73
|
+
#ifdef ENCOPYALL
|
74
|
+
/* Try to set COPYALL mode so that we see packets to ourself */
|
75
|
+
enmode = ENCOPYALL;
|
76
|
+
ioctl(l->fd, EIOCMBIS, (caddr_t)&enmode); /* OK if this fails */
|
77
|
+
#endif
|
78
|
+
/* set the backlog */
|
79
|
+
if (ioctl(l->fd, EIOCSETW, (caddr_t)&backlog) < 0)
|
80
|
+
{
|
81
|
+
sprintf(ebuf, "EIOCSETW: %s", strerror(errno));
|
82
|
+
goto bad;
|
83
|
+
}
|
84
|
+
/*
|
85
|
+
* discover interface type
|
86
|
+
*/
|
87
|
+
if (ioctl(l->fd, EIOCDEVP, (caddr_t)&devparams) < 0)
|
88
|
+
{
|
89
|
+
sprintf(ebuf, "EIOCDEVP: %s", strerror(errno));
|
90
|
+
goto bad;
|
91
|
+
}
|
92
|
+
|
93
|
+
/* HACK: to compile prior to Ultrix 4.2 */
|
94
|
+
#ifndef ENDT_FDDI
|
95
|
+
#define ENDT_FDDI 4
|
96
|
+
#endif
|
97
|
+
switch (devparams.end_dev_type)
|
98
|
+
{
|
99
|
+
case ENDT_10MB:
|
100
|
+
l->linktype = DLT_EN10MB;
|
101
|
+
break;
|
102
|
+
case ENDT_FDDI:
|
103
|
+
l->linktype = DLT_FDDI;
|
104
|
+
break;
|
105
|
+
default:
|
106
|
+
/*
|
107
|
+
* XXX
|
108
|
+
* Currently, the Ultrix packet filter supports only
|
109
|
+
* Ethernet and FDDI. Eventually, support for SLIP and PPP
|
110
|
+
* (and possibly others: T1?) should be added.
|
111
|
+
*/
|
112
|
+
l->linktype = DLT_EN10MB;
|
113
|
+
break;
|
114
|
+
}
|
115
|
+
/*
|
116
|
+
* acceptag all packets
|
117
|
+
*/
|
118
|
+
bzero((int8_t *)&Filter, sizeof(Filter));
|
119
|
+
Filter.enf_Priority = 37; /* anything > 2 */
|
120
|
+
Filter.enf_FilterLen = 0; /* means "always true" */
|
121
|
+
if (ioctl(l->fd, EIOCSETF, (caddr_t)&Filter) < 0)
|
122
|
+
{
|
123
|
+
sprintf(ebuf, "EIOCSETF: %s", strerror(errno));
|
124
|
+
goto bad;
|
125
|
+
}
|
126
|
+
|
127
|
+
return (l);
|
128
|
+
bad:
|
129
|
+
free(l);
|
130
|
+
return (NULL);
|
131
|
+
}
|
132
|
+
|
133
|
+
|
134
|
+
int
|
135
|
+
libnet_close_link_interface(struct libnet_link_int *l)
|
136
|
+
{
|
137
|
+
if (close(l->fd) == 0)
|
138
|
+
{
|
139
|
+
free(l);
|
140
|
+
return (1);
|
141
|
+
}
|
142
|
+
else
|
143
|
+
{
|
144
|
+
free(l);
|
145
|
+
return (-1);
|
146
|
+
}
|
147
|
+
}
|
148
|
+
|
149
|
+
|
150
|
+
int
|
151
|
+
libnet_write_link_layer(struct libnet_link_int *l, const int8_t *device,
|
152
|
+
const u_int8_t *buf, int len)
|
153
|
+
{
|
154
|
+
int c;
|
155
|
+
|
156
|
+
/* corey: move check for UID/EUID of 0 from libnet_init() to here */
|
157
|
+
if (getuid() && geteuid())
|
158
|
+
{
|
159
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
160
|
+
"%s(): UID or EUID of 0 required\n", __func__);
|
161
|
+
return -1;
|
162
|
+
}
|
163
|
+
|
164
|
+
/* corey: open socket if necessary */
|
165
|
+
if (l->fd == -1) {
|
166
|
+
if (libnet_open_socket(l) == -1) {
|
167
|
+
return -1;
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
c = write(l->fd, buf, len);
|
172
|
+
if (c != len)
|
173
|
+
{
|
174
|
+
snprintf(l->err_buf, LIBNET_ERRBUF_SIZE,
|
175
|
+
"libnet_write_link: %d bytes written (%s)\n", c,
|
176
|
+
strerror(errno));
|
177
|
+
}
|
178
|
+
return (c);
|
179
|
+
}
|