diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/db/daemon/client.c perdition-ipv6/perdition/db/daemon/client.c --- perdition/db/daemon/client.c Wed Feb 9 16:02:50 2005 +++ perdition-ipv6/perdition/db/daemon/client.c Tue Jun 5 17:44:31 2007 @@ -21,8 +21,10 @@ #define MAX_RETRY 5 -static struct sockaddr_in *peername = NULL; -static struct sockaddr_in *sockname = NULL; +static struct sockaddr *peername = NULL; +static struct sockaddr *sockname = NULL; +static socklen_t peersalen; +static socklen_t socksalen; static void usage(int exit_status) @@ -94,10 +96,7 @@ PERDITION_PACKET_STR_PACK(domain_delimiter, "@"); if(perdition_packet_init_v1_req(&packet, 0, - peername?peername->sin_addr.s_addr:0UL, - peername?peername->sin_port:0U, - sockname?sockname->sin_addr.s_addr:0UL, - sockname?sockname->sin_port:0U, + peername, peersalen, sockname, socksalen, &key, &domain_delimiter) < 0) { VANESSA_LOGGER_DEBUG("perdition_packet_init_v1"); goto leave; diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/db/daemon/packet.c perdition-ipv6/perdition/db/daemon/packet.c --- perdition/db/daemon/packet.c Tue Jun 21 19:50:04 2005 +++ perdition-ipv6/perdition/db/daemon/packet.c Tue Jun 5 17:44:31 2007 @@ -37,8 +37,9 @@ static int perdition_packet_init_v1_head(perdition_packet_t **packet, uint16_t cs_type, uint16_t flags, - uint32_t saddr, uint16_t sport, - uint32_t daddr, uint16_t dport, size_t body_len); + struct sockaddr *ssaddr, socklen_t ssalen, + struct sockaddr *dsaddr, socklen_t dsalen, + size_t body_len); static int perdition_packet_verify_v1_head(perdition_packet_t *packet, size_t len); @@ -88,8 +89,8 @@ int perdition_packet_init_v1_req(perdition_packet_t **packet, uint16_t cs_type, - uint32_t saddr, uint16_t sport, - uint32_t daddr, uint16_t dport, + struct sockaddr *ssaddr, socklen_t ssalen, + struct sockaddr *dsaddr, socklen_t dsalen, perdition_packet_str_t *key, perdition_packet_str_t *domain_delimiter) { @@ -102,7 +103,7 @@ (domain_delimiter ? domain_delimiter->length : 0); if(perdition_packet_init_v1_head(packet, cs_type, PERDITION_PACKET_REQ, - saddr, sport, daddr, dport, body_len) < 0) { + ssaddr, ssalen, dsaddr, dsalen, body_len) < 0) { VANESSA_LOGGER_DEBUG("perdition_packet_init_v1_head"); return(-1); } @@ -132,7 +133,7 @@ sizeof(str.length) + (port ? port->length : 0); if(perdition_packet_init_v1_head(packet, cs_type, PERDITION_PACKET_RSP, - 0, 0, 0, 0, body_len) < 0) { + NULL, 0, NULL, 0, body_len) < 0) { VANESSA_LOGGER_DEBUG("perdition_packet_init_v1_head"); return(-1); } @@ -151,8 +152,9 @@ static int perdition_packet_init_v1_head(perdition_packet_t **packet, uint16_t cs_type, uint16_t flags, - uint32_t saddr, uint16_t sport, - uint32_t daddr, uint16_t dport, size_t body_len) + struct sockaddr *ssaddr, socklen_t ssalen, + struct sockaddr *dsaddr, socklen_t dsalen, + size_t body_len) { if (cs_type != PERDITION_PACKET_CS_NONE) { VANESSA_LOGGER_DEBUG("Only checksum type none is implemented"); @@ -182,10 +184,18 @@ (*packet)->head.length = htons(sizeof(perdition_packet_head_t) + body_len); (*packet)->head.cs_type = htons(cs_type); - (*packet)->head.saddr = htonl(saddr); - (*packet)->head.sport = htons(sport); - (*packet)->head.daddr = htonl(daddr); - (*packet)->head.dport = htons(dport); + getnameinfo( ssaddr, ssalen, + (char *) &((*packet)->head.saddr), + sizeof (*packet)->head.saddr, + (char *) &((*packet)->head.sport), + sizeof (*packet)->head.sport, + NI_NUMERICHOST | NI_NUMERICSERV ); + getnameinfo( dsaddr, dsalen, + (char *) &((*packet)->head.daddr), + sizeof (*packet)->head.daddr, + (char *) &((*packet)->head.dport), + sizeof (*packet)->head.dport, + NI_NUMERICHOST | NI_NUMERICSERV ); return(0); } diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/db/daemon/packet.h perdition-ipv6/perdition/db/daemon/packet.h --- perdition/db/daemon/packet.h Tue Jun 21 19:50:04 2005 +++ perdition-ipv6/perdition/db/daemon/packet.h Tue Jun 5 17:44:31 2007 @@ -31,6 +31,8 @@ #include #include #include +#include +#include #define PERDITION_SOCKET @@ -51,10 +53,10 @@ uint16_t flags; uint16_t length; uint16_t cs_type; - uint32_t saddr; - uint32_t daddr; - uint16_t sport; - uint16_t dport; + char saddr[INET6_ADDRSTRLEN]; + char daddr[INET6_ADDRSTRLEN]; + char sport[NI_MAXSERV]; + char dport[NI_MAXSERV]; } perdition_packet_head_t; typedef struct { @@ -109,8 +111,8 @@ int perdition_packet_init_v1_req(perdition_packet_t **packet, uint16_t cs_type, - uint32_t saddr, uint16_t sport, - uint32_t daddr, uint16_t dport, + struct sockaddr *ssaddr, socklen_t ssalen, + struct sockaddr *dsaddr, socklen_t dsalen, perdition_packet_str_t *key, perdition_packet_str_t *domain_delimiter); diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/db/daemon/perditiondb_daemon.c perdition-ipv6/perdition/db/daemon/perditiondb_daemon.c --- perdition/db/daemon/perditiondb_daemon.c Tue Jun 21 19:50:04 2005 +++ perdition-ipv6/perdition/db/daemon/perditiondb_daemon.c Tue Jun 5 17:44:32 2007 @@ -152,8 +152,10 @@ perdition_packet_str_t port_pstr; extern options_t opt; - extern struct sockaddr_in *peername; - extern struct sockaddr_in *sockname; + extern struct sockaddr *peername; + extern struct sockaddr *sockname; + extern socklen_t peersalen; + extern socklen_t socksalen; packet = perdition_packet_create(); if(!packet) { @@ -165,10 +167,7 @@ PERDITION_PACKET_STR_PACK(domain_delimiter_pstr, opt.domain_delimiter); if(perdition_packet_init_v1_req(&packet, 0, - peername?peername->sin_addr.s_addr:0UL, - peername?peername->sin_port:0U, - sockname?sockname->sin_addr.s_addr:0UL, - sockname?sockname->sin_port:0U, + peername, peersalen, sockname, socksalen, &key_pstr, &domain_delimiter_pstr) < 0) { VANESSA_LOGGER_DEBUG("perdition_packet_init_v1"); goto leave; diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/getserver.c perdition-ipv6/perdition/getserver.c --- perdition/getserver.c Tue Jun 21 19:50:05 2005 +++ perdition-ipv6/perdition/getserver.c Tue Jun 5 17:44:32 2007 @@ -149,8 +149,8 @@ static char *getserver_key_str(const char *query_fmt, const char *full_user_str, const char *from_str, - const char *to_str, const uint16 from_port, - const uint16 to_port) + const char *to_str, const char *from_port, + const char *to_port) { const char *user_str=NULL; char *domain_str=NULL; @@ -217,12 +217,14 @@ _GSK_STR_ADD_STR(to_str); break; case 'p': - snprintf(to_port_str, 6, "%hu", from_port); + strncpy( from_port_str, from_port, + sizeof from_port_str); from_port_str[5] = '\0'; _GSK_STR_ADD_STR(from_port_str); break; case 'P': - snprintf(to_port_str, 6, "%hu", to_port); + strncpy( to_port_str, to_port, + sizeof to_port_str); to_port_str[5] = '\0'; _GSK_STR_ADD_STR(to_port_str); break; @@ -328,7 +330,7 @@ user_server_port_t *getserver( const char *user_str, const char *from_str, const char *to_str, - const uint16 from_port, const uint16 to_port, + const char *from_port, const char *to_port, int (*dbserver_get)(const char *, const char *, char **, size_t *), int (*dbserver_get2)(const char *, const char *, char **, char **, char **)) { diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/getserver.h perdition-ipv6/perdition/getserver.h --- perdition/getserver.h Tue Jun 21 19:50:05 2005 +++ perdition-ipv6/perdition/getserver.h Tue Jun 5 17:44:32 2007 @@ -47,7 +47,7 @@ user_server_port_t *getserver( const char *user_str, const char *from_str, const char *to_str, - const uint16 from_port, const uint16 to_port, + const char *from_port, const char *to_port, int (*dbserver_get)(const char *, const char *, char **, size_t *), int (*dbserver_get2)(const char *, const char *, char **, char **, char **)); diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/greeting.c perdition-ipv6/perdition/greeting.c --- perdition/greeting.c Tue Jun 21 19:50:05 2005 +++ perdition-ipv6/perdition/greeting.c Tue Jun 5 17:44:32 2007 @@ -105,8 +105,7 @@ char *greeting_str(const protocol_t *protocol, flag_t flag){ char *message; char *host; - struct hostent *hp; - struct in_addr in; + struct addrinfo hints, *hp; uint32 csum; char csum_str[10]; @@ -122,20 +121,20 @@ if(flag&GREETING_ADD_NODENAME){ if(!opt.no_bind_banner && !opt.no_lookup && opt.bind_address!=NULL){ - if((hp=gethostbyname(opt.bind_address))==NULL){ - VANESSA_LOGGER_DEBUG_HERRNO("gethostbyname"); + bzero( &hints, sizeof hints ); + hints.ai_flags = AI_CANONNAME; + hints.ai_family = AF_UNSPEC; + if ( (getaddrinfo( opt.bind_address, NULL, &hints, &hp )) ) { + VANESSA_LOGGER_DEBUG_HERRNO("getaddrinfo"); host=opt.bind_address; } else { - bcopy(hp->h_addr, &in, hp->h_length); - hp=gethostbyaddr((char *)&in, sizeof(struct in_addr), AF_INET); - if(hp==NULL){ - VANESSA_LOGGER_DEBUG_HERRNO("gethostbyaddr"); + if ( hp->ai_canonname == NULL ) { + VANESSA_LOGGER_DEBUG_HERRNO("getaddrinfo"); host=opt.bind_address; } else { - host=opt.bind_address; - host=hp->h_name; + host = hp->ai_canonname; } } } diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/perdition.c perdition-ipv6/perdition/perdition.c --- perdition/perdition.c Tue Jun 21 19:50:05 2005 +++ perdition-ipv6/perdition/perdition.c Tue Jun 5 17:44:32 2007 @@ -87,8 +87,10 @@ /* Local and Peer address information is global so perditiondb * libraries can access this information */ -struct sockaddr_in *peername; -struct sockaddr_in *sockname; +struct sockaddr *peername; +struct sockaddr *sockname; +socklen_t peersalen; +socklen_t socksalen; /* PID file that has been created */ char *pid_file; @@ -196,7 +198,8 @@ vanessa_logger_t *vl; struct passwd pw = {NULL, NULL}; struct passwd pw2 = {NULL, NULL}; - struct in_addr *to_addr; + struct sockaddr *to_addr; + socklen_t tosalen; unsigned char *server_resp_buf=NULL; unsigned char *buffer; user_server_port_t *usp=NULL; @@ -206,9 +209,9 @@ size_t server_resp_buf_size=0; flag_t tls_state=0; timed_log_t auth_log; - char from_to_str[36]; - char from_str[17]; - char to_str[17]; + char from_to_str[ 2*INET6_ADDRSTRLEN + 2 ]; + char from_str[INET6_ADDRSTRLEN]; + char to_str[INET6_ADDRSTRLEN]; char *servername=NULL; char *username=NULL; char *port=NULL; @@ -228,11 +231,15 @@ SSL_CTX *ssl_ctx=NULL; #endif /* WITH_SSL_SUPPORT */ - extern struct sockaddr_in *peername; - extern struct sockaddr_in *sockname; + extern struct sockaddr *peername; + extern struct sockaddr *sockname; + extern socklen_t peersalen; + extern socklen_t socksalen; extern struct utsname *system_uname; extern options_t opt; + char peerportstr[NI_MAXSERV], sockportstr[NI_MAXSERV]; + /* * Create Logger */ @@ -459,12 +466,12 @@ /* * Allocate the peername and sockname structures */ - if((sockname=(struct sockaddr_in *)malloc(sizeof(struct sockaddr_in)))==NULL){ + if((sockname=(struct sockaddr *)malloc(sizeof(struct sockaddr_storage)))==NULL){ VANESSA_LOGGER_DEBUG_ERRNO("malloc sockname"); VANESSA_LOGGER_ERR("Fatal error allocating memory. Exiting."); perdition_exit_cleanly(-1); } - if((peername=(struct sockaddr_in *)malloc(sizeof(struct sockaddr_in)))==NULL){ + if((peername=(struct sockaddr *)malloc(sizeof(struct sockaddr_storage)))==NULL){ VANESSA_LOGGER_DEBUG_ERRNO("malloc peername"); VANESSA_LOGGER_ERR("Fatal error allocating memory. Exiting."); perdition_exit_cleanly(-1); @@ -498,8 +505,9 @@ PERDITION_SET_UID_AND_GID; /* Get an incoming connection */ + peersalen = sizeof (struct sockaddr_storage); + socksalen = sizeof (struct sockaddr_storage); if(opt.inetd_mode){ - int namelen; if((client_io=io_create_fd(0, 1, PERDITION_LOG_STR_CLIENT))==NULL){ VANESSA_LOGGER_DEBUG("io_create_fd 1"); @@ -507,19 +515,19 @@ perdition_exit_cleanly(-1); } - namelen = sizeof(*peername); - if(getpeername(0, (struct sockaddr *)peername, &namelen)){ + if(getpeername(0, (struct sockaddr *)peername, &peersalen)){ peername=NULL; } - namelen = sizeof(*sockname); - if(getsockname(1, (struct sockaddr *)sockname, &namelen)){ + if(getsockname(1, (struct sockaddr *)sockname, &socksalen)){ sockname=NULL; } } else{ - s = vanessa_socket_server_accept(g, opt.connection_limit, peername, - sockname, 0); + s = vanessa_socket_server_accept(g, opt.connection_limit, + (struct sockaddr *) peername, &peersalen, + (struct sockaddr *) sockname, &socksalen, + 0); if(s < 0){ VANESSA_LOGGER_DEBUG("vanessa_socket_server_accept"); VANESSA_LOGGER_ERR("Fatal error accepting child connection. Exiting."); @@ -546,21 +554,25 @@ /* Get the source and destination ip address as a string */ if(peername!=NULL){ - snprintf(from_str, 17, "%s", inet_ntoa(peername->sin_addr)); + getnameinfo( peername, peersalen, from_str, + sizeof from_str, NULL, 0, NI_NUMERICHOST ); } else { *from_str='\0'; } if(sockname!=NULL){ - snprintf(to_str, 17, "%s", inet_ntoa(sockname->sin_addr)); - to_addr=&(sockname->sin_addr); + to_addr = sockname; + tosalen = socksalen; + getnameinfo( sockname, socksalen, to_str, + sizeof to_str, NULL, 0, NI_NUMERICHOST ); } else { *to_str='\0'; to_addr=NULL; + tosalen=0; } if(peername!=NULL && sockname!=NULL){ - snprintf(from_to_str, 36, "%s->%s ", from_str, to_str); + snprintf(from_to_str, sizeof from_to_str, "%s->%s ", from_str, to_str); } else{ *from_to_str='\0'; @@ -649,7 +661,8 @@ } #endif /* WITH_SSL_SUPPORT */ - if((username=username_mangle(pw.pw_name, to_addr, STATE_GET_SERVER))==NULL){ + if((username=username_mangle(pw.pw_name, to_addr, tosalen, + STATE_GET_SERVER))==NULL){ VANESSA_LOGGER_DEBUG("username_mangle STATE_GET_SERVER"); VANESSA_LOGGER_ERR_UNSAFE( "Fatal error manipulating username for client \"%s\": Exiting child", @@ -660,9 +673,14 @@ /*Read the server from the map, if we have a map*/ if(dbserver_get || dbserver_get2 || opt.client_server_specification) { + if ( peername ) getnameinfo( peername, peersalen, NULL, 0, + peerportstr, sizeof peerportstr, + NI_NUMERICSERV ); + if ( sockname ) getnameinfo( sockname, socksalen, NULL, 0, + sockportstr, sizeof sockportstr, + NI_NUMERICSERV ); usp = getserver(username, from_str, to_str, - peername==NULL?0:ntohs(peername->sin_port), - sockname==NULL?0:ntohs(sockname->sin_port), + peerportstr, sockportstr, dbserver_get, dbserver_get2); } if(usp){ @@ -710,7 +728,7 @@ #ifdef WITH_PAM_SUPPORT if(opt.authenticate_in){ if((pw2.pw_name=username_mangle(pw.pw_name, - to_addr, STATE_LOCAL_AUTH))==NULL){ + to_addr, tosalen, STATE_LOCAL_AUTH))==NULL){ VANESSA_LOGGER_DEBUG("username_mangle STATE_LOCAL_AUTH"); VANESSA_LOGGER_ERR_UNSAFE( "Fatal error manipulating username for client \"%s\": Exiting child", @@ -778,7 +796,7 @@ /* Authenticate the user with the pop server */ if((pw2.pw_name=username_mangle(pw.pw_name, - to_addr, STATE_REMOTE_LOGIN))==NULL){ + to_addr, tosalen, STATE_REMOTE_LOGIN))==NULL){ VANESSA_LOGGER_DEBUG("username_mangle STATE_REMOTE_LOGIN"); VANESSA_LOGGER_ERR_UNSAFE( "Fatal error manipulating username for client \"%s\": Exiting child", diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/username.c perdition-ipv6/perdition/username.c --- perdition/username.c Tue Jun 21 19:50:06 2005 +++ perdition-ipv6/perdition/username.c Tue Jun 5 17:44:32 2007 @@ -48,7 +48,7 @@ * Append the domain part of the address connected to after * the domain delimiter if not already present. * pre: username: username to strip domain from - * in_addr: Source address of connection + * to_addr: Source address of connection * state: The current state. Should be one of STATE_GET_SERVER, * STATE_LOCAL_AUTH or STATE_REMOTE_LOGIN. * strip_depth: number of leading levels of the domain to strip @@ -62,9 +62,9 @@ **********************************************************************/ char * -username_add_domain(char *username, struct in_addr *to_addr, int state, - unsigned int strip_depth){ - struct hostent *hp; +username_add_domain(char *username, struct sockaddr *to_addr, + socklen_t tosalen, int state, unsigned int strip_depth){ + char hostname[NI_MAXHOST]; char *domainpart; char *new_str; @@ -84,13 +84,13 @@ domainpart = opt.explicit_domain; } else { - hp=gethostbyaddr((char *)to_addr,sizeof(struct in_addr),AF_INET); - if (!hp) { + if ( (getnameinfo( to_addr, tosalen, hostname, + sizeof hostname, NULL, 0, NI_NAMEREQD )) ) { VANESSA_LOGGER_DEBUG("no reverse IP lookup, domain not added"); return(username); } - domainpart = hp->h_name; + domainpart = &hostname; if (!domainpart || !*domainpart) { VANESSA_LOGGER_DEBUG("No domain in reverse lookup, domain not added"); return(username); @@ -220,7 +220,7 @@ **********************************************************************/ char *username_mangle(char *username, - struct in_addr *to_addr, int state){ + struct sockaddr *to_addr, socklen_t tosalen, int state){ char *result; char *old_result; @@ -232,7 +232,7 @@ } old_result = result; - result = username_add_domain(result, to_addr, state, + result = username_add_domain(result, to_addr, tosalen, state, opt.add_domain_strip_depth); if (!result) { VANESSA_LOGGER_DEBUG("username_add_domain"); diff -ruB --exclude=config* --exclude=Makefile* --exclude=libtool --exclude=makebdb.c --exclude=perditiondb_bdb.h --exclude=perditiondb_ldap.c perdition/username.h perdition-ipv6/perdition/username.h --- perdition/username.h Tue Jun 21 19:50:06 2005 +++ perdition-ipv6/perdition/username.h Tue Jun 5 17:44:32 2007 @@ -40,7 +40,7 @@ * Append the domain part of the address connected to after * the domain delimiter if not already present. * pre: username: username to strip domain from - * in_addr: Source address of connection + * to_addr: Source address of connection * state: The current state. Should be one of STATE_GET_SERVER, * STATE_LOCAL_AUTH or STATE_REMOTE_LOGIN. * strip_depth: number of leading levels of the domain to strip @@ -54,8 +54,8 @@ **********************************************************************/ char * -username_add_domain(char *username, struct in_addr *to_addr, int state, - unsigned int strip_depth); +username_add_domain(char *username, struct sockaddr *to_addr, + socklen_t tosalen, int state, unsigned int strip_depth); /********************************************************************** @@ -111,6 +111,7 @@ * NULL on error **********************************************************************/ -char *username_mangle(char *username, struct in_addr *to_addr, int state); +char *username_mangle(char *username, struct sockaddr *to_addr, + socklen_t tosalen, int state); #endif /* USERNAME_BERT */