|
/* $OpenBSD: ntpd.h,v 1.59 2005/07/15 03:37:15 henning Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.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/types.h>
|
|
#include <sys/uio.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/queue.h>
|
|
#include <sys/time.h>
|
|
#include <netinet/in.h>
|
|
#include <netinet/in_systm.h>
|
|
#include <netinet/ip.h>
|
|
#include <arpa/inet.h>
|
|
#include <netdb.h>
|
|
#include <stdarg.h>
|
|
|
|
#include "ntp.h"
|
|
|
|
#define NTPD_USER "_ntp"
|
|
#define CONFFILE "/etc/ntpd.conf"
|
|
|
|
#define READ_BUF_SIZE 4096
|
|
|
|
#define NTPD_OPT_VERBOSE 0x0001
|
|
#define NTPD_OPT_VERBOSE2 0x0002
|
|
|
|
#define INTERVAL_QUERY_NORMAL 30 /* sync to peers every n secs */
|
|
#define INTERVAL_QUERY_PATHETIC 60
|
|
#define INTERVAL_QUERY_AGRESSIVE 5
|
|
|
|
#define TRUSTLEVEL_BADPEER 6
|
|
#define TRUSTLEVEL_PATHETIC 2
|
|
#define TRUSTLEVEL_AGRESSIVE 8
|
|
#define TRUSTLEVEL_MAX 10
|
|
|
|
#define MAX_SERVERS_DNS 8
|
|
|
|
#define QSCALE_OFF_MIN 0.05
|
|
#define QSCALE_OFF_MAX 0.50
|
|
|
|
#define QUERYTIME_MAX 15 /* single query might take n secs max */
|
|
#define OFFSET_ARRAY_SIZE 8
|
|
#define SETTIME_MIN_OFFSET 180 /* min offset for settime at start */
|
|
#define SETTIME_TIMEOUT 15 /* max seconds to wait with -s */
|
|
#define LOG_NEGLIGEE 128 /* negligible drift to not log (ms) */
|
|
|
|
enum client_state {
|
|
STATE_NONE,
|
|
STATE_DNS_INPROGRESS,
|
|
STATE_DNS_TEMPFAIL,
|
|
STATE_DNS_DONE,
|
|
STATE_QUERY_SENT,
|
|
STATE_REPLY_RECEIVED
|
|
};
|
|
|
|
struct listen_addr {
|
|
TAILQ_ENTRY(listen_addr) entry;
|
|
struct sockaddr_storage sa;
|
|
int fd;
|
|
};
|
|
|
|
struct ntp_addr {
|
|
struct ntp_addr *next;
|
|
struct sockaddr_storage ss;
|
|
};
|
|
|
|
struct ntp_addr_wrap {
|
|
char *name;
|
|
struct ntp_addr *a;
|
|
u_int8_t pool;
|
|
};
|
|
|
|
struct ntp_status {
|
|
double rootdelay;
|
|
double rootdispersion;
|
|
double reftime;
|
|
u_int32_t refid;
|
|
u_int32_t refid4;
|
|
u_int8_t leap;
|
|
int8_t precision;
|
|
u_int8_t poll;
|
|
u_int8_t stratum;
|
|
};
|
|
|
|
struct ntp_offset {
|
|
struct ntp_status status;
|
|
double offset;
|
|
double delay;
|
|
double error;
|
|
time_t rcvd;
|
|
u_int8_t good;
|
|
};
|
|
|
|
struct ntp_peer {
|
|
TAILQ_ENTRY(ntp_peer) entry;
|
|
struct ntp_addr_wrap addr_head;
|
|
struct ntp_addr *addr;
|
|
struct ntp_query *query;
|
|
struct ntp_offset reply[OFFSET_ARRAY_SIZE];
|
|
struct ntp_offset update;
|
|
enum client_state state;
|
|
time_t next;
|
|
time_t deadline;
|
|
u_int32_t id;
|
|
u_int8_t shift;
|
|
u_int8_t trustlevel;
|
|
int lasterror;
|
|
};
|
|
|
|
struct ntpd_conf {
|
|
TAILQ_HEAD(listen_addrs, listen_addr) listen_addrs;
|
|
TAILQ_HEAD(ntp_peers, ntp_peer) ntp_peers;
|
|
struct ntp_status status;
|
|
u_int8_t listen_all;
|
|
u_int8_t settime;
|
|
u_int8_t debug;
|
|
u_int32_t scale;
|
|
};
|
|
|
|
struct buf {
|
|
TAILQ_ENTRY(buf) entry;
|
|
u_char *buf;
|
|
size_t size;
|
|
size_t wpos;
|
|
size_t rpos;
|
|
};
|
|
|
|
struct msgbuf {
|
|
TAILQ_HEAD(, buf) bufs;
|
|
u_int32_t queued;
|
|
int fd;
|
|
};
|
|
|
|
struct buf_read {
|
|
size_t wpos;
|
|
u_char buf[READ_BUF_SIZE];
|
|
u_char *rptr;
|
|
};
|
|
|
|
/* ipc messages */
|
|
|
|
#define IMSG_HEADER_SIZE sizeof(struct imsg_hdr)
|
|
#define MAX_IMSGSIZE 8192
|
|
|
|
struct imsgbuf {
|
|
int fd;
|
|
pid_t pid;
|
|
struct buf_read r;
|
|
struct msgbuf w;
|
|
};
|
|
|
|
enum imsg_type {
|
|
IMSG_NONE,
|
|
IMSG_ADJTIME,
|
|
IMSG_SETTIME,
|
|
IMSG_HOST_DNS
|
|
};
|
|
|
|
struct imsg_hdr {
|
|
enum imsg_type type;
|
|
u_int32_t peerid;
|
|
pid_t pid;
|
|
u_int16_t len;
|
|
};
|
|
|
|
struct imsg {
|
|
struct imsg_hdr hdr;
|
|
void *data;
|
|
};
|
|
|
|
/* prototypes */
|
|
/* log.c */
|
|
void log_init(int);
|
|
void vlog(int, const char *, va_list);
|
|
void log_warn(const char *, ...);
|
|
void log_warnx(const char *, ...);
|
|
void log_info(const char *, ...);
|
|
void log_debug(const char *, ...);
|
|
void fatal(const char *);
|
|
void fatalx(const char *);
|
|
const char * log_sockaddr(struct sockaddr *);
|
|
|
|
/* buffer.c */
|
|
struct buf *buf_open(size_t);
|
|
int buf_add(struct buf *, void *, size_t);
|
|
int buf_close(struct msgbuf *, struct buf *);
|
|
void buf_free(struct buf *);
|
|
void msgbuf_init(struct msgbuf *);
|
|
void msgbuf_clear(struct msgbuf *);
|
|
int msgbuf_write(struct msgbuf *);
|
|
|
|
/* imsg.c */
|
|
void imsg_init(struct imsgbuf *, int);
|
|
int imsg_read(struct imsgbuf *);
|
|
int imsg_get(struct imsgbuf *, struct imsg *);
|
|
int imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
|
|
void *, u_int16_t);
|
|
struct buf *imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
|
|
u_int16_t);
|
|
int imsg_add(struct buf *, void *, u_int16_t);
|
|
int imsg_close(struct imsgbuf *, struct buf *);
|
|
void imsg_free(struct imsg *);
|
|
|
|
/* ntp.c */
|
|
pid_t ntp_main(int[2], struct ntpd_conf *);
|
|
void priv_adjtime(void);
|
|
void priv_settime(double);
|
|
void priv_host_dns(char *, u_int32_t);
|
|
|
|
/* parse.y */
|
|
int parse_config(const char *, struct ntpd_conf *);
|
|
|
|
/* config.c */
|
|
int host(const char *, struct ntp_addr **);
|
|
int host_dns(const char *, struct ntp_addr **);
|
|
struct ntp_peer *new_peer(void);
|
|
|
|
/* ntp_msg.c */
|
|
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 *, u_int *);
|
|
int ntp_reply(int, struct sockaddr *, struct ntp_msg *, int);
|
|
int server_dispatch(int, struct ntpd_conf *);
|
|
|
|
/* client.c */
|
|
int client_peer_init(struct ntp_peer *);
|
|
int client_addr_init(struct ntp_peer *);
|
|
int client_nextaddr(struct ntp_peer *);
|
|
int client_query(struct ntp_peer *);
|
|
int client_dispatch(struct ntp_peer *, u_int8_t);
|
|
void client_log_error(struct ntp_peer *, const char *, int);
|
|
void update_scale(double);
|
|
time_t scale_interval(time_t);
|
|
time_t error_interval(void);
|
|
void set_next(struct ntp_peer *, time_t);
|
|
|
|
/* util.c */
|
|
double gettime(void);
|
|
void d_to_tv(double, struct timeval *);
|
|
double lfp_to_d(struct l_fixedpt);
|
|
struct l_fixedpt d_to_lfp(double);
|
|
double sfp_to_d(struct s_fixedpt);
|
|
struct s_fixedpt d_to_sfp(double);
|