int status;
ReceiveBuffer message;
- int message_length;
struct sockaddr_in where_from;
- socklen_t from_length;
unsigned int flags = 0;
struct timeval now;
NTP_Remote_Address remote_addr;
double local_clock_err;
+ char cmsgbuf[256];
+ struct msghdr msg;
+ struct iovec iov;
assert(initialised);
- from_length = sizeof(where_from);
- message_length = sizeof(message);
-
LCL_ReadCookedTime(&now, &local_clock_err);
- status = recvfrom(sock_fd, (char *)&message, message_length, flags,
- (struct sockaddr *)&where_from, &from_length);
+
+ iov.iov_base = message.arbitrary;
+ iov.iov_len = sizeof(message);
+ msg.msg_name = &where_from;
+ msg.msg_namelen = sizeof(where_from);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = (void *) cmsgbuf;
+ msg.msg_controllen = sizeof(cmsgbuf);
+ msg.msg_flags = 0;
+
+ status = recvmsg(sock_fd, &msg, flags);
/* Don't bother checking if read failed or why if it did. More
likely than not, it will be connection refused, resulting from a
}
/* ================================================== */
-/* Send an unauthenticated packet to a given address */
+/* Send a packet to given address */
-void
-NIO_SendNormalPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr)
+static void
+send_packet(void *packet, int packetlen, NTP_Remote_Address *remote_addr)
{
struct sockaddr_in remote;
+ struct msghdr msg;
+ struct iovec iov;
assert(initialised);
remote.sin_port = htons(remote_addr->port);
remote.sin_addr.s_addr = htonl(remote_addr->ip_addr);
- if (sendto(sock_fd, (void *) packet, NTP_NORMAL_PACKET_SIZE, 0,
- (struct sockaddr *) &remote, sizeof(remote)) < 0) {
+ iov.iov_base = packet;
+ iov.iov_len = packetlen;
+ msg.msg_name = &remote;
+ msg.msg_namelen = sizeof(remote);
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_flags = 0;
+
+ if (sendmsg(sock_fd, &msg, 0) < 0) {
LOG(LOGS_WARN, LOGF_NtpIO, "Could not send to %s:%d : %s",
UTI_IPToDottedQuad(remote_addr->ip_addr), remote_addr->port, strerror(errno));
}
}
/* ================================================== */
-/* Send an authenticated packet to a given address */
+/* Send an unauthenticated packet to a given address */
void
-NIO_SendAuthenticatedPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr)
+NIO_SendNormalPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr)
{
- struct sockaddr_in remote;
-
- assert(initialised);
-
- remote.sin_family = AF_INET;
- remote.sin_port = htons(remote_addr->port);
- remote.sin_addr.s_addr = htonl(remote_addr->ip_addr);
+ send_packet((void *) packet, NTP_NORMAL_PACKET_SIZE, remote_addr);
+}
- if (sendto(sock_fd, (void *) packet, sizeof(NTP_Packet), 0,
- (struct sockaddr *) &remote, sizeof(remote)) < 0) {
- LOG(LOGS_WARN, LOGF_NtpIO, "Could not send to %s:%d : %s",
- UTI_IPToDottedQuad(remote_addr->ip_addr), remote_addr->port, strerror(errno));
- }
+/* ================================================== */
+/* Send an authenticated packet to a given address */
- return;
+void
+NIO_SendAuthenticatedPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr)
+{
+ send_packet((void *) packet, sizeof(NTP_Packet), remote_addr);
}
/* ================================================== */
NIO_SendEcho(NTP_Remote_Address *remote_addr)
{
unsigned long magic_message = 0xbe7ab1e7UL;
- struct sockaddr_in addr;
-
- addr.sin_family = AF_INET;
- addr.sin_port = htons(ECHO_PORT);
- addr.sin_addr.s_addr = htonl(remote_addr->ip_addr);
-
- /* Just ignore error status on send - this is not a big deal anyway */
- sendto(sock_fd, (void *) &magic_message, sizeof(unsigned long), 0,
- (struct sockaddr *) &addr, sizeof(addr));
+ NTP_Remote_Address addr;
+ addr = *remote_addr;
+ addr.port = ECHO_PORT;
+ send_packet((void *) &magic_message, sizeof(unsigned long), &addr);
}