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