Skip to content

Commit a893462

Browse files
author
someguy
committed
Add support for syslog over TCP.
1 parent 0b5a39d commit a893462

File tree

8 files changed

+114
-2
lines changed

8 files changed

+114
-2
lines changed

conf/systemd-netlogd.conf.in

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
[Network]
22
#Address=239.0.0.1:6000
3+
#SocketType=udp

src/netlog/netlog-conf.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "in-addr-util.h"
55
#include "netlog-conf.h"
66
#include "conf-parser.h"
7+
#include "string-util.h"
78

89
int config_parse_netlog_remote_address(const char *unit,
910
const char *filename,
@@ -33,6 +34,36 @@ int config_parse_netlog_remote_address(const char *unit,
3334
return 0;
3435
}
3536

37+
int config_parse_socket_type(const char *unit,
38+
const char *filename,
39+
unsigned line,
40+
const char *section,
41+
unsigned section_line,
42+
const char *lvalue,
43+
int ltype,
44+
const char *rvalue,
45+
void *data,
46+
void *userdata) {
47+
Manager *m = userdata;
48+
49+
assert(filename);
50+
assert(lvalue);
51+
assert(rvalue);
52+
assert(data);
53+
54+
if (strcaseeq(rvalue, "tcp"))
55+
m->socket_type = SOCK_STREAM;
56+
else if (strcaseeq(rvalue, "udp"))
57+
m->socket_type = SOCK_DGRAM;
58+
else {
59+
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
60+
"Unrecognised socket type '%s'; should be either 'tcp' or 'udp'", rvalue);
61+
return -EINVAL;
62+
}
63+
64+
return 0;
65+
}
66+
3667
int manager_parse_config_file(Manager *m) {
3768
assert(m);
3869

src/netlog/netlog-conf.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,14 @@ int config_parse_netlog_remote_address(const char *unit,
1717
const char *rvalue,
1818
void *data,
1919
void *userdata);
20+
int config_parse_socket_type(const char *unit,
21+
const char *filename,
22+
unsigned line,
23+
const char *section,
24+
unsigned section_line,
25+
const char *lvalue,
26+
int ltype,
27+
const char *rvalue,
28+
void *data,
29+
void *userdata);
2030
int manager_parse_config_file(Manager *m);

src/netlog/netlog-gperf.gperf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ struct ConfigPerfItem;
1616
%includes
1717
%%
1818
Network.Address, config_parse_netlog_remote_address, 0, 0
19+
Network.SocketType, config_parse_socket_type, 0, offsetof(Manager, socket_type)
1920
Network.StructuredData, config_parse_string, 0, offsetof(Manager, structured_data)

src/netlog/netlog-manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ struct Manager {
3333

3434
char *last_cursor, *current_cursor;
3535
char *structured_data;
36+
int socket_type;
3637
};
3738

3839
int manager_new(Manager **ret, const char *state_file, const char *cursor);

src/netlog/netlog-network.c

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <unistd.h>
44
#include <stddef.h>
55
#include <poll.h>
6+
#include <netinet/tcp.h>
67

78
#include "netlog-manager.h"
89
#include "io-util.h"
@@ -97,7 +98,7 @@ int manager_push_to_network(Manager *m,
9798
char header_priority[sizeof("< >1 ")];
9899
char header_time[FORMAT_TIMESTAMP_MAX];
99100
uint8_t makepri;
100-
struct iovec iov[13];
101+
struct iovec iov[14];
101102
int n = 0;
102103

103104
assert(m);
@@ -152,6 +153,10 @@ int manager_push_to_network(Manager *m,
152153
/* Ninth: message */
153154
IOVEC_SET_STRING(iov[n++], message);
154155

156+
/* Tenth: Newline message separator, if not implicitly terminated by end of UDP frame */
157+
if (m->socket_type == SOCK_DGRAM)
158+
IOVEC_SET_STRING(iov[n++], "\n");
159+
155160
return network_send(m, iov, n);
156161
}
157162

@@ -170,7 +175,7 @@ int manager_open_network_socket(Manager *m) {
170175
if (!IN_SET(m->address.sockaddr.sa.sa_family, AF_INET, AF_INET6))
171176
return -EAFNOSUPPORT;
172177

173-
m->socket = socket(m->address.sockaddr.sa.sa_family, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0);
178+
m->socket = socket(m->address.sockaddr.sa.sa_family, m->socket_type|SOCK_CLOEXEC, 0);
174179
if (m->socket < 0)
175180
return -errno;
176181

@@ -180,6 +185,45 @@ int manager_open_network_socket(Manager *m) {
180185
goto fail;
181186
}
182187

188+
if (SOCK_STREAM == m->socket_type) {
189+
union sockaddr_union sa;
190+
socklen_t salen;
191+
switch (m->address.sockaddr.sa.sa_family) {
192+
case AF_INET:
193+
sa = (union sockaddr_union) {
194+
.in.sin_family = m->address.sockaddr.sa.sa_family,
195+
.in.sin_port = m->address.sockaddr.in.sin_port,
196+
.in.sin_addr = m->address.sockaddr.in.sin_addr,
197+
};
198+
salen = sizeof(sa.in);
199+
break;
200+
case AF_INET6:
201+
sa = (union sockaddr_union) {
202+
.in6.sin6_family = m->address.sockaddr.sa.sa_family,
203+
.in6.sin6_port = m->address.sockaddr.in6.sin6_port,
204+
.in6.sin6_addr = m->address.sockaddr.in6.sin6_addr,
205+
};
206+
salen = sizeof(sa.in6);
207+
break;
208+
default:
209+
r = -EAFNOSUPPORT;
210+
goto fail;
211+
}
212+
r = connect(m->socket, &m->address.sockaddr.sa, salen);
213+
if (r < 0) {
214+
r = -errno;
215+
goto fail;
216+
}
217+
218+
r = setsockopt(m->socket, IPPROTO_TCP, TCP_NODELAY, &one, sizeof(one));
219+
if (r < 0)
220+
return r;
221+
}
222+
223+
r = fd_status_flag(m->socket, O_NONBLOCK, 1);
224+
if (r < 0)
225+
goto fail;
226+
183227
return m->socket;
184228

185229
fail:

src/share/fd-util.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,29 @@ int fd_cloexec(int fd, bool cloexec) {
121121
return 0;
122122
}
123123

124+
int fd_status_flag(int fd, int flag, bool new_value) {
125+
int flags, nflags;
126+
127+
assert(fd >= 0);
128+
129+
flags = fcntl(fd, F_GETFL, 0);
130+
if (flags < 0)
131+
return -errno;
132+
133+
if (new_value)
134+
nflags = flags | flag;
135+
else
136+
nflags = flags & ~flag;
137+
138+
if (nflags == flags)
139+
return 0;
140+
141+
if (fcntl(fd, F_SETFL, nflags) < 0)
142+
return -errno;
143+
144+
return 0;
145+
}
146+
124147
void stdio_unset_cloexec(void) {
125148
fd_cloexec(STDIN_FILENO, false);
126149
fd_cloexec(STDOUT_FILENO, false);

src/share/fd-util.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ DEFINE_TRIVIAL_CLEANUP_FUNC(DIR*, closedir);
3838
#define _cleanup_close_pair_ _cleanup_(close_pairp)
3939

4040
int fd_cloexec(int fd, bool cloexec);
41+
int fd_status_flag(int fd, int flag, bool new_value);
4142
void stdio_unset_cloexec(void);
4243

4344

0 commit comments

Comments
 (0)