From b5fab4dbf781248f138ae348a4c83abb347721aa Mon Sep 17 00:00:00 2001 From: "nelson%bolyard.com" Date: Wed, 8 Aug 2007 01:00:23 +0000 Subject: [PATCH] Bug 388117 - make strsclnt use IPv4 or IPv6, like tstclnt. r=julien.pierre,neil.williams git-svn-id: svn://10.0.0.236/branches/NSS_3_11_BRANCH@231621 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/security/nss/cmd/strsclnt/strsclnt.c | 68 +++++++++----------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/mozilla/security/nss/cmd/strsclnt/strsclnt.c b/mozilla/security/nss/cmd/strsclnt/strsclnt.c index 94a8b9ba6a0..d40d1dfe736 100644 --- a/mozilla/security/nss/cmd/strsclnt/strsclnt.c +++ b/mozilla/security/nss/cmd/strsclnt/strsclnt.c @@ -163,6 +163,8 @@ static PRBool ignoreErrors = PR_FALSE; PRIntervalTime maxInterval = PR_INTERVAL_NO_TIMEOUT; +char * progName; + char * ownPasswd( PK11SlotInfo *slot, PRBool retry, void *arg) { char *passwd = NULL; @@ -766,9 +768,9 @@ do_connects( retry: - tcp_sock = PR_NewTCPSocket(); + tcp_sock = PR_OpenTCPSocket(addr->raw.family); if (tcp_sock == NULL) { - errExit("PR_NewTCPSocket"); + errExit("PR_OpenTCPSocket"); } opt.option = PR_SockOpt_Nonblocking; @@ -896,32 +898,6 @@ done: return SECSuccess; } -/* Returns IP address for hostname as PRUint32 in Host Byte Order. -** Since the value returned is an integer (not a string of bytes), -** it is inherently in Host Byte Order. -*/ -PRUint32 -getIPAddress(const char * hostName) -{ - const unsigned char *p; - PRStatus prStatus; - PRUint32 rv; - PRHostEnt prHostEnt; - char scratch[PR_NETDB_BUF_SIZE]; - - prStatus = PR_GetHostByName(hostName, scratch, sizeof scratch, &prHostEnt); - if (prStatus != PR_SUCCESS) - errExit("PR_GetHostByName"); - -#undef h_addr -#define h_addr h_addr_list[0] /* address, for backward compatibility */ - - p = (const unsigned char *)(prHostEnt.h_addr); /* in Network Byte order */ - FPRINTF(stderr, "strsclnt: %s -> %d.%d.%d.%d\n", hostName, - p[0], p[1], p[2], p[3]); - rv = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; - return rv; -} typedef struct { PRLock* lock; @@ -1117,15 +1093,34 @@ client_main( PRFileDesc *model_sock = NULL; int i; int rv; - PRUint32 ipAddress; /* in host byte order */ + PRStatus status; PRNetAddr addr; - /* Assemble NetAddr struct for connections. */ - ipAddress = getIPAddress(hostName); + status = PR_StringToNetAddr(hostName, &addr); + if (status == PR_SUCCESS) { + addr.inet.port = PR_htons(port); + } else { + /* Lookup host */ + PRAddrInfo *addrInfo; + void *enumPtr = NULL; - addr.inet.family = PR_AF_INET; - addr.inet.port = PR_htons(port); - addr.inet.ip = PR_htonl(ipAddress); + addrInfo = PR_GetAddrInfoByName(hostName, PR_AF_UNSPEC, + PR_AI_ADDRCONFIG | PR_AI_NOCANONNAME); + if (!addrInfo) { + SECU_PrintError(progName, "error looking up host"); + return; + } + do { + enumPtr = PR_EnumerateAddrInfo(enumPtr, addrInfo, port, &addr); + } while (enumPtr != NULL && + addr.raw.family != PR_AF_INET && + addr.raw.family != PR_AF_INET6); + PR_FreeAddrInfo(addrInfo); + if (enumPtr == NULL) { + SECU_PrintError(progName, "error looking up host address"); + return; + } + } /* all suites except RSA_NULL_MD5 are enabled by Domestic Policy */ NSS_SetDomesticPolicy(); @@ -1184,9 +1179,9 @@ client_main( /* configure model SSL socket. */ - model_sock = PR_NewTCPSocket(); + model_sock = PR_OpenTCPSocket(addr.raw.family); if (model_sock == NULL) { - errExit("PR_NewTCPSocket on model socket"); + errExit("PR_OpenTCPSocket for model socket"); } model_sock = SSL_ImportFD(NULL, model_sock); @@ -1330,7 +1325,6 @@ main(int argc, char **argv) const char * fileName = NULL; char * hostName = NULL; char * nickName = NULL; - char * progName = NULL; char * tmp = NULL; char * passwd = NULL; int connections = 1;