#ifndef _TCPD_H
#define _TCPD_H
#define HAVE_IPV6
#define STRING_LENGTH 128
#include <sys/socket.h>
#include <netinet/in.h>
typedef struct sockaddr_gen {
union {
struct sockaddr _sg_sa;
struct sockaddr_in _sg_sin;
#ifdef HAVE_IPV6
struct sockaddr_in6 _sg_sin6;
#endif
} sg_addr;
} sockaddr_gen;
typedef union gen_addr {
struct in_addr ga_in;
#ifdef HAVE_IPV6
struct in6_addr ga_in6;
#endif
} gen_addr;
extern void sockgen_simplify();
#define sg_sa sg_addr._sg_sa
#define sg_sin sg_addr._sg_sin
#define sg_sin6 sg_addr._sg_sin6
#define sg_family sg_sa.sa_family
#ifdef HAVE_IPV6
#define SGADDRSZ(sag) ((sag)->sg_family == AF_INET6 ? \
sizeof (struct in6_addr) : \
sizeof (struct in_addr))
#define SGSOCKADDRSZ(sag) ((sag)->sg_family == AF_INET6 ? \
sizeof (struct sockaddr_in6) : \
sizeof (struct sockaddr_in))
#define SGPORT(sag) (*((sag)->sg_family == AF_INET6 ? \
&(sag)->sg_sin6.sin6_port : \
&(sag)->sg_sin.sin_port))
#define SGADDRP(sag) (((sag)->sg_family == AF_INET6 ? \
(char *)&(sag)->sg_sin6.sin6_addr : \
(char *)&(sag)->sg_sin.sin_addr))
#define SGFAM(sag) ((sag)->sg_family == AF_INET6 ? \
AF_INET6 : AF_INET)
#define SG_IS_UNSPECIFIED(sag) \
((sag)->sg_family == AF_INET6 ? \
IN6_IS_ADDR_UNSPECIFIED(&(sag)->sg_sin6.sin6_addr) : \
(sag)->sg_sin.sin_addr.s_addr == 0)
#define VALID_ADDRTYPE(t) ((t) == AF_INET || (t) == AF_INET6)
#ifndef IPV6_ABITS
#define IPV6_ABITS 128
#endif
#else
#define SGADDRSZ(sag) sizeof (struct in_addr)
#define SGSOCKADDRSZ(sag) sizeof (struct sockaddr_in)
#define SGPORT(sag) ((sag)->sg_sin.sin_port)
#define SGADDRP(sag) ((char *)&(sag)->sg_sin.sin_addr)
#define SGFAM(sag) AF_INET
#define SG_IS_UNSPECIFIED(sag) ((sag)->sg_sin.sin_addr.s_addr == 0)
#define VALID_ADDRTYPE(t) ((t) == AF_INET)
#endif
struct host_info {
char name[STRING_LENGTH];
char addr[STRING_LENGTH];
struct sockaddr_gen *sin;
struct t_unitdata *unit;
struct request_info *request;
};
struct request_info {
int fd;
char user[STRING_LENGTH];
char daemon[STRING_LENGTH];
char pid[10];
struct host_info client[1];
struct host_info server[1];
void (*sink) ();
void (*hostname) ();
void (*hostaddr) ();
void (*cleanup) ();
struct netconfig *config;
};
#define STRN_CPY(d, s, l) { strncpy((d), (s), (l)); (d)[(l)-1] = 0; }
#define STRN_EQ(x, y, l) (strncasecmp((x), (y), (l)) == 0)
#define STRN_NE(x, y, l) (strncasecmp((x), (y), (l)) != 0)
#define STR_EQ(x, y) (strcasecmp((x), (y)) == 0)
#define STR_NE(x, y) (strcasecmp((x), (y)) != 0)
#define STRING_UNKNOWN "unknown"
#define STRING_PARANOID "paranoid"
extern char unknown[];
extern char paranoid[];
#define HOSTNAME_KNOWN(s) (STR_NE((s), unknown) && STR_NE((s), paranoid))
#ifdef HAVE_IPV6
#define NOT_INADDR(s) (strchr(s, ':') == 0 && s[strspn(s, "0123456789./")] != 0)
#else
#define NOT_INADDR(s) (s[strspn(s, "0123456789./")] != 0)
#endif
#if defined(TLI) || defined(PTX) || defined(TLI_SEQUENT)
extern void fromhost();
#else
#define fromhost sock_host
#endif
extern int hosts_ctl();
extern int hosts_access();
extern void shell_cmd();
extern char *percent_x();
extern void rfc931();
extern void clean_exit();
extern void refuse();
extern char *xgets();
extern char *split_at();
extern unsigned long dot_quad_addr();
extern int numeric_addr();
extern struct hostent *tcpd_gethostbyname();
#ifdef HAVE_IPV6
extern char *skip_ipv6_addrs();
#else
#define skip_ipv6_addrs(x) x
#endif
extern int allow_severity;
extern int deny_severity;
extern char *hosts_allow_table;
extern char *hosts_deny_table;
extern int hosts_access_verbose;
extern int rfc931_timeout;
extern int resident;
#ifdef __STDC__
extern struct request_info *request_init(struct request_info *, ...);
extern struct request_info *request_set(struct request_info *, ...);
#else
extern struct request_info *request_init();
extern struct request_info *request_set();
#endif
#define RQ_FILE 1
#define RQ_DAEMON 2
#define RQ_USER 3
#define RQ_CLIENT_NAME 4
#define RQ_CLIENT_ADDR 5
#define RQ_CLIENT_SIN 6
#define RQ_SERVER_NAME 7
#define RQ_SERVER_ADDR 8
#define RQ_SERVER_SIN 9
extern char *eval_user();
extern char *eval_hostname();
extern char *eval_hostaddr();
extern char *eval_hostinfo();
extern char *eval_client();
extern char *eval_server();
#define eval_daemon(r) ((r)->daemon)
#define eval_pid(r) ((r)->pid)
extern void sock_host();
extern void sock_hostname();
extern void sock_hostaddr();
#define sock_methods(r) \
{ (r)->hostname = sock_hostname; (r)->hostaddr = sock_hostaddr; }
#if defined(TLI) || defined(PTX) || defined(TLI_SEQUENT)
extern void tli_host();
#endif
#ifdef __STDC__
extern void tcpd_warn(char *, ...);
extern void tcpd_jump(char *, ...);
#else
extern void tcpd_warn();
extern void tcpd_jump();
#endif
struct tcpd_context {
char *file;
int line;
};
extern struct tcpd_context tcpd_context;
#define AC_PERMIT 1
#define AC_DENY (-1)
#define AC_ERROR AC_DENY
extern void process_options();
extern int dry_run;
#ifdef INET_ADDR_BUG
#define inet_addr fix_inet_addr
extern long fix_inet_addr();
#endif
#ifdef BROKEN_FGETS
#define fgets fix_fgets
extern char *fix_fgets();
#endif
#ifdef RECVFROM_BUG
#define recvfrom fix_recvfrom
extern int fix_recvfrom();
#endif
#ifdef GETPEERNAME_BUG
#define getpeername fix_getpeername
extern int fix_getpeername();
#endif
#ifdef SOLARIS_24_GETHOSTBYNAME_BUG
#define gethostbyname fix_gethostbyname
extern struct hostent *fix_gethostbyname();
#endif
#ifdef USE_STRSEP
#define strtok fix_strtok
extern char *fix_strtok();
#endif
#ifdef LIBC_CALLS_STRTOK
#define strtok my_strtok
extern char *my_strtok();
#endif
#endif