static
int
nss_load_library (service_user
*
ni)
{
if
(ni
-
>library
=
=
NULL)
{
static name_database default_table;
ni
-
>library
=
nss_new_service (service_table ?: &default_table,
ni
-
>name);
if
(ni
-
>library
=
=
NULL)
return
-
1
;
}
if
(ni
-
>library
-
>lib_handle
=
=
NULL)
{
/
*
Load the shared library.
*
/
size_t shlen
=
(
7
+
strlen (ni
-
>name)
+
3
+
strlen (__nss_shlib_revision)
+
1
);
int
saved_errno
=
errno;
char shlib_name[shlen];
/
/
构建动态库的名称 libnss_
*
.so
__stpcpy (__stpcpy (__stpcpy (__stpcpy (shlib_name,
"libnss_"
),
ni
-
>name),
".so"
),
__nss_shlib_revision);
ni
-
>library
-
>lib_handle
=
__libc_dlopen (shlib_name);
if
(ni
-
>library
-
>lib_handle
=
=
NULL)
{
/
*
Failed to load the library. Try a fallback.
*
/
int
n
=
__snprintf(shlib_name, shlen,
"libnss_%s.so.%d.%d"
,
ni
-
>library
-
>name, __GLIBC__, __GLIBC_MINOR__);
if
(n >
=
shlen)
ni
-
>library
-
>lib_handle
=
NULL;
else
ni
-
>library
-
>lib_handle
=
__libc_dlopen (shlib_name);
if
(ni
-
>library
-
>lib_handle
=
=
NULL)
{
/
*
Ok, really fail now.
*
/
ni
-
>library
-
>lib_handle
=
(void
*
)
-
1l
;
__set_errno (saved_errno);
}
}