/*
* ProFTPD - FTP server daemon
* Copyright (c) 2003-2005 The ProFTPD Project team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* As a special exemption, The ProFTPD Project team and other respective
* copyright holders give permission to link this program with OpenSSL, and
* distribute the resulting executable, without including the source code for
* OpenSSL in the source distribution.
*/
/* Network address API
* $Id: netaddr.h,v 1.19 2005/09/19 21:35:38 castaglia Exp $
*/
#ifndef PR_NETADDR_H
#define PR_NETADDR_H
#include "conf.h"
#ifndef HAVE_STRUCT_ADDRINFO
struct addrinfo {
/* AI_PASSIVE, AI_CANONNAME */
int ai_flags;
/* AF/PF_xxx */
int ai_family;
/* SOCK_xxx */
int ai_socktype;
/* IPPROTO_xxx for IPv4/v6 */
int ai_protocol;
/* Length of ai_addr */
int ai_addrlen;
/* Canonical name for host */
char *ai_canonname;
/* Binary address */
struct sockaddr *ai_addr;
/* Next structure in the linked list */
struct addrinfo *ai_next;
};
#endif /* HAVE_STRUCT_ADDRINFO */
#if defined(HAVE_GETADDRINFO) && !defined(PR_USE_GETADDRINFO)
/* Use the system getaddrinfo(2) and freeaddrinfo(2) by redefining the
* 'pr_getaddrinfo' and 'pr_freeaddrinfo' symbols to be 'getaddrinfo' and
* 'freeaddrinfo', respectively.
*/
# define pr_getaddrinfo getaddrinfo
# define pr_freeaddrinfo freeaddrinfo
#else
int pr_getaddrinfo(const char *, const char *, const struct addrinfo *,
struct addrinfo **);
void pr_freeaddrinfo(struct addrinfo *);
#endif /* HAVE_GETNAMEINFO and !PR_USE_GETNAMEINFO */
/* These AI_ defines are for use by getaddrinfo(3). */
/* Indicates that the socket is intended for bind()+listen(). */
#ifndef AI_PASSIVE
# define AI_PASSIVE 1
#endif /* AI_PASSIVE */
/* Return the canonical name. */
#ifndef AI_CANONNAME
# define AI_CANONNAME 2
#endif /* AI_CANONNAME */
/* The following EAI_ defines are for errors. */
/* Host address family not supported. */
#ifndef EAI_ADDRFAMILY
# define EAI_ADDRFAMILY -1
#endif /* EAI_ADDRFAMILY */
/* Temporary failure in name resolution. */
#ifndef EAI_AGAIN
# define EAI_AGAIN -2
#endif /* EAI_AGAIN */
/* Invalid value for ai_flags. */
#ifndef EAI_BADFLAGS
# define EAI_BADFLAGS -3
#endif /* EAI_BADFLAGS */
/* Non-recoverable failure in name resolution. */
#ifndef EAI_FAIL
# define EAI_FAIL -4
#endif /* EAI_FAIL */
/* ai_family not supported. */
#ifndef EAI_FAMILY
# define EAI_FAMILY -5
#endif /* EAI_FAMILY */
/* Memory allocation failure. */
#ifndef EAI_MEMORY
# define EAI_MEMORY -6
#endif /* EAI_MEMORY */
/* No address associated with host. */
#ifndef EAI_NODATA
# define EAI_NODATA -7
#endif /* EAI_NODATA */
/* Host nor service not provided, or not known. */
#ifndef EAI_NONAME
# define EAI_NONAME -8
#endif /* EAI_NONAME */
/* Service not supported for ai_socktype. */
#ifndef EAI_SERVICE
# define EAI_SERVICE -9
#endif /* EAI_SERVICE */
/* ai_socktype not supported. */
#ifndef EAI_SOCKTYPE
# define EAI_SOCKTYPE -10
#endif /* EAI_SOCKTYPE */
/* System error contained in errno. */
#ifndef EAI_SYSTEM
# define EAI_SYSTEM -11
#endif /* EAI_SYSTEM */
#if defined(HAVE_GETNAMEINFO) && !defined(PR_USE_GETNAMEINFO)
/* Use the system getnameinfo(2) by redefining the 'pr_getnameinfo' symbol
* to be simply 'getnameinfo'.
*/
# define pr_getnameinfo getnameinfo
#else
int pr_getnameinfo(const struct sockaddr *, socklen_t, char *, size_t,
char *, size_t, int);
#endif /* HAVE_GETNAMEINFO and !PR_USE_GETNAMEINFO */
/* These NI_ defines are for use by getnameinfo(3). */
/* Max hostname length returned. */
#ifndef NI_MAXHOST
# define NI_MAXHOST 1025
#endif /* NI_MAXHOST */
/* Max service name length returned. */
#ifndef NI_MAXSERV
# define NI_MAXSERV 32
#endif /* NI_MAXSERV */
/* Do not return FQDNs. */
#ifndef NI_NOFQDN
# define NI_NOFQDN 1
#endif /* NI_NOFQDN */
/* Return the numeric form of the hostname. */
#ifndef NI_NUMERICHOST
# define NI_NUMERICHOST 2
#endif /* NI_NUMERICHOST */
/* Return an error if hostname is not found. */
#ifndef NI_NAMEREQD
# define NI_NAMEREQD 4
#endif /* NI_NAMEREQD */
/* Return the numeric form of the service name. */
#ifndef NI_NUMERICSERV
# define NI_NUMERICSERV 8
#endif /* NI_NUMERICSERV */
/* Datagram service for getservbyname(). */
#ifndef NI_DGRAM
# define NI_DGRAM 16
#endif /* NI_DGRAM */
#if defined(HAVE_INET_NTOP)
/* Use the system inet_ntop(3) by redefining the 'pr_inet_ntop' symbol to be
* 'inet_ntop'.
*/
# define pr_inet_ntop inet_ntop
#else
const char *pr_inet_ntop(int, const void *, char *, size_t);
#endif
#if defined(HAVE_INET_PTON)
/* Use the system inet_pton(3) by redefining the 'pr_inet_pton' symbol to be
* 'inet_pton'.
*/
# define pr_inet_pton inet_pton
#else
int pr_inet_pton(int, const char *, void *);
#endif
/* Network Address API
*/
/* Allocate an initialized netaddr from the given pool. */
pr_netaddr_t *pr_netaddr_alloc(pool *);
/* Duplicate a netaddr using the given pool. */
pr_netaddr_t *pr_netaddr_dup(pool *, pr_netaddr_t *);
/* Initialize the given netaddr. */
void pr_netaddr_clear(pr_netaddr_t *);
/* Given a name (either an IP address string or a DNS name), return a
* pr_netaddr_t * for that name. In the case of DNS names, multiple
* addresses might be associated with given name; callers that are interested
* in these additional addresses should provide a pointer to an array_header *,
* which will be filled with an array_header (allocated from the given pool)
* that contains a list of additional pr_netaddr_t *'s.
*
* If there is a failure in resolving the given name to its address(es),
* NULL will be return, and an error logged.
*/
pr_netaddr_t *pr_netaddr_get_addr(pool *, const char *, array_header **);
/* Compare the two given pr_netaddr_ts. In order for the comparison to
* be accurate, the pr_netaddr_ts must be of the same family (AF_INET or
* AF_INET6). In the case where the pr_netaddr_ts are from different
* families, -1 will be returned, with errno set to EINVAL. Otherwise,
* the comparison is a fancy memcmp().
*/
int pr_netaddr_cmp(const pr_netaddr_t *, const pr_netaddr_t *);
/* Compare the first N bits of the two given pr_netaddr_ts. In order for
* the comparison to be accurate, the pr_netaddr_ts must be of the same family
* (AF_INET or AF_INET6). In the case where the pr_netaddr_ts are from
* different families, -1 will be returned, with errno set to EINVAL.
* Otherwise, the comparison is a fancy memcmp().
*/
int pr_netaddr_ncmp(const pr_netaddr_t *, const pr_netaddr_t *, unsigned int);
/* Compare the given pr_netaddr_t against a glob pattern, as intended for
* fnmatch(3). The flags parameter is an OR of the following values:
* PR_NETADDR_MATCH_DNS and PR_NETADDR_MATCH_IP. If the PR_NETADDR_MATCH_DNS
* flag is used, the given pattern will be matched against the DNS string of
* the netaddr, if present. If that doesn't match, and if the
* PR_NETADDR_MATCH_IP flag is used, a comparison against the IP address string
* will be tried. A return value of -1, with errno set to EINVAL, occurs if
* the netaddr or pattern are NULL. Otherwise, TRUE is returned if the address
* is matched by the pattern, or FALSE if is not matched.
*/
int pr_netaddr_fnmatch(pr_netaddr_t *, const char *, int);
#define PR_NETADDR_MATCH_DNS 0x001
#define PR_NETADDR_MATCH_IP 0x002
/* Returns the size of the contained address (or -1, with errno set to EINVAL,
* if NULL is used as the argument). If the pr_netaddr_t is of the AF_INET
* family, the size of struct sockaddr_in is returned; if of the AF_INET6
* family, the size of struct sockaddr_in6 is returned.
*/
size_t pr_netaddr_get_sockaddr_len(const pr_netaddr_t *);
/* Returns the size of the contained address (or -1, with errno set to EINVAL,
* if NULL is used as the argument). If the pr_netaddr_t is of the AF_INET
* family, the size of struct in_addr is returned; if of the AF_INET6
* family, the size of struct in6_addr is returned.
*/
size_t pr_netaddr_get_inaddr_len(const pr_netaddr_t *);
/* Returns the family of the given pr_netaddr_t, either AF_INET or AF_INET6.
* A NULL pr_netaddr_t will result in -1 being returned, and errno set to
* EINVAL.
*/
int pr_netaddr_get_family(const pr_netaddr_t *);
/* Sets the family on the given pr_netaddr_t. Returns 0 on success, or
* -1 on error (as when NULL is used as the argument).
*/
int pr_netaddr_set_family(pr_netaddr_t *, int);
/* Returns a void * pointing to either a struct in_addr (if the family of the
* given pr_netaddr_t is AF_INET) or a struct in6_addr (if the family of the
* given pr_netaddr_t is AF_INET6). Returns NULL on error.
*/
void *pr_netaddr_get_inaddr(const pr_netaddr_t *);
/* Returns a struct sockaddr * (pointing to either a struct sockaddr_in or
* a struct sockaddr_in6, depending on the family), or NULL if there was an
* error.
*/
struct sockaddr *pr_netaddr_get_sockaddr(const pr_netaddr_t *);
/* Set the contained sockaddr * in the given pr_netaddr_t to be the
* sockaddr given. The family of the pr_netaddr_t must have been set
* first. Returns 0 on success, and -1 on error.
*/
int pr_netaddr_set_sockaddr(pr_netaddr_t *, struct sockaddr *);
/* Sets the address of the contained sockaddr to be the wildcard address.
* Returns 0 on success, and -1 on error.
*/
int pr_netaddr_set_sockaddr_any(pr_netaddr_t *);
/* Returns the port of the contained struct sockaddr *. */
unsigned int pr_netaddr_get_port(const pr_netaddr_t *);
/* Sets the port on the contained struct sockaddr *. Returns 0 on success,
* or -1 on error (as when NULL is given as the argument).
*/
int pr_netaddr_set_port(pr_netaddr_t *, unsigned int);
/* Enables or disable use of reverse DNS lookups. Returns the previous
* setting.
*/
int pr_netaddr_set_reverse_dns(int);
/* Returns the DNS name associated with the given pr_netaddr_t. If DNS
* lookups have been disabled, the returned string will be the IP address.
* Returns NULL if there was an error.
*/
const char *pr_netaddr_get_dnsstr(pr_netaddr_t *);
/* Returns the IP address associated with the given pr_netaddr_t. Returns
* NULL if there was an error.
*/
const char *pr_netaddr_get_ipstr(pr_netaddr_t *);
/* Returns the name of the local host, as returned by gethostname(2). The
* returned string will be dup'd from the given pool, if any.
*/
const char *pr_netaddr_get_localaddr_str(pool *);
unsigned int pr_netaddr_get_addrno(const pr_netaddr_t *);
/* Returns TRUE if the given pr_netaddr_t contains a loopback address,
* FALSE otherwise.
*/
int pr_netaddr_loopback(const pr_netaddr_t *);
/* Returns TRUE if the given pr_netaddr_t is of the AF_INET6 family and
* contains an IPv4-mapped IPv6 address; otherwise FALSE is returned. A
* return value of -1 is used to indicate an error.
*/
int pr_netaddr_is_v4mappedv6(const pr_netaddr_t *);
/* Return pointers to static memory which contains the local and remote
* netaddr information for the sesssion. DO NOT MODIFY the pointed-to
* memory! Returns NULL if no such session information exists.
*/
pr_netaddr_t *pr_netaddr_get_sess_local_addr(void);
pr_netaddr_t *pr_netaddr_get_sess_remote_addr(void);
const char *pr_netaddr_get_sess_remote_name(void);
void pr_netaddr_set_sess_addrs(void);
#endif /* PR_NETADDR_H */
Last Updated: Thu Feb 23 11:06:46 2006
HTML generated by tj's src2html script