1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/nsprpub/pr/tests/ipv6.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,216 @@ 1.4 +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "prio.h" 1.10 +#include "prenv.h" 1.11 +#include "prmem.h" 1.12 +#include "prlink.h" 1.13 +#include "prsystem.h" 1.14 +#include "prnetdb.h" 1.15 +#include "prprf.h" 1.16 +#include "prvrsion.h" 1.17 + 1.18 +#include "plerror.h" 1.19 +#include "plgetopt.h" 1.20 +#include "obsolete/probslet.h" 1.21 + 1.22 +#include <string.h> 1.23 + 1.24 +#define DNS_BUFFER 100 1.25 +#define ADDR_BUFFER 100 1.26 +#define HOST_BUFFER 1024 1.27 +#define PROTO_BUFFER 1500 1.28 + 1.29 +#define NETADDR_SIZE(addr) \ 1.30 + (PR_AF_INET == (addr)->raw.family ? \ 1.31 + sizeof((addr)->inet) : sizeof((addr)->ipv6)) 1.32 + 1.33 +static PRFileDesc *err = NULL; 1.34 + 1.35 +static void Help(void) 1.36 +{ 1.37 + PR_fprintf(err, "Usage: [-V] [-h]\n"); 1.38 + PR_fprintf(err, "\t<nul> Name of host to lookup (default: self)\n"); 1.39 + PR_fprintf(err, "\t-V Display runtime version info (default: FALSE)\n"); 1.40 + PR_fprintf(err, "\t-h This message and nothing else\n"); 1.41 +} /* Help */ 1.42 + 1.43 +static void DumpAddr(const PRNetAddr* address, const char *msg) 1.44 +{ 1.45 + PRUint32 *word = (PRUint32*)address; 1.46 + PRUint32 addr_len = sizeof(PRNetAddr); 1.47 + PR_fprintf(err, "%s[%d]\t", msg, NETADDR_SIZE(address)); 1.48 + while (addr_len > 0) 1.49 + { 1.50 + PR_fprintf(err, " %08x", *word++); 1.51 + addr_len -= sizeof(PRUint32); 1.52 + } 1.53 + PR_fprintf(err, "\n"); 1.54 +} /* DumpAddr */ 1.55 + 1.56 +static PRStatus PrintAddress(const PRNetAddr* address) 1.57 +{ 1.58 + PRNetAddr translation; 1.59 + char buffer[ADDR_BUFFER]; 1.60 + PRStatus rv = PR_NetAddrToString(address, buffer, sizeof(buffer)); 1.61 + if (PR_FAILURE == rv) PL_FPrintError(err, "PR_NetAddrToString"); 1.62 + else 1.63 + { 1.64 + PR_fprintf(err, "\t%s\n", buffer); 1.65 + memset(&translation, 0, sizeof(translation)); 1.66 + rv = PR_StringToNetAddr(buffer, &translation); 1.67 + if (PR_FAILURE == rv) PL_FPrintError(err, "PR_StringToNetAddr"); 1.68 + else 1.69 + { 1.70 + PRSize addr_len = NETADDR_SIZE(address); 1.71 + if (0 != memcmp(address, &translation, addr_len)) 1.72 + { 1.73 + PR_fprintf(err, "Address translations do not match\n"); 1.74 + DumpAddr(address, "original"); 1.75 + DumpAddr(&translation, "translate"); 1.76 + rv = PR_FAILURE; 1.77 + } 1.78 + } 1.79 + } 1.80 + return rv; 1.81 +} /* PrintAddress */ 1.82 + 1.83 +int main(int argc, char **argv) 1.84 +{ 1.85 + PRStatus rv; 1.86 + PLOptStatus os; 1.87 + PRHostEnt host; 1.88 + PRProtoEnt proto; 1.89 + const char *name = NULL; 1.90 + PRBool failed = PR_FALSE, version = PR_FALSE; 1.91 + PLOptState *opt = PL_CreateOptState(argc, argv, "Vh"); 1.92 + 1.93 + err = PR_GetSpecialFD(PR_StandardError); 1.94 + 1.95 + while (PL_OPT_EOL != (os = PL_GetNextOpt(opt))) 1.96 + { 1.97 + if (PL_OPT_BAD == os) continue; 1.98 + switch (opt->option) 1.99 + { 1.100 + case 0: /* Name of host to lookup */ 1.101 + name = opt->value; 1.102 + break; 1.103 + case 'V': /* Do version discovery */ 1.104 + version = PR_TRUE; 1.105 + break; 1.106 + case 'h': /* user wants some guidance */ 1.107 + default: 1.108 + Help(); /* so give him an earful */ 1.109 + return 2; /* but not a lot else */ 1.110 + } 1.111 + } 1.112 + PL_DestroyOptState(opt); 1.113 + 1.114 + if (version) 1.115 + { 1.116 +#if defined(WINNT) 1.117 +#define NSPR_LIB "libnspr4" 1.118 +#else 1.119 +#define NSPR_LIB "nspr4" 1.120 +#endif 1.121 + const PRVersionDescription *version_info; 1.122 + char *nspr_path = PR_GetEnv("LD_LIBRARY_PATH"); 1.123 + char *nspr_name = PR_GetLibraryName(nspr_path, NSPR_LIB); 1.124 + PRLibrary *runtime = PR_LoadLibrary(nspr_name); 1.125 + if (NULL == runtime) 1.126 + PL_FPrintError(err, "PR_LoadLibrary"); 1.127 + else 1.128 + { 1.129 + versionEntryPointType versionPoint = (versionEntryPointType) 1.130 + PR_FindSymbol(runtime, "libVersionPoint"); 1.131 + if (NULL == versionPoint) 1.132 + PL_FPrintError(err, "PR_FindSymbol"); 1.133 + else 1.134 + { 1.135 + char buffer[100]; 1.136 + PRExplodedTime exploded; 1.137 + version_info = versionPoint(); 1.138 + (void)PR_fprintf(err, "Runtime library version information\n"); 1.139 + PR_ExplodeTime( 1.140 + version_info->buildTime, PR_GMTParameters, &exploded); 1.141 + (void)PR_FormatTime( 1.142 + buffer, sizeof(buffer), "%d %b %Y %H:%M:%S", &exploded); 1.143 + (void)PR_fprintf(err, " Build time: %s GMT\n", buffer); 1.144 + (void)PR_fprintf( 1.145 + err, " Build time: %s\n", version_info->buildTimeString); 1.146 + (void)PR_fprintf( 1.147 + err, " %s V%u.%u.%u (%s%s%s)\n", 1.148 + version_info->description, 1.149 + version_info->vMajor, 1.150 + version_info->vMinor, 1.151 + version_info->vPatch, 1.152 + (version_info->beta ? " beta " : ""), 1.153 + (version_info->debug ? " debug " : ""), 1.154 + (version_info->special ? " special" : "")); 1.155 + (void)PR_fprintf(err, " filename: %s\n", version_info->filename); 1.156 + (void)PR_fprintf(err, " security: %s\n", version_info->security); 1.157 + (void)PR_fprintf(err, " copyright: %s\n", version_info->copyright); 1.158 + (void)PR_fprintf(err, " comment: %s\n", version_info->comment); 1.159 + } 1.160 + } 1.161 + if (NULL != nspr_name) PR_FreeLibraryName(nspr_name); 1.162 + } 1.163 + 1.164 + { 1.165 + if (NULL == name) 1.166 + { 1.167 + char *me = (char*)PR_MALLOC(DNS_BUFFER); 1.168 + rv = PR_GetSystemInfo(PR_SI_HOSTNAME, me, DNS_BUFFER); 1.169 + if (PR_FAILURE == rv) 1.170 + { 1.171 + failed = PR_TRUE; 1.172 + PL_FPrintError(err, "PR_GetSystemInfo"); 1.173 + return 2; 1.174 + } 1.175 + name = me; /* just leak the storage */ 1.176 + } 1.177 + } 1.178 + 1.179 + { 1.180 + char buffer[HOST_BUFFER]; 1.181 + PR_fprintf(err, "Translating the name %s ...", name); 1.182 + 1.183 + rv = PR_GetHostByName(name, buffer, sizeof(buffer), &host); 1.184 + if (PR_FAILURE == rv) 1.185 + { 1.186 + failed = PR_TRUE; 1.187 + PL_FPrintError(err, "PR_GetHostByName"); 1.188 + } 1.189 + else 1.190 + { 1.191 + PRIntn index = 0; 1.192 + PRNetAddr address; 1.193 + memset(&address, 0, sizeof(PRNetAddr)); 1.194 + PR_fprintf(err, "success .. enumerating results\n"); 1.195 + do 1.196 + { 1.197 + index = PR_EnumerateHostEnt(index, &host, 0, &address); 1.198 + if (index > 0) PrintAddress(&address); 1.199 + else if (-1 == index) 1.200 + { 1.201 + failed = PR_TRUE; 1.202 + PL_FPrintError(err, "PR_EnumerateHostEnt"); 1.203 + } 1.204 + } while (index > 0); 1.205 + } 1.206 + } 1.207 + 1.208 + 1.209 + { 1.210 + char buffer[PROTO_BUFFER]; 1.211 + /* 1.212 + ** Get Proto by name/number 1.213 + */ 1.214 + rv = PR_GetProtoByName("tcp", &buffer[1], sizeof(buffer) - 1, &proto); 1.215 + rv = PR_GetProtoByNumber(6, &buffer[3], sizeof(buffer) - 3, &proto); 1.216 + } 1.217 + 1.218 + return (failed) ? 1 : 0; 1.219 +}