On Fri, Nov 16, 2007 at 01:13:42PM +0100, Otto Moerbeek wrote:

> On Fri, Nov 16, 2007 at 12:40:29PM +0100, frantisek holop wrote:
> > hmm, on Fri, Nov 16, 2007 at 12:30:00PM +0100, Toni Mueller said that
> > > > could someone test this before i submit a bug report?
> > > 
> > > I've removed the '-s' flag for this reason, although I would very much
> > > prefer to have it in place in the case that I have net access. I don't
> > > know whether it would be feasible for ntpd to see whether there's an
> > > appropriate route, and whether the relevant interfaces are up.
> > 
> > it definitely worked in 4.1 even with "-s".
> 
> It is this commit, which manages to keep the outging buffer full.
> 
> http://www.openbsd.org/cgi-bin/cvsweb/src/usr.sbin/ntpd/client.c.diff?r1=1.75&r2=1.76&f=h
> 
> Reverting it makes the problem go away.
> 
> Still thinking how to solve this.
> 
>       -Otto

This seems to work for me,

        -Otto

Index: client.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/client.c,v
retrieving revision 1.76
diff -u -p -r1.76 client.c
--- client.c    1 May 2007 07:40:45 -0000       1.76
+++ client.c    16 Nov 2007 12:37:25 -0000
@@ -123,7 +123,8 @@ client_query(struct ntp_peer *p)
        int     tos = IPTOS_LOWDELAY;
 
        if (p->addr == NULL && client_nextaddr(p) == -1) {
-               set_next(p, scale_interval(INTERVAL_QUERY_AGGRESSIVE));
+               set_next(p, MAX(SETTIME_TIMOUT,
+                   scale_interval(INTERVAL_QUERY_AGGRESSIVE)));
                return (0);
        }
 
@@ -140,8 +141,8 @@ client_query(struct ntp_peer *p)
                        if (errno == ECONNREFUSED || errno == ENETUNREACH ||
                            errno == EHOSTUNREACH || errno == EADDRNOTAVAIL) {
                                client_nextaddr(p);
-                               set_next(p,
-                                   scale_interval(INTERVAL_QUERY_AGGRESSIVE));
+                               set_next(p, MAX(SETTIME_TIMOUT,
+                                   scale_interval(INTERVAL_QUERY_AGGRESSIVE)));
                                return (-1);
                        } else
                                fatal("client_query connect");
Index: ntpd.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/ntpd.c,v
retrieving revision 1.52
diff -u -p -r1.52 ntpd.c
--- ntpd.c      13 Sep 2007 20:34:12 -0000      1.52
+++ ntpd.c      16 Nov 2007 12:37:25 -0000
@@ -193,12 +193,24 @@ main(int argc, char *argv[])
                                        fatal("daemon");
                }
 
-               if (nfds > 0 && (pfd[PFD_PIPE].revents & POLLOUT))
-                       if (msgbuf_write(&ibuf->w) < 0) {
+               if (nfds > 0 && (pfd[PFD_PIPE].revents & POLLOUT)) {
+                       int ret;
+
+                       if ((ret = msgbuf_write(&ibuf->w)) < 0) {
                                log_warn("pipe write error (to child)");
                                quit = 1;
                        }
-
+                       if (ret == 0 && lconf.settime) {
+                               lconf.settime = 0;
+                               timeout = INFTIM;
+                               log_init(lconf.debug);
+                               log_debug("could not send request, skipping"
+                                   "initial time setting");
+                               if (!lconf.debug)
+                                       if (daemon(1, 0))
+                                               fatal("daemon");
+                       }
+               }
                if (nfds > 0 && pfd[PFD_PIPE].revents & POLLIN) {
                        nfds--;
                        if (dispatch_imsg(&lconf) == -1)

Reply via email to