/*
* blname.c - determine the freebl library name.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#if defined(FREEBL_LOWHASH)
static const char* default_name =
SHLIB_PREFIX
"freeblpriv" SHLIB_VERSION
"." SHLIB_SUFFIX;
#else
static const char* default_name =
SHLIB_PREFIX
"freebl" SHLIB_VERSION
"." SHLIB_SUFFIX;
#endif
/* getLibName() returns the name of the library to load. */
#if defined(SOLARIS) &&
defined(__sparc)
#include <stddef.h>
#include <strings.h>
#include <sys/systeminfo.h>
#if defined(NSS_USE_64)
const static char fpu_hybrid_shared_lib[] =
"libfreebl_64fpu_3.so";
const static char int_hybrid_shared_lib[] =
"libfreebl_64int_3.so";
const static char non_hybrid_shared_lib[] =
"libfreebl_64fpu_3.so";
const static char int_hybrid_isa[] =
"sparcv9";
const static char fpu_hybrid_isa[] =
"sparcv9+vis";
#else
const static char fpu_hybrid_shared_lib[] =
"libfreebl_32fpu_3.so";
const static char int_hybrid_shared_lib[] =
"libfreebl_32int64_3.so";
/* This was for SPARC V8, now obsolete. */
const static char*
const non_hybrid_shared_lib = NULL;
const static char int_hybrid_isa[] =
"sparcv8plus";
const static char fpu_hybrid_isa[] =
"sparcv8plus+vis";
#endif
static const char*
getLibName(
void)
{
char* found_int_hybrid;
char* found_fpu_hybrid;
long buflen;
char buf[256];
buflen = sysinfo(SI_ISALIST, buf,
sizeof buf);
if (buflen <= 0)
return NULL;
/* sysinfo output is always supposed to be NUL terminated, but ... */
if (buflen <
sizeof buf)
buf[buflen] =
'\0';
else
buf[(
sizeof buf) - 1] =
'\0';
/* The ISA list is a space separated string of names of ISAs and
* ISA extensions, in order of decreasing performance.
* There are two different ISAs with which NSS's crypto code can be
* accelerated. If both are in the list, we take the first one.
* If one is in the list, we use it, and if neither then we use
* the base unaccelerated code.
*/
found_int_hybrid = strstr(buf, int_hybrid_isa);
found_fpu_hybrid = strstr(buf, fpu_hybrid_isa);
if (found_fpu_hybrid &&
(!found_int_hybrid ||
(found_int_hybrid - found_fpu_hybrid) >= 0)) {
return fpu_hybrid_shared_lib;
}
if (found_int_hybrid) {
return int_hybrid_shared_lib;
}
return non_hybrid_shared_lib;
}
#elif defined(HPUX) && !
defined(NSS_USE_64) && !
defined(__ia64)
#include <unistd.h>
/* This code tests to see if we're running on a PA2.x CPU.
** It returns true (1) if so, and false (0) otherwise.
*/
static const char*
getLibName(
void)
{
long cpu = sysconf(_SC_CPU_VERSION);
return (cpu == CPU_PA_RISC2_0)
?
"libfreebl_32fpu_3.sl"
:
"libfreebl_32int_3.sl";
}
#else
/* default case, for platforms/ABIs that have only one freebl shared lib. */
static const char*
getLibName(
void)
{
return default_name;
}
#endif