xref: /openbsd-src/usr.sbin/ntpd/ntp_msg.c (revision 774da4d1ccc43e2a4200d81b656c10f05a30b4b9)
1*774da4d1Sreyk /*	$OpenBSD: ntp_msg.c,v 1.22 2016/09/03 11:52:06 reyk Exp $ */
26a5eeebaShenning 
36a5eeebaShenning /*
46a5eeebaShenning  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
56a5eeebaShenning  * Copyright (c) 2004 Alexander Guy <alexander.guy@andern.org>
66a5eeebaShenning  *
76a5eeebaShenning  * Permission to use, copy, modify, and distribute this software for any
86a5eeebaShenning  * purpose with or without fee is hereby granted, provided that the above
96a5eeebaShenning  * copyright notice and this permission notice appear in all copies.
106a5eeebaShenning  *
116a5eeebaShenning  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
126a5eeebaShenning  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
136a5eeebaShenning  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
146a5eeebaShenning  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15*774da4d1Sreyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16*774da4d1Sreyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17*774da4d1Sreyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
186a5eeebaShenning  */
196a5eeebaShenning 
2061f07045Sderaadt #include <sys/types.h>
216a5eeebaShenning #include <stdlib.h>
226a5eeebaShenning #include <string.h>
236a5eeebaShenning #include <unistd.h>
24e155c74aSderaadt #include <errno.h>
256a5eeebaShenning 
266a5eeebaShenning #include "ntpd.h"
276a5eeebaShenning 
286a5eeebaShenning int
ntp_getmsg(struct sockaddr * sa,char * p,ssize_t len,struct ntp_msg * msg)29a6c97c40Sdtucker ntp_getmsg(struct sockaddr *sa, char *p, ssize_t len, struct ntp_msg *msg)
306a5eeebaShenning {
31e4295f03Shenning 	if (len != NTP_MSGSIZE_NOAUTH && len != NTP_MSGSIZE) {
32e63cce50Sotto 		log_debug("malformed packet received from %s",
33a6c97c40Sdtucker 		    log_sockaddr(sa));
346a5eeebaShenning 		return (-1);
356a5eeebaShenning 	}
366a5eeebaShenning 
37c0ee96ccShenning 	memcpy(msg, p, sizeof(*msg));
386a5eeebaShenning 
396a5eeebaShenning 	return (0);
406a5eeebaShenning }
416a5eeebaShenning 
426a5eeebaShenning int
ntp_sendmsg(int fd,struct sockaddr * sa,struct ntp_msg * msg)4380d85ff8Smglocker ntp_sendmsg(int fd, struct sockaddr *sa, struct ntp_msg *msg)
446a5eeebaShenning {
45bd641f87Sdtucker 	socklen_t	sa_len;
46c0ee96ccShenning 	ssize_t		n;
476a5eeebaShenning 
4825f38044Shenning 	if (sa != NULL)
4925f38044Shenning 		sa_len = SA_LEN(sa);
5025f38044Shenning 	else
5125f38044Shenning 		sa_len = 0;
5225f38044Shenning 
53c0ee96ccShenning 	n = sendto(fd, msg, sizeof(*msg), 0, sa, sa_len);
54c0ee96ccShenning 	if (n == -1) {
55e155c74aSderaadt 		if (errno == ENOBUFS || errno == EHOSTUNREACH ||
56e155c74aSderaadt 		    errno == ENETDOWN || errno == EHOSTDOWN) {
57e155c74aSderaadt 			/* logging is futile */
58e155c74aSderaadt 			return (-1);
59e155c74aSderaadt 		}
60e11a55dfShenning 		log_warn("sendto");
61e11a55dfShenning 		return (-1);
62e11a55dfShenning 	}
636a5eeebaShenning 
64c0ee96ccShenning 	if (n != sizeof(*msg)) {
655e3ffb1fSbcook 		log_warnx("ntp_sendmsg: only %zd of %zu bytes sent", n,
66c0ee96ccShenning 		    sizeof(*msg));
67c0ee96ccShenning 		return (-1);
68c0ee96ccShenning 	}
69c0ee96ccShenning 
706a5eeebaShenning 	return (0);
716a5eeebaShenning }
72