Browse Source

make my japanese friends happy by supporting IPv6 as well

OPENBSD_3_6
henning 20 years ago
parent
commit
95c30e89c6
1 changed files with 45 additions and 12 deletions
  1. +45
    -12
      src/usr.sbin/ntpd/ntp.c

+ 45
- 12
src/usr.sbin/ntpd/ntp.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: ntp.c,v 1.1 2004/05/31 13:46:16 henning Exp $ */
/* $OpenBSD: ntp.c,v 1.2 2004/05/31 15:11:56 henning Exp $ */
/* /*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@ -30,8 +30,9 @@
#include "ntp.h" #include "ntp.h"
#define PFD_LISTEN 0 #define PFD_LISTEN 0
#define PFD_PIPE_MAIN 1
#define PFD_MAX 2
#define PFD_LISTEN6 1
#define PFD_PIPE_MAIN 2
#define PFD_MAX 3
volatile sig_atomic_t ntp_quit = 0; volatile sig_atomic_t ntp_quit = 0;
struct imsgbuf ibuf_main; struct imsgbuf ibuf_main;
@ -39,6 +40,7 @@ struct l_fixedpt ref_ts;
void ntp_sighdlr(int); void ntp_sighdlr(int);
int setup_listener(struct servent *); int setup_listener(struct servent *);
int setup_listener6(struct servent *);
int ntp_dispatch_imsg(void); int ntp_dispatch_imsg(void);
int ntp_dispatch(int fd); int ntp_dispatch(int fd);
int parse_ntp_msg(char *, ssize_t, struct ntp_msg *); int parse_ntp_msg(char *, ssize_t, struct ntp_msg *);
@ -62,6 +64,7 @@ ntp_main(int pipe_prnt[2])
{ {
int nfds; int nfds;
int sock = -1; int sock = -1;
int sock6 = -1;
pid_t pid; pid_t pid;
struct pollfd pfd[PFD_MAX]; struct pollfd pfd[PFD_MAX];
struct passwd *pw; struct passwd *pw;
@ -90,6 +93,7 @@ ntp_main(int pipe_prnt[2])
setproctitle("ntp engine"); setproctitle("ntp engine");
sock = setup_listener(se); sock = setup_listener(se);
sock6 = setup_listener6(se);
if (setgroups(1, &pw->pw_gid) || if (setgroups(1, &pw->pw_gid) ||
setegid(pw->pw_gid) || setgid(pw->pw_gid) || setegid(pw->pw_gid) || setgid(pw->pw_gid) ||
@ -113,12 +117,14 @@ ntp_main(int pipe_prnt[2])
bzero(&pfd, sizeof(pfd)); bzero(&pfd, sizeof(pfd));
pfd[PFD_LISTEN].fd = sock; pfd[PFD_LISTEN].fd = sock;
pfd[PFD_LISTEN].events = POLLIN; pfd[PFD_LISTEN].events = POLLIN;
pfd[PFD_LISTEN6].fd = sock6;
pfd[PFD_LISTEN6].events = POLLIN;
pfd[PFD_PIPE_MAIN].fd = ibuf_main.fd; pfd[PFD_PIPE_MAIN].fd = ibuf_main.fd;
pfd[PFD_PIPE_MAIN].events = POLLIN; pfd[PFD_PIPE_MAIN].events = POLLIN;
if (ibuf_main.w.queued > 0) if (ibuf_main.w.queued > 0)
pfd[PFD_PIPE_MAIN].events |= POLLOUT; pfd[PFD_PIPE_MAIN].events |= POLLOUT;
if ((nfds = poll(pfd, 2, INFTIM)) == -1)
if ((nfds = poll(pfd, PFD_MAX, INFTIM)) == -1)
if (errno != EINTR) { if (errno != EINTR) {
log_warn("poll error"); log_warn("poll error");
ntp_quit = 1; ntp_quit = 1;
@ -141,6 +147,12 @@ ntp_main(int pipe_prnt[2])
if (ntp_dispatch(sock) == -1) if (ntp_dispatch(sock) == -1)
ntp_quit = 1; ntp_quit = 1;
} }
if (nfds > 0 && pfd[PFD_LISTEN6].revents & POLLIN) {
nfds--;
if (ntp_dispatch(sock6) == -1)
ntp_quit = 1;
}
} }
msgbuf_write(&ibuf_main.w); msgbuf_write(&ibuf_main.w);
@ -160,7 +172,7 @@ setup_listener(struct servent *se)
fatal("socket"); fatal("socket");
bzero(&sa_in, sizeof(sa_in)); bzero(&sa_in, sizeof(sa_in));
sa_in.sin_len = sizeof(sa_in);
sa_in.sin_family = AF_INET; sa_in.sin_family = AF_INET;
sa_in.sin_addr.s_addr = htonl(INADDR_ANY); sa_in.sin_addr.s_addr = htonl(INADDR_ANY);
sa_in.sin_port = se->s_port; sa_in.sin_port = se->s_port;
@ -171,6 +183,26 @@ setup_listener(struct servent *se)
return (fd); return (fd);
} }
int
setup_listener6(struct servent *se)
{
struct sockaddr_in6 sa_in6;
int fd;
if ((fd = socket(AF_INET6, SOCK_DGRAM, 0)) == -1)
fatal("socket");
bzero(&sa_in6, sizeof(sa_in6));
sa_in6.sin6_len = sizeof(sa_in6);
sa_in6.sin6_family = AF_INET6;
sa_in6.sin6_port = se->s_port;
if (bind(fd, (struct sockaddr *)&sa_in6, sizeof(sa_in6)) == -1)
fatal("bind");
return (fd);
}
int int
ntp_dispatch_imsg(void) ntp_dispatch_imsg(void)
{ {
@ -204,18 +236,19 @@ ntp_dispatch_imsg(void)
int int
ntp_dispatch(int fd) ntp_dispatch(int fd)
{ {
struct sockaddr fsa;
socklen_t fsa_len;
char buf[NTP_MSGSIZE];
ssize_t size;
struct ntp_msg msg;
struct sockaddr_storage fsa;
socklen_t fsa_len;
char buf[NTP_MSGSIZE];
ssize_t size;
struct ntp_msg msg;
fsa_len = sizeof(fsa); fsa_len = sizeof(fsa);
if ((size = recvfrom(fd, &buf, sizeof(buf), 0, &fsa, &fsa_len)) == -1)
if ((size = recvfrom(fd, &buf, sizeof(buf), 0,
(struct sockaddr *)&fsa, &fsa_len)) == -1)
fatal("recvfrom"); fatal("recvfrom");
parse_ntp_msg(buf, size, &msg); parse_ntp_msg(buf, size, &msg);
ntp_reply(fd, &fsa, &msg, 0);
ntp_reply(fd, (struct sockaddr *)&fsa, &msg, 0);
return (0); return (0);
} }


Loading…
Cancel
Save