#define TRUE 1
#define FALSE 0

#define SLOP_LEN 5			/* Extra space on allocated strings */

typedef long SYSTIM[2];

/* Some interesting structures */

struct jnet_file_header {
    char host[10];
    char user[10];
    char filename[10];
    char filetype[10];
    char device[10];
    char class[2];
    char local_file[128];
    char jnet_file[128];
    char conf_name[41];
    char flag_user_exit;		/* For later development */
};

struct list_info {
    char scan_data[11];
    char conf_hdr[21];
    char conf_user[13];
    int flag_digest;
    int flag_keyword;
    char new_topic_interval;
    char conf_name[41];
};

struct source_info {
    char id[3];
    char scan_text[21];
    int reg_text_length;
    char * header_text;
};

struct rule_info {
    char ids[2][3];
    char comparison[3];
    char action[3];
    char id_from[3];
    char id_subj[3];
};

struct command {
    char * name;
    int min_len;
    int privileged;
    int cmd_value;
};

struct $NUMTIM {
    unsigned short year;
    unsigned short month;
    unsigned short day;
    unsigned short hour;
    unsigned short minute;
    unsigned short second;
    unsigned short h_second;
};

/* Functions for prototyping */

/* From BBOARD.C */

void timer_reset(void);
void process_message(void);

/* From BBSUPP.C */

char * log_tran(char * log_name);
void send_msg(char * n, char * u, char * s);
void send_log_file(char * s);
char * get_vms_ver(void);
void init_log_file(void);
void send_opcom(char * s);
void from_text_fondle(char * s);
void subj_text_fondle(char * s);
void report_error(char * s, int error);
int receive_file(struct jnet_file_header * f);
int receive_message(char * node, char * user, char * msg);

/* From SUPP.C */

void critical_error(char * err_line);
void inter_error(char * log_flag, char * err_line, char * node, char * user);
void str_desc(struct dsc$descriptor * desc, char * str);
char * strip(char * s);
char * trim_end(char * s);
char * scrunch(char * s);
char * strupr(char * s);
char * strlwr(char * s);
char * remove_quotes(char * s);
long * get_time(long * buf);
struct $NUMTIM * get_numtim(struct $NUMTIM * num, long * buf);
long * start_end_time(char delt_type, long * buf_start, long * buf_end);
void * xmalloc(unsigned size);
void xfree(void * mem);
int fgets_lcl(char * s, int len, FILE * f);

/* From RULES.C */

int read_control_file(int reload, char * node, char * user);
void do_rules(FILE * note);
char * find_source(char * id);
void scan_header(FILE * note, struct source_info * p);
int digest_find(char dig_type, int * len, int * error);
int ignore_msgs(char * n, char * u);
int valid_manager(char * n, char * u);
int mandatory_link(char * l);
#ifdef DEBUG
void dump_control_file(void);
#endif

/* From USEFILE.C */

void use_file(struct jnet_file_header * f);
void put_note(FILE * note, struct rule_info * rule, struct list_info * list,
    int error_note);

/* From USEMSG.C */

void use_msg(char * node, char * user, char * msg);

/* From HOOKS.C */

int check_for_hook(char * hook);
void load_host_name(char * host);
char * check_links_down(void);
char * get_jnet_ver(void);
char * get_jnet_wrk(struct dsc$descriptor * jni_vers_dsc);

/* From NOTELOG.C */

void fondle_note_log_file(FILE * out, char interval, char * conf, char * hdr);
void reset_log_file_entry(char * conf, char * node, char * user);
void display_log_file_entry(char * conf, char * node, char * user);

/* From COMSUPP.C */

void com_write_notes(void);
FILE * com_open(void);
void com_close(int upd_count);

/* From DIGEST.C */

void digest_run(FILE * note, struct rule_info * rule, struct list_info * list);

/* And now for some global variables */

extern char * version;			/* BBOARD Version string */
extern unsigned int mail_received;	/* How many entries since start-up */
extern char host[];			/* What's the local host name? */
extern SYSTIM bboard_start;		/* When did we start the hook? */
extern unsigned int new_count;		/* How many unposted notes? */
extern int postings_suspended;		/* Can we write to Notes? */
extern int shutdown_state;		/* Are we shutting down? */
extern int log_available;		/* Can we use the Jnet log? */
extern int setuname_used;		/* Was SETUNAME used? */

/* Some fake globals */

extern int mode;			/* Used by jan_ calls */
extern int status;			/* Status from SYS$, etc. calls */
extern char temp[512];			/* Temporary string space */

#ifdef DESCRIP_H_DEFINED  		/* For VAX C, pre-V3.1 */
#define __DESCRIP_LOADED 1
#endif

#ifdef __DESCRIP_LOADED
extern struct dsc$descriptor hook_name;
extern struct dsc$descriptor root_dir;
extern struct dsc$descriptor scratch_dir;
extern struct dsc$descriptor control_file;

extern struct dsc$descriptor log_file;
extern struct dsc$descriptor error_conf;
extern struct dsc$descriptor local_contact;
#endif
extern SYSTIM bboard_time_interval;
extern unsigned int bboard_count_interval;

/* Some default values */

#define DEF_HOOK_NAME	    "BBOARD"
#define DEF_ROOT_DIR	    "SYS$SYSDEVICE:[BBOARD]"
#define DEF_SCRATCH_DIR     "SYS$SYSDEVICE:[BBOARD.SCRATCH]"
#define DEF_CONTROL_FILE    "BBOARD_DIR:BBOARD.CTL"
#define DEF_LOG_FILE	    "BBOARD_DIR:BBOARD.NOTELOG"
#define DEF_ERR_CONF	    "X-Unknown"
#define DEF_TIME_INTERVAL   "0 00:05:00.00"
#define DEF_COUNT_INTERVAL  5

#ifndef TEST
#define LOG_HOOK_NAME	    "BBOARD_HOOK_NAME"
#define LOG_ROOT_DIR	    "BBOARD_DIR"
#define LOG_SCRATCH_DIR	    "BBOARD_SCRATCH_DIR"
#define LOG_CONTROL_FILE    "BBOARD_CONTROL_FILE"
#else
#define LOG_HOOK_NAME	    "TESTBB_HOOK_NAME"
#define LOG_ROOT_DIR	    "TESTBB_DIR"
#define LOG_SCRATCH_DIR	    "TESTBB_SCRATCH_DIR"
#define LOG_CONTROL_FILE    "TESTBB_CONTROL_FILE"
#endif
