#ifndef _SOCKMISC_H
#define _SOCKMISC_H
struct netaddr {
union {
struct sockaddr_storage sa;
struct sockaddr_in sin;
struct sockaddr_in6 sin6;
} sa;
unsigned long prefix;
};
extern const int niflags;
extern int cmpsaddrwop (const struct sockaddr_storage *, const struct sockaddr_storage *);
extern int cmpsaddrwop_withprefix(const struct sockaddr_storage *, const struct sockaddr_storage *, int);
extern int cmpsaddrwild (const struct sockaddr_storage *, const struct sockaddr_storage *);
extern int cmpsaddrstrict (const struct sockaddr_storage *, const struct sockaddr_storage *);
extern int cmpsaddrstrict_withprefix(const struct sockaddr_storage *, const struct sockaddr_storage *, int);
#ifdef ENABLE_NATT
#define CMPSADDR(saddr1, saddr2) cmpsaddrstrict((saddr1), (saddr2))
#define CMPSADDR2(saddr1, saddr2) cmpsaddrwild((saddr1), (saddr2))
#else
#define CMPSADDR(saddr1, saddr2) cmpsaddrwop((saddr1), (saddr2))
#define CMPSADDR2(saddr1, saddr2) cmpsaddrwop((saddr1), (saddr2))
#endif
extern struct sockaddr_storage *getlocaladdr (struct sockaddr *);
extern int recvfromto (int, void *, size_t, int,
struct sockaddr_storage *, socklen_t *, struct sockaddr_storage *, unsigned int *);
extern int sendfromto (int, const void *, size_t,
struct sockaddr_storage *, struct sockaddr_storage *, int);
extern int setsockopt_bypass (int, int);
extern struct sockaddr_storage *newsaddr (int);
extern struct sockaddr_storage *dupsaddr (struct sockaddr_storage *);
extern char *saddr2str (const struct sockaddr *);
extern char *saddr2str_with_prefix __P((const struct sockaddr *, int));
extern char *saddrwop2str (const struct sockaddr *);
extern char *saddr2str_fromto (const char *format,
const struct sockaddr *saddr,
const struct sockaddr *daddr);
extern struct sockaddr_storage *str2saddr (char *, char *);
extern void mask_sockaddr (struct sockaddr_storage *, const struct sockaddr_storage *,
size_t);
extern char *naddrwop2str (const struct netaddr *naddr);
extern char *naddrwop2str_fromto (const char *format, const struct netaddr *saddr,
const struct netaddr *daddr);
extern int naddr_score(const struct netaddr *naddr, const struct sockaddr_storage *saddr);
extern u_int16_t extract_port (const struct sockaddr_storage *addr);
extern u_int16_t *set_port (struct sockaddr_storage *addr, u_int16_t new_port);
extern u_int16_t *get_port_ptr (struct sockaddr_storage *addr);
#endif