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 :
0 commit comments