forked from antirez/hping
-
Notifications
You must be signed in to change notification settings - Fork 0
/
libpcap_stuff.c
74 lines (59 loc) · 1.57 KB
/
libpcap_stuff.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
* $smu-mark$
* $name: libpcap_stuff.c$
* $author: Salvatore Sanfilippo <antirez@invece.org>$
* $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$
* $license: This software is under GPL version 2 of license$
* $date: Fri Nov 5 11:55:48 MET 1999$
* $rev: 8$
*/
/* $Id: libpcap_stuff.c,v 1.3 2004/04/09 23:38:56 antirez Exp $ */
#include "hping2.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <net/bpf.h>
#include <pcap.h>
#include "globals.h"
int open_pcap()
{
int on;
on = 1; /* no warning if BIOCIMMEDIATE will not be compiled */
if (opt_debug)
printf("DEBUG: pcap_open_live(%s, 99999, 0, 1, %p)\n",
ifname, errbuf);
pcapfp = pcap_open_live(ifname, 99999, 0, 1, errbuf);
if (pcapfp == NULL) {
printf("[open_pcap] pcap_open_live: %s\n", errbuf);
return -1;
}
#if (!defined OSTYPE_LINUX) && (!defined __sun__)
/* Return the packets to userspace as fast as possible */
if (ioctl(pcap_fileno(pcapfp), BIOCIMMEDIATE, &on) == -1)
perror("[open_pcap] ioctl(... BIOCIMMEDIATE ...)");
#endif
return 0;
}
int close_pcap()
{
pcap_close(pcapfp);
return 0;
}
int pcap_recv(char *packet, unsigned int size)
{
char *p = NULL;
int pcapsize;
if (opt_debug)
printf("DEBUG: under pcap_recv()\n");
while(p == NULL) {
p = (char*) pcap_next(pcapfp, &hdr);
if (p == NULL && opt_debug)
printf("DEBUG: [pcap_recv] p = NULL\n");
}
pcapsize = hdr.caplen;
if (pcapsize < size)
size = pcapsize;
memcpy(packet, p, pcapsize);
return pcapsize;
}