/*
 * Copyright (c) 1985, 1990
 *    The Regents of the University of California.  All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 * 	This product includes software developed by the University of
 * 	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*
 * Portions Copyright (c) 1993 by Digital Equipment Corporation.
 * 
 * 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, and that
 * the name of Digital Equipment Corporation not be used in advertising or
 * publicity pertaining to distribution of the document or software without
 * specific, written prior permission.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS.   IN NO EVENT SHALL DIGITAL EQUIPMENT
 * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 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.
 */

/*
 * Portions Copyright (c) 1996-2000 by Internet Software Consortium.
 *
 * 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 INTERNET SOFTWARE CONSORTIUM DISCLAIMS
 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 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.
 */

/*
 * Portions Copyright (c) 1999 by Check Point Software Technologies, Inc.
 * 
 * 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, and that
 * the name of Check Point Software Technologies Incorporated not be used 
 * in advertising or publicity pertaining to distribution of the document 
 * or software without specific, written prior permission.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS" AND CHECK POINT SOFTWARE TECHNOLOGIES 
 * INCORPORATED DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.   
 * IN NO EVENT SHALL CHECK POINT SOFTWARE TECHNOLOGIES INCORPRATED
 * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR 
 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 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.
 */

/* ns_func.h - declarations for ns_*.c's externally visible functions
 *
 * $Id: ns_func.h,v 1.3 2001/01/31 04:56:03 zarzycki Exp $
 */

/* ++from ns_glue.c++ */
struct in_addr		ina_get(const u_char *data);
const char *		sin_ntoa(struct sockaddr_in);
int			ns_wouldlog(int category, int level);
void			ns_debug(int, int, const char *, ...);
void			ns_info(int, const char *, ...);
void			ns_notice(int, const char *, ...);
void			ns_warning(int, const char *, ...);
void			ns_error(int, const char *, ...);
void			ns_panic(int, int, const char *, ...);
void			ns_assertion_failed(char *file, int line,
					    assertion_type type, char *cond,
					    int print_errno);
#define panic(A, B)	ns_panic(ns_log_default, 1, (A), (B))
void			gettime(struct timeval *);
int			nlabels(const char *);
int			my_close(int);
int			my_fclose(FILE *);
void			__freestr(char *);
char *			__newstr(size_t, int);
char *			__savestr(const char *, int);
char *			checked_ctime(const time_t *t);
char *			ctimel(long);
void			__freestr_record(char *, char *, int);
char *			__newstr_record(size_t, int, char *, int);
char *			__savestr_record(const char *, int, char *, int);
u_char *		ina_put(struct in_addr ina, u_char *data);
u_char *		savebuf(const u_char *, size_t, int);
void			dprintf(int level, const char *format, ...);
#ifdef DEBUG_STRINGS
char *			debug_newstr(size_t, int, const char *, int);
char *			debug_savestr(const char *, int, const char *, int);
void			debug_freestr(char *, const char *, int);
#define newstr(l, n) debug_newstr((l), (n), __FILE__, __LINE__)
#define savestr(s, n) debug_savestr((s), (n), __FILE__, __LINE__)
#define freestr(s) debug_freestr((s), __FILE__, __LINE__)
#else
#ifdef RECORD_STRINGS
#define newstr(l, n) __newstr_record((l), (n), __FILE__, __LINE__)
#define savestr(s, n) __savestr_record((s), (n), __FILE__, __LINE__)
#define freestr(s) __freestr_record((s), __FILE__, __LINE__)
#else
#define newstr(l, n) __newstr((l), (n))
#define savestr(s, n) __savestr((s), (n))
#define freestr(s) __freestr((s))
#endif
#endif /* DEBUG_STRINGS */
/* --from ns_glue.c-- */

/* ++from ns_notify.c++ */
#ifdef BIND_NOTIFY
void			ns_notify(const char *, ns_class, ns_type);
void			notify_afterload(void);
void			ns_unnotify(void);
void			ns_stopnotify(const char *, ns_class);
#endif
/* --from ns_notify.c-- */

/* ++from ns_resp.c++ */
void			ns_resp(u_char *, int, struct sockaddr_in,
				struct qstream *);
void			prime_cache(void);
void			delete_all(struct namebuf *, int, int);
int			delete_stale(struct namebuf *);
struct qinfo *		sysquery(const char *, int, int,
				 struct in_addr *, int, u_int16_t, int);
int			doupdate(u_char *, u_char *, struct databuf **,
				 int, int, int, u_int, struct sockaddr_in);
int			send_msg(u_char *, int, struct qinfo *);
int			findns(struct namebuf **, int,
			       struct databuf **, int *, int);
int			finddata(struct namebuf *, int, int, HEADER *,
				 char **, int *, int *);
int			add_data(struct namebuf *,
				 struct databuf **,
				 u_char *, int, int *);
int			trunc_adjust(u_char *, int, int);
/* --from ns_resp.c-- */

/* ++from ns_req.c++ */
void			ns_req(u_char *, int, int,
			       struct qstream *,
			       struct sockaddr_in,
			       int);
void			free_addinfo(void);
void			free_nsp(struct databuf **);
int			stale(struct databuf *);
int			make_rr(const char *, struct databuf *,
				u_char *, int, int,
				u_char **, u_char **, int);
int			doaddinfo(HEADER *, u_char *, int);
int			doaddauth(HEADER *, u_char *, int,
				  struct namebuf *,
				  struct databuf *);
#ifdef BIND_NOTIFY
int			findZonePri(const struct zoneinfo *,
				    const struct sockaddr_in);
#endif
/* --from ns_req.c-- */

/* ++from ns_xfr.c++ */
void			ns_xfr(struct qstream *qsp, struct namebuf *znp,
			       int zone, int class, int type,
			       int id, int opcode, u_int32_t serial_ixfr, 
			       struct tsig_record *in_tsig);
void			ns_stopxfrs(struct zoneinfo *);
void			ns_freexfr(struct qstream *);
void			sx_newmsg(struct qstream *qsp);
void			sx_sendlev(struct qstream *qsp);
void			sx_sendsoa(struct qstream *qsp);
/* --from ns_xfr.c-- */

/* ++from ns_ctl.c++ */
void			ns_ctl_initialize(void);
void			ns_ctl_shutdown(void);
void			ns_ctl_defaults(controls *);
void			ns_ctl_add(controls *, control);
control			ns_ctl_new_inet(struct in_addr, u_int, ip_match_list);
#ifndef WINNT
control			ns_ctl_new_unix(char *, mode_t, uid_t, gid_t);
#endif
void			ns_ctl_install(controls *);
/* --from ns_ctl.c-- */

/* ++from ns_ixfr.c++ */
void			sx_send_ixfr(struct qstream *);
int			ixfr_log_maint(struct zoneinfo *);
/* --from ns_ixfr.c-- */

/* ++from ns_forw.c++ */
time_t			retrytime(struct qinfo *);
int			ns_forw(struct databuf *nsp[],
				u_char *msg,
				int msglen,
				struct sockaddr_in from,
				struct qstream *qsp,
				int dfd,
				struct qinfo **qpp,
				const char *dname,
				int class,
				int type,
				struct namebuf *np,
				int use_tcp,
				struct tsig_record *in_tsig);
int			haveComplained(u_long, u_long);
int			nslookup(struct databuf *nsp[],
				 struct qinfo *qp,
				 const char *syslogdname,
				 const char *sysloginfo);
int			qcomp(struct qserv *, struct qserv *);
void			schedretry(struct qinfo *, time_t);
void			unsched(struct qinfo *);
void			reset_retrytimer(void);
void			retrytimer(evContext ctx, void *uap,
				   struct timespec due, struct timespec ival);
void			retry(struct qinfo *);
void			qflush(void);
void			qremove(struct qinfo *);
void			ns_freeqns(struct qinfo *, char *);
void			ns_freeqry(struct qinfo *);
void			freeComplaints(void);
void			nsfwdadd(struct qinfo *, struct fwdinfo *);
struct qinfo *		qfindid(u_int16_t);
struct qinfo *		qnew(const char *, int, int, int);
/* --from ns_forw.c-- */

/* ++from ns_main.c++ */
void			toggle_qrylog(void);
struct in_addr		net_mask(struct in_addr);
void			sq_remove(struct qstream *);
void			sq_flushw(struct qstream *);
void			sq_flush(struct qstream *allbut);
void			dq_remove_gen(time_t gen);
void			dq_remove_all();
void			sq_done(struct qstream *);
void			ns_setproctitle(char *, int);
void			getnetconf(int);
void			nsid_init(void);
void			ns_setoption(int option);
void			writestream(struct qstream *, const u_char *, int);
void			ns_need_unsafe(enum need);
void			ns_need(enum need);
void			opensocket_f(void);
void			nsid_hash(u_char *, size_t);
u_int16_t		nsid_next(void);
int			sq_openw(struct qstream *, int);
int			sq_writeh(struct qstream *, sq_closure);
int			sq_write(struct qstream *, const u_char *, int);
int			tcp_send(struct qinfo *);
int			aIsUs(struct in_addr);
/* --from ns_main.c-- */

/* ++from ns_maint.c++ */
void			zone_maint(struct zoneinfo *);
void			sched_zone_maint(struct zoneinfo *);
void			ns_cleancache(evContext ctx, void *uap,
				      struct timespec due,
				      struct timespec inter);
void			clean_cache_from(char *dname, struct hashbuf *htp);
void			remove_zone(struct zoneinfo *, const char *);
void			purge_zone(const char *, struct hashbuf *, int);
void			loadxfer(void);
void			qserial_retrytime(struct zoneinfo *, time_t);
void			qserial_query(struct zoneinfo *);
void			qserial_answer(struct qinfo *);
#ifdef DEBUG
void			printzoneinfo(int, int, int);
#endif
void			endxfer(void);
void			addxfer(struct zoneinfo *);
void			ns_zreload(void);
void			ns_reload(void);
void			ns_reconfig(void);
void			ns_noexpired(void);
#if 0
int			reload_all_unsafe(void);
#endif
int			zonefile_changed_p(struct zoneinfo *);
int			reload_master(struct zoneinfo *);
const char *		deferred_reload_unsafe(struct zoneinfo *);
struct namebuf *	purge_node(struct hashbuf *htp, struct namebuf *np);
int			clean_cache(struct hashbuf *, int);
void			reapchild(void);
const char *		zoneTypeString(unsigned int);
void			ns_heartbeat(evContext ctx, void *uap,
				     struct timespec, struct timespec);
void			make_new_zones(void);
void			free_zone(struct zoneinfo *);
struct zoneinfo *	find_auth_zone(const char *, ns_class);
int			purge_nonglue(const char *dname, struct hashbuf *htp,
				      int class, int log);
/* --from ns_maint.c-- */

/* ++from ns_sort.c++ */
void			sort_response(u_char *, u_char *, int,
				      struct sockaddr_in *);
/* --from ns_sort.c-- */

/* ++from ns_init.c++ */
void			ns_refreshtime(struct zoneinfo *, time_t);
void			ns_retrytime(struct zoneinfo *, time_t);
time_t			ns_init(const char *);
void			purgeandload(struct zoneinfo *zp);
enum context		ns_ptrcontext(const char *owner);
enum context		ns_ownercontext(int type, enum transport);
int			ns_nameok(const struct qinfo *qry, const char *name,
				  int class, struct zoneinfo *zp,
				  enum transport, enum context,
				  const char *owner,
				  struct in_addr source);
int			ns_wildcard(const char *name);
void			zoneinit(struct zoneinfo *);
void			do_reload(const char *, int, int, int);
void			ns_shutdown(void);
/* --from ns_init.c-- */

/* ++from ns_ncache.c++ */
void			cache_n_resp(u_char *, int, struct sockaddr_in,
				     const char *, int, int);
/* --from ns_ncache.c-- */

/* ++from ns_udp.c++ */
void			ns_udp(void);
/* --from ns_udp.c-- */

/* ++from ns_stats.c++ */
void			ns_stats(void);
void			ns_stats_dumpandclear(void);
void			ns_freestats(void);
void			ns_logstats(evContext ctx, void *uap,
				    struct timespec, struct timespec);
void			qtypeIncr(int qtype);
struct nameser *	nameserFind(struct in_addr addr, int flags);
#define NS_F_INSERT	0x0001
#define nameserIncr(a,w) NS_INCRSTAT(a,w)	/* XXX should change name. */
/* --from ns_stats.c-- */

/* ++from ns_update.c++ */
struct databuf *	findzonesoa(struct zoneinfo *);
void			free_rrecp(ns_updque *, int rcode, struct sockaddr_in);
int			findzone(const char *, int, int, int *, int);
u_char *		findsoaserial(u_char *data);
u_int32_t		get_serial_unchecked(struct zoneinfo *zp);
u_int32_t		get_serial(struct zoneinfo *zp);
void			set_serial(struct zoneinfo *zp, u_int32_t serial);
int			schedule_soa_update(struct zoneinfo *, int);
int			schedule_dump(struct zoneinfo *);
int			incr_serial(struct zoneinfo *zp);
int			merge_logs(struct zoneinfo *zp, char *logname);
int			zonedump(struct zoneinfo *zp, int isixfr);
void			dynamic_about_to_exit(void);
enum req_action		req_update(HEADER *hp, u_char *cp, u_char *eom,
				   u_char *msg, struct qstream *qsp,
				   int dfd, struct sockaddr_in from,
				   struct tsig_record *in_tsig);
void			rdata_dump(struct databuf *dp, FILE *fp);
/* --from ns_update.c-- */

/* ++from ns_config.c++ */
void			add_to_rrset_order_list(rrset_order_list,
						rrset_order_element);
const char *		p_order(int);
int			set_zone_ixfr_file(zone_config, char *);
int			set_zone_master_port(zone_config, u_short);
int			set_zone_max_log_size_ixfr(zone_config, int);
int			set_zone_dialup(zone_config, int);
int			set_trusted_key(const char *, const int,
					const int, const int, const char *);
int			set_zone_ixfr_tmp(zone_config, char *);
void			free_zone_timerinfo(struct zoneinfo *);
void			free_zone_contents(struct zoneinfo *, int);
struct zoneinfo *	find_zone(const char *, int);
zone_config		begin_zone(char *, int);
void			end_zone(zone_config, int);
int			set_zone_type(zone_config, int);
int			set_zone_filename(zone_config, char *);
int 			set_zone_checknames(zone_config, enum severity);
#ifdef BIND_NOTIFY
int			set_zone_notify(zone_config, int value);
#endif
int			set_zone_maintain_ixfr_base(zone_config, int value);
int			set_zone_update_acl(zone_config, ip_match_list);
int			set_zone_query_acl(zone_config, ip_match_list);
int			set_zone_transfer_acl(zone_config, ip_match_list);
int			set_zone_transfer_source(zone_config, struct in_addr);
int			set_zone_pubkey(zone_config, const int, const int,
					const int, const char *);
int 			set_zone_transfer_time_in(zone_config, long);
int			add_zone_master(zone_config, struct in_addr);
#ifdef BIND_NOTIFY
int			add_zone_notify(zone_config, struct in_addr);
#endif
void			set_zone_forward(zone_config);
void			add_zone_forwarder(zone_config, struct in_addr);
void			set_zone_boolean_option(zone_config, int, int);
options			new_options(void);
void			free_options(options);
void			free_rrset_order_list(rrset_order_list);
void			set_global_boolean_option(options, int, int);
listen_info_list	new_listen_info_list(void);
void			free_listen_info_list(listen_info_list);
void			add_listen_on(options, u_short, ip_match_list);
FILE *			write_open(char *filename);
void			update_pid_file(void);
void			set_options(options, int);
void			use_default_options(void);
enum ordering		lookup_ordering(const char *);
rrset_order_list	new_rrset_order_list(void);
rrset_order_element	new_rrset_order_element(int, int, char *, enum ordering);
ip_match_list		new_ip_match_list(void);
void			free_ip_match_list(ip_match_list);
ip_match_element	new_ip_match_pattern(struct in_addr, u_int);
ip_match_element	new_ip_match_mask(struct in_addr, struct in_addr);
ip_match_element	new_ip_match_indirect(ip_match_list);
ip_match_element	new_ip_match_key(struct dst_key *dst_key);
ip_match_element	new_ip_match_localhost(void);
ip_match_element	new_ip_match_localnets(void);
void			ip_match_negate(ip_match_element);
void			add_to_ip_match_list(ip_match_list, ip_match_element);
void			dprint_ip_match_list(int, ip_match_list, int, char *,
					     char *);
int			ip_match_address(ip_match_list, struct in_addr);
int			ip_match_addr_or_key(ip_match_list, struct in_addr,
					     struct dst_key *key);
int			ip_address_allowed(ip_match_list, struct in_addr);
int			ip_addr_or_key_allowed(ip_match_list iml,
					       struct in_addr,
					       struct dst_key *key);
int			ip_match_network(ip_match_list, struct in_addr,
					 struct in_addr);
int			ip_match_key_name(ip_match_list iml, char *name);
int			distance_of_address(ip_match_list, struct in_addr);
int			ip_match_is_none(ip_match_list);
#ifdef BIND_NOTIFY
void			free_also_notify(options);
int			add_global_also_notify(options, struct in_addr);
#endif
void			add_global_forwarder(options, struct in_addr);
void			free_forwarders(struct fwdinfo *);
server_info		find_server(struct in_addr);
server_config		begin_server(struct in_addr);
void			end_server(server_config, int);
void			set_server_option(server_config, int, int);
void			set_server_transfers(server_config, int);
void			set_server_transfer_format(server_config,
						   enum axfr_format);
void			add_server_key_info(server_config, struct dst_key *);
struct dst_key		*new_key_info(char *, char *, char *);
void			free_key_info(struct dst_key *);
struct dst_key		*find_key(char *name, char *algorithm);
void			dprint_key_info(struct dst_key *);
key_info_list		new_key_info_list(void);
void			free_key_info_list(key_info_list);
void			add_to_key_info_list(key_info_list, struct dst_key *);
void			dprint_key_info_list(key_info_list);
log_config		begin_logging(void);
void			add_log_channel(log_config, int, log_channel);
void			open_special_channels(void);
void			set_logging(log_config, int);
void			end_logging(log_config, int);
void			use_default_logging(void);
void			init_logging(void);
void			shutdown_logging(void);
void			init_configuration(void);
void			shutdown_configuration(void);
time_t			load_configuration(const char *);
/* --from ns_config.c-- */

/* ++from parser.y++ */
ip_match_list		lookup_acl(char *);
void			define_acl(char *, ip_match_list);
struct dst_key		*lookup_key(char *);
void			define_key(char *, struct dst_key *);
time_t			parse_configuration(const char *);
void			parser_initialize(void);
void			parser_shutdown(void);
/* --from parser.y-- */

/* ++from ns_signal.c++ */
void                    init_signals(void);
void			block_signals(void);
void			unblock_signals(void);
/* --from ns_signal.c-- */
