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
) {
59 PL_FPrintError(err
, "PR_NetAddrToString");
63 PR_fprintf(err
, "\t%s\n", buffer
);
64 memset(&translation
, 0, sizeof(translation
));
65 rv
= PR_StringToNetAddr(buffer
, &translation
);
66 if (PR_FAILURE
== rv
) {
67 PL_FPrintError(err
, "PR_StringToNetAddr");
71 PRSize addr_len
= NETADDR_SIZE(address
);
72 if (0 != memcmp(address
, &translation
, addr_len
))
74 PR_fprintf(err
, "Address translations do not match\n");
75 DumpAddr(address
, "original");
76 DumpAddr(&translation
, "translate");
84 int main(int argc
, char **argv
)
90 const char *name
= NULL
;
91 PRBool failed
= PR_FALSE
, version
= PR_FALSE
;
92 PLOptState
*opt
= PL_CreateOptState(argc
, argv
, "Vh");
94 err
= PR_GetSpecialFD(PR_StandardError
);
96 while (PL_OPT_EOL
!= (os
= PL_GetNextOpt(opt
)))
98 if (PL_OPT_BAD
== os
) {
103 case 0: /* Name of host to lookup */
106 case 'V': /* Do version discovery */
109 case 'h': /* user wants some guidance */
111 Help(); /* so give him an earful */
112 return 2; /* but not a lot else */
115 PL_DestroyOptState(opt
);
120 #define NSPR_LIB "libnspr4"
122 #define NSPR_LIB "nspr4"
124 const PRVersionDescription
*version_info
;
125 char *nspr_path
= PR_GetEnv("LD_LIBRARY_PATH");
126 char *nspr_name
= PR_GetLibraryName(nspr_path
, NSPR_LIB
);
127 PRLibrary
*runtime
= PR_LoadLibrary(nspr_name
);
128 if (NULL
== runtime
) {
129 PL_FPrintError(err
, "PR_LoadLibrary");
133 versionEntryPointType versionPoint
= (versionEntryPointType
)
134 PR_FindSymbol(runtime
, "libVersionPoint");
135 if (NULL
== versionPoint
) {
136 PL_FPrintError(err
, "PR_FindSymbol");
141 PRExplodedTime exploded
;
142 version_info
= versionPoint();
143 (void)PR_fprintf(err
, "Runtime library version information\n");
145 version_info
->buildTime
, PR_GMTParameters
, &exploded
);
147 buffer
, sizeof(buffer
), "%d %b %Y %H:%M:%S", &exploded
);
148 (void)PR_fprintf(err
, " Build time: %s GMT\n", buffer
);
150 err
, " Build time: %s\n", version_info
->buildTimeString
);
152 err
, " %s V%u.%u.%u (%s%s%s)\n",
153 version_info
->description
,
154 version_info
->vMajor
,
155 version_info
->vMinor
,
156 version_info
->vPatch
,
157 (version_info
->beta
? " beta " : ""),
158 (version_info
->debug
? " debug " : ""),
159 (version_info
->special
? " special" : ""));
160 (void)PR_fprintf(err
, " filename: %s\n", version_info
->filename
);
161 (void)PR_fprintf(err
, " security: %s\n", version_info
->security
);
162 (void)PR_fprintf(err
, " copyright: %s\n", version_info
->copyright
);
163 (void)PR_fprintf(err
, " comment: %s\n", version_info
->comment
);
166 if (NULL
!= nspr_name
) {
167 PR_FreeLibraryName(nspr_name
);
174 char *me
= (char*)PR_MALLOC(DNS_BUFFER
);
175 rv
= PR_GetSystemInfo(PR_SI_HOSTNAME
, me
, DNS_BUFFER
);
176 if (PR_FAILURE
== rv
)
179 PL_FPrintError(err
, "PR_GetSystemInfo");
182 name
= me
; /* just leak the storage */
187 char buffer
[HOST_BUFFER
];
188 PR_fprintf(err
, "Translating the name %s ...", name
);
190 rv
= PR_GetHostByName(name
, buffer
, sizeof(buffer
), &host
);
191 if (PR_FAILURE
== rv
)
194 PL_FPrintError(err
, "PR_GetHostByName");
200 memset(&address
, 0, sizeof(PRNetAddr
));
201 PR_fprintf(err
, "success .. enumerating results\n");
204 index
= PR_EnumerateHostEnt(index
, &host
, 0, &address
);
206 PrintAddress(&address
);
208 else if (-1 == index
)
211 PL_FPrintError(err
, "PR_EnumerateHostEnt");
219 char buffer
[PROTO_BUFFER
];
221 ** Get Proto by name/number
223 rv
= PR_GetProtoByName("tcp", &buffer
[1], sizeof(buffer
) - 1, &proto
);
224 rv
= PR_GetProtoByNumber(6, &buffer
[3], sizeof(buffer
) - 3, &proto
);
227 return (failed
) ? 1 : 0;