From 70f7e553441c7891dccc9c2538d642e35e0870cb Mon Sep 17 00:00:00 2001 From: Stig Venaas Date: Sun, 26 Aug 2001 11:03:27 +0000 Subject: [PATCH] Changed get_listener_addresses() to not use getaddrinfo() for PF_LOCAL --- servers/slapd/daemon.c | 179 ++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 102 deletions(-) diff --git a/servers/slapd/daemon.c b/servers/slapd/daemon.c index 07bb58560e..7edf78e5db 100644 --- a/servers/slapd/daemon.c +++ b/servers/slapd/daemon.c @@ -337,35 +337,51 @@ static int slap_get_listener_addresses( struct sockaddr ***sal) { struct sockaddr **sap; -#ifdef HAVE_GETADDRINFO - struct addrinfo hints, *res, *sai; - int n, err; - memset( &hints, '\0', sizeof(hints) ); - hints.ai_flags = AI_PASSIVE; - hints.ai_socktype = SOCK_STREAM; -# ifdef LDAP_PF_LOCAL +#ifdef LDAP_PF_LOCAL if ( port == 0 ) { - hints.ai_family = AF_LOCAL; - /* host specifies a service in this case */ - if (err = getaddrinfo(NULL, host, &hints, &res)) { + *sal = ch_malloc(2 * sizeof(void *)); + if (*sal == NULL) { + return -1; + } + + sap = *sal; + *sap = ch_malloc(sizeof(struct sockaddr_un)); + if (*sap == NULL) + goto errexit; + sap[1] = NULL; + + if ( strlen(host) > + (sizeof(((struct sockaddr_un *)*sap)->sun_path) - 1) ) { #ifdef NEW_LOGGING LDAP_LOG(( "connection", LDAP_LEVEL_INFO, - "slap_get_listener_addresses: getaddrinfo failed: %s\n", - AC_GAI_STRERROR(err) )); + "slap_get_listener_addresses: domain socket path (%s) too long in URL\n", + host )); #else - Debug( LDAP_DEBUG_ANY, "daemon: getaddrinfo failed: %s\n", - AC_GAI_STRERROR(err), 0, 0); + Debug( LDAP_DEBUG_ANY, + "daemon: domain socket path (%s) too long in URL", + host, 0, 0); #endif - return -1; + goto errexit; } + + (void)memset( (void *)*sap, '\0', sizeof(struct sockaddr_un) ); + (*sap)->sa_family = AF_LOCAL; + strcpy( ((struct sockaddr_un *)*sap)->sun_path, host ); } else -# endif +#endif { +#ifdef HAVE_GETADDRINFO + struct addrinfo hints, *res, *sai; + int n, err; char serv[7]; - snprintf(serv, sizeof serv, "%d", port); + memset( &hints, '\0', sizeof(hints) ); + hints.ai_flags = AI_PASSIVE; + hints.ai_socktype = SOCK_STREAM; hints.ai_family = AF_UNSPEC; + snprintf(serv, sizeof serv, "%d", port); + if (err = getaddrinfo(host, serv, &hints, &res)) { #ifdef NEW_LOGGING LDAP_LOG(( "connection", LDAP_LEVEL_INFO, @@ -377,94 +393,54 @@ static int slap_get_listener_addresses( #endif return -1; } - } - sai = res; - for (n=2; (sai = sai->ai_next) != NULL; n++) { - /* EMPTY */ ; - } - *sal = ch_malloc(n * sizeof(*sal)); - if (*sal == NULL) { - return -1; - } - - sai = res; - sap = *sal; - do { - switch (sai->ai_family) { -# ifdef LDAP_PF_LOCAL - case AF_LOCAL: { - *sap = ch_malloc(sizeof(struct sockaddr_un)); - if (*sap == NULL) { - freeaddrinfo(res); - goto errexit; - } - *(struct sockaddr_un *)*sap = - *((struct sockaddr_un *)sai->ai_addr); - } break; -# endif -# ifdef LDAP_PF_INET6 - case AF_INET6: { - *sap = ch_malloc(sizeof(struct sockaddr_in6)); - if (*sap == NULL) { - freeaddrinfo(res); - goto errexit; - } - *(struct sockaddr_in6 *)*sap = - *((struct sockaddr_in6 *)sai->ai_addr); - } break; -# endif - case AF_INET: { - *sap = ch_malloc(sizeof(struct sockaddr_in)); - if (*sap == NULL) { - freeaddrinfo(res); - goto errexit; - } - *(struct sockaddr_in *)*sap = - *((struct sockaddr_in *)sai->ai_addr); - } break; - default: - *sap = NULL; - break; - } - if (*sap != NULL) { - (*sap)->sa_family = sai->ai_family; - sap++; + sai = res; + for (n=2; (sai = sai->ai_next) != NULL; n++) { + /* EMPTY */ ; } - } while ((sai = sai->ai_next) != NULL); - - freeaddrinfo(res); - -#else -# ifdef LDAP_PF_LOCAL - if ( port == 0 ) { - *sal = ch_malloc(2 * sizeof(*sal)); + *sal = ch_malloc(n * sizeof(void *)); if (*sal == NULL) { return -1; } + + sai = res; sap = *sal; - *sap = ch_malloc(sizeof(struct sockaddr_un)); - if (*sap == NULL) - goto errexit; - (void)memset( (void *)*sap, '\0', sizeof(struct sockaddr_un) ); - (*sap)->sa_family = AF_LOCAL; - if ( strlen(host) > - (sizeof(((struct sockaddr_un *)*sal)->sun_path) - 1) ) { -#ifdef NEW_LOGGING - LDAP_LOG(( "connection", LDAP_LEVEL_INFO, - "slap_get_listener_addresses: domain socket path (%s) too long in URL\n", - host )); -#else - Debug( LDAP_DEBUG_ANY, - "daemon: domain socket path (%s) too long in URL", - host, 0, 0); -#endif - goto errexit; - } - strcpy( ((struct sockaddr_un *)*sap)->sun_path, host ); - } else + + do { + switch (sai->ai_family) { +# ifdef LDAP_PF_INET6 + case AF_INET6: + *sap = ch_malloc(sizeof(struct sockaddr_in6)); + if (*sap == NULL) { + freeaddrinfo(res); + goto errexit; + } + *(struct sockaddr_in6 *)*sap = + *((struct sockaddr_in6 *)sai->ai_addr); + break; # endif - { + case AF_INET: + *sap = ch_malloc(sizeof(struct sockaddr_in)); + if (*sap == NULL) { + freeaddrinfo(res); + goto errexit; + } + *(struct sockaddr_in *)*sap = + *((struct sockaddr_in *)sai->ai_addr); + break; + default: + *sap = NULL; + break; + } + if (*sap != NULL) { + (*sap)->sa_family = sai->ai_family; + sap++; + } + } while ((sai = sai->ai_next) != NULL); + + *sap = NULL; + freeaddrinfo(res); +#else struct in_addr in; if ( host == NULL ) { @@ -486,7 +462,7 @@ static int slap_get_listener_addresses( AC_MEMCPY( &in, he->h_addr, sizeof( in ) ); } - *sal = ch_malloc(2 * sizeof(*sal)); + *sal = ch_malloc(2 * sizeof(void *)); if (*sal == NULL) { return -1; } @@ -496,16 +472,15 @@ static int slap_get_listener_addresses( if (*sap == NULL) { goto errexit; } + sap[1] = NULL; (void)memset( (void *)*sap, '\0', sizeof(struct sockaddr_in) ); (*sap)->sa_family = AF_INET; ((struct sockaddr_in *)*sap)->sin_port = htons(port); ((struct sockaddr_in *)*sap)->sin_addr = in; - } - sap++; #endif + } - *sap = NULL; return 0; errexit: -- 2.39.5