#include <sys/timerfd.h>
#include <sys/timex.h>
#include <sys/socket.h>
+#include <resolv.h>
#include "missing.h"
#include "util.h"
#include "socket-util.h"
#include "list.h"
#include "ratelimit.h"
+#include "strv.h"
#include "sd-event.h"
#include "sd-resolve.h"
#include "sd-daemon.h"
assert(m);
m->event_clock_watch = sd_event_source_unref(m->event_clock_watch);
- m->clock_watch_fd = safe_close(m->clock_watch_fd);
+ safe_close(m->clock_watch_fd);
m->clock_watch_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC);
if (m->clock_watch_fd < 0) {
return manager_connect(m);
}
- if (NTP_FIELD_VERSION(ntpmsg.field) != 4) {
+ if (NTP_FIELD_VERSION(ntpmsg.field) != 4 && NTP_FIELD_VERSION(ntpmsg.field) != 3) {
log_debug("Response NTPv%d. Disconnecting.", NTP_FIELD_VERSION(ntpmsg.field));
return manager_connect(m);
}
m->current_server_name = m->servers;
}
+ /* Tell the resolver to reread /etc/resolv.conf, in
+ * case it changed. */
+ res_init();
+
r = sd_resolve_getaddrinfo(m->resolve, &m->resolve_query, m->current_server_name->string, "123", &hints, manager_resolve_handler, m);
if (r < 0) {
log_error("Failed to create resolver: %s", strerror(-r));
}
static int manager_add_server(Manager *m, const char *server) {
- ServerName *n;
+ ServerName *n, *tail;
assert(m);
assert(server);
return -ENOMEM;
}
- LIST_PREPEND(names, m->servers, n);
+ LIST_FIND_TAIL(names, m->servers, tail);
+ LIST_INSERT_AFTER(names, m->servers, tail, n);
+
return 0;
}
int main(int argc, char *argv[]) {
_cleanup_manager_free_ Manager *m = NULL;
+ const char *x;
int r;
log_set_target(LOG_TARGET_AUTO);
sd_notify(false, "READY=1");
- r = manager_add_server(m, "time1.google.com");
- if (r < 0) {
- log_error("Failed to add server: %s", strerror(-r));
- goto out;
+ FOREACH_STRING(x, "time1.google.com", "time2.google.com", "time3.google.com", "time4.google.com", "0.fedora.pool.ntp.org") {
+ r = manager_add_server(m, x);
+ if (r < 0) {
+ log_error("Failed to add server %s: %s", x, strerror(-r));
+ goto out;
+ }
}
r = manager_connect(m);