From 44782aec16249dc73cafc4e8c369dd20b3e037c1 Mon Sep 17 00:00:00 2001 From: henning <> Date: Wed, 2 Jun 2004 10:08:59 +0000 Subject: [PATCH] prepare for client functionality --- src/usr.sbin/ntpd/Makefile | 5 +- src/usr.sbin/ntpd/config.c | 5 +- src/usr.sbin/ntpd/ntp.c | 222 +----------------------------------- src/usr.sbin/ntpd/ntp.h | 13 ++- src/usr.sbin/ntpd/ntp_msg.c | 152 ++++++++++++++++++++++++ src/usr.sbin/ntpd/ntpd.h | 4 +- src/usr.sbin/ntpd/server.c | 113 ++++++++++++++++++ 7 files changed, 285 insertions(+), 229 deletions(-) create mode 100644 src/usr.sbin/ntpd/ntp_msg.c create mode 100644 src/usr.sbin/ntpd/server.c diff --git a/src/usr.sbin/ntpd/Makefile b/src/usr.sbin/ntpd/Makefile index 56866b6e..96664576 100644 --- a/src/usr.sbin/ntpd/Makefile +++ b/src/usr.sbin/ntpd/Makefile @@ -1,9 +1,10 @@ -# $OpenBSD: Makefile,v 1.3 2004/06/01 21:58:08 henning Exp $ +# $OpenBSD: Makefile,v 1.4 2004/06/02 10:08:59 henning Exp $ .PATH: ${.CURDIR}/.. PROG= ntpd -SRCS= ntpd.c buffer.c log.c imsg.c ntp.c parse.y config.c +SRCS= ntpd.c buffer.c log.c imsg.c ntp.c ntp_msg.c parse.y config.c \ + server.c CFLAGS+= -Wall -I${.CURDIR} CFLAGS+= -Wstrict-prototypes -Wmissing-prototypes CFLAGS+= -Wmissing-declarations diff --git a/src/usr.sbin/ntpd/config.c b/src/usr.sbin/ntpd/config.c index 670f0e0b..fa68f6ca 100644 --- a/src/usr.sbin/ntpd/config.c +++ b/src/usr.sbin/ntpd/config.c @@ -1,4 +1,4 @@ -/* $OpenBSD: config.c,v 1.1 2004/06/01 21:58:08 henning Exp $ */ +/* $OpenBSD: config.c,v 1.2 2004/06/02 10:08:59 henning Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -19,11 +19,8 @@ #include #include #include -#include #include -#include -#include #include #include #include diff --git a/src/usr.sbin/ntpd/ntp.c b/src/usr.sbin/ntpd/ntp.c index 78a7d2b9..55538d58 100644 --- a/src/usr.sbin/ntpd/ntp.c +++ b/src/usr.sbin/ntpd/ntp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ntp.c,v 1.5 2004/06/01 21:58:08 henning Exp $ */ +/* $OpenBSD: ntp.c,v 1.6 2004/06/02 10:08:59 henning Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -36,13 +35,8 @@ struct imsgbuf ibuf_main; struct l_fixedpt ref_ts; void ntp_sighdlr(int); -int setup_listeners(struct servent *, struct ntpd_conf *); int ntp_dispatch_imsg(void); int ntp_dispatch(int fd); -int ntp_getmsg(char *, ssize_t, struct ntp_msg *); -int ntp_reply(int, struct sockaddr *, struct ntp_msg *, int); -int ntp_sendmsg(int, struct sockaddr *, struct ntp_msg *, ssize_t, int); -void get_ts(struct l_fixedpt *); void ntp_sighdlr(int sig) @@ -107,7 +101,6 @@ ntp_main(int pipe_prnt[2], struct ntpd_conf *conf) log_info("ntp engine ready"); while (ntp_quit == 0) { - get_ts(&ref_ts); /* XXX */ bzero(&pfd, sizeof(pfd)); pfd[PFD_PIPE_MAIN].fd = ibuf_main.fd; pfd[PFD_PIPE_MAIN].events = POLLIN; @@ -154,57 +147,6 @@ ntp_main(int pipe_prnt[2], struct ntpd_conf *conf) _exit(0); } -int -setup_listeners(struct servent *se, struct ntpd_conf *conf) -{ - struct listen_addr *la; - - if (TAILQ_EMPTY(&conf->listen_addrs)) { - if ((la = calloc(1, sizeof(struct listen_addr))) == NULL) - fatal("setup_listeners calloc"); - la->sa.ss_len = sizeof(struct sockaddr_in); - ((struct sockaddr_in *)&la->sa)->sin_family = AF_INET; - ((struct sockaddr_in *)&la->sa)->sin_addr.s_addr = - htonl(INADDR_ANY); - ((struct sockaddr_in *)&la->sa)->sin_port = se->s_port; - TAILQ_INSERT_TAIL(&conf->listen_addrs, la, entry); - - if ((la = calloc(1, sizeof(struct listen_addr))) == NULL) - fatal("setup_listeners calloc"); - la->sa.ss_len = sizeof(struct sockaddr_in6); - ((struct sockaddr_in6 *)&la->sa)->sin6_family = AF_INET6; - ((struct sockaddr_in6 *)&la->sa)->sin6_port = se->s_port; - TAILQ_INSERT_TAIL(&conf->listen_addrs, la, entry); - } - - TAILQ_FOREACH(la, &conf->listen_addrs, entry) { - switch (la->sa.ss_family) { - case AF_INET: - if (((struct sockaddr_in *)&la->sa)->sin_port == 0) - ((struct sockaddr_in *)&la->sa)->sin_port = - se->s_port; - break; - case AF_INET6: - if (((struct sockaddr_in6 *)&la->sa)->sin6_port == 0) - ((struct sockaddr_in6 *)&la->sa)->sin6_port = - se->s_port; - break; - default: - fatalx("king bula sez: af borked"); - - } - - if ((la->fd = socket(la->sa.ss_family, SOCK_DGRAM, 0)) == -1) - fatal("socket"); - - if (bind(la->fd, (struct sockaddr *)&la->sa, la->sa.ss_len) == - -1) - fatal("bind"); - } - - return (0); -} - int ntp_dispatch_imsg(void) { @@ -254,165 +196,3 @@ ntp_dispatch(int fd) return (0); } - -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_reply(int fd, struct sockaddr *sa, struct ntp_msg *query, int auth) -{ - ssize_t len; - struct l_fixedpt t; - struct ntp_msg reply; - - if (auth) - len = NTP_MSGSIZE; - else - len = NTP_MSGSIZE_NOAUTH; - - bzero(&reply, sizeof(reply)); - reply.status = 0 | (query->status & VERSIONMASK); - if ((query->status & MODEMASK) == MODE_CLIENT) - reply.status |= MODE_SERVER; - else - reply.status |= MODE_SYM_PAS; - - reply.stratum = 2; - reply.ppoll = query->ppoll; - reply.precision = 0; /* XXX */ - reply.refid = htonl(t.fraction); /* XXX */ - reply.reftime.int_part = htonl(ref_ts.int_part); - reply.reftime.fraction = htonl(ref_ts.fraction); - get_ts(&t); - reply.rectime.int_part = htonl(t.int_part); - reply.rectime.fraction = htonl(t.fraction); - reply.xmttime.int_part = htonl(t.int_part); - reply.xmttime.fraction = htonl(t.fraction); - reply.orgtime.int_part = query->xmttime.int_part; - reply.orgtime.fraction = query->xmttime.fraction; - - return (ntp_sendmsg(fd, sa, &reply, len, auth)); -} - -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; -} \ No newline at end of file diff --git a/src/usr.sbin/ntpd/ntp.h b/src/usr.sbin/ntpd/ntp.h index e3f6b120..489a8d20 100644 --- a/src/usr.sbin/ntpd/ntp.h +++ b/src/usr.sbin/ntpd/ntp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ntp.h,v 1.2 2004/06/01 22:02:32 henning Exp $ */ +/* $OpenBSD: ntp.h,v 1.3 2004/06/02 10:08:59 henning Exp $ */ /* * Copyright (c) 2004 Henning Brauer @@ -134,3 +134,14 @@ struct ntp_msg { #define MODE_RES2 7 /* reserved for private use */ #define JAN_1970 2208988800UL /* 1970 - 1900 in seconds */ + +/* prototypes */ + +/* ntp_msg.c */ +void get_ts(struct l_fixedpt *); +int ntp_getmsg(char *, ssize_t, struct ntp_msg *); +int ntp_sendmsg(int, struct sockaddr *, struct ntp_msg *, ssize_t, int); + +/* server.c */ +int setup_listeners(struct servent *, struct ntpd_conf *); +int ntp_reply(int, struct sockaddr *, struct ntp_msg *, int); diff --git a/src/usr.sbin/ntpd/ntp_msg.c b/src/usr.sbin/ntpd/ntp_msg.c new file mode 100644 index 00000000..178ae7cc --- /dev/null +++ b/src/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 + * Copyright (c) 2004 Alexander Guy + * + * 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 +#include +#include +#include + +#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; +} diff --git a/src/usr.sbin/ntpd/ntpd.h b/src/usr.sbin/ntpd/ntpd.h index bd5cd05a..078facd7 100644 --- a/src/usr.sbin/ntpd/ntpd.h +++ b/src/usr.sbin/ntpd/ntpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ntpd.h,v 1.3 2004/06/01 21:58:09 henning Exp $ */ +/* $OpenBSD: ntpd.h,v 1.4 2004/06/02 10:08:59 henning Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer @@ -21,6 +21,7 @@ #include #include #include +#include #include #define NTPD_USER "_ntp" @@ -132,3 +133,4 @@ int cmdline_symset(char *); /* config.c */ int check_file_secrecy(int, const char *); int host(const char *, struct sockaddr *, u_int8_t *); + diff --git a/src/usr.sbin/ntpd/server.c b/src/usr.sbin/ntpd/server.c new file mode 100644 index 00000000..8b76c659 --- /dev/null +++ b/src/usr.sbin/ntpd/server.c @@ -0,0 +1,113 @@ +/* $OpenBSD: server.c,v 1.1 2004/06/02 10:08:59 henning Exp $ */ + +/* + * Copyright (c) 2003, 2004 Henning Brauer + * + * 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 +#include +#include +#include +#include + +#include "ntpd.h" +#include "ntp.h" + +int +setup_listeners(struct servent *se, struct ntpd_conf *conf) +{ + struct listen_addr *la; + + if (TAILQ_EMPTY(&conf->listen_addrs)) { + if ((la = calloc(1, sizeof(struct listen_addr))) == NULL) + fatal("setup_listeners calloc"); + la->sa.ss_len = sizeof(struct sockaddr_in); + ((struct sockaddr_in *)&la->sa)->sin_family = AF_INET; + ((struct sockaddr_in *)&la->sa)->sin_addr.s_addr = + htonl(INADDR_ANY); + ((struct sockaddr_in *)&la->sa)->sin_port = se->s_port; + TAILQ_INSERT_TAIL(&conf->listen_addrs, la, entry); + + if ((la = calloc(1, sizeof(struct listen_addr))) == NULL) + fatal("setup_listeners calloc"); + la->sa.ss_len = sizeof(struct sockaddr_in6); + ((struct sockaddr_in6 *)&la->sa)->sin6_family = AF_INET6; + ((struct sockaddr_in6 *)&la->sa)->sin6_port = se->s_port; + TAILQ_INSERT_TAIL(&conf->listen_addrs, la, entry); + } + + TAILQ_FOREACH(la, &conf->listen_addrs, entry) { + switch (la->sa.ss_family) { + case AF_INET: + if (((struct sockaddr_in *)&la->sa)->sin_port == 0) + ((struct sockaddr_in *)&la->sa)->sin_port = + se->s_port; + break; + case AF_INET6: + if (((struct sockaddr_in6 *)&la->sa)->sin6_port == 0) + ((struct sockaddr_in6 *)&la->sa)->sin6_port = + se->s_port; + break; + default: + fatalx("king bula sez: af borked"); + + } + + if ((la->fd = socket(la->sa.ss_family, SOCK_DGRAM, 0)) == -1) + fatal("socket"); + + if (bind(la->fd, (struct sockaddr *)&la->sa, la->sa.ss_len) == + -1) + fatal("bind"); + } + + return (0); +} + +int +ntp_reply(int fd, struct sockaddr *sa, struct ntp_msg *query, int auth) +{ + ssize_t len; + struct l_fixedpt t; + struct ntp_msg reply; + + if (auth) + len = NTP_MSGSIZE; + else + len = NTP_MSGSIZE_NOAUTH; + + bzero(&reply, sizeof(reply)); + reply.status = 0 | (query->status & VERSIONMASK); + if ((query->status & MODEMASK) == MODE_CLIENT) + reply.status |= MODE_SERVER; + else + reply.status |= MODE_SYM_PAS; + + reply.stratum = 2; + reply.ppoll = query->ppoll; + reply.precision = 0; /* XXX */ + reply.refid = htonl(t.fraction); /* XXX */ + get_ts(&t); + reply.reftime.int_part = htonl(t.int_part); /* XXX */ + reply.reftime.fraction = htonl(t.fraction); /* XXX */ + reply.rectime.int_part = htonl(t.int_part); + reply.rectime.fraction = htonl(t.fraction); + reply.xmttime.int_part = htonl(t.int_part); + reply.xmttime.fraction = htonl(t.fraction); + reply.orgtime.int_part = query->xmttime.int_part; + reply.orgtime.fraction = query->xmttime.fraction; + + return (ntp_sendmsg(fd, sa, &reply, len, auth)); +}