summaryrefslogtreecommitdiff
path: root/usr.sbin/ntpd/ntp_msg.c
diff options
context:
space:
mode:
authorHenning Brauer <henning@cvs.openbsd.org>2004-06-02 10:09:00 +0000
committerHenning Brauer <henning@cvs.openbsd.org>2004-06-02 10:09:00 +0000
commit9bb777f068fbb34930ccc6fbf86342bd7b1ad4ed (patch)
tree75d3505c3517441194728b4c78cf51ff74fac756 /usr.sbin/ntpd/ntp_msg.c
parent12c37e87c9b63c007a069648dd3827e7f9e21d13 (diff)
prepare for client functionality
Diffstat (limited to 'usr.sbin/ntpd/ntp_msg.c')
-rw-r--r--usr.sbin/ntpd/ntp_msg.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/usr.sbin/ntpd/ntp_msg.c b/usr.sbin/ntpd/ntp_msg.c
new file mode 100644
index 00000000000..178ae7cc1c9
--- /dev/null
+++ b/usr.sbin/ntpd/ntp_msg.c
@@ -0,0 +1,152 @@
+/* $OpenBSD: ntp_msg.c,v 1.1 2004/06/02 10:08:59 henning Exp $ */
+
+/*
+ * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
+ * Copyright (c) 2004 Alexander Guy <alexander.guy@andern.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "ntpd.h"
+#include "ntp.h"
+
+int
+ntp_getmsg(char *p, ssize_t len, struct ntp_msg *msg)
+{
+ int auth, i;
+
+ if (len == NTP_MSGSIZE)
+ auth = 1;
+ else if (len == NTP_MSGSIZE_NOAUTH)
+ auth = 0;
+ else {
+ log_warnx("malformed packet received");
+ return (-1);
+ }
+
+ memcpy(&msg->status, p, sizeof(msg->status));
+ p += sizeof(msg->status);
+ memcpy(&msg->stratum, p, sizeof(msg->stratum));
+ p += sizeof(msg->stratum);
+ memcpy(&msg->ppoll, p, sizeof(msg->ppoll));
+ p += sizeof(msg->ppoll);
+ memcpy(&msg->precision, p, sizeof(msg->precision));
+ p += sizeof(msg->precision);
+ memcpy(&msg->distance.int_part, p, sizeof(msg->distance.int_part));
+ p += sizeof(msg->distance.int_part);
+ memcpy(&msg->distance.fraction, p, sizeof(msg->distance.fraction));
+ p += sizeof(msg->distance.fraction);
+ memcpy(&msg->dispersion.int_part, p, sizeof(msg->dispersion.int_part));
+ p += sizeof(msg->dispersion.int_part);
+ memcpy(&msg->dispersion.fraction, p, sizeof(msg->dispersion.fraction));
+ p += sizeof(msg->dispersion.fraction);
+ memcpy(&msg->refid, p, sizeof(msg->refid));
+ p += sizeof(msg->refid);
+ memcpy(&msg->reftime.int_part, p, sizeof(msg->reftime.int_part));
+ p += sizeof(msg->reftime.int_part);
+ memcpy(&msg->reftime.fraction, p, sizeof(msg->reftime.fraction));
+ p += sizeof(msg->reftime.fraction);
+ memcpy(&msg->orgtime.int_part, p, sizeof(msg->orgtime.int_part));
+ p += sizeof(msg->orgtime.int_part);
+ memcpy(&msg->orgtime.fraction, p, sizeof(msg->orgtime.fraction));
+ p += sizeof(msg->orgtime.fraction);
+ memcpy(&msg->rectime.int_part, p, sizeof(msg->rectime.int_part));
+ p += sizeof(msg->rectime.int_part);
+ memcpy(&msg->rectime.fraction, p, sizeof(msg->rectime.fraction));
+ p += sizeof(msg->rectime.fraction);
+ memcpy(&msg->xmttime.int_part, p, sizeof(msg->xmttime.int_part));
+ p += sizeof(msg->xmttime.int_part);
+ memcpy(&msg->xmttime.fraction, p, sizeof(msg->xmttime.fraction));
+ p += sizeof(msg->xmttime.fraction);
+
+ if (auth) {
+ memcpy(&msg->keyid, p, sizeof(msg->keyid));
+ p += sizeof(msg->refid);
+ for (i = 0; i < NTP_DIGESTSIZE; i++) {
+ memcpy(&msg->digest[i], p, sizeof(msg->digest[i]));
+ p += sizeof(msg->digest[i]);
+ }
+
+ /* XXX check auth */
+ }
+
+ return (0);
+}
+
+int
+ntp_sendmsg(int fd, struct sockaddr *sa, struct ntp_msg *msg, ssize_t len,
+ int auth)
+{
+ char buf[NTP_MSGSIZE];
+ char *p;
+
+ p = buf;
+ memcpy(p, &msg->status, sizeof(msg->status));
+ p += sizeof(msg->status);
+ memcpy(p, &msg->stratum, sizeof(msg->stratum));
+ p += sizeof(msg->stratum);
+ memcpy(p, &msg->ppoll, sizeof(msg->ppoll));
+ p += sizeof(msg->ppoll);
+ memcpy(p, &msg->precision, sizeof(msg->precision));
+ p += sizeof(msg->precision);
+ memcpy(p, &msg->distance.int_part, sizeof(msg->distance.int_part));
+ p += sizeof(msg->distance.int_part);
+ memcpy(p, &msg->distance.fraction, sizeof(msg->distance.fraction));
+ p += sizeof(msg->distance.fraction);
+ memcpy(p, &msg->dispersion.int_part, sizeof(msg->dispersion.int_part));
+ p += sizeof(msg->dispersion.int_part);
+ memcpy(p, &msg->dispersion.fraction, sizeof(msg->dispersion.fraction));
+ p += sizeof(msg->dispersion.fraction);
+ memcpy(p, &msg->refid, sizeof(msg->refid));
+ p += sizeof(msg->refid);
+ memcpy(p, &msg->reftime.int_part, sizeof(msg->reftime.int_part));
+ p += sizeof(msg->reftime.int_part);
+ memcpy(p, &msg->reftime.fraction, sizeof(msg->reftime.fraction));
+ p += sizeof(msg->reftime.fraction);
+ memcpy(p, &msg->orgtime.int_part, sizeof(msg->orgtime.int_part));
+ p += sizeof(msg->orgtime.int_part);
+ memcpy(p, &msg->orgtime.fraction, sizeof(msg->orgtime.fraction));
+ p += sizeof(msg->orgtime.fraction);
+ memcpy(p, &msg->rectime.int_part, sizeof(msg->rectime.int_part));
+ p += sizeof(msg->rectime.int_part);
+ memcpy(p, &msg->rectime.fraction, sizeof(msg->rectime.fraction));
+ p += sizeof(msg->rectime.fraction);
+ memcpy(p, &msg->xmttime.int_part, sizeof(msg->xmttime.int_part));
+ p += sizeof(msg->xmttime.int_part);
+ memcpy(p, &msg->xmttime.fraction, sizeof(msg->xmttime.fraction));
+ p += sizeof(msg->xmttime.fraction);
+
+ if (auth) {
+ /* XXX */
+ }
+
+ if (sendto(fd, &buf, len, 0, sa, sa->sa_len) != len)
+ fatal("sendto");
+
+ return (0);
+}
+
+void
+get_ts(struct l_fixedpt *t)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ t->int_part = tv.tv_sec + JAN_1970;
+ t->fraction = ((float)tv.tv_usec)/1000000 * UINT_MAX;
+}