Merge from vendor branch GCC:
[dragonfly.git] / contrib / ntpd / ntpd.h
1 /*      $OpenBSD: src/usr.sbin/ntpd/ntpd.h,v 1.47 2004/12/09 20:24:46 mickey Exp $ */
2
3 /*
4  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18
19 #include <sys/types.h>
20 #include <sys/uio.h>
21 #include <sys/socket.h>
22 #include <sys/queue.h>
23 #include <sys/time.h>
24 #include <netinet/in.h>
25 #include <netinet/in_systm.h>
26 #include <netinet/ip.h>
27 #include <arpa/inet.h>
28 #include <netdb.h>
29 #include <stdarg.h>
30
31 #include "ntp.h"
32
33 #define NTPD_USER       "_ntp"
34 #define CONFFILE        "/etc/ntpd.conf"
35
36 #define READ_BUF_SIZE           65535
37
38 #define NTPD_OPT_VERBOSE        0x0001
39 #define NTPD_OPT_VERBOSE2       0x0002
40
41 #define INTERVAL_QUERY_NORMAL           30      /* sync to peers every n secs */
42 #define INTERVAL_QUERY_PATHETIC         60
43 #define INTERVAL_QUERY_AGRESSIVE        5
44
45 #define TRUSTLEVEL_BADPEER              6
46 #define TRUSTLEVEL_PATHETIC             2
47 #define TRUSTLEVEL_AGRESSIVE            8
48 #define TRUSTLEVEL_MAX                  10
49
50 #define QSCALE_OFF_MIN                  0.05
51 #define QSCALE_OFF_MAX                  0.50
52
53 #define QUERYTIME_MAX           15      /* single query might take n secs max */
54 #define OFFSET_ARRAY_SIZE       8
55 #define SETTIME_MIN_OFFSET      180     /* min offset for settime at start */
56 #define LOG_NEGLIGEE            128     /* negligible drift to not log (ms) */
57
58 enum client_state {
59         STATE_NONE,
60         STATE_QUERY_SENT,
61         STATE_REPLY_RECEIVED
62 };
63
64 struct listen_addr {
65         TAILQ_ENTRY(listen_addr)         entry;
66         struct sockaddr_storage          sa;
67         int                              fd;
68 };
69
70 struct ntp_addr {
71         struct ntp_addr         *next;
72         struct sockaddr_storage  ss;
73 };
74
75 struct ntp_addr_wrap {
76         char                    *name;
77         struct ntp_addr         *a;
78         u_int8_t                 pool;
79 };
80
81 struct ntp_status {
82         double          rootdelay;
83         double          rootdispersion;
84         double          reftime;
85         u_int32_t       refid;
86         u_int8_t        leap;
87         int8_t          precision;
88         u_int8_t        poll;
89         u_int8_t        stratum;
90 };
91
92 struct ntp_offset {
93         struct ntp_status       status;
94         double                  offset;
95         double                  delay;
96         double                  error;
97         time_t                  rcvd;
98         u_int8_t                good;
99 };
100
101 struct ntp_peer {
102         TAILQ_ENTRY(ntp_peer)            entry;
103         struct ntp_addr_wrap             addr_head;
104         struct ntp_addr                 *addr;
105         struct ntp_query                *query;
106         struct ntp_offset                reply[OFFSET_ARRAY_SIZE];
107         struct ntp_offset                update;
108         enum client_state                state;
109         time_t                           next;
110         time_t                           deadline;
111         u_int32_t                        id;
112         u_int8_t                         shift;
113         u_int8_t                         trustlevel;
114 };
115
116 struct ntpd_conf {
117         TAILQ_HEAD(listen_addrs, listen_addr)   listen_addrs;
118         TAILQ_HEAD(ntp_peers, ntp_peer)         ntp_peers;
119         struct ntp_status                       status;
120         u_int8_t                                listen_all;
121         u_int8_t                                settime;
122         u_int8_t                                debug;
123 };
124
125 struct buf {
126         TAILQ_ENTRY(buf)         entries;
127         u_char                  *buf;
128         ssize_t                  size;
129         ssize_t                  wpos;
130         ssize_t                  rpos;
131 };
132
133 struct msgbuf {
134         TAILQ_HEAD(bufs, buf)    bufs;
135         u_int32_t                queued;
136         int                      fd;
137 };
138
139 struct buf_read {
140         ssize_t                  wpos;
141         u_char                   buf[READ_BUF_SIZE];
142         u_char                  *rptr;
143 };
144
145 /* ipc messages */
146
147 #define IMSG_HEADER_SIZE        sizeof(struct imsg_hdr)
148 #define MAX_IMSGSIZE            8192
149
150 struct imsgbuf {
151         int                     fd;
152         pid_t                   pid;
153         struct buf_read         r;
154         struct msgbuf           w;
155 };
156
157 enum imsg_type {
158         IMSG_NONE,
159         IMSG_ADJTIME,
160         IMSG_SETTIME,
161         IMSG_HOST_DNS
162 };
163
164 struct imsg_hdr {
165         enum imsg_type  type;
166         u_int32_t       peerid;
167         pid_t           pid;
168         u_int16_t       len;
169 };
170
171 struct imsg {
172         struct imsg_hdr  hdr;
173         void            *data;
174 };
175
176 /* prototypes */
177 /* log.c */
178 void             log_init(int);
179 void             vlog(int, const char *, va_list);
180 void             log_warn(const char *, ...);
181 void             log_warnx(const char *, ...);
182 void             log_info(const char *, ...);
183 void             log_debug(const char *, ...);
184 void             fatal(const char *);
185 void             fatalx(const char *);
186 const char *     log_sockaddr(struct sockaddr *);
187
188 /* buffer.c */
189 struct buf      *buf_open(ssize_t);
190 int              buf_add(struct buf *, void *, ssize_t);
191 int              buf_close(struct msgbuf *, struct buf *);
192 void             buf_free(struct buf *);
193 void             msgbuf_init(struct msgbuf *);
194 void             msgbuf_clear(struct msgbuf *);
195 int              msgbuf_write(struct msgbuf *);
196
197 /* imsg.c */
198 void     imsg_init(struct imsgbuf *, int);
199 int      imsg_read(struct imsgbuf *);
200 int      imsg_get(struct imsgbuf *, struct imsg *);
201 int      imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
202             void *, u_int16_t);
203 struct buf      *imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t,
204                     u_int16_t);
205 int      imsg_add(struct buf *, void *, u_int16_t);
206 int      imsg_close(struct imsgbuf *, struct buf *);
207 void     imsg_free(struct imsg *);
208
209 /* ntp.c */
210 pid_t    ntp_main(int[2], struct ntpd_conf *);
211 void     priv_adjtime(void);
212 void     priv_settime(double);
213 void     priv_host_dns(char *, u_int32_t);
214
215 /* parse.y */
216 int      parse_config(const char *, struct ntpd_conf *);
217
218 /* config.c */
219 int              host(const char *, struct ntp_addr **);
220 int              host_dns(const char *, struct ntp_addr **);
221 struct ntp_peer *new_peer(void);
222
223 /* ntp_msg.c */
224 int     ntp_getmsg(char *, ssize_t, struct ntp_msg *);
225 int     ntp_sendmsg(int, struct sockaddr *, struct ntp_msg *, ssize_t, int);
226
227 /* server.c */
228 int     setup_listeners(struct servent *, struct ntpd_conf *, u_int *);
229 int     ntp_reply(int, struct sockaddr *, struct ntp_msg *, int);
230 int     server_dispatch(int, struct ntpd_conf *);
231
232 /* client.c */
233 int     client_peer_init(struct ntp_peer *);
234 int     client_addr_init(struct ntp_peer *);
235 int     client_nextaddr(struct ntp_peer *);
236 int     client_query(struct ntp_peer *);
237 int     client_dispatch(struct ntp_peer *, u_int8_t);
238
239 /* util.c */
240 double                  gettime(void);
241 void                    d_to_tv(double, struct timeval *);
242 double                  lfp_to_d(struct l_fixedpt);
243 struct l_fixedpt        d_to_lfp(double);
244 double                  sfp_to_d(struct s_fixedpt);
245 struct s_fixedpt        d_to_sfp(double);