diff options
author | Henning Brauer <henning@cvs.openbsd.org> | 2004-06-02 10:09:00 +0000 |
---|---|---|
committer | Henning Brauer <henning@cvs.openbsd.org> | 2004-06-02 10:09:00 +0000 |
commit | 9bb777f068fbb34930ccc6fbf86342bd7b1ad4ed (patch) | |
tree | 75d3505c3517441194728b4c78cf51ff74fac756 /usr.sbin/ntpd/ntp_msg.c | |
parent | 12c37e87c9b63c007a069648dd3827e7f9e21d13 (diff) |
prepare for client functionality
Diffstat (limited to 'usr.sbin/ntpd/ntp_msg.c')
-rw-r--r-- | usr.sbin/ntpd/ntp_msg.c | 152 |
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; +} |