Skip to content

Commit cb627ae

Browse files
authored
Merge pull request #60 from jelu/tcpcli
TCP client
2 parents 0acfc3e + 313495c commit cb627ae

File tree

6 files changed

+343
-9
lines changed

6 files changed

+343
-9
lines changed

src/Makefile.am

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,16 @@ lua_objects = core.luao lib.luao input.luao filter.luao output.luao
4343
dnsjit_LDADD = $(PTHREAD_LIBS) $(luajit_LIBS)
4444

4545
# C source and headers
46-
dnsjit_SOURCES += core/producer.c core/log.c core/receiver.c core/object.c core/object/ip.c core/object/tcp.c core/object/pcap.c core/object/dns.c core/object/icmp6.c core/object/ieee802.c core/object/udp.c core/object/loop.c core/object/packet.c core/object/ip6.c core/object/gre.c core/object/linuxsll.c core/object/icmp.c core/object/null.c core/object/ether.c core/tracking.c core/mutex.c lib/clock.c input/zero.c input/pcap.c input/fpcap.c input/mmpcap.c input/pcapthread.c filter/lua.c filter/split.c filter/thread.c filter/timing.c filter/coro.c filter/layer.c output/udpcli.c output/cpool.c output/cpool/client_pool.c output/cpool/client.c output/null.c
47-
dist_dnsjit_SOURCES += core/mutex.h core/receiver.h core/object.h core/log.h core/timespec.h core/producer.h core/tracking.h core/object/icmp.h core/object/ip.h core/object/loop.h core/object/dns.h core/object/ip6.h core/object/null.h core/object/tcp.h core/object/udp.h core/object/packet.h core/object/icmp6.h core/object/ether.h core/object/pcap.h core/object/ieee802.h core/object/linuxsll.h core/object/gre.h lib/clock.h input/zero.h input/fpcap.h input/pcap.h input/mmpcap.h input/pcapthread.h filter/lua.h filter/split.h filter/layer.h filter/timing.h filter/thread.h filter/coro.h output/null.h output/cpool/client_pool.h output/cpool/client.h output/cpool.h output/udpcli.h
46+
dnsjit_SOURCES += core/producer.c core/log.c core/receiver.c core/object.c core/object/ip.c core/object/tcp.c core/object/pcap.c core/object/dns.c core/object/icmp6.c core/object/ieee802.c core/object/udp.c core/object/loop.c core/object/packet.c core/object/ip6.c core/object/gre.c core/object/linuxsll.c core/object/icmp.c core/object/null.c core/object/ether.c core/tracking.c core/mutex.c lib/clock.c input/zero.c input/pcap.c input/fpcap.c input/mmpcap.c input/pcapthread.c filter/lua.c filter/split.c filter/thread.c filter/timing.c filter/coro.c filter/layer.c output/udpcli.c output/cpool.c output/tcpcli.c output/cpool/client_pool.c output/cpool/client.c output/null.c
47+
dist_dnsjit_SOURCES += core/mutex.h core/receiver.h core/object.h core/log.h core/timespec.h core/producer.h core/tracking.h core/object/icmp.h core/object/ip.h core/object/loop.h core/object/dns.h core/object/ip6.h core/object/null.h core/object/tcp.h core/object/udp.h core/object/packet.h core/object/icmp6.h core/object/ether.h core/object/pcap.h core/object/ieee802.h core/object/linuxsll.h core/object/gre.h lib/clock.h input/zero.h input/fpcap.h input/pcap.h input/mmpcap.h input/pcapthread.h filter/lua.h filter/split.h filter/layer.h filter/timing.h filter/thread.h filter/coro.h output/null.h output/cpool/client_pool.h output/cpool/client.h output/cpool.h output/tcpcli.h output/udpcli.h
4848

4949
# Lua headers
50-
dist_dnsjit_SOURCES += core/timespec.hh core/mutex.hh core/tracking.hh core/object/loop.hh core/object/gre.hh core/object/linuxsll.hh core/object/tcp.hh core/object/ether.hh core/object/icmp.hh core/object/ieee802.hh core/object/ip6.hh core/object/udp.hh core/object/packet.hh core/object/dns.hh core/object/pcap.hh core/object/icmp6.hh core/object/ip.hh core/object/null.hh core/producer.hh core/receiver.hh core/object.hh core/log.hh lib/clock.hh input/zero.hh input/mmpcap.hh input/pcap.hh input/fpcap.hh input/pcapthread.hh filter/layer.hh filter/coro.hh filter/lua.hh filter/thread.hh filter/timing.hh filter/split.hh output/udpcli.hh output/cpool.hh output/null.hh
51-
lua_hobjects += core/timespec.luaho core/mutex.luaho core/tracking.luaho core/object/loop.luaho core/object/gre.luaho core/object/linuxsll.luaho core/object/tcp.luaho core/object/ether.luaho core/object/icmp.luaho core/object/ieee802.luaho core/object/ip6.luaho core/object/udp.luaho core/object/packet.luaho core/object/dns.luaho core/object/pcap.luaho core/object/icmp6.luaho core/object/ip.luaho core/object/null.luaho core/producer.luaho core/receiver.luaho core/object.luaho core/log.luaho lib/clock.luaho input/zero.luaho input/mmpcap.luaho input/pcap.luaho input/fpcap.luaho input/pcapthread.luaho filter/layer.luaho filter/coro.luaho filter/lua.luaho filter/thread.luaho filter/timing.luaho filter/split.luaho output/udpcli.luaho output/cpool.luaho output/null.luaho
50+
dist_dnsjit_SOURCES += core/timespec.hh core/mutex.hh core/tracking.hh core/object/loop.hh core/object/gre.hh core/object/linuxsll.hh core/object/tcp.hh core/object/ether.hh core/object/icmp.hh core/object/ieee802.hh core/object/ip6.hh core/object/udp.hh core/object/packet.hh core/object/dns.hh core/object/pcap.hh core/object/icmp6.hh core/object/ip.hh core/object/null.hh core/producer.hh core/receiver.hh core/object.hh core/log.hh lib/clock.hh input/zero.hh input/mmpcap.hh input/pcap.hh input/fpcap.hh input/pcapthread.hh filter/layer.hh filter/coro.hh filter/lua.hh filter/thread.hh filter/timing.hh filter/split.hh output/udpcli.hh output/cpool.hh output/tcpcli.hh output/null.hh
51+
lua_hobjects += core/timespec.luaho core/mutex.luaho core/tracking.luaho core/object/loop.luaho core/object/gre.luaho core/object/linuxsll.luaho core/object/tcp.luaho core/object/ether.luaho core/object/icmp.luaho core/object/ieee802.luaho core/object/ip6.luaho core/object/udp.luaho core/object/packet.luaho core/object/dns.luaho core/object/pcap.luaho core/object/icmp6.luaho core/object/ip.luaho core/object/null.luaho core/producer.luaho core/receiver.luaho core/object.luaho core/log.luaho lib/clock.luaho input/zero.luaho input/mmpcap.luaho input/pcap.luaho input/fpcap.luaho input/pcapthread.luaho filter/layer.luaho filter/coro.luaho filter/lua.luaho filter/thread.luaho filter/timing.luaho filter/split.luaho output/udpcli.luaho output/cpool.luaho output/tcpcli.luaho output/null.luaho
5252

5353
# Lua sources
54-
dist_dnsjit_SOURCES += core/mutex.lua core/log.lua core/tracking.lua core/timespec.lua core/producer.lua core/object/pcap.lua core/object/icmp6.lua core/object/gre.lua core/object/ether.lua core/object/ip.lua core/object/ieee802.lua core/object/tcp.lua core/object/ip6.lua core/object/linuxsll.lua core/object/null.lua core/object/loop.lua core/object/icmp.lua core/object/packet.lua core/object/dns.lua core/object/udp.lua core/receiver.lua core/object.lua lib/getopt.lua lib/clock.lua lib/parseconf.lua input/pcapthread.lua input/fpcap.lua input/pcap.lua input/zero.lua input/mmpcap.lua filter/coro.lua filter/timing.lua filter/split.lua filter/layer.lua filter/thread.lua filter/lua.lua output/cpool.lua output/null.lua output/udpcli.lua
55-
lua_objects += core/mutex.luao core/log.luao core/tracking.luao core/timespec.luao core/producer.luao core/object/pcap.luao core/object/icmp6.luao core/object/gre.luao core/object/ether.luao core/object/ip.luao core/object/ieee802.luao core/object/tcp.luao core/object/ip6.luao core/object/linuxsll.luao core/object/null.luao core/object/loop.luao core/object/icmp.luao core/object/packet.luao core/object/dns.luao core/object/udp.luao core/receiver.luao core/object.luao lib/getopt.luao lib/clock.luao lib/parseconf.luao input/pcapthread.luao input/fpcap.luao input/pcap.luao input/zero.luao input/mmpcap.luao filter/coro.luao filter/timing.luao filter/split.luao filter/layer.luao filter/thread.luao filter/lua.luao output/cpool.luao output/null.luao output/udpcli.luao
54+
dist_dnsjit_SOURCES += core/mutex.lua core/log.lua core/tracking.lua core/timespec.lua core/producer.lua core/object/pcap.lua core/object/icmp6.lua core/object/gre.lua core/object/ether.lua core/object/ip.lua core/object/ieee802.lua core/object/tcp.lua core/object/ip6.lua core/object/linuxsll.lua core/object/null.lua core/object/loop.lua core/object/icmp.lua core/object/packet.lua core/object/dns.lua core/object/udp.lua core/receiver.lua core/object.lua lib/getopt.lua lib/clock.lua lib/parseconf.lua input/pcapthread.lua input/fpcap.lua input/pcap.lua input/zero.lua input/mmpcap.lua filter/coro.lua filter/timing.lua filter/split.lua filter/layer.lua filter/thread.lua filter/lua.lua output/tcpcli.lua output/cpool.lua output/null.lua output/udpcli.lua
55+
lua_objects += core/mutex.luao core/log.luao core/tracking.luao core/timespec.luao core/producer.luao core/object/pcap.luao core/object/icmp6.luao core/object/gre.luao core/object/ether.luao core/object/ip.luao core/object/ieee802.luao core/object/tcp.luao core/object/ip6.luao core/object/linuxsll.luao core/object/null.luao core/object/loop.luao core/object/icmp.luao core/object/packet.luao core/object/dns.luao core/object/udp.luao core/receiver.luao core/object.luao lib/getopt.luao lib/clock.luao lib/parseconf.luao input/pcapthread.luao input/fpcap.luao input/pcap.luao input/zero.luao input/mmpcap.luao filter/coro.luao filter/timing.luao filter/split.luao filter/layer.luao filter/thread.luao filter/lua.luao output/tcpcli.luao output/cpool.luao output/null.luao output/udpcli.luao
5656

5757
dnsjit_LDFLAGS = -Wl,-E
5858
dnsjit_LDADD += $(lua_hobjects) $(lua_objects)
@@ -62,7 +62,7 @@ man1_MANS = dnsjit.1
6262
CLEANFILES += $(man1_MANS)
6363

6464
man3_MANS = dnsjit.core.3 dnsjit.lib.3 dnsjit.input.3 dnsjit.filter.3 dnsjit.output.3
65-
man3_MANS += dnsjit.core.mutex.3 dnsjit.core.log.3 dnsjit.core.tracking.3 dnsjit.core.timespec.3 dnsjit.core.producer.3 dnsjit.core.object.pcap.3 dnsjit.core.object.icmp6.3 dnsjit.core.object.gre.3 dnsjit.core.object.ether.3 dnsjit.core.object.ip.3 dnsjit.core.object.ieee802.3 dnsjit.core.object.tcp.3 dnsjit.core.object.ip6.3 dnsjit.core.object.linuxsll.3 dnsjit.core.object.null.3 dnsjit.core.object.loop.3 dnsjit.core.object.icmp.3 dnsjit.core.object.packet.3 dnsjit.core.object.dns.3 dnsjit.core.object.udp.3 dnsjit.core.receiver.3 dnsjit.core.object.3 dnsjit.lib.getopt.3 dnsjit.lib.clock.3 dnsjit.lib.parseconf.3 dnsjit.input.pcapthread.3 dnsjit.input.fpcap.3 dnsjit.input.pcap.3 dnsjit.input.zero.3 dnsjit.input.mmpcap.3 dnsjit.filter.coro.3 dnsjit.filter.timing.3 dnsjit.filter.split.3 dnsjit.filter.layer.3 dnsjit.filter.thread.3 dnsjit.filter.3.3 dnsjit.output.cpool.3 dnsjit.output.null.3 dnsjit.output.udpcli.3
65+
man3_MANS += dnsjit.core.mutex.3 dnsjit.core.log.3 dnsjit.core.tracking.3 dnsjit.core.timespec.3 dnsjit.core.producer.3 dnsjit.core.object.pcap.3 dnsjit.core.object.icmp6.3 dnsjit.core.object.gre.3 dnsjit.core.object.ether.3 dnsjit.core.object.ip.3 dnsjit.core.object.ieee802.3 dnsjit.core.object.tcp.3 dnsjit.core.object.ip6.3 dnsjit.core.object.linuxsll.3 dnsjit.core.object.null.3 dnsjit.core.object.loop.3 dnsjit.core.object.icmp.3 dnsjit.core.object.packet.3 dnsjit.core.object.dns.3 dnsjit.core.object.udp.3 dnsjit.core.receiver.3 dnsjit.core.object.3 dnsjit.lib.getopt.3 dnsjit.lib.clock.3 dnsjit.lib.parseconf.3 dnsjit.input.pcapthread.3 dnsjit.input.fpcap.3 dnsjit.input.pcap.3 dnsjit.input.zero.3 dnsjit.input.mmpcap.3 dnsjit.filter.coro.3 dnsjit.filter.timing.3 dnsjit.filter.split.3 dnsjit.filter.layer.3 dnsjit.filter.thread.3 dnsjit.filter.3.3 dnsjit.output.tcpcli.3 dnsjit.output.cpool.3 dnsjit.output.null.3 dnsjit.output.udpcli.3
6666
CLEANFILES += *.3in $(man3_MANS)
6767

6868
.lua.luao:
@@ -220,6 +220,9 @@ dnsjit.filter.thread.3in: filter/thread.lua gen-manpage.lua
220220
dnsjit.filter.3.3in: filter/lua.lua gen-manpage.lua
221221
$(LUAJIT) "$(srcdir)/gen-manpage.lua" "$(srcdir)/filter/lua.lua" > "$@"
222222

223+
dnsjit.output.tcpcli.3in: output/tcpcli.lua gen-manpage.lua
224+
$(LUAJIT) "$(srcdir)/gen-manpage.lua" "$(srcdir)/output/tcpcli.lua" > "$@"
225+
223226
dnsjit.output.cpool.3in: output/cpool.lua gen-manpage.lua
224227
$(LUAJIT) "$(srcdir)/gen-manpage.lua" "$(srcdir)/output/cpool.lua" > "$@"
225228

src/output/tcpcli.c

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
/*
2+
* Copyright (c) 2018, OARC, Inc.
3+
* All rights reserved.
4+
*
5+
* This file is part of dnsjit.
6+
*
7+
* dnsjit is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* dnsjit is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with dnsjit. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
21+
#include "config.h"
22+
23+
#include "output/tcpcli.h"
24+
#include "core/object/dns.h"
25+
#include "core/object/udp.h"
26+
#include "core/object/tcp.h"
27+
28+
#include <sys/types.h>
29+
#include <sys/socket.h>
30+
#include <netdb.h>
31+
#include <unistd.h>
32+
#include <fcntl.h>
33+
#include <string.h>
34+
#include <errno.h>
35+
#include <arpa/inet.h>
36+
37+
static core_log_t _log = LOG_T_INIT("output.tcpcli");
38+
static output_tcpcli_t _defaults = {
39+
LOG_T_INIT_OBJ("output.tcpcli"),
40+
0, 0, -1,
41+
};
42+
43+
core_log_t* output_tcpcli_log()
44+
{
45+
return &_log;
46+
}
47+
48+
int output_tcpcli_init(output_tcpcli_t* self, const char* host, const char* port)
49+
{
50+
struct addrinfo* addr;
51+
int err;
52+
53+
if (!self || !host || !port) {
54+
return 1;
55+
}
56+
57+
*self = _defaults;
58+
59+
ldebug("init %s %s", host, port);
60+
61+
if ((err = getaddrinfo(host, port, 0, &addr))) {
62+
lcritical("getaddrinfo() %d", err);
63+
return 1;
64+
}
65+
if (!addr) {
66+
lcritical("getaddrinfo failed");
67+
return 1;
68+
}
69+
ldebug("getaddrinfo() flags: 0x%x family: 0x%x socktype: 0x%x protocol: 0x%x addrlen: %d",
70+
addr->ai_flags,
71+
addr->ai_family,
72+
addr->ai_socktype,
73+
addr->ai_protocol,
74+
addr->ai_addrlen);
75+
76+
if ((self->fd = socket(addr->ai_addr->sa_family, SOCK_STREAM, 0)) < 0) {
77+
lcritical("socket failed");
78+
freeaddrinfo(addr);
79+
return 1;
80+
}
81+
82+
if (connect(self->fd, addr->ai_addr, addr->ai_addrlen)) {
83+
lcritical("connect failed");
84+
freeaddrinfo(addr);
85+
close(self->fd);
86+
self->fd = -1;
87+
return 1;
88+
}
89+
90+
freeaddrinfo(addr);
91+
92+
if ((err = fcntl(self->fd, F_GETFL)) == -1
93+
|| fcntl(self->fd, F_SETFL, err | O_NONBLOCK)) {
94+
lcritical("fcntl failed");
95+
}
96+
97+
return 0;
98+
}
99+
100+
int output_tcpcli_destroy(output_tcpcli_t* self)
101+
{
102+
if (!self) {
103+
return 1;
104+
}
105+
106+
ldebug("destroy");
107+
108+
if (self->fd > -1) {
109+
shutdown(self->fd, SHUT_RDWR);
110+
close(self->fd);
111+
}
112+
113+
return 0;
114+
}
115+
116+
static int _receive(void* ctx, const core_object_t* obj)
117+
{
118+
output_tcpcli_t* self = (output_tcpcli_t*)ctx;
119+
const uint8_t* payload;
120+
size_t len, sent;
121+
uint16_t dnslen;
122+
123+
if (!self) {
124+
return 1;
125+
}
126+
127+
for (; obj;) {
128+
switch (obj->obj_type) {
129+
case CORE_OBJECT_DNS:
130+
obj = obj->obj_prev;
131+
continue;
132+
case CORE_OBJECT_UDP:
133+
payload = ((core_object_udp_t*)obj)->payload;
134+
len = ((core_object_udp_t*)obj)->len;
135+
break;
136+
case CORE_OBJECT_TCP:
137+
payload = ((core_object_tcp_t*)obj)->payload;
138+
len = ((core_object_tcp_t*)obj)->len;
139+
break;
140+
default:
141+
return 1;
142+
}
143+
144+
if (len < 3 || payload[2] & 0x80) {
145+
return 0;
146+
}
147+
148+
sent = 0;
149+
self->pkts++;
150+
151+
dnslen = htons(len);
152+
153+
for (;;) {
154+
ssize_t ret = sendto(self->fd, ((uint8_t*)&dnslen) + sent, sizeof(dnslen) - sent, 0, 0, 0);
155+
if (ret > -1) {
156+
sent += ret;
157+
if (sent < sizeof(dnslen))
158+
continue;
159+
160+
sent = 0;
161+
for (;;) {
162+
ssize_t ret = sendto(self->fd, payload + sent, len - sent, 0, 0, 0);
163+
if (ret > -1) {
164+
sent += ret;
165+
if (sent < len)
166+
continue;
167+
return 0;
168+
}
169+
switch (errno) {
170+
case EAGAIN:
171+
#if EAGAIN != EWOULDBLOCK
172+
case EWOULDBLOCK:
173+
#endif
174+
continue;
175+
default:
176+
break;
177+
}
178+
self->errs++;
179+
break;
180+
}
181+
break;
182+
}
183+
switch (errno) {
184+
case EAGAIN:
185+
#if EAGAIN != EWOULDBLOCK
186+
case EWOULDBLOCK:
187+
#endif
188+
continue;
189+
default:
190+
break;
191+
}
192+
self->errs++;
193+
break;
194+
}
195+
break;
196+
}
197+
198+
return 1;
199+
}
200+
201+
core_receiver_t output_tcpcli_receiver()
202+
{
203+
return _receive;
204+
}

src/output/tcpcli.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright (c) 2018, OARC, Inc.
3+
* All rights reserved.
4+
*
5+
* This file is part of dnsjit.
6+
*
7+
* dnsjit is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* dnsjit is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with dnsjit. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
21+
#include "core/log.h"
22+
#include "core/receiver.h"
23+
24+
#ifndef __dnsjit_output_tcpcli_h
25+
#define __dnsjit_output_tcpcli_h
26+
27+
#include "output/tcpcli.hh"
28+
29+
#endif

src/output/tcpcli.hh

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2018, OARC, Inc.
3+
* All rights reserved.
4+
*
5+
* This file is part of dnsjit.
6+
*
7+
* dnsjit is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU General Public License as published by
9+
* the Free Software Foundation, either version 3 of the License, or
10+
* (at your option) any later version.
11+
*
12+
* dnsjit is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Public License
18+
* along with dnsjit. If not, see <http://www.gnu.org/licenses/>.
19+
*/
20+
21+
//lua:require("dnsjit.core.log")
22+
//lua:require("dnsjit.core.receiver_h")
23+
24+
typedef struct output_tcpcli {
25+
core_log_t _log;
26+
size_t pkts, errs;
27+
int fd;
28+
} output_tcpcli_t;
29+
30+
core_log_t* output_tcpcli_log();
31+
32+
int output_tcpcli_init(output_tcpcli_t* self, const char* host, const char* port);
33+
int output_tcpcli_destroy(output_tcpcli_t* self);
34+
35+
core_receiver_t output_tcpcli_receiver();

0 commit comments

Comments
 (0)