#ifndef __NTP_CONFIG_H__
#define __NTP_CONFIG_H__

#include "ntp_data_structures.h"
#include "ntpsim.h"


/*
 * Configuration file name
 */
#ifndef CONFIG_FILE
# ifndef SYS_WINNT
#  define	CONFIG_FILE "/etc/ntp.conf"
# else /* SYS_WINNT */
#  define	CONFIG_FILE	"%windir%\\system32\\drivers\\etc\\ntp.conf"
#  define	ALT_CONFIG_FILE "%windir%\\ntp.conf"
#  define	NTP_KEYSDIR	"%windir%\\system32\\drivers\\etc"
# endif /* SYS_WINNT */
#endif /* not CONFIG_FILE */


/* Limits */
#define MAXLINE 1024


/* Structure for storing an attribute-value pair  */
struct attr_val {
    int attr;
    union val{
        double d;
        int i;
        char *s;
        void *p;
    } value;
    int type;
};

/* Structure for nodes on the syntax tree */
struct address_node {
    char *address;
    int type;
};

struct restrict_node {
    struct address_node *addr;
    struct address_node *mask;
    queue *flags;
    int line_no;
};

struct peer_node {
    int host_mode;
    struct address_node *addr;
    int minpoll;
    int maxpoll;
    int ttl;
    int peerversion;
    int peerkey;
    int peerflags;
};

struct auth_node {
    int autokey;
    int control_key;
    queue *crypto_cmd_list;
    char *keys;
    char *keysdir;
    int requested_key;
    int revoke;
    queue *trusted_key_list;
};

struct filegen_node {
    char *name;
    queue *options;
};

struct setvar_node {
    char *data;
    u_long len;
    u_short def;
};

struct addr_opts_node {
    struct address_node *addr;
    queue *options;
};

struct sim_node {
    queue *init_opts;
    queue *servers;
};

enum broadcastclienttype {
    SIMPLE = 1,
    NOVOLLEY
};

/* The syntax tree */
struct config_tree {
    queue *peers;

    /* Other Modes */
    int broadcastclient;
    queue *manycastserver;
    queue *multicastclient;

    queue *orphan_cmds;

    /* Monitoring Configuration */
    queue *stats_list;
    char *stats_dir;
    queue *filegen_opts;

    /* Access Control Configuration */
    queue *discard_opts;
    queue *restrict_opts;

    queue *fudge;
    queue *tinker;
    queue *enable_opts;
    queue *disable_opts;
    struct auth_node auth;

    queue *logconfig;
    queue *phone;
    queue *setvar;
    queue *ttl;
    queue *trap;
    queue *vars;

    struct sim_node *sim_details;
};


/* Structure for holding a remote configuration command */
struct REMOTE_CONFIG_INFO {
    char buffer[MAXLINE];
    char err_msg[MAXLINE];
    int pos;
    int err_pos;
    int no_errors;
};


struct peer_node *create_peer_node(int hmode, struct address_node *addr, queue *options);
struct address_node *create_address_node(char *addr, int type);
queue *enqueue_in_new_queue(void *my_node);
struct attr_val *create_attr_dval(int attr, double value);
struct attr_val *create_attr_ival(int attr, int value);
struct attr_val *create_attr_sval(int attr, char *s);
struct attr_val *create_attr_pval(int attr, void *s);
struct filegen_node *create_filegen_node(void **name, queue *options);
void **create_pval(void *val);
struct restrict_node *create_restrict_node(struct address_node *addr,struct address_node *mask,queue *flags, int line_no);
int *create_ival(int val);
struct addr_opts_node *create_addr_opts_node(struct address_node *addr, queue *options);
struct sim_node *create_sim_node(queue *init_opts, queue *servers);
struct setvar_node *create_setvar_node(char *var, char *val, u_short def);

script_info *create_sim_script_info(double duration, queue *script_queue);
server_info *create_sim_server(struct address_node *addr, double server_offset, queue *script);

extern struct REMOTE_CONFIG_INFO remote_config;
void config_remotely(void);


#endif


syntax highlighted by Code2HTML, v. 0.9.1