1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
17 #include "obsolete/probslet.h"
21 #define DNS_BUFFER 100
22 #define ADDR_BUFFER 100
23 #define HOST_BUFFER 1024
24 #define PROTO_BUFFER 1500
26 #define NETADDR_SIZE(addr) \
27 (PR_AF_INET == (addr)->raw.family ? \
28 sizeof((addr)->inet) : sizeof((addr)->ipv6))
30 static PRFileDesc
*err
= NULL
;
32 static void Help(void)
34 PR_fprintf(err
, "Usage: [-V] [-h]\n");
35 PR_fprintf(err
, "\t<nul> Name of host to lookup (default: self)\n");
36 PR_fprintf(err
, "\t-V Display runtime version info (default: FALSE)\n");
37 PR_fprintf(err
, "\t-h This message and nothing else\n");
40 static void DumpAddr(const PRNetAddr
* address
, const char *msg
)
42 PRUint32
*word
= (PRUint32
*)address
;
43 PRUint32 addr_len
= sizeof(PRNetAddr
);
44 PR_fprintf(err
, "%s[%d]\t", msg
, NETADDR_SIZE(address
));
47 PR_fprintf(err
, " %08x", *word
++);
48 addr_len
-= sizeof(PRUint32
);
50 PR_fprintf(err
, "\n");
53 static PRStatus
PrintAddress(const PRNetAddr
* address
)
55 PRNetAddr translation
;
56 char buffer
[ADDR_BUFFER
];
57 PRStatus rv
= PR_NetAddrToString(address
, buffer
, sizeof(buffer
));
58 if (PR_FAILURE
== rv
) PL_FPrintError(err
, "PR_NetAddrToString");
61 PR_fprintf(err
, "\t%s\n", buffer
);
62 memset(&translation
, 0, sizeof(translation
));
63 rv
= PR_StringToNetAddr(buffer
, &translation
);
64 if (PR_FAILURE
== rv
) PL_FPrintError(err
, "PR_StringToNetAddr");
67 PRSize addr_len
= NETADDR_SIZE(address
);
68 if (0 != memcmp(address
, &translation
, addr_len
))
70 PR_fprintf(err
, "Address translations do not match\n");
71 DumpAddr(address
, "original");
72 DumpAddr(&translation
, "translate");
80 int main(int argc
, char **argv
)
86 const char *name
= NULL
;
87 PRBool failed
= PR_FALSE
, version
= PR_FALSE
;
88 PLOptState
*opt
= PL_CreateOptState(argc
, argv
, "Vh");
90 err
= PR_GetSpecialFD(PR_StandardError
);
92 while (PL_OPT_EOL
!= (os
= PL_GetNextOpt(opt
)))
94 if (PL_OPT_BAD
== os
) continue;
97 case 0: /* Name of host to lookup */
100 case 'V': /* Do version discovery */
103 case 'h': /* user wants some guidance */
105 Help(); /* so give him an earful */
106 return 2; /* but not a lot else */
109 PL_DestroyOptState(opt
);
114 #define NSPR_LIB "libnspr4"
116 #define NSPR_LIB "nspr4"
118 const PRVersionDescription
*version_info
;
119 char *nspr_path
= PR_GetEnv("LD_LIBRARY_PATH");
120 char *nspr_name
= PR_GetLibraryName(nspr_path
, NSPR_LIB
);
121 PRLibrary
*runtime
= PR_LoadLibrary(nspr_name
);
123 PL_FPrintError(err
, "PR_LoadLibrary");
126 versionEntryPointType versionPoint
= (versionEntryPointType
)
127 PR_FindSymbol(runtime
, "libVersionPoint");
128 if (NULL
== versionPoint
)
129 PL_FPrintError(err
, "PR_FindSymbol");
133 PRExplodedTime exploded
;
134 version_info
= versionPoint();
135 (void)PR_fprintf(err
, "Runtime library version information\n");
137 version_info
->buildTime
, PR_GMTParameters
, &exploded
);
139 buffer
, sizeof(buffer
), "%d %b %Y %H:%M:%S", &exploded
);
140 (void)PR_fprintf(err
, " Build time: %s GMT\n", buffer
);
142 err
, " Build time: %s\n", version_info
->buildTimeString
);
144 err
, " %s V%u.%u.%u (%s%s%s)\n",
145 version_info
->description
,
146 version_info
->vMajor
,
147 version_info
->vMinor
,
148 version_info
->vPatch
,
149 (version_info
->beta
? " beta " : ""),
150 (version_info
->debug
? " debug " : ""),
151 (version_info
->special
? " special" : ""));
152 (void)PR_fprintf(err
, " filename: %s\n", version_info
->filename
);
153 (void)PR_fprintf(err
, " security: %s\n", version_info
->security
);
154 (void)PR_fprintf(err
, " copyright: %s\n", version_info
->copyright
);
155 (void)PR_fprintf(err
, " comment: %s\n", version_info
->comment
);
158 if (NULL
!= nspr_name
) PR_FreeLibraryName(nspr_name
);
164 char *me
= (char*)PR_MALLOC(DNS_BUFFER
);
165 rv
= PR_GetSystemInfo(PR_SI_HOSTNAME
, me
, DNS_BUFFER
);
166 if (PR_FAILURE
== rv
)
169 PL_FPrintError(err
, "PR_GetSystemInfo");
172 name
= me
; /* just leak the storage */
177 char buffer
[HOST_BUFFER
];
178 PR_fprintf(err
, "Translating the name %s ...", name
);
180 rv
= PR_GetHostByName(name
, buffer
, sizeof(buffer
), &host
);
181 if (PR_FAILURE
== rv
)
184 PL_FPrintError(err
, "PR_GetHostByName");
190 memset(&address
, 0, sizeof(PRNetAddr
));
191 PR_fprintf(err
, "success .. enumerating results\n");
194 index
= PR_EnumerateHostEnt(index
, &host
, 0, &address
);
195 if (index
> 0) PrintAddress(&address
);
196 else if (-1 == index
)
199 PL_FPrintError(err
, "PR_EnumerateHostEnt");
207 char buffer
[PROTO_BUFFER
];
209 ** Get Proto by name/number
211 rv
= PR_GetProtoByName("tcp", &buffer
[1], sizeof(buffer
) - 1, &proto
);
212 rv
= PR_GetProtoByNumber(6, &buffer
[3], sizeof(buffer
) - 3, &proto
);
215 return (failed
) ? 1 : 0;