Annotation of embedaddon/arping/src/windows.c, revision 1.1.1.1
1.1 misho 1: /* arping/src/windows.c
2: *
3: * Copyright (C) 2000-2011 Thomas Habets <thomas@habets.se>
4: *
5: * This library is free software; you can redistribute it and/or
6: * modify it under the terms of the GNU General Public
7: * License as published by the Free Software Foundation; either
8: * version 2 of the License, or (at your option) any later version.
9: *
10: * This library is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13: * General Public License for more details.
14: *
15: * You should have received a copy of the GNU General Public License along
16: * with this program; if not, write to the Free Software Foundation, Inc.,
17: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18: */
19:
20: /***************
21: * This code has worked at one point, but I'm not a Windows programmer
22: * so it's not being maintained. Should not be hard to get working
23: * again though for someone who is.
24: ***************/
25: #if HAVE_CONFIG_H
26: #include "config.h"
27: #endif
28:
29: #include <pcap.h>
30:
31: #include "arping.h"
32:
33: /**
34: *
35: */
36: void
37: do_signal_init()
38: {
39: SetConsoleCtrlHandler(arping_console_ctrl_handler, TRUE);
40: /* SetConsoleCtrlHandler(NULL, TRUE); */
41: }
42:
43: /**
44: * untested for a long time. Maybe since arping 2.05 or so.
45: */
46: static void
47: ping_recv_win32(pcap_t *pcap, uint32_t packetwait, pcap_handler func)
48: {
49: struct timespec tv,tv2;
50: char done = 0;
51: /* windows won't let us do select() */
52: getclock(&tv2);
53:
54: while (!done && !time_to_die) {
55: struct pcap_pkthdr *pkt_header;
56: u_char *pkt_data;
57: if (pcap_next_ex(pcap, &pkt_header, &pkt_data) == 1) {
58: func(pcap, pkt_header, pkt_data);
59: }
60: getclock(&tv);
61:
62: /*
63: * setup next timespec, not very exact
64: */
65: tv.tv_sec = (packetwait / 1000000)
66: - (tv.tv_sec - tv2.tv_sec);
67: tv.tv_nsec = (packetwait % 1000000)
68: - (tv.tv_nsec - tv2.tv_nsec);
69: fixup_timespec(&tv);
70:
71: usleep(10);
72: if (tv.tv_sec < 0) {
73: done=1;
74: }
75: }
76: }
77:
78: /**
79: * Fall back on getting device name from pcap.
80: */
81: const char *
82: arping_lookupdev_default(int32_t srcip, uint32_t dstip,
83: char *ebuf)
84: {
85: WCHAR buf[LIBNET_ERRBUF_SIZE + PCAP_ERRBUF_SIZE];
86: WCHAR* ret = (WCHAR*)pcap_lookupdev((char*)buf);
87: if (ret != NULL) {
88: wcstombs(ebuf, ret, LIBNET_ERRBUF_SIZE + PCAP_ERRBUF_SIZE);
89: return ebuf;
90: }
91: return NULL;
92: }
93:
94: static BOOL WINAPI arping_console_ctrl_handler(DWORD dwCtrlType)
95: {
96: if (verbose) {
97: printf("arping_console_ctrl_handler(%d)\n", (int)dwCtrlType);
98: }
99: time_to_die = 1;
100:
101: if (0) {
102: /* if SetConsoleCtrlHandler() does what I think, this
103: isn't needed */
104: if (display == NORMAL) {
105: printf("\n--- %s statistics ---\n"
106: "%d packets transmitted, %d packets received, "
107: "%3.0f%% "
108: "unanswered\n", target, numsent, numrecvd,
109: 100.0
110: - 100.0 * (float)(numrecvd)/(float)numsent);
111: }
112: }
113: return TRUE;
114: }
115: /* ---- Emacs Variables ----
116: * Local Variables:
117: * c-basic-offset: 8
118: * indent-tabs-mode: nil
119: * End:
120: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>