* [PATCH 1/7] inet: Add hidden prototype for __inet_network
2021-06-29 10:11 [PATCH v2 0/7] nss_files move Florian Weimer
@ 2021-06-29 10:11 ` Florian Weimer
2021-07-07 13:33 ` Adhemerval Zanella
2021-06-29 10:11 ` [PATCH 2/7] libio: Add hidden prototype for ungetc Florian Weimer
` (6 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2021-06-29 10:11 UTC (permalink / raw)
To: libc-alpha
---
include/arpa/inet.h | 2 ++
inet/inet_net.c | 4 +++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/include/arpa/inet.h b/include/arpa/inet.h
index 19aec74275..df9472ba3b 100644
--- a/include/arpa/inet.h
+++ b/include/arpa/inet.h
@@ -12,4 +12,6 @@ libc_hidden_proto (__inet_pton)
extern __typeof (inet_makeaddr) __inet_makeaddr;
libc_hidden_proto (__inet_makeaddr)
libc_hidden_proto (inet_netof)
+extern __typeof (inet_network) __inet_network;
+libc_hidden_proto (__inet_network)
#endif
diff --git a/inet/inet_net.c b/inet/inet_net.c
index a0855e8bd2..b98634c33b 100644
--- a/inet/inet_net.c
+++ b/inet/inet_net.c
@@ -55,7 +55,7 @@
* network numbers.
*/
uint32_t
-inet_network (const char *cp)
+__inet_network (const char *cp)
{
uint32_t val, base, n, i;
char c;
@@ -107,3 +107,5 @@ again:
}
return (val);
}
+libc_hidden_def (__inet_network)
+weak_alias (__inet_network, inet_network)
--
2.31.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 1/7] inet: Add hidden prototype for __inet_network
2021-06-29 10:11 ` [PATCH 1/7] inet: Add hidden prototype for __inet_network Florian Weimer
@ 2021-07-07 13:33 ` Adhemerval Zanella
0 siblings, 0 replies; 17+ messages in thread
From: Adhemerval Zanella @ 2021-07-07 13:33 UTC (permalink / raw)
To: Florian Weimer, libc-alpha
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
On 29/06/2021 07:11, Florian Weimer via Libc-alpha wrote:
> ---
> include/arpa/inet.h | 2 ++
> inet/inet_net.c | 4 +++-
> 2 files changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/include/arpa/inet.h b/include/arpa/inet.h
> index 19aec74275..df9472ba3b 100644
> --- a/include/arpa/inet.h
> +++ b/include/arpa/inet.h
> @@ -12,4 +12,6 @@ libc_hidden_proto (__inet_pton)
> extern __typeof (inet_makeaddr) __inet_makeaddr;
> libc_hidden_proto (__inet_makeaddr)
> libc_hidden_proto (inet_netof)
> +extern __typeof (inet_network) __inet_network;
> +libc_hidden_proto (__inet_network)
> #endif
> diff --git a/inet/inet_net.c b/inet/inet_net.c
> index a0855e8bd2..b98634c33b 100644
> --- a/inet/inet_net.c
> +++ b/inet/inet_net.c
> @@ -55,7 +55,7 @@
> * network numbers.
> */
> uint32_t
> -inet_network (const char *cp)
> +__inet_network (const char *cp)
> {
> uint32_t val, base, n, i;
> char c;
> @@ -107,3 +107,5 @@ again:
> }
> return (val);
> }
> +libc_hidden_def (__inet_network)
> +weak_alias (__inet_network, inet_network)
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 2/7] libio: Add hidden prototype for ungetc
2021-06-29 10:11 [PATCH v2 0/7] nss_files move Florian Weimer
2021-06-29 10:11 ` [PATCH 1/7] inet: Add hidden prototype for __inet_network Florian Weimer
@ 2021-06-29 10:11 ` Florian Weimer
2021-07-07 13:33 ` Adhemerval Zanella
2021-06-29 10:11 ` [PATCH v2 3/7] libio: Replace internal _IO_getdelim symbol with __getdelim Florian Weimer
` (5 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2021-06-29 10:11 UTC (permalink / raw)
To: libc-alpha
And make ungetc the primary symbol, with _IO_ungetc as an alias.
---
include/stdio.h | 1 +
libio/ioungetc.c | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/include/stdio.h b/include/stdio.h
index 2e0dc80c16..311adcf953 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -212,6 +212,7 @@ libc_hidden_ldbl_proto (dprintf)
libc_hidden_ldbl_proto (fprintf)
libc_hidden_ldbl_proto (vfprintf)
libc_hidden_ldbl_proto (sprintf)
+libc_hidden_proto (ungetc)
libc_hidden_proto (fwrite)
libc_hidden_proto (perror)
libc_hidden_proto (remove)
diff --git a/libio/ioungetc.c b/libio/ioungetc.c
index dcf1c4ca9e..e68a4aaca8 100644
--- a/libio/ioungetc.c
+++ b/libio/ioungetc.c
@@ -27,7 +27,7 @@
#include "libioP.h"
int
-_IO_ungetc (int c, FILE *fp)
+ungetc (int c, FILE *fp)
{
int result;
CHECK_FILE (fp, EOF);
@@ -40,5 +40,5 @@ _IO_ungetc (int c, FILE *fp)
_IO_release_lock (fp);
return result;
}
-
-weak_alias (_IO_ungetc, ungetc)
+libc_hidden_def (ungetc)
+strong_alias (ungetc, _IO_ungetc)
--
2.31.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 2/7] libio: Add hidden prototype for ungetc
2021-06-29 10:11 ` [PATCH 2/7] libio: Add hidden prototype for ungetc Florian Weimer
@ 2021-07-07 13:33 ` Adhemerval Zanella
0 siblings, 0 replies; 17+ messages in thread
From: Adhemerval Zanella @ 2021-07-07 13:33 UTC (permalink / raw)
To: Florian Weimer, libc-alpha
On 29/06/2021 07:11, Florian Weimer via Libc-alpha wrote:
> And make ungetc the primary symbol, with _IO_ungetc as an alias.
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> include/stdio.h | 1 +
> libio/ioungetc.c | 6 +++---
> 2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/include/stdio.h b/include/stdio.h
> index 2e0dc80c16..311adcf953 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -212,6 +212,7 @@ libc_hidden_ldbl_proto (dprintf)
> libc_hidden_ldbl_proto (fprintf)
> libc_hidden_ldbl_proto (vfprintf)
> libc_hidden_ldbl_proto (sprintf)
> +libc_hidden_proto (ungetc)
> libc_hidden_proto (fwrite)
> libc_hidden_proto (perror)
> libc_hidden_proto (remove)
> diff --git a/libio/ioungetc.c b/libio/ioungetc.c
> index dcf1c4ca9e..e68a4aaca8 100644
> --- a/libio/ioungetc.c
> +++ b/libio/ioungetc.c
> @@ -27,7 +27,7 @@
> #include "libioP.h"
>
> int
> -_IO_ungetc (int c, FILE *fp)
> +ungetc (int c, FILE *fp)
> {
> int result;
> CHECK_FILE (fp, EOF);
> @@ -40,5 +40,5 @@ _IO_ungetc (int c, FILE *fp)
> _IO_release_lock (fp);
> return result;
> }
> -
> -weak_alias (_IO_ungetc, ungetc)
> +libc_hidden_def (ungetc)
> +strong_alias (ungetc, _IO_ungetc)
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 3/7] libio: Replace internal _IO_getdelim symbol with __getdelim
2021-06-29 10:11 [PATCH v2 0/7] nss_files move Florian Weimer
2021-06-29 10:11 ` [PATCH 1/7] inet: Add hidden prototype for __inet_network Florian Weimer
2021-06-29 10:11 ` [PATCH 2/7] libio: Add hidden prototype for ungetc Florian Weimer
@ 2021-06-29 10:11 ` Florian Weimer
2021-07-07 13:33 ` Adhemerval Zanella
2021-06-29 10:11 ` [PATCH 4/7] nss_files: Allocate nscd file registration data on the heap Florian Weimer
` (4 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2021-06-29 10:11 UTC (permalink / raw)
To: libc-alpha
__getdelim is exported, _IO_getdelim is not. Add a hidden prototype
for __getdelim.
---
iconv/gconv_parseconfdir.h | 2 +-
include/stdio.h | 1 +
libio/iogetdelim.c | 7 +++----
libio/libioP.h | 1 -
stdio-common/getline.c | 2 +-
sysdeps/unix/sysv/linux/readonly-area.c | 2 +-
6 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/iconv/gconv_parseconfdir.h b/iconv/gconv_parseconfdir.h
index e73ea0ff5c..505e8b1458 100644
--- a/iconv/gconv_parseconfdir.h
+++ b/iconv/gconv_parseconfdir.h
@@ -23,7 +23,7 @@
#if IS_IN (libc)
# include <libio/libioP.h>
-# define __getdelim(line, len, c, fp) _IO_getdelim (line, len, c, fp)
+# define __getdelim(line, len, c, fp) __getdelim (line, len, c, fp)
# undef isspace
# define isspace(__c) __isspace_l ((__c), _nl_C_locobj_ptr)
diff --git a/include/stdio.h b/include/stdio.h
index 311adcf953..23b7fd288c 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -213,6 +213,7 @@ libc_hidden_ldbl_proto (fprintf)
libc_hidden_ldbl_proto (vfprintf)
libc_hidden_ldbl_proto (sprintf)
libc_hidden_proto (ungetc)
+libc_hidden_proto (__getdelim)
libc_hidden_proto (fwrite)
libc_hidden_proto (perror)
libc_hidden_proto (remove)
diff --git a/libio/iogetdelim.c b/libio/iogetdelim.c
index 06450ca96c..3b1253bae8 100644
--- a/libio/iogetdelim.c
+++ b/libio/iogetdelim.c
@@ -37,7 +37,7 @@
null terminator), or -1 on error or EOF. */
ssize_t
-_IO_getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
+__getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
{
ssize_t result;
ssize_t cur_len = 0;
@@ -122,6 +122,5 @@ unlock_return:
_IO_release_lock (fp);
return result;
}
-
-weak_alias (_IO_getdelim, __getdelim)
-weak_alias (_IO_getdelim, getdelim)
+libc_hidden_def (__getdelim)
+weak_alias (__getdelim, getdelim)
diff --git a/libio/libioP.h b/libio/libioP.h
index 4bad7f3c06..dc9a2ce9c8 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -734,7 +734,6 @@ libc_hidden_proto (_IO_getline)
extern size_t _IO_getline_info (FILE *,char *, size_t,
int, int, int *);
libc_hidden_proto (_IO_getline_info)
-extern ssize_t _IO_getdelim (char **, size_t *, int, FILE *);
extern size_t _IO_getwline (FILE *,wchar_t *, size_t, wint_t, int);
extern size_t _IO_getwline_info (FILE *,wchar_t *, size_t,
wint_t, int, wint_t *);
diff --git a/stdio-common/getline.c b/stdio-common/getline.c
index de212243bb..52dfc58f2b 100644
--- a/stdio-common/getline.c
+++ b/stdio-common/getline.c
@@ -25,7 +25,7 @@
ssize_t
__getline (char **lineptr, size_t *n, FILE *stream)
{
- return _IO_getdelim (lineptr, n, '\n', stream);
+ return __getdelim (lineptr, n, '\n', stream);
}
weak_alias (__getline, getline)
diff --git a/sysdeps/unix/sysv/linux/readonly-area.c b/sysdeps/unix/sysv/linux/readonly-area.c
index b42ec6ef3e..fa407d2f05 100644
--- a/sysdeps/unix/sysv/linux/readonly-area.c
+++ b/sysdeps/unix/sysv/linux/readonly-area.c
@@ -55,7 +55,7 @@ __readonly_area (const char *ptr, size_t size)
while (! __feof_unlocked (fp))
{
- if (_IO_getdelim (&line, &linelen, '\n', fp) <= 0)
+ if (__getdelim (&line, &linelen, '\n', fp) <= 0)
break;
char *p;
--
2.31.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 3/7] libio: Replace internal _IO_getdelim symbol with __getdelim
2021-06-29 10:11 ` [PATCH v2 3/7] libio: Replace internal _IO_getdelim symbol with __getdelim Florian Weimer
@ 2021-07-07 13:33 ` Adhemerval Zanella
0 siblings, 0 replies; 17+ messages in thread
From: Adhemerval Zanella @ 2021-07-07 13:33 UTC (permalink / raw)
To: Florian Weimer, libc-alpha
On 29/06/2021 07:11, Florian Weimer via Libc-alpha wrote:
> __getdelim is exported, _IO_getdelim is not. Add a hidden prototype
> for __getdelim.
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> iconv/gconv_parseconfdir.h | 2 +-
> include/stdio.h | 1 +
> libio/iogetdelim.c | 7 +++----
> libio/libioP.h | 1 -
> stdio-common/getline.c | 2 +-
> sysdeps/unix/sysv/linux/readonly-area.c | 2 +-
> 6 files changed, 7 insertions(+), 8 deletions(-)
>
> diff --git a/iconv/gconv_parseconfdir.h b/iconv/gconv_parseconfdir.h
> index e73ea0ff5c..505e8b1458 100644
> --- a/iconv/gconv_parseconfdir.h
> +++ b/iconv/gconv_parseconfdir.h
> @@ -23,7 +23,7 @@
>
> #if IS_IN (libc)
> # include <libio/libioP.h>
> -# define __getdelim(line, len, c, fp) _IO_getdelim (line, len, c, fp)
> +# define __getdelim(line, len, c, fp) __getdelim (line, len, c, fp)
>
> # undef isspace
> # define isspace(__c) __isspace_l ((__c), _nl_C_locobj_ptr)
> diff --git a/include/stdio.h b/include/stdio.h
> index 311adcf953..23b7fd288c 100644
> --- a/include/stdio.h
> +++ b/include/stdio.h
> @@ -213,6 +213,7 @@ libc_hidden_ldbl_proto (fprintf)
> libc_hidden_ldbl_proto (vfprintf)
> libc_hidden_ldbl_proto (sprintf)
> libc_hidden_proto (ungetc)
> +libc_hidden_proto (__getdelim)
> libc_hidden_proto (fwrite)
> libc_hidden_proto (perror)
> libc_hidden_proto (remove)
> diff --git a/libio/iogetdelim.c b/libio/iogetdelim.c
> index 06450ca96c..3b1253bae8 100644
> --- a/libio/iogetdelim.c
> +++ b/libio/iogetdelim.c
> @@ -37,7 +37,7 @@
> null terminator), or -1 on error or EOF. */
>
> ssize_t
> -_IO_getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
> +__getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp)
> {
> ssize_t result;
> ssize_t cur_len = 0;
> @@ -122,6 +122,5 @@ unlock_return:
> _IO_release_lock (fp);
> return result;
> }
> -
> -weak_alias (_IO_getdelim, __getdelim)
> -weak_alias (_IO_getdelim, getdelim)
> +libc_hidden_def (__getdelim)
> +weak_alias (__getdelim, getdelim)
> diff --git a/libio/libioP.h b/libio/libioP.h
> index 4bad7f3c06..dc9a2ce9c8 100644
> --- a/libio/libioP.h
> +++ b/libio/libioP.h
> @@ -734,7 +734,6 @@ libc_hidden_proto (_IO_getline)
> extern size_t _IO_getline_info (FILE *,char *, size_t,
> int, int, int *);
> libc_hidden_proto (_IO_getline_info)
> -extern ssize_t _IO_getdelim (char **, size_t *, int, FILE *);
> extern size_t _IO_getwline (FILE *,wchar_t *, size_t, wint_t, int);
> extern size_t _IO_getwline_info (FILE *,wchar_t *, size_t,
> wint_t, int, wint_t *);
> diff --git a/stdio-common/getline.c b/stdio-common/getline.c
> index de212243bb..52dfc58f2b 100644
> --- a/stdio-common/getline.c
> +++ b/stdio-common/getline.c
> @@ -25,7 +25,7 @@
> ssize_t
> __getline (char **lineptr, size_t *n, FILE *stream)
> {
> - return _IO_getdelim (lineptr, n, '\n', stream);
> + return __getdelim (lineptr, n, '\n', stream);
> }
>
> weak_alias (__getline, getline)
> diff --git a/sysdeps/unix/sysv/linux/readonly-area.c b/sysdeps/unix/sysv/linux/readonly-area.c
> index b42ec6ef3e..fa407d2f05 100644
> --- a/sysdeps/unix/sysv/linux/readonly-area.c
> +++ b/sysdeps/unix/sysv/linux/readonly-area.c
> @@ -55,7 +55,7 @@ __readonly_area (const char *ptr, size_t size)
>
> while (! __feof_unlocked (fp))
> {
> - if (_IO_getdelim (&line, &linelen, '\n', fp) <= 0)
> + if (__getdelim (&line, &linelen, '\n', fp) <= 0)
> break;
>
> char *p;
>
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 4/7] nss_files: Allocate nscd file registration data on the heap
2021-06-29 10:11 [PATCH v2 0/7] nss_files move Florian Weimer
` (2 preceding siblings ...)
2021-06-29 10:11 ` [PATCH v2 3/7] libio: Replace internal _IO_getdelim symbol with __getdelim Florian Weimer
@ 2021-06-29 10:11 ` Florian Weimer
2021-07-07 13:35 ` Adhemerval Zanella
2021-06-29 10:11 ` [PATCH 5/7] nss_files: Add generic code for set*ent, end*ent and file open Florian Weimer
` (3 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2021-06-29 10:11 UTC (permalink / raw)
To: libc-alpha
This is only needed if nss_files is loaded by nscd.
Before:
text data bss dec hex filename
767 0 24952 25719 6477 nss/files-init.os
After:
text data bss dec hex filename
666 0 0 666 29a nss/files-init.os
Using PATH_MAX bytes unconditionally for the directory name
is wasteful, but fixing that would constitute another break
of this semi-public ABI. (The other issue is that with
symbolic links, an arbitrary set of parent directories may need
watching, not just a single one.)
---
nss/nss_files/files-init.c | 54 ++++++++++++++------------------------
1 file changed, 20 insertions(+), 34 deletions(-)
diff --git a/nss/nss_files/files-init.c b/nss/nss_files/files-init.c
index cc22330640..36d5ebce1f 100644
--- a/nss/nss_files/files-init.c
+++ b/nss/nss_files/files-init.c
@@ -24,44 +24,30 @@
NSS_DECLARE_MODULE_FUNCTIONS (files)
-#define PWD_FILENAME "/etc/passwd"
-define_traced_file (pwd, PWD_FILENAME);
-
-#define GRP_FILENAME "/etc/group"
-define_traced_file (grp, GRP_FILENAME);
-
-#define HST_FILENAME "/etc/hosts"
-define_traced_file (hst, HST_FILENAME);
-
-#define RESOLV_FILENAME "/etc/resolv.conf"
-define_traced_file (resolv, RESOLV_FILENAME);
-
-#define SERV_FILENAME "/etc/services"
-define_traced_file (serv, SERV_FILENAME);
-
-#define NETGR_FILENAME "/etc/netgroup"
-define_traced_file (netgr, NETGR_FILENAME);
+static void
+register_file (void (*cb) (size_t, struct traced_file *),
+ int db, const char *path, int crinit)
+{
+ size_t pathlen = strlen (path) + 1;
+ struct traced_file *file = malloc (sizeof (struct traced_file) + pathlen);
+ /* Do not register anything on memory allocation file. nscd will
+ fail soon anyway. */
+ if (file != NULL)
+ {
+ init_traced_file (file, path, crinit);
+ cb (db, file);
+ }
+}
void
_nss_files_init (void (*cb) (size_t, struct traced_file *))
{
- init_traced_file (&pwd_traced_file.file, PWD_FILENAME, 0);
- cb (pwddb, &pwd_traced_file.file);
-
- init_traced_file (&grp_traced_file.file, GRP_FILENAME, 0);
- cb (grpdb, &grp_traced_file.file);
-
- init_traced_file (&hst_traced_file.file, HST_FILENAME, 0);
- cb (hstdb, &hst_traced_file.file);
-
- init_traced_file (&resolv_traced_file.file, RESOLV_FILENAME, 1);
- cb (hstdb, &resolv_traced_file.file);
-
- init_traced_file (&serv_traced_file.file, SERV_FILENAME, 0);
- cb (servdb, &serv_traced_file.file);
-
- init_traced_file (&netgr_traced_file.file, NETGR_FILENAME, 0);
- cb (netgrdb, &netgr_traced_file.file);
+ register_file (cb, pwddb, "/etc/passwd", 0);
+ register_file (cb, grpdb, "/etc/group", 0);
+ register_file (cb, hstdb, "/etc/hosts", 0);
+ register_file (cb, hstdb, "/etc/resolv.conf", 1);
+ register_file (cb, servdb, "/etc/services", 0);
+ register_file (cb, netgrdb, "/etc/netgroup", 0);
}
#endif
--
2.31.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 4/7] nss_files: Allocate nscd file registration data on the heap
2021-06-29 10:11 ` [PATCH 4/7] nss_files: Allocate nscd file registration data on the heap Florian Weimer
@ 2021-07-07 13:35 ` Adhemerval Zanella
0 siblings, 0 replies; 17+ messages in thread
From: Adhemerval Zanella @ 2021-07-07 13:35 UTC (permalink / raw)
To: Florian Weimer, libc-alpha
On 29/06/2021 07:11, Florian Weimer via Libc-alpha wrote:
> This is only needed if nss_files is loaded by nscd.
>
> Before:
>
> text data bss dec hex filename
> 767 0 24952 25719 6477 nss/files-init.os
>
> After:
>
> text data bss dec hex filename
> 666 0 0 666 29a nss/files-init.os
>
> Using PATH_MAX bytes unconditionally for the directory name
> is wasteful, but fixing that would constitute another break
> of this semi-public ABI. (The other issue is that with
> symbolic links, an arbitrary set of parent directories may need
> watching, not just a single one.)
LGTM, only a nit below.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> nss/nss_files/files-init.c | 54 ++++++++++++++------------------------
> 1 file changed, 20 insertions(+), 34 deletions(-)
>
> diff --git a/nss/nss_files/files-init.c b/nss/nss_files/files-init.c
> index cc22330640..36d5ebce1f 100644
> --- a/nss/nss_files/files-init.c
> +++ b/nss/nss_files/files-init.c
> @@ -24,44 +24,30 @@
>
> NSS_DECLARE_MODULE_FUNCTIONS (files)
>
> -#define PWD_FILENAME "/etc/passwd"
> -define_traced_file (pwd, PWD_FILENAME);
> -
> -#define GRP_FILENAME "/etc/group"
> -define_traced_file (grp, GRP_FILENAME);
> -
> -#define HST_FILENAME "/etc/hosts"
> -define_traced_file (hst, HST_FILENAME);
> -
> -#define RESOLV_FILENAME "/etc/resolv.conf"
> -define_traced_file (resolv, RESOLV_FILENAME);
> -
> -#define SERV_FILENAME "/etc/services"
> -define_traced_file (serv, SERV_FILENAME);
> -
> -#define NETGR_FILENAME "/etc/netgroup"
> -define_traced_file (netgr, NETGR_FILENAME);
> +static void
> +register_file (void (*cb) (size_t, struct traced_file *),
> + int db, const char *path, int crinit)
> +{
> + size_t pathlen = strlen (path) + 1;
> + struct traced_file *file = malloc (sizeof (struct traced_file) + pathlen);
> + /* Do not register anything on memory allocation file. nscd will
I think you mean 'fail' instead of 'file' here.
> + fail soon anyway. */
> + if (file != NULL)
> + {
> + init_traced_file (file, path, crinit);
> + cb (db, file);
> + }
> +}
>
> void
> _nss_files_init (void (*cb) (size_t, struct traced_file *))
> {
> - init_traced_file (&pwd_traced_file.file, PWD_FILENAME, 0);
> - cb (pwddb, &pwd_traced_file.file);
> -
> - init_traced_file (&grp_traced_file.file, GRP_FILENAME, 0);
> - cb (grpdb, &grp_traced_file.file);
> -
> - init_traced_file (&hst_traced_file.file, HST_FILENAME, 0);
> - cb (hstdb, &hst_traced_file.file);
> -
> - init_traced_file (&resolv_traced_file.file, RESOLV_FILENAME, 1);
> - cb (hstdb, &resolv_traced_file.file);
> -
> - init_traced_file (&serv_traced_file.file, SERV_FILENAME, 0);
> - cb (servdb, &serv_traced_file.file);
> -
> - init_traced_file (&netgr_traced_file.file, NETGR_FILENAME, 0);
> - cb (netgrdb, &netgr_traced_file.file);
> + register_file (cb, pwddb, "/etc/passwd", 0);
> + register_file (cb, grpdb, "/etc/group", 0);
> + register_file (cb, hstdb, "/etc/hosts", 0);
> + register_file (cb, hstdb, "/etc/resolv.conf", 1);
> + register_file (cb, servdb, "/etc/services", 0);
> + register_file (cb, netgrdb, "/etc/netgroup", 0);
> }
>
> #endif
>
Ok.
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 5/7] nss_files: Add generic code for set*ent, end*ent and file open
2021-06-29 10:11 [PATCH v2 0/7] nss_files move Florian Weimer
` (3 preceding siblings ...)
2021-06-29 10:11 ` [PATCH 4/7] nss_files: Allocate nscd file registration data on the heap Florian Weimer
@ 2021-06-29 10:11 ` Florian Weimer
2021-07-07 13:42 ` Adhemerval Zanella
2021-06-29 10:11 ` [PATCH 6/7] nss_files: Move into libc Florian Weimer
` (2 subsequent siblings)
7 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2021-06-29 10:11 UTC (permalink / raw)
To: libc-alpha
This reduces RSS usage if nss_files is not actually used, and can
be used later to make NSS data thread-specific. It also results in
a small code size reduction.
Before:
text data bss dec hex filename
2288 0 72 2360 938 nss/files-alias.os
1807 0 72 1879 757 nss/files-ethers.os
1371 0 72 1443 5a3 nss/files-grp.os
6246 0 72 6318 18ae nss/files-hosts.os
869 0 0 869 365 nss/files-initgroups.os
666 0 0 666 29a nss/files-init.os
1934 0 0 1934 78e nss/files-netgrp.os
2353 0 72 2425 979 nss/files-network.os
2130 0 72 2202 89a nss/files-proto.os
1372 0 72 1444 5a4 nss/files-pwd.os
2124 0 72 2196 894 nss/files-rpc.os
2265 0 72 2337 921 nss/files-service.os
1125 0 72 1197 4ad nss/files-sgrp.os
1124 0 72 1196 4ac nss/files-spwd.os
After:
text data bss dec hex filename
2040 0 0 2040 7f8 nss/files-alias.os
1599 0 0 1599 63f nss/files-ethers.os
1155 0 0 1155 483 nss/files-grp.os
6010 0 0 6010 177a nss/files-hosts.os
869 0 0 869 365 nss/files-initgroups.os
666 0 0 666 29a nss/files-init.os
1934 0 0 1934 78e nss/files-netgrp.os
2129 0 0 2129 851 nss/files-network.os
1914 0 0 1914 77a nss/files-proto.os
1156 0 0 1156 484 nss/files-pwd.os
1908 0 0 1908 774 nss/files-rpc.os
2057 0 0 2057 809 nss/files-service.os
909 0 0 909 38d nss/files-sgrp.os
908 0 0 908 38c nss/files-spwd.os
1090 0 8 1098 44a nss/nss_files_data.os
27674 code bytes before, 26344 code bytes after, so it is an overall
win despite the extra initialization code.
---
include/nss_files.h | 60 ++++++++++++++
nss/Makefile | 2 +-
nss/Versions | 4 +
nss/nss_files/files-XXX.c | 67 ++++-----------
nss/nss_files/files-alias.c | 69 ++++------------
nss/nss_files/files-hosts.c | 4 +-
nss/nss_files_data.c | 159 ++++++++++++++++++++++++++++++++++++
7 files changed, 257 insertions(+), 108 deletions(-)
create mode 100644 nss/nss_files_data.c
diff --git a/include/nss_files.h b/include/nss_files.h
index 6a0dcdb85b..7bf1951496 100644
--- a/include/nss_files.h
+++ b/include/nss_files.h
@@ -20,6 +20,9 @@
#define _NSS_FILES_H
#include <stdio.h>
+#if IS_IN (libc)
+#include <libc-lock.h>
+#endif
/* Open PATH for reading, as a data source for nss_files. */
FILE *__nss_files_fopen (const char *path);
@@ -47,6 +50,63 @@ int __nss_readline_seek (FILE *fp, off64_t offset) attribute_hidden;
int __nss_parse_line_result (FILE *fp, off64_t offset, int parse_line_result);
libc_hidden_proto (__nss_parse_line_result)
+/* Per-file data. Used by the *ent functions that need to preserve
+ state across calls. */
+struct nss_files_per_file_data
+{
+ FILE *stream;
+#if IS_IN (libc)
+ /* The size of locks changes between libc and nss_files, so this
+ member must be last and is only available in libc. */
+ __libc_lock_define (, lock);
+#endif
+};
+
+/* File index for __nss_files_data_get. */
+enum nss_files_file
+ {
+ nss_file_aliasent,
+ nss_file_etherent,
+ nss_file_grent,
+ nss_file_hostent,
+ nss_file_netent,
+ nss_file_protoent,
+ nss_file_pwent,
+ nss_file_rpcent,
+ nss_file_servent,
+ nss_file_sgent,
+ nss_file_spent,
+
+ nss_file_count
+ };
+
+/* Obtains a pointer to the per-file data for FILE, which is written
+ to *PDATA, and tries to open the file at PATH for it. On success,
+ returns NSS_STATUS_SUCCESS, and the caller must later call
+ __nss_files_data_put. On failure, NSS_STATUS_TRYAGAIN is returned,
+ and *ERRNOP and *HERRNOP are updated if these pointers are not
+ null. */
+enum nss_status __nss_files_data_open (struct nss_files_per_file_data **pdata,
+ enum nss_files_file file,
+ const char *path,
+ int *errnop, int *herrnop);
+libc_hidden_proto (__nss_files_data_open)
+
+/* Unlock the per-file data, previously obtained by
+ __nss_files_data_open. */
+void __nss_files_data_put (struct nss_files_per_file_data *data);
+libc_hidden_proto (__nss_files_data_put)
+
+/* Performs the set*ent operation for FILE. PATH is the file to
+ open. */
+enum nss_status __nss_files_data_setent (enum nss_files_file file,
+ const char *path);
+libc_hidden_proto (__nss_files_data_setent)
+
+/* Performs the end*ent operation for FILE. */
+enum nss_status __nss_files_data_endent (enum nss_files_file file);
+libc_hidden_proto (__nss_files_data_endent)
+
struct parser_data;
/* Instances of the parse_line function from
diff --git a/nss/Makefile b/nss/Makefile
index 9682a31e20..271a0e7716 100644
--- a/nss/Makefile
+++ b/nss/Makefile
@@ -31,7 +31,7 @@ routines = nsswitch getnssent getnssent_r digits_dots \
compat-lookup nss_hash nss_files_fopen \
nss_readline nss_parse_line_result \
nss_fgetent_r nss_module nss_action \
- nss_action_parse nss_database
+ nss_action_parse nss_database nss_files_data
# These are the databases that go through nss dispatch.
# Caution: if you add a database here, you must add its real name
diff --git a/nss/Versions b/nss/Versions
index fdddea104c..7b040b4786 100644
--- a/nss/Versions
+++ b/nss/Versions
@@ -19,6 +19,10 @@ libc {
__nss_services_lookup2; __nss_next2; __nss_lookup;
__nss_hash; __nss_database_get;
__nss_files_fopen; __nss_readline; __nss_parse_line_result;
+ __nss_files_data_endent;
+ __nss_files_data_open;
+ __nss_files_data_put;
+ __nss_files_data_setent;
}
}
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
index b4b989d9bb..91553d7ca5 100644
--- a/nss/nss_files/files-XXX.c
+++ b/nss/nss_files/files-XXX.c
@@ -45,10 +45,12 @@
# include <netdb.h>
# define H_ERRNO_PROTO , int *herrnop
# define H_ERRNO_ARG , herrnop
+# define H_ERRNO_ARG_OR_NULL herrnop
# define H_ERRNO_SET(val) (*herrnop = (val))
#else
# define H_ERRNO_PROTO
# define H_ERRNO_ARG
+# define H_ERRNO_ARG_OR_NULL NULL
# define H_ERRNO_SET(val) ((void) 0)
#endif
@@ -58,15 +60,11 @@
# define EXTRA_ARGS_VALUE
#endif
-/* Locks the static variables in this file. */
-__libc_lock_define_initialized (static, lock)
\f
/* Maintenance of the stream open on the database file. For getXXent
operations the stream needs to be held open across calls, the other
getXXbyYY operations all use their own stream. */
-static FILE *stream;
-
/* Open database file if not already opened. */
static enum nss_status
internal_setent (FILE **stream)
@@ -91,41 +89,13 @@ internal_setent (FILE **stream)
enum nss_status
CONCAT(_nss_files_set,ENTNAME) (int stayopen)
{
- enum nss_status status;
-
- __libc_lock_lock (lock);
-
- status = internal_setent (&stream);
-
- __libc_lock_unlock (lock);
-
- return status;
-}
-
-
-/* Close the database file. */
-static void
-internal_endent (FILE **stream)
-{
- if (*stream != NULL)
- {
- fclose (*stream);
- *stream = NULL;
- }
+ return __nss_files_data_setent (CONCAT (nss_file_, ENTNAME), DATAFILE);
}
-
-/* Thread-safe, exported version of that. */
enum nss_status
CONCAT(_nss_files_end,ENTNAME) (void)
{
- __libc_lock_lock (lock);
-
- internal_endent (&stream);
-
- __libc_lock_unlock (lock);
-
- return NSS_STATUS_SUCCESS;
+ return __nss_files_data_endent (CONCAT (nss_file_, ENTNAME));
}
\f
@@ -194,26 +164,19 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer,
size_t buflen, int *errnop H_ERRNO_PROTO)
{
/* Return next entry in host file. */
- enum nss_status status = NSS_STATUS_SUCCESS;
-
- __libc_lock_lock (lock);
-
- /* Be prepared that the set*ent function was not called before. */
- if (stream == NULL)
- {
- int save_errno = errno;
-
- status = internal_setent (&stream);
-
- __set_errno (save_errno);
- }
- if (status == NSS_STATUS_SUCCESS)
- status = internal_getent (stream, result, buffer, buflen, errnop
- H_ERRNO_ARG EXTRA_ARGS_VALUE);
+ struct nss_files_per_file_data *data;
+ enum nss_status status = __nss_files_data_open (&data,
+ CONCAT (nss_file_, ENTNAME),
+ DATAFILE,
+ errnop, H_ERRNO_ARG_OR_NULL);
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
- __libc_lock_unlock (lock);
+ status = internal_getent (data->stream, result, buffer, buflen, errnop
+ H_ERRNO_ARG EXTRA_ARGS_VALUE);
+ __nss_files_data_put (data);
return status;
}
\f
@@ -248,7 +211,7 @@ _nss_files_get##name##_r (proto, \
== NSS_STATUS_SUCCESS) \
{ break_if_match } \
\
- internal_endent (&stream); \
+ fclose (stream); \
} \
\
return status; \
diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
index 30971bfe56..9624b6224c 100644
--- a/nss/nss_files/files-alias.c
+++ b/nss/nss_files/files-alias.c
@@ -33,16 +33,11 @@
NSS_DECLARE_MODULE_FUNCTIONS (files)
-/* Locks the static variables in this file. */
-__libc_lock_define_initialized (static, lock)
\f
/* Maintenance of the stream open on the database file. For getXXent
operations the stream needs to be held open across calls, the other
getXXbyYY operations all use their own stream. */
-static FILE *stream;
-
-
static enum nss_status
internal_setent (FILE **stream)
{
@@ -66,41 +61,13 @@ internal_setent (FILE **stream)
enum nss_status
_nss_files_setaliasent (void)
{
- enum nss_status status;
-
- __libc_lock_lock (lock);
-
- status = internal_setent (&stream);
-
- __libc_lock_unlock (lock);
-
- return status;
-}
-
-
-/* Close the database file. */
-static void
-internal_endent (FILE **stream)
-{
- if (*stream != NULL)
- {
- fclose (*stream);
- *stream = NULL;
- }
+ return __nss_files_data_setent (nss_file_aliasent, "/etc/aliases");
}
-
-/* Thread-safe, exported version of that. */
enum nss_status
_nss_files_endaliasent (void)
{
- __libc_lock_lock (lock);
-
- internal_endent (&stream);
-
- __libc_lock_unlock (lock);
-
- return NSS_STATUS_SUCCESS;
+ return __nss_files_data_endent (nss_file_aliasent);
}
\f
/* Parsing the database file into `struct aliasent' data structures. */
@@ -369,26 +336,22 @@ _nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen,
int *errnop)
{
/* Return next entry in host file. */
- enum nss_status status = NSS_STATUS_SUCCESS;
- __libc_lock_lock (lock);
+ struct nss_files_per_file_data *data;
+ enum nss_status status = __nss_files_data_open (&data, nss_file_aliasent,
+ "/etc/aliases", errnop, NULL);
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
- /* Be prepared that the set*ent function was not called before. */
- if (stream == NULL)
- status = internal_setent (&stream);
+ result->alias_local = 1;
- if (status == NSS_STATUS_SUCCESS)
- {
- result->alias_local = 1;
-
- /* Read lines until we get a definite result. */
- do
- status = get_next_alias (stream, NULL, result, buffer, buflen, errnop);
- while (status == NSS_STATUS_RETURN);
- }
-
- __libc_lock_unlock (lock);
+ /* Read lines until we get a definite result. */
+ do
+ status = get_next_alias (data->stream, NULL, result, buffer, buflen,
+ errnop);
+ while (status == NSS_STATUS_RETURN);
+ __nss_files_data_put (data);
return status;
}
@@ -418,9 +381,9 @@ _nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
do
status = get_next_alias (stream, name, result, buffer, buflen, errnop);
while (status == NSS_STATUS_RETURN);
- }
- internal_endent (&stream);
+ fclose (stream);
+ }
return status;
}
diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
index 2b47ec3e53..1dd51d1db9 100644
--- a/nss/nss_files/files-hosts.c
+++ b/nss/nss_files/files-hosts.c
@@ -349,7 +349,7 @@ _nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result,
status = gethostbyname3_multi
(stream, name, af, result, buffer, buflen, errnop, herrnop);
- internal_endent (&stream);
+ fclose (stream);
}
if (canonp && status == NSS_STATUS_SUCCESS)
@@ -475,7 +475,7 @@ _nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
status = NSS_STATUS_SUCCESS;
}
- internal_endent (&stream);
+ fclose (stream);
}
else if (status == NSS_STATUS_TRYAGAIN)
{
diff --git a/nss/nss_files_data.c b/nss/nss_files_data.c
new file mode 100644
index 0000000000..7b7662abf1
--- /dev/null
+++ b/nss/nss_files_data.c
@@ -0,0 +1,159 @@
+/* Returns a pointer to the global nss_files data structure.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <nss_files.h>
+
+#include <allocate_once.h>
+#include <errno.h>
+#include <netdb.h>
+#include <nss.h>
+#include <stdlib.h>
+
+/* This collects all per file-data. */
+struct nss_files_data
+{
+ struct nss_files_per_file_data files[nss_file_count];
+};
+
+/* For use with allocate_once. */
+static void *nss_files_global;
+static void *
+nss_files_global_allocate (void *closure)
+{
+ struct nss_files_data *result = malloc (sizeof (*result));
+ if (result != NULL)
+ for (int i = 0; i < nss_file_count; ++i)
+ {
+ result->files[i].stream = NULL;
+ __libc_lock_init (result->files[i].lock);
+ }
+ return result;
+}
+/* Like __nss_files_data_open, but does not perform the open call. */
+static enum nss_status
+__nss_files_data_get (struct nss_files_per_file_data **pdata,
+ enum nss_files_file file, int *errnop, int *herrnop)
+{
+ struct nss_files_data *data = allocate_once (&nss_files_global,
+ nss_files_global_allocate,
+ NULL, NULL);
+ if (data == NULL)
+ {
+ if (errnop != NULL)
+ *errnop = errno;
+ if (herrnop != NULL)
+ {
+ __set_h_errno (NETDB_INTERNAL);
+ *herrnop = NETDB_INTERNAL;
+ }
+ return NSS_STATUS_TRYAGAIN;
+ }
+
+ *pdata = &data->files[file];
+ __libc_lock_lock ((*pdata)->lock);
+ return NSS_STATUS_SUCCESS;
+}
+
+/* Helper function for opening the backing file at PATH. */
+static enum nss_status
+__nss_files_data_internal_open (struct nss_files_per_file_data *data,
+ const char *path)
+{
+ enum nss_status status = NSS_STATUS_SUCCESS;
+
+ if (data->stream == NULL)
+ {
+ data->stream = __nss_files_fopen (path);
+
+ if (data->stream == NULL)
+ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
+ }
+
+ return status;
+}
+
+
+enum nss_status
+__nss_files_data_open (struct nss_files_per_file_data **pdata,
+ enum nss_files_file file, const char *path,
+ int *errnop, int *herrnop)
+{
+ enum nss_status status = __nss_files_data_get (pdata, file, errnop, herrnop);
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
+
+ /* Be prepared that the set*ent function was not called before. */
+ if ((*pdata)->stream == NULL)
+ {
+ int saved_errno = errno;
+ status = __nss_files_data_internal_open (*pdata, path);
+ __set_errno (saved_errno);
+ if (status != NSS_STATUS_SUCCESS)
+ __nss_files_data_put (*pdata);
+ }
+
+ return status;
+}
+
+libc_hidden_def (__nss_files_data_open)
+
+void
+__nss_files_data_put (struct nss_files_per_file_data *data)
+{
+ __libc_lock_unlock (data->lock);
+}
+libc_hidden_def (__nss_files_data_put)
+
+enum nss_status
+__nss_files_data_setent (enum nss_files_file file, const char *path)
+{
+ struct nss_files_per_file_data *data;
+ enum nss_status status = __nss_files_data_get (&data, file, NULL, NULL);
+ if (status != NSS_STATUS_SUCCESS)
+ return status;
+
+ if (data->stream == NULL)
+ status = __nss_files_data_internal_open (data, path);
+ else
+ rewind (data->stream);
+
+ __nss_files_data_put (data);
+ return status;
+}
+libc_hidden_def (__nss_files_data_setent)
+
+enum nss_status
+__nss_files_data_endent (enum nss_files_file file)
+{
+ /* No cleanup is necessary if not initialized. */
+ struct nss_files_data *data = atomic_load_acquire (&nss_files_global);
+ if (data == NULL)
+ return NSS_STATUS_SUCCESS;
+
+ struct nss_files_per_file_data *fdata = &data->files[file];
+ __libc_lock_lock (fdata->lock);
+ if (fdata->stream != NULL)
+ {
+ fclose (fdata->stream);
+ fdata->stream = NULL;
+ }
+ __libc_lock_unlock (fdata->lock);
+
+ return NSS_STATUS_SUCCESS;
+}
+libc_hidden_def (__nss_files_data_endent)
--
2.31.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 5/7] nss_files: Add generic code for set*ent, end*ent and file open
2021-06-29 10:11 ` [PATCH 5/7] nss_files: Add generic code for set*ent, end*ent and file open Florian Weimer
@ 2021-07-07 13:42 ` Adhemerval Zanella
0 siblings, 0 replies; 17+ messages in thread
From: Adhemerval Zanella @ 2021-07-07 13:42 UTC (permalink / raw)
To: Florian Weimer, libc-alpha
On 29/06/2021 07:11, Florian Weimer via Libc-alpha wrote:
> This reduces RSS usage if nss_files is not actually used, and can
> be used later to make NSS data thread-specific. It also results in
> a small code size reduction.
>
> Before:
>
> text data bss dec hex filename
> 2288 0 72 2360 938 nss/files-alias.os
> 1807 0 72 1879 757 nss/files-ethers.os
> 1371 0 72 1443 5a3 nss/files-grp.os
> 6246 0 72 6318 18ae nss/files-hosts.os
> 869 0 0 869 365 nss/files-initgroups.os
> 666 0 0 666 29a nss/files-init.os
> 1934 0 0 1934 78e nss/files-netgrp.os
> 2353 0 72 2425 979 nss/files-network.os
> 2130 0 72 2202 89a nss/files-proto.os
> 1372 0 72 1444 5a4 nss/files-pwd.os
> 2124 0 72 2196 894 nss/files-rpc.os
> 2265 0 72 2337 921 nss/files-service.os
> 1125 0 72 1197 4ad nss/files-sgrp.os
> 1124 0 72 1196 4ac nss/files-spwd.os
>
>
>
> After:
>
> text data bss dec hex filename
> 2040 0 0 2040 7f8 nss/files-alias.os
> 1599 0 0 1599 63f nss/files-ethers.os
> 1155 0 0 1155 483 nss/files-grp.os
> 6010 0 0 6010 177a nss/files-hosts.os
> 869 0 0 869 365 nss/files-initgroups.os
> 666 0 0 666 29a nss/files-init.os
> 1934 0 0 1934 78e nss/files-netgrp.os
> 2129 0 0 2129 851 nss/files-network.os
> 1914 0 0 1914 77a nss/files-proto.os
> 1156 0 0 1156 484 nss/files-pwd.os
> 1908 0 0 1908 774 nss/files-rpc.os
> 2057 0 0 2057 809 nss/files-service.os
> 909 0 0 909 38d nss/files-sgrp.os
> 908 0 0 908 38c nss/files-spwd.os
> 1090 0 8 1098 44a nss/nss_files_data.os
>
> 27674 code bytes before, 26344 code bytes after, so it is an overall
> win despite the extra initialization code.
LGTM, only a minor nit below.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> include/nss_files.h | 60 ++++++++++++++
> nss/Makefile | 2 +-
> nss/Versions | 4 +
> nss/nss_files/files-XXX.c | 67 ++++-----------
> nss/nss_files/files-alias.c | 69 ++++------------
> nss/nss_files/files-hosts.c | 4 +-
> nss/nss_files_data.c | 159 ++++++++++++++++++++++++++++++++++++
> 7 files changed, 257 insertions(+), 108 deletions(-)
> create mode 100644 nss/nss_files_data.c
>
> diff --git a/include/nss_files.h b/include/nss_files.h
> index 6a0dcdb85b..7bf1951496 100644
> --- a/include/nss_files.h
> +++ b/include/nss_files.h
> @@ -20,6 +20,9 @@
> #define _NSS_FILES_H
>
> #include <stdio.h>
> +#if IS_IN (libc)
> +#include <libc-lock.h>
> +#endif
>
> /* Open PATH for reading, as a data source for nss_files. */
> FILE *__nss_files_fopen (const char *path);
> @@ -47,6 +50,63 @@ int __nss_readline_seek (FILE *fp, off64_t offset) attribute_hidden;
> int __nss_parse_line_result (FILE *fp, off64_t offset, int parse_line_result);
> libc_hidden_proto (__nss_parse_line_result)
>
> +/* Per-file data. Used by the *ent functions that need to preserve
> + state across calls. */
> +struct nss_files_per_file_data
> +{
> + FILE *stream;
> +#if IS_IN (libc)
> + /* The size of locks changes between libc and nss_files, so this
> + member must be last and is only available in libc. */
> + __libc_lock_define (, lock);
> +#endif
> +};
> +
> +/* File index for __nss_files_data_get. */
> +enum nss_files_file
> + {
> + nss_file_aliasent,
> + nss_file_etherent,
> + nss_file_grent,
> + nss_file_hostent,
> + nss_file_netent,
> + nss_file_protoent,
> + nss_file_pwent,
> + nss_file_rpcent,
> + nss_file_servent,
> + nss_file_sgent,
> + nss_file_spent,
> +
> + nss_file_count
> + };
> +
> +/* Obtains a pointer to the per-file data for FILE, which is written
> + to *PDATA, and tries to open the file at PATH for it. On success,
> + returns NSS_STATUS_SUCCESS, and the caller must later call
> + __nss_files_data_put. On failure, NSS_STATUS_TRYAGAIN is returned,
> + and *ERRNOP and *HERRNOP are updated if these pointers are not
> + null. */
> +enum nss_status __nss_files_data_open (struct nss_files_per_file_data **pdata,
> + enum nss_files_file file,
> + const char *path,
> + int *errnop, int *herrnop);
> +libc_hidden_proto (__nss_files_data_open)
> +
Ok.
> +/* Unlock the per-file data, previously obtained by
> + __nss_files_data_open. */
> +void __nss_files_data_put (struct nss_files_per_file_data *data);
> +libc_hidden_proto (__nss_files_data_put)
> +
> +/* Performs the set*ent operation for FILE. PATH is the file to
> + open. */
> +enum nss_status __nss_files_data_setent (enum nss_files_file file,
> + const char *path);
> +libc_hidden_proto (__nss_files_data_setent)
> +
> +/* Performs the end*ent operation for FILE. */
> +enum nss_status __nss_files_data_endent (enum nss_files_file file);
> +libc_hidden_proto (__nss_files_data_endent)
> +
> struct parser_data;
>
> /* Instances of the parse_line function from
Ok.
> diff --git a/nss/Makefile b/nss/Makefile
> index 9682a31e20..271a0e7716 100644
> --- a/nss/Makefile
> +++ b/nss/Makefile
> @@ -31,7 +31,7 @@ routines = nsswitch getnssent getnssent_r digits_dots \
> compat-lookup nss_hash nss_files_fopen \
> nss_readline nss_parse_line_result \
> nss_fgetent_r nss_module nss_action \
> - nss_action_parse nss_database
> + nss_action_parse nss_database nss_files_data
>
> # These are the databases that go through nss dispatch.
> # Caution: if you add a database here, you must add its real name
Ok.
> diff --git a/nss/Versions b/nss/Versions
> index fdddea104c..7b040b4786 100644
> --- a/nss/Versions
> +++ b/nss/Versions
> @@ -19,6 +19,10 @@ libc {
> __nss_services_lookup2; __nss_next2; __nss_lookup;
> __nss_hash; __nss_database_get;
> __nss_files_fopen; __nss_readline; __nss_parse_line_result;
> + __nss_files_data_endent;
> + __nss_files_data_open;
> + __nss_files_data_put;
> + __nss_files_data_setent;
> }
> }
>
Ok.
> diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
> index b4b989d9bb..91553d7ca5 100644
> --- a/nss/nss_files/files-XXX.c
> +++ b/nss/nss_files/files-XXX.c
> @@ -45,10 +45,12 @@
> # include <netdb.h>
> # define H_ERRNO_PROTO , int *herrnop
> # define H_ERRNO_ARG , herrnop
> +# define H_ERRNO_ARG_OR_NULL herrnop
> # define H_ERRNO_SET(val) (*herrnop = (val))
> #else
> # define H_ERRNO_PROTO
> # define H_ERRNO_ARG
> +# define H_ERRNO_ARG_OR_NULL NULL
> # define H_ERRNO_SET(val) ((void) 0)
> #endif
>
> @@ -58,15 +60,11 @@
> # define EXTRA_ARGS_VALUE
> #endif
>
> -/* Locks the static variables in this file. */
> -__libc_lock_define_initialized (static, lock)
> \f
> /* Maintenance of the stream open on the database file. For getXXent
> operations the stream needs to be held open across calls, the other
> getXXbyYY operations all use their own stream. */
>
> -static FILE *stream;
> -
> /* Open database file if not already opened. */
> static enum nss_status
> internal_setent (FILE **stream)
> @@ -91,41 +89,13 @@ internal_setent (FILE **stream)
> enum nss_status
> CONCAT(_nss_files_set,ENTNAME) (int stayopen)
> {
> - enum nss_status status;
> -
> - __libc_lock_lock (lock);
> -
> - status = internal_setent (&stream);
> -
> - __libc_lock_unlock (lock);
> -
> - return status;
> -}
> -
> -
> -/* Close the database file. */
> -static void
> -internal_endent (FILE **stream)
> -{
> - if (*stream != NULL)
> - {
> - fclose (*stream);
> - *stream = NULL;
> - }
> + return __nss_files_data_setent (CONCAT (nss_file_, ENTNAME), DATAFILE);
> }
>
Ok.
> -
> -/* Thread-safe, exported version of that. */
> enum nss_status
> CONCAT(_nss_files_end,ENTNAME) (void)
> {
> - __libc_lock_lock (lock);
> -
> - internal_endent (&stream);
> -
> - __libc_lock_unlock (lock);
> -
> - return NSS_STATUS_SUCCESS;
> + return __nss_files_data_endent (CONCAT (nss_file_, ENTNAME));
> }
> \f
>
Ok.
> @@ -194,26 +164,19 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer,
> size_t buflen, int *errnop H_ERRNO_PROTO)
> {
> /* Return next entry in host file. */
> - enum nss_status status = NSS_STATUS_SUCCESS;
> -
> - __libc_lock_lock (lock);
> -
> - /* Be prepared that the set*ent function was not called before. */
> - if (stream == NULL)
> - {
> - int save_errno = errno;
> -
> - status = internal_setent (&stream);
> -
> - __set_errno (save_errno);
> - }
>
> - if (status == NSS_STATUS_SUCCESS)
> - status = internal_getent (stream, result, buffer, buflen, errnop
> - H_ERRNO_ARG EXTRA_ARGS_VALUE);
> + struct nss_files_per_file_data *data;
> + enum nss_status status = __nss_files_data_open (&data,
> + CONCAT (nss_file_, ENTNAME),
> + DATAFILE,
> + errnop, H_ERRNO_ARG_OR_NULL);
> + if (status != NSS_STATUS_SUCCESS)
> + return status;
>
> - __libc_lock_unlock (lock);
> + status = internal_getent (data->stream, result, buffer, buflen, errnop
> + H_ERRNO_ARG EXTRA_ARGS_VALUE);
>
> + __nss_files_data_put (data);
> return status;
> }
> \f
Ok.
> @@ -248,7 +211,7 @@ _nss_files_get##name##_r (proto, \
> == NSS_STATUS_SUCCESS) \
> { break_if_match } \
> \
> - internal_endent (&stream); \
> + fclose (stream); \
> } \
> \
> return status;
Ok.
\
> diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
> index 30971bfe56..9624b6224c 100644
> --- a/nss/nss_files/files-alias.c
> +++ b/nss/nss_files/files-alias.c
> @@ -33,16 +33,11 @@
>
> NSS_DECLARE_MODULE_FUNCTIONS (files)
>
> -/* Locks the static variables in this file. */
> -__libc_lock_define_initialized (static, lock)
> \f
> /* Maintenance of the stream open on the database file. For getXXent
> operations the stream needs to be held open across calls, the other
> getXXbyYY operations all use their own stream. */
>
> -static FILE *stream;
> -
> -
> static enum nss_status
> internal_setent (FILE **stream)
> {
> @@ -66,41 +61,13 @@ internal_setent (FILE **stream)
> enum nss_status
> _nss_files_setaliasent (void)
> {
> - enum nss_status status;
> -
> - __libc_lock_lock (lock);
> -
> - status = internal_setent (&stream);
> -
> - __libc_lock_unlock (lock);
> -
> - return status;
> -}
> -
> -
> -/* Close the database file. */
> -static void
> -internal_endent (FILE **stream)
> -{
> - if (*stream != NULL)
> - {
> - fclose (*stream);
> - *stream = NULL;
> - }
> + return __nss_files_data_setent (nss_file_aliasent, "/etc/aliases");
> }
>
Ok.
> -
> -/* Thread-safe, exported version of that. */
> enum nss_status
> _nss_files_endaliasent (void)
> {
> - __libc_lock_lock (lock);
> -
> - internal_endent (&stream);
> -
> - __libc_lock_unlock (lock);
> -
> - return NSS_STATUS_SUCCESS;
> + return __nss_files_data_endent (nss_file_aliasent);
> }
> \f
> /* Parsing the database file into `struct aliasent' data structures. */
Ok.
> @@ -369,26 +336,22 @@ _nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen,
> int *errnop)
> {
> /* Return next entry in host file. */
> - enum nss_status status = NSS_STATUS_SUCCESS;
>
> - __libc_lock_lock (lock);
> + struct nss_files_per_file_data *data;
> + enum nss_status status = __nss_files_data_open (&data, nss_file_aliasent,
> + "/etc/aliases", errnop, NULL);
> + if (status != NSS_STATUS_SUCCESS)
> + return status;
>
> - /* Be prepared that the set*ent function was not called before. */
> - if (stream == NULL)
> - status = internal_setent (&stream);
> + result->alias_local = 1;
>
> - if (status == NSS_STATUS_SUCCESS)
> - {
> - result->alias_local = 1;
> -
> - /* Read lines until we get a definite result. */
> - do
> - status = get_next_alias (stream, NULL, result, buffer, buflen, errnop);
> - while (status == NSS_STATUS_RETURN);
> - }
> -
> - __libc_lock_unlock (lock);
> + /* Read lines until we get a definite result. */
> + do
> + status = get_next_alias (data->stream, NULL, result, buffer, buflen,
> + errnop);
> + while (status == NSS_STATUS_RETURN);
>
> + __nss_files_data_put (data);
> return status;
> }
>
Ok.
> @@ -418,9 +381,9 @@ _nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
> do
> status = get_next_alias (stream, name, result, buffer, buflen, errnop);
> while (status == NSS_STATUS_RETURN);
> - }
>
> - internal_endent (&stream);
> + fclose (stream);
> + }
>
> return status;
> }
Ok.
> diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
> index 2b47ec3e53..1dd51d1db9 100644
> --- a/nss/nss_files/files-hosts.c
> +++ b/nss/nss_files/files-hosts.c
> @@ -349,7 +349,7 @@ _nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result,
> status = gethostbyname3_multi
> (stream, name, af, result, buffer, buflen, errnop, herrnop);
>
> - internal_endent (&stream);
> + fclose (stream);
> }
>
> if (canonp && status == NSS_STATUS_SUCCESS)
> @@ -475,7 +475,7 @@ _nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
> status = NSS_STATUS_SUCCESS;
> }
>
> - internal_endent (&stream);
> + fclose (stream);
> }
> else if (status == NSS_STATUS_TRYAGAIN)
> {
Ok.
> diff --git a/nss/nss_files_data.c b/nss/nss_files_data.c
> new file mode 100644
> index 0000000000..7b7662abf1
> --- /dev/null
> +++ b/nss/nss_files_data.c
> @@ -0,0 +1,159 @@
> +/* Returns a pointer to the global nss_files data structure.
> + Copyright (C) 2021 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <nss_files.h>
> +
> +#include <allocate_once.h>
> +#include <errno.h>
> +#include <netdb.h>
> +#include <nss.h>
> +#include <stdlib.h>
> +
> +/* This collects all per file-data. */
> +struct nss_files_data
> +{
> + struct nss_files_per_file_data files[nss_file_count];
> +};
> +
> +/* For use with allocate_once. */
> +static void *nss_files_global;
> +static void *
> +nss_files_global_allocate (void *closure)
> +{
> + struct nss_files_data *result = malloc (sizeof (*result));
> + if (result != NULL)
Maybe add brackets here?
> + for (int i = 0; i < nss_file_count; ++i)
> + {
> + result->files[i].stream = NULL;
> + __libc_lock_init (result->files[i].lock);
> + }
> + return result;
> +}
Ok.
> +/* Like __nss_files_data_open, but does not perform the open call. */
> +static enum nss_status
> +__nss_files_data_get (struct nss_files_per_file_data **pdata,
> + enum nss_files_file file, int *errnop, int *herrnop)
> +{
> + struct nss_files_data *data = allocate_once (&nss_files_global,
> + nss_files_global_allocate,
> + NULL, NULL);
> + if (data == NULL)
> + {
> + if (errnop != NULL)
> + *errnop = errno;
> + if (herrnop != NULL)
> + {
> + __set_h_errno (NETDB_INTERNAL);
> + *herrnop = NETDB_INTERNAL;
> + }
> + return NSS_STATUS_TRYAGAIN;
> + }
> +
> + *pdata = &data->files[file];
> + __libc_lock_lock ((*pdata)->lock);
> + return NSS_STATUS_SUCCESS;
> +}
> +
Ok.
> +/* Helper function for opening the backing file at PATH. */
> +static enum nss_status
> +__nss_files_data_internal_open (struct nss_files_per_file_data *data,
> + const char *path)
> +{
> + enum nss_status status = NSS_STATUS_SUCCESS;
> +
> + if (data->stream == NULL)
> + {
> + data->stream = __nss_files_fopen (path);
> +
> + if (data->stream == NULL)
> + status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
> + }
> +
> + return status;
> +}
> +
> +
Ok.
> +enum nss_status
> +__nss_files_data_open (struct nss_files_per_file_data **pdata,
> + enum nss_files_file file, const char *path,
> + int *errnop, int *herrnop)
> +{
> + enum nss_status status = __nss_files_data_get (pdata, file, errnop, herrnop);
> + if (status != NSS_STATUS_SUCCESS)
> + return status;
> +
> + /* Be prepared that the set*ent function was not called before. */
> + if ((*pdata)->stream == NULL)
> + {
> + int saved_errno = errno;
> + status = __nss_files_data_internal_open (*pdata, path);
> + __set_errno (saved_errno);
> + if (status != NSS_STATUS_SUCCESS)
> + __nss_files_data_put (*pdata);
> + }
> +
> + return status;
> +}
> +
> +libc_hidden_def (__nss_files_data_open)
> +
Ok.
> +void
> +__nss_files_data_put (struct nss_files_per_file_data *data)
> +{
> + __libc_lock_unlock (data->lock);
> +}
> +libc_hidden_def (__nss_files_data_put)
> +
Ok.
> +enum nss_status
> +__nss_files_data_setent (enum nss_files_file file, const char *path)
> +{
> + struct nss_files_per_file_data *data;
> + enum nss_status status = __nss_files_data_get (&data, file, NULL, NULL);
> + if (status != NSS_STATUS_SUCCESS)
> + return status;
> +
> + if (data->stream == NULL)
> + status = __nss_files_data_internal_open (data, path);
> + else
> + rewind (data->stream);
> +
> + __nss_files_data_put (data);
> + return status;
> +}
> +libc_hidden_def (__nss_files_data_setent)
> +
Ok.
> +enum nss_status
> +__nss_files_data_endent (enum nss_files_file file)
> +{
> + /* No cleanup is necessary if not initialized. */
> + struct nss_files_data *data = atomic_load_acquire (&nss_files_global);
> + if (data == NULL)
> + return NSS_STATUS_SUCCESS;
> +
> + struct nss_files_per_file_data *fdata = &data->files[file];
> + __libc_lock_lock (fdata->lock);
> + if (fdata->stream != NULL)
> + {
> + fclose (fdata->stream);
> + fdata->stream = NULL;
> + }
> + __libc_lock_unlock (fdata->lock);
> +
> + return NSS_STATUS_SUCCESS;
> +}
> +libc_hidden_def (__nss_files_data_endent)
>
Ok.
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 6/7] nss_files: Move into libc
2021-06-29 10:11 [PATCH v2 0/7] nss_files move Florian Weimer
` (4 preceding siblings ...)
2021-06-29 10:11 ` [PATCH 5/7] nss_files: Add generic code for set*ent, end*ent and file open Florian Weimer
@ 2021-06-29 10:11 ` Florian Weimer
2021-07-07 13:45 ` Adhemerval Zanella
2021-06-29 10:11 ` [PATCH 7/7] nss: Access nss_files through direct references Florian Weimer
2021-07-08 10:28 ` [PATCH v2 0/7] nss_files move Andreas Schwab
7 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2021-06-29 10:11 UTC (permalink / raw)
To: libc-alpha
This is the first step towards fixing bug 27959.
---
include/libc-symbols.h | 23 -----------------------
include/netdb.h | 2 +-
include/nss_files.h | 10 +++++-----
nss/Makefile | 11 +++--------
nss/Versions | 13 +++++++++----
nss/nss_files/files-alias.c | 10 +++++-----
nss/nss_files/files-hosts.c | 7 ++++---
nss/nss_files/files-netgrp.c | 6 +++---
nss/nss_files/files-network.c | 5 ++---
nss/nss_files/files-parse.c | 8 +-------
nss/nss_readline.c | 4 ++--
11 files changed, 35 insertions(+), 64 deletions(-)
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 127ea656c2..d41ecf4384 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -798,29 +798,6 @@ for linking")
# define libdl_hidden_data_ver(local, name)
#endif
-#if IS_IN (libnss_files)
-# define libnss_files_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
-# define libnss_files_hidden_tls_proto(name, attrs...) \
- hidden_tls_proto (name, ##attrs)
-# define libnss_files_hidden_def(name) hidden_def (name)
-# define libnss_files_hidden_weak(name) hidden_weak (name)
-# define libnss_files_hidden_ver(local, name) hidden_ver (local, name)
-# define libnss_files_hidden_data_def(name) hidden_data_def (name)
-# define libnss_files_hidden_tls_def(name) hidden_tls_def (name)
-# define libnss_files_hidden_data_weak(name) hidden_data_weak (name)
-# define libnss_files_hidden_data_ver(local, name) hidden_data_ver(local, name)
-#else
-# define libnss_files_hidden_proto(name, attrs...)
-# define libnss_files_hidden_tls_proto(name, attrs...)
-# define libnss_files_hidden_def(name)
-# define libnss_files_hidden_weak(name)
-# define libnss_files_hidden_ver(local, name)
-# define libnss_files_hidden_data_def(name)
-# define libnss_files_hidden_tls_def(name)
-# define libnss_files_hidden_data_weak(name)
-# define libnss_files_hidden_data_ver(local, name)
-#endif
-
#if IS_IN (libnsl)
# define libnsl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
# define libnsl_hidden_tls_proto(name, attrs...) \
diff --git a/include/netdb.h b/include/netdb.h
index 645b85dc62..76edd65f9a 100644
--- a/include/netdb.h
+++ b/include/netdb.h
@@ -213,7 +213,7 @@ extern enum nss_status _nss_netgroup_parseline (char **cursor,
struct __netgrent *result,
char *buffer, size_t buflen,
int *errnop);
-libnss_files_hidden_proto (_nss_netgroup_parseline)
+libc_hidden_proto (_nss_netgroup_parseline)
#define DECLARE_NSS_PROTOTYPES(service) \
extern enum nss_status _nss_ ## service ## _setprotoent (int); \
diff --git a/include/nss_files.h b/include/nss_files.h
index 7bf1951496..dd0081a0f1 100644
--- a/include/nss_files.h
+++ b/include/nss_files.h
@@ -124,13 +124,13 @@ extern nss_files_parse_line _nss_files_parse_servent;
extern nss_files_parse_line _nss_files_parse_sgent;
extern nss_files_parse_line _nss_files_parse_spent;
-libnss_files_hidden_proto (_nss_files_parse_etherent)
+libc_hidden_proto (_nss_files_parse_etherent)
libc_hidden_proto (_nss_files_parse_grent)
-libnss_files_hidden_proto (_nss_files_parse_netent)
-libnss_files_hidden_proto (_nss_files_parse_protoent)
+libc_hidden_proto (_nss_files_parse_netent)
+libc_hidden_proto (_nss_files_parse_protoent)
libc_hidden_proto (_nss_files_parse_pwent)
-libnss_files_hidden_proto (_nss_files_parse_rpcent)
-libnss_files_hidden_proto (_nss_files_parse_servent)
+libc_hidden_proto (_nss_files_parse_rpcent)
+libc_hidden_proto (_nss_files_parse_servent)
libc_hidden_proto (_nss_files_parse_sgent)
libc_hidden_proto (_nss_files_parse_spent)
diff --git a/nss/Makefile b/nss/Makefile
index 271a0e7716..8905a5fd9b 100644
--- a/nss/Makefile
+++ b/nss/Makefile
@@ -98,9 +98,9 @@ subdir-dirs = $(services:%=nss_%)
vpath %.c $(subdir-dirs) ../locale/programs ../intl
-libnss_files-routines := $(addprefix files-, \
- $(filter-out key, $(databases))) \
- files-initgroups files-init
+routines += \
+ $(addprefix files-, $(filter-out key, $(databases))) \
+ files-initgroups files-init
libnss_db-dbs := $(addprefix db-,\
$(filter-out hosts network key alias,\
@@ -116,12 +116,9 @@ libnss_compat-routines := $(addprefix compat-,grp pwd spwd initgroups) \
install-others += $(inst_vardbdir)/Makefile
# Build static module into libc if requested
-libnss_files-inhibit-o = $(filter-out .os,$(object-suffixes))
libnss_db-inhibit-o = $(filter-out .os,$(object-suffixes))
libnss_compat-inhibit-o = $(filter-out .os,$(object-suffixes))
ifeq ($(build-static-nss),yes)
-routines += $(libnss_files-routines)
-static-only-routines += $(libnss_files-routines)
tests-static += tst-nss-static
endif
extra-test-objs += nss_test1.os nss_test2.os
@@ -138,8 +135,6 @@ libnss-libc = $(common-objpfx)linkobj/libc.so
# for new links:
$(services:%=$(objpfx)libnss_%.so): libc-for-link = $(libnss-libc)
-$(objpfx)libnss_db.so: $(objpfx)libnss_files.so
-
$(libnss_db-dbs:%=$(objpfx)%.c): $(objpfx)db-%.c: nss_files/files-%.c
@rm -f $@.new
(echo '#define EXTERN_PARSER';\
diff --git a/nss/Versions b/nss/Versions
index 7b040b4786..e551524aa9 100644
--- a/nss/Versions
+++ b/nss/Versions
@@ -23,11 +23,8 @@ libc {
__nss_files_data_open;
__nss_files_data_put;
__nss_files_data_setent;
- }
-}
-libnss_files {
- GLIBC_PRIVATE {
+ # Routines formerly in libnss_files.so.2.
_nss_files_setaliasent;
_nss_files_endaliasent;
_nss_files_getaliasbyname_r;
@@ -113,6 +110,14 @@ libnss_files {
}
}
+libnss_files {
+ GLIBC_PRIVATE {
+ # Keep a version node (with a synthesized local: * directive) so that
+ # __bss_* symbols are hidden on targets that need it.
+ __libnss_files_version_placeholder;
+ }
+}
+
libnss_db {
GLIBC_PRIVATE {
_nss_db_setetherent;
diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
index 9624b6224c..75d91e0b0a 100644
--- a/nss/nss_files/files-alias.c
+++ b/nss/nss_files/files-alias.c
@@ -98,7 +98,7 @@ get_next_alias (FILE *stream, const char *match, struct aliasent *result,
/* Read the first line. It must contain the alias name and
possibly some alias names. */
first_unused[room_left - 1] = '\xff';
- line = fgets_unlocked (first_unused, room_left, stream);
+ line = __fgets_unlocked (first_unused, room_left, stream);
if (line == NULL)
/* Nothing to read. */
break;
@@ -187,7 +187,7 @@ get_next_alias (FILE *stream, const char *match, struct aliasent *result,
/* If the file does not exist we simply ignore
the statement. */
if (listfile != NULL
- && (old_line = strdup (line)) != NULL)
+ && (old_line = __strdup (line)) != NULL)
{
while (! feof_unlocked (listfile))
{
@@ -199,8 +199,8 @@ get_next_alias (FILE *stream, const char *match, struct aliasent *result,
}
first_unused[room_left - 1] = '\xff';
- line = fgets_unlocked (first_unused, room_left,
- listfile);
+ line = __fgets_unlocked (first_unused, room_left,
+ listfile);
if (line == NULL)
break;
if (first_unused[room_left - 1] != '\xff')
@@ -302,7 +302,7 @@ get_next_alias (FILE *stream, const char *match, struct aliasent *result,
/* The just read character is a white space and so
can be ignored. */
first_unused[room_left - 1] = '\xff';
- line = fgets_unlocked (first_unused, room_left, stream);
+ line = __fgets_unlocked (first_unused, room_left, stream);
if (line == NULL)
{
/* Continuation line without any data and
diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
index 1dd51d1db9..894b85d501 100644
--- a/nss/nss_files/files-hosts.c
+++ b/nss/nss_files/files-hosts.c
@@ -57,12 +57,13 @@ LINE_PARSER
STRING_FIELD (addr, isspace, 1);
/* Parse address. */
- if (inet_pton (af == AF_UNSPEC ? AF_INET : af, addr, entdata->host_addr)
+ if (__inet_pton (af == AF_UNSPEC ? AF_INET : af, addr, entdata->host_addr)
> 0)
af = af == AF_UNSPEC ? AF_INET : af;
else
{
- if (af == AF_INET && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
+ if (af == AF_INET
+ && __inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
{
if (IN6_IS_ADDR_V4MAPPED (entdata->host_addr))
memcpy (entdata->host_addr, entdata->host_addr + 12, INADDRSZ);
@@ -76,7 +77,7 @@ LINE_PARSER
return 0;
}
else if (af == AF_UNSPEC
- && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
+ && __inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
af = AF_INET6;
else
/* Illegal address: ignore line. */
diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c
index f8c821c2f0..be9c72accf 100644
--- a/nss/nss_files/files-netgrp.c
+++ b/nss/nss_files/files-netgrp.c
@@ -32,7 +32,7 @@ NSS_DECLARE_MODULE_FUNCTIONS (files)
#define DATAFILE "/etc/netgroup"
-libnss_files_hidden_proto (_nss_files_endnetgrent)
+libc_hidden_proto (_nss_files_endnetgrent)
#define EXPAND(needed) \
do \
@@ -164,7 +164,7 @@ _nss_files_endnetgrent (struct __netgrent *result)
result->cursor = NULL;
return NSS_STATUS_SUCCESS;
}
-libnss_files_hidden_def (_nss_files_endnetgrent)
+libc_hidden_def (_nss_files_endnetgrent)
static char *
strip_whitespace (char *str)
@@ -279,7 +279,7 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
return status;
}
-libnss_files_hidden_def (_nss_netgroup_parseline)
+libc_hidden_def (_nss_netgroup_parseline)
enum nss_status
diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
index 9cd7d7dc79..75c9f8a57e 100644
--- a/nss/nss_files/files-network.c
+++ b/nss/nss_files/files-network.c
@@ -21,8 +21,7 @@
#include <netdb.h>
#include <stdint.h>
#include <nss.h>
-
-NSS_DECLARE_MODULE_FUNCTIONS (files)
+#include <nss_files.h>
#define ENTNAME netent
#define DATABASE "networks"
@@ -71,7 +70,7 @@ LINE_PARSER
*cp = '\0';
addr = newp;
}
- result->n_net = inet_network (addr);
+ result->n_net = __inet_network (addr);
result->n_addrtype = AF_INET;
})
diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c
index 68c51c7cbf..997eac573a 100644
--- a/nss/nss_files/files-parse.c
+++ b/nss/nss_files/files-parse.c
@@ -74,13 +74,7 @@ struct parser_data
/* Export the line parser function so it can be used in nss_db. */
# define parser_stclass /* Global */
# define parse_line CONCAT(_nss_files_parse_,ENTNAME)
-# if IS_IN (libc)
-/* We are defining one of the functions that actually lives in libc
- because it is used to implement fget*ent and suchlike. */
-# define nss_files_parse_hidden_def(name) libc_hidden_def (name)
-# else
-# define nss_files_parse_hidden_def(name) libnss_files_hidden_def (name)
-# endif
+# define nss_files_parse_hidden_def(name) libc_hidden_def (name)
#endif
diff --git a/nss/nss_readline.c b/nss/nss_readline.c
index 4b3ecbccc8..a2f397a11f 100644
--- a/nss/nss_readline.c
+++ b/nss/nss_readline.c
@@ -40,7 +40,7 @@ __nss_readline (FILE *fp, char *buf, size_t len, off64_t *poffset)
*poffset = __ftello64 (fp);
buf[len - 1] = '\xff'; /* Marker to recognize truncation. */
- if (fgets_unlocked (buf, len, fp) == NULL)
+ if (__fgets_unlocked (buf, len, fp) == NULL)
{
if (feof_unlocked (fp))
{
@@ -61,7 +61,7 @@ __nss_readline (FILE *fp, char *buf, size_t len, off64_t *poffset)
line on the next call. */
return __nss_readline_seek (fp, *poffset);
- /* fgets_unlocked succeeded. */
+ /* __fgets_unlocked succeeded. */
/* Remove leading whitespace. */
char *p = buf;
--
2.31.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 6/7] nss_files: Move into libc
2021-06-29 10:11 ` [PATCH 6/7] nss_files: Move into libc Florian Weimer
@ 2021-07-07 13:45 ` Adhemerval Zanella
0 siblings, 0 replies; 17+ messages in thread
From: Adhemerval Zanella @ 2021-07-07 13:45 UTC (permalink / raw)
To: Florian Weimer, libc-alpha
On 29/06/2021 07:11, Florian Weimer via Libc-alpha wrote:
> This is the first step towards fixing bug 27959.
LGTM, only a minor nit below.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> include/libc-symbols.h | 23 -----------------------
> include/netdb.h | 2 +-
> include/nss_files.h | 10 +++++-----
> nss/Makefile | 11 +++--------
> nss/Versions | 13 +++++++++----
> nss/nss_files/files-alias.c | 10 +++++-----
> nss/nss_files/files-hosts.c | 7 ++++---
> nss/nss_files/files-netgrp.c | 6 +++---
> nss/nss_files/files-network.c | 5 ++---
> nss/nss_files/files-parse.c | 8 +-------
> nss/nss_readline.c | 4 ++--
> 11 files changed, 35 insertions(+), 64 deletions(-)
>
> diff --git a/include/libc-symbols.h b/include/libc-symbols.h
> index 127ea656c2..d41ecf4384 100644
> --- a/include/libc-symbols.h
> +++ b/include/libc-symbols.h
> @@ -798,29 +798,6 @@ for linking")
> # define libdl_hidden_data_ver(local, name)
> #endif
>
> -#if IS_IN (libnss_files)
> -# define libnss_files_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
> -# define libnss_files_hidden_tls_proto(name, attrs...) \
> - hidden_tls_proto (name, ##attrs)
> -# define libnss_files_hidden_def(name) hidden_def (name)
> -# define libnss_files_hidden_weak(name) hidden_weak (name)
> -# define libnss_files_hidden_ver(local, name) hidden_ver (local, name)
> -# define libnss_files_hidden_data_def(name) hidden_data_def (name)
> -# define libnss_files_hidden_tls_def(name) hidden_tls_def (name)
> -# define libnss_files_hidden_data_weak(name) hidden_data_weak (name)
> -# define libnss_files_hidden_data_ver(local, name) hidden_data_ver(local, name)
> -#else
> -# define libnss_files_hidden_proto(name, attrs...)
> -# define libnss_files_hidden_tls_proto(name, attrs...)
> -# define libnss_files_hidden_def(name)
> -# define libnss_files_hidden_weak(name)
> -# define libnss_files_hidden_ver(local, name)
> -# define libnss_files_hidden_data_def(name)
> -# define libnss_files_hidden_tls_def(name)
> -# define libnss_files_hidden_data_weak(name)
> -# define libnss_files_hidden_data_ver(local, name)
> -#endif
> -
> #if IS_IN (libnsl)
> # define libnsl_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
> # define libnsl_hidden_tls_proto(name, attrs...) \
Ok.
> diff --git a/include/netdb.h b/include/netdb.h
> index 645b85dc62..76edd65f9a 100644
> --- a/include/netdb.h
> +++ b/include/netdb.h
> @@ -213,7 +213,7 @@ extern enum nss_status _nss_netgroup_parseline (char **cursor,
> struct __netgrent *result,
> char *buffer, size_t buflen,
> int *errnop);
> -libnss_files_hidden_proto (_nss_netgroup_parseline)
> +libc_hidden_proto (_nss_netgroup_parseline)
>
> #define DECLARE_NSS_PROTOTYPES(service) \
> extern enum nss_status _nss_ ## service ## _setprotoent (int); \
Ok.
> diff --git a/include/nss_files.h b/include/nss_files.h
> index 7bf1951496..dd0081a0f1 100644
> --- a/include/nss_files.h
> +++ b/include/nss_files.h
> @@ -124,13 +124,13 @@ extern nss_files_parse_line _nss_files_parse_servent;
> extern nss_files_parse_line _nss_files_parse_sgent;
> extern nss_files_parse_line _nss_files_parse_spent;
>
> -libnss_files_hidden_proto (_nss_files_parse_etherent)
> +libc_hidden_proto (_nss_files_parse_etherent)
> libc_hidden_proto (_nss_files_parse_grent)
> -libnss_files_hidden_proto (_nss_files_parse_netent)
> -libnss_files_hidden_proto (_nss_files_parse_protoent)
> +libc_hidden_proto (_nss_files_parse_netent)
> +libc_hidden_proto (_nss_files_parse_protoent)
> libc_hidden_proto (_nss_files_parse_pwent)
> -libnss_files_hidden_proto (_nss_files_parse_rpcent)
> -libnss_files_hidden_proto (_nss_files_parse_servent)
> +libc_hidden_proto (_nss_files_parse_rpcent)
> +libc_hidden_proto (_nss_files_parse_servent)
> libc_hidden_proto (_nss_files_parse_sgent)
> libc_hidden_proto (_nss_files_parse_spent)
>
Ok.
> diff --git a/nss/Makefile b/nss/Makefile
> index 271a0e7716..8905a5fd9b 100644
> --- a/nss/Makefile
> +++ b/nss/Makefile
> @@ -98,9 +98,9 @@ subdir-dirs = $(services:%=nss_%)
> vpath %.c $(subdir-dirs) ../locale/programs ../intl
>
>
> -libnss_files-routines := $(addprefix files-, \
> - $(filter-out key, $(databases))) \
> - files-initgroups files-init
> +routines += \
> + $(addprefix files-, $(filter-out key, $(databases))) \
> + files-initgroups files-init
>
One entry per line.
> libnss_db-dbs := $(addprefix db-,\
> $(filter-out hosts network key alias,\
> @@ -116,12 +116,9 @@ libnss_compat-routines := $(addprefix compat-,grp pwd spwd initgroups) \
> install-others += $(inst_vardbdir)/Makefile
>
> # Build static module into libc if requested
> -libnss_files-inhibit-o = $(filter-out .os,$(object-suffixes))
> libnss_db-inhibit-o = $(filter-out .os,$(object-suffixes))
> libnss_compat-inhibit-o = $(filter-out .os,$(object-suffixes))
> ifeq ($(build-static-nss),yes)
> -routines += $(libnss_files-routines)
> -static-only-routines += $(libnss_files-routines)
> tests-static += tst-nss-static
> endif
> extra-test-objs += nss_test1.os nss_test2.os
Ok.
> @@ -138,8 +135,6 @@ libnss-libc = $(common-objpfx)linkobj/libc.so
> # for new links:
> $(services:%=$(objpfx)libnss_%.so): libc-for-link = $(libnss-libc)
>
> -$(objpfx)libnss_db.so: $(objpfx)libnss_files.so
> -
> $(libnss_db-dbs:%=$(objpfx)%.c): $(objpfx)db-%.c: nss_files/files-%.c
> @rm -f $@.new
> (echo '#define EXTERN_PARSER';\
Ok.
> diff --git a/nss/Versions b/nss/Versions
> index 7b040b4786..e551524aa9 100644
> --- a/nss/Versions
> +++ b/nss/Versions
> @@ -23,11 +23,8 @@ libc {
> __nss_files_data_open;
> __nss_files_data_put;
> __nss_files_data_setent;
> - }
> -}
>
> -libnss_files {
> - GLIBC_PRIVATE {
> + # Routines formerly in libnss_files.so.2.
> _nss_files_setaliasent;
> _nss_files_endaliasent;
> _nss_files_getaliasbyname_r;
Ok.
> @@ -113,6 +110,14 @@ libnss_files {
> }
> }
>
> +libnss_files {
> + GLIBC_PRIVATE {
> + # Keep a version node (with a synthesized local: * directive) so that
> + # __bss_* symbols are hidden on targets that need it.
> + __libnss_files_version_placeholder;
> + }
> +}
> +
> libnss_db {
> GLIBC_PRIVATE {
> _nss_db_setetherent;
Ok.
> diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
> index 9624b6224c..75d91e0b0a 100644
> --- a/nss/nss_files/files-alias.c
> +++ b/nss/nss_files/files-alias.c
> @@ -98,7 +98,7 @@ get_next_alias (FILE *stream, const char *match, struct aliasent *result,
> /* Read the first line. It must contain the alias name and
> possibly some alias names. */
> first_unused[room_left - 1] = '\xff';
> - line = fgets_unlocked (first_unused, room_left, stream);
> + line = __fgets_unlocked (first_unused, room_left, stream);
> if (line == NULL)
> /* Nothing to read. */
> break;
Ok.
> @@ -187,7 +187,7 @@ get_next_alias (FILE *stream, const char *match, struct aliasent *result,
> /* If the file does not exist we simply ignore
> the statement. */
> if (listfile != NULL
> - && (old_line = strdup (line)) != NULL)
> + && (old_line = __strdup (line)) != NULL)
> {
> while (! feof_unlocked (listfile))
> {
> @@ -199,8 +199,8 @@ get_next_alias (FILE *stream, const char *match, struct aliasent *result,
> }
>
> first_unused[room_left - 1] = '\xff';
> - line = fgets_unlocked (first_unused, room_left,
> - listfile);
> + line = __fgets_unlocked (first_unused, room_left,
> + listfile);
> if (line == NULL)
> break;
> if (first_unused[room_left - 1] != '\xff')
> @@ -302,7 +302,7 @@ get_next_alias (FILE *stream, const char *match, struct aliasent *result,
> /* The just read character is a white space and so
> can be ignored. */
> first_unused[room_left - 1] = '\xff';
> - line = fgets_unlocked (first_unused, room_left, stream);
> + line = __fgets_unlocked (first_unused, room_left, stream);
> if (line == NULL)
> {
> /* Continuation line without any data and
Ok.
> diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
> index 1dd51d1db9..894b85d501 100644
> --- a/nss/nss_files/files-hosts.c
> +++ b/nss/nss_files/files-hosts.c
> @@ -57,12 +57,13 @@ LINE_PARSER
> STRING_FIELD (addr, isspace, 1);
>
> /* Parse address. */
> - if (inet_pton (af == AF_UNSPEC ? AF_INET : af, addr, entdata->host_addr)
> + if (__inet_pton (af == AF_UNSPEC ? AF_INET : af, addr, entdata->host_addr)
> > 0)
> af = af == AF_UNSPEC ? AF_INET : af;
> else
> {
> - if (af == AF_INET && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
> + if (af == AF_INET
> + && __inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
> {
> if (IN6_IS_ADDR_V4MAPPED (entdata->host_addr))
> memcpy (entdata->host_addr, entdata->host_addr + 12, INADDRSZ);
> @@ -76,7 +77,7 @@ LINE_PARSER
> return 0;
> }
> else if (af == AF_UNSPEC
> - && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
> + && __inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
> af = AF_INET6;
> else
> /* Illegal address: ignore line. */
Ok.
> diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c
> index f8c821c2f0..be9c72accf 100644
> --- a/nss/nss_files/files-netgrp.c
> +++ b/nss/nss_files/files-netgrp.c
> @@ -32,7 +32,7 @@ NSS_DECLARE_MODULE_FUNCTIONS (files)
>
> #define DATAFILE "/etc/netgroup"
>
> -libnss_files_hidden_proto (_nss_files_endnetgrent)
> +libc_hidden_proto (_nss_files_endnetgrent)
>
> #define EXPAND(needed) \
> do \
> @@ -164,7 +164,7 @@ _nss_files_endnetgrent (struct __netgrent *result)
> result->cursor = NULL;
> return NSS_STATUS_SUCCESS;
> }
> -libnss_files_hidden_def (_nss_files_endnetgrent)
> +libc_hidden_def (_nss_files_endnetgrent)
>
> static char *
> strip_whitespace (char *str)
> @@ -279,7 +279,7 @@ _nss_netgroup_parseline (char **cursor, struct __netgrent *result,
>
> return status;
> }
> -libnss_files_hidden_def (_nss_netgroup_parseline)
> +libc_hidden_def (_nss_netgroup_parseline)
>
>
> enum nss_status
Ok.
> diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
> index 9cd7d7dc79..75c9f8a57e 100644
> --- a/nss/nss_files/files-network.c
> +++ b/nss/nss_files/files-network.c
> @@ -21,8 +21,7 @@
> #include <netdb.h>
> #include <stdint.h>
> #include <nss.h>
> -
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> +#include <nss_files.h>
>
> #define ENTNAME netent
> #define DATABASE "networks"
> @@ -71,7 +70,7 @@ LINE_PARSER
> *cp = '\0';
> addr = newp;
> }
> - result->n_net = inet_network (addr);
> + result->n_net = __inet_network (addr);
> result->n_addrtype = AF_INET;
>
> })
Ok.
> diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c
> index 68c51c7cbf..997eac573a 100644
> --- a/nss/nss_files/files-parse.c
> +++ b/nss/nss_files/files-parse.c
> @@ -74,13 +74,7 @@ struct parser_data
> /* Export the line parser function so it can be used in nss_db. */
> # define parser_stclass /* Global */
> # define parse_line CONCAT(_nss_files_parse_,ENTNAME)
> -# if IS_IN (libc)
> -/* We are defining one of the functions that actually lives in libc
> - because it is used to implement fget*ent and suchlike. */
> -# define nss_files_parse_hidden_def(name) libc_hidden_def (name)
> -# else
> -# define nss_files_parse_hidden_def(name) libnss_files_hidden_def (name)
> -# endif
> +# define nss_files_parse_hidden_def(name) libc_hidden_def (name)
> #endif
>
>
> diff --git a/nss/nss_readline.c b/nss/nss_readline.c
Ok.
> index 4b3ecbccc8..a2f397a11f 100644
> --- a/nss/nss_readline.c
> +++ b/nss/nss_readline.c
> @@ -40,7 +40,7 @@ __nss_readline (FILE *fp, char *buf, size_t len, off64_t *poffset)
> *poffset = __ftello64 (fp);
>
> buf[len - 1] = '\xff'; /* Marker to recognize truncation. */
> - if (fgets_unlocked (buf, len, fp) == NULL)
> + if (__fgets_unlocked (buf, len, fp) == NULL)
> {
> if (feof_unlocked (fp))
> {
> @@ -61,7 +61,7 @@ __nss_readline (FILE *fp, char *buf, size_t len, off64_t *poffset)
> line on the next call. */
> return __nss_readline_seek (fp, *poffset);
>
> - /* fgets_unlocked succeeded. */
> + /* __fgets_unlocked succeeded. */
>
> /* Remove leading whitespace. */
> char *p = buf;
>
Ok.
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 7/7] nss: Access nss_files through direct references
2021-06-29 10:11 [PATCH v2 0/7] nss_files move Florian Weimer
` (5 preceding siblings ...)
2021-06-29 10:11 ` [PATCH 6/7] nss_files: Move into libc Florian Weimer
@ 2021-06-29 10:11 ` Florian Weimer
2021-07-07 13:49 ` Adhemerval Zanella
2021-07-08 10:28 ` [PATCH v2 0/7] nss_files move Andreas Schwab
7 siblings, 1 reply; 17+ messages in thread
From: Florian Weimer @ 2021-06-29 10:11 UTC (permalink / raw)
To: libc-alpha
This partially fixes static-only NSS support (bug 27959): The files
module no longer needs dlopen. Support for the dns module remains
to be added, and also support for disabling dlopen altogher.
---
include/nss_files.h | 10 ++++++++
nss/Makefile | 3 ++-
nss/nss_files/files-XXX.c | 6 ++++-
nss/nss_files/files-alias.c | 7 +++---
nss/nss_files/files-ethers.c | 2 --
nss/nss_files/files-grp.c | 2 --
nss/nss_files/files-hosts.c | 6 +++--
nss/nss_files/files-init.c | 4 +--
nss/nss_files/files-initgroups.c | 3 +--
nss/nss_files/files-netgrp.c | 5 ++--
nss/nss_files/files-network.c | 1 -
nss/nss_files/files-proto.c | 2 --
nss/nss_files/files-pwd.c | 2 --
nss/nss_files/files-rpc.c | 2 --
nss/nss_files/files-service.c | 2 --
nss/nss_files/files-sgrp.c | 2 --
nss/nss_files/files-spwd.c | 2 --
nss/nss_files_functions.c | 43 ++++++++++++++++++++++++++++++++
nss/nss_module.c | 38 +++++++++++++++++++++++++++-
nss/nss_module.h | 4 +++
20 files changed, 114 insertions(+), 32 deletions(-)
create mode 100644 nss/nss_files_functions.c
diff --git a/include/nss_files.h b/include/nss_files.h
index dd0081a0f1..6190cac6be 100644
--- a/include/nss_files.h
+++ b/include/nss_files.h
@@ -19,6 +19,7 @@
#ifndef _NSS_FILES_H
#define _NSS_FILES_H
+#include <nss.h>
#include <stdio.h>
#if IS_IN (libc)
#include <libc-lock.h>
@@ -134,6 +135,15 @@ libc_hidden_proto (_nss_files_parse_servent)
libc_hidden_proto (_nss_files_parse_sgent)
libc_hidden_proto (_nss_files_parse_spent)
+NSS_DECLARE_MODULE_FUNCTIONS (files)
+#undef DEFINE_NSS_FUNCTION
+#define DEFINE_NSS_FUNCTION(x) libc_hidden_proto (_nss_files_##x)
+#include <nss/function.def>
+#undef DEFINE_NSS_FUNCTION
+
+void _nss_files_init (void (*cb) (size_t, struct traced_file *));
+libc_hidden_proto (_nss_files_init)
+
/* Generic implementation of fget*ent_r. Reads lines from FP until
EOF or a successful parse into *RESULT using PARSER. Returns 0 on
success, ENOENT on EOF, ERANGE on too-small buffer. */
diff --git a/nss/Makefile b/nss/Makefile
index 8905a5fd9b..75afb22cb3 100644
--- a/nss/Makefile
+++ b/nss/Makefile
@@ -31,7 +31,8 @@ routines = nsswitch getnssent getnssent_r digits_dots \
compat-lookup nss_hash nss_files_fopen \
nss_readline nss_parse_line_result \
nss_fgetent_r nss_module nss_action \
- nss_action_parse nss_database nss_files_data
+ nss_action_parse nss_database nss_files_data \
+ nss_files_functions
# These are the databases that go through nss dispatch.
# Caution: if you add a database here, you must add its real name
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
index 91553d7ca5..c158a891bd 100644
--- a/nss/nss_files/files-XXX.c
+++ b/nss/nss_files/files-XXX.c
@@ -91,12 +91,14 @@ CONCAT(_nss_files_set,ENTNAME) (int stayopen)
{
return __nss_files_data_setent (CONCAT (nss_file_, ENTNAME), DATAFILE);
}
+libc_hidden_def (CONCAT (_nss_files_set,ENTNAME))
enum nss_status
CONCAT(_nss_files_end,ENTNAME) (void)
{
return __nss_files_data_endent (CONCAT (nss_file_, ENTNAME));
}
+libc_hidden_def (CONCAT (_nss_files_end,ENTNAME))
\f
/* Parsing the database file into `struct STRUCTURE' data structures. */
@@ -179,6 +181,7 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer,
__nss_files_data_put (data);
return status;
}
+libc_hidden_def (CONCAT (_nss_files_get,ENTNAME_r))
\f
/* Macro for defining lookup functions for this file-based database.
@@ -215,4 +218,5 @@ _nss_files_get##name##_r (proto, \
} \
\
return status; \
-}
+} \
+libc_hidden_def (_nss_files_get##name##_r)
diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
index 75d91e0b0a..8c6e176ff6 100644
--- a/nss/nss_files/files-alias.c
+++ b/nss/nss_files/files-alias.c
@@ -31,8 +31,6 @@
#include "nsswitch.h"
#include <nss_files.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
\f
/* Maintenance of the stream open on the database file. For getXXent
operations the stream needs to be held open across calls, the other
@@ -63,12 +61,14 @@ _nss_files_setaliasent (void)
{
return __nss_files_data_setent (nss_file_aliasent, "/etc/aliases");
}
+libc_hidden_def (_nss_files_setaliasent)
enum nss_status
_nss_files_endaliasent (void)
{
return __nss_files_data_endent (nss_file_aliasent);
}
+libc_hidden_def (_nss_files_endaliasent)
\f
/* Parsing the database file into `struct aliasent' data structures. */
static enum nss_status
@@ -354,7 +354,7 @@ _nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen,
__nss_files_data_put (data);
return status;
}
-
+libc_hidden_def (_nss_files_getaliasent_r)
enum nss_status
_nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
@@ -387,3 +387,4 @@ _nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
return status;
}
+libc_hidden_def (_nss_files_getaliasbyname_r)
diff --git a/nss/nss_files/files-ethers.c b/nss/nss_files/files-ethers.c
index 2fe7f81e4b..7c2c2b9833 100644
--- a/nss/nss_files/files-ethers.c
+++ b/nss/nss_files/files-ethers.c
@@ -20,8 +20,6 @@
#include <netinet/if_ether.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
struct etherent_data {};
#define ENTNAME etherent
diff --git a/nss/nss_files/files-grp.c b/nss/nss_files/files-grp.c
index 49be38e8b1..a716d948e2 100644
--- a/nss/nss_files/files-grp.c
+++ b/nss/nss_files/files-grp.c
@@ -19,8 +19,6 @@
#include <grp.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
#define STRUCTURE group
#define ENTNAME grent
#define DATABASE "group"
diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
index 894b85d501..d54d91d038 100644
--- a/nss/nss_files/files-hosts.c
+++ b/nss/nss_files/files-hosts.c
@@ -26,8 +26,6 @@
#include <alloc_buffer.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
/* Get implementation for some internal functions. */
#include "../resolv/res_hconf.h"
@@ -358,6 +356,7 @@ _nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result,
return status;
}
+libc_hidden_def (_nss_files_gethostbyname3_r)
enum nss_status
_nss_files_gethostbyname_r (const char *name, struct hostent *result,
@@ -367,6 +366,7 @@ _nss_files_gethostbyname_r (const char *name, struct hostent *result,
return _nss_files_gethostbyname3_r (name, AF_INET, result, buffer, buflen,
errnop, herrnop, NULL, NULL);
}
+libc_hidden_def (_nss_files_gethostbyname_r)
enum nss_status
_nss_files_gethostbyname2_r (const char *name, int af, struct hostent *result,
@@ -376,6 +376,7 @@ _nss_files_gethostbyname2_r (const char *name, int af, struct hostent *result,
return _nss_files_gethostbyname3_r (name, af, result, buffer, buflen,
errnop, herrnop, NULL, NULL);
}
+libc_hidden_def (_nss_files_gethostbyname2_r)
enum nss_status
_nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
@@ -491,3 +492,4 @@ _nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
return status;
}
+libc_hidden_def (_nss_files_gethostbyname4_r)
diff --git a/nss/nss_files/files-init.c b/nss/nss_files/files-init.c
index 36d5ebce1f..18d48168e8 100644
--- a/nss/nss_files/files-init.c
+++ b/nss/nss_files/files-init.c
@@ -21,8 +21,7 @@
#include <string.h>
#include <nscd/nscd.h>
#include <nss.h>
-
-NSS_DECLARE_MODULE_FUNCTIONS (files)
+#include <nss_files.h>
static void
register_file (void (*cb) (size_t, struct traced_file *),
@@ -49,5 +48,6 @@ _nss_files_init (void (*cb) (size_t, struct traced_file *))
register_file (cb, servdb, "/etc/services", 0);
register_file (cb, netgrdb, "/etc/netgroup", 0);
}
+libc_hidden_def (_nss_files_init)
#endif
diff --git a/nss/nss_files/files-initgroups.c b/nss/nss_files/files-initgroups.c
index 6fcea40b55..b44211e50b 100644
--- a/nss/nss_files/files-initgroups.c
+++ b/nss/nss_files/files-initgroups.c
@@ -28,8 +28,6 @@
#include <nss.h>
#include <nss_files.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
enum nss_status
_nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
long int *size, gid_t **groupsp, long int limit,
@@ -129,3 +127,4 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
return status == NSS_STATUS_SUCCESS && !any ? NSS_STATUS_NOTFOUND : status;
}
+libc_hidden_def (_nss_files_initgroups_dyn)
diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c
index be9c72accf..75bfbd9e44 100644
--- a/nss/nss_files/files-netgrp.c
+++ b/nss/nss_files/files-netgrp.c
@@ -28,8 +28,6 @@
#include "netgroup.h"
#include <nss_files.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
#define DATAFILE "/etc/netgroup"
libc_hidden_proto (_nss_files_endnetgrent)
@@ -152,7 +150,7 @@ _nss_files_setnetgrent (const char *group, struct __netgrent *result)
return status;
}
-
+libc_hidden_def (_nss_files_setnetgrent)
enum nss_status
_nss_files_endnetgrent (struct __netgrent *result)
@@ -293,3 +291,4 @@ _nss_files_getnetgrent_r (struct __netgrent *result, char *buffer,
return status;
}
+libc_hidden_def (_nss_files_getnetgrent_r)
diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
index 75c9f8a57e..217ed78609 100644
--- a/nss/nss_files/files-network.c
+++ b/nss/nss_files/files-network.c
@@ -21,7 +21,6 @@
#include <netdb.h>
#include <stdint.h>
#include <nss.h>
-#include <nss_files.h>
#define ENTNAME netent
#define DATABASE "networks"
diff --git a/nss/nss_files/files-proto.c b/nss/nss_files/files-proto.c
index 98d082c642..13072692c1 100644
--- a/nss/nss_files/files-proto.c
+++ b/nss/nss_files/files-proto.c
@@ -19,8 +19,6 @@
#include <netdb.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
#define ENTNAME protoent
#define DATABASE "protocols"
diff --git a/nss/nss_files/files-pwd.c b/nss/nss_files/files-pwd.c
index b04165ddde..5c74c6da9b 100644
--- a/nss/nss_files/files-pwd.c
+++ b/nss/nss_files/files-pwd.c
@@ -19,8 +19,6 @@
#include <pwd.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
#define STRUCTURE passwd
#define ENTNAME pwent
#define DATABASE "passwd"
diff --git a/nss/nss_files/files-rpc.c b/nss/nss_files/files-rpc.c
index eeb2725d2c..3dea8f18f2 100644
--- a/nss/nss_files/files-rpc.c
+++ b/nss/nss_files/files-rpc.c
@@ -19,8 +19,6 @@
#include <rpc/netdb.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
#define ENTNAME rpcent
#define DATABASE "rpc"
diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c
index f4f0985377..a8d83e094e 100644
--- a/nss/nss_files/files-service.c
+++ b/nss/nss_files/files-service.c
@@ -20,8 +20,6 @@
#include <netdb.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
#define ENTNAME servent
#define DATABASE "services"
diff --git a/nss/nss_files/files-sgrp.c b/nss/nss_files/files-sgrp.c
index 6b1c9eac02..213a408e7b 100644
--- a/nss/nss_files/files-sgrp.c
+++ b/nss/nss_files/files-sgrp.c
@@ -19,8 +19,6 @@
#include <gshadow.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
#define STRUCTURE sgrp
#define ENTNAME sgent
#define DATABASE "gshadow"
diff --git a/nss/nss_files/files-spwd.c b/nss/nss_files/files-spwd.c
index 976deaf918..d031257a20 100644
--- a/nss/nss_files/files-spwd.c
+++ b/nss/nss_files/files-spwd.c
@@ -19,8 +19,6 @@
#include <shadow.h>
#include <nss.h>
-NSS_DECLARE_MODULE_FUNCTIONS (files)
-
#define STRUCTURE spwd
#define ENTNAME spent
#define DATABASE "shadow"
diff --git a/nss/nss_files_functions.c b/nss/nss_files_functions.c
new file mode 100644
index 0000000000..85720b4311
--- /dev/null
+++ b/nss/nss_files_functions.c
@@ -0,0 +1,43 @@
+/* Direct access for nss_files functions for NSS module loading.
+ Copyright (C) 2021 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <nss_module.h>
+#include <nss_files.h>
+
+void
+__nss_files_functions (nss_module_functions_untyped pointers)
+{
+ void **fptr = pointers;
+
+ /* Functions which are not implemented. */
+#define _nss_files_getcanonname_r NULL
+#define _nss_files_gethostbyaddr2_r NULL
+#define _nss_files_getpublickey NULL
+#define _nss_files_getsecretkey NULL
+#define _nss_files_netname2user NULL
+
+#undef DEFINE_NSS_FUNCTION
+#define DEFINE_NSS_FUNCTION(x) *fptr++ = _nss_files_##x;
+#include "function.def"
+
+#ifdef PTR_MANGLE
+ void **end = fptr;
+ for (fptr = pointers; fptr != end; ++fptr)
+ PTR_MANGLE (*fptr);
+#endif
+}
diff --git a/nss/nss_module.c b/nss/nss_module.c
index 60c070c851..7b42c585a4 100644
--- a/nss/nss_module.c
+++ b/nss/nss_module.c
@@ -30,6 +30,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <nss_files.h>
/* Suffix after .so of NSS service modules. This is a bit of magic,
but we assume LIBNSS_FILES_SO looks like "libnss_files.so.2" and we
@@ -110,10 +111,45 @@ static const function_name nss_function_name_array[] =
#include "function.def"
};
+static bool
+module_load_nss_files (struct nss_module *module)
+{
+ if (is_nscd)
+ {
+ void (*cb) (size_t, struct traced_file *) = nscd_init_cb;
+# ifdef PTR_DEMANGLE
+ PTR_DEMANGLE (cb);
+# endif
+ _nss_files_init (cb);
+ }
+
+ /* Initialize the function pointers, following the double-checked
+ locking idiom. */
+ __libc_lock_lock (nss_module_list_lock);
+ switch ((enum nss_module_state) atomic_load_acquire (&module->state))
+ {
+ case nss_module_uninitialized:
+ case nss_module_failed:
+ __nss_files_functions (module->functions.untyped);
+ module->handle = NULL;
+ /* Synchronizes with unlocked __nss_module_load atomic_load_acquire. */
+ atomic_store_release (&module->state, nss_module_loaded);
+ break;
+ case nss_module_loaded:
+ /* Nothing to clean up. */
+ break;
+ }
+ __libc_lock_unlock (nss_module_list_lock);
+ return true;
+}
+
/* Internal implementation of __nss_module_load. */
static bool
module_load (struct nss_module *module)
{
+ if (strcmp (module->name, "files") == 0)
+ return module_load_nss_files (module);
+
void *handle;
{
char *shlib_name;
@@ -360,7 +396,7 @@ __nss_module_freeres (void)
struct nss_module *current = nss_module_list;
while (current != NULL)
{
- if (current->state == nss_module_loaded)
+ if (current->state == nss_module_loaded && current->handle != NULL)
__libc_dlclose (current->handle);
struct nss_module *next = current->next;
diff --git a/nss/nss_module.h b/nss/nss_module.h
index 05c4791d11..c1a1d90b60 100644
--- a/nss/nss_module.h
+++ b/nss/nss_module.h
@@ -38,6 +38,10 @@ struct nss_module_functions
typedef void *nss_module_functions_untyped[sizeof (struct nss_module_functions)
/ sizeof (void *)];
+/* Locate the nss_files functions, as if by dlopen/dlsym. */
+void __nss_files_functions (nss_module_functions_untyped pointers)
+ attribute_hidden;
+
/* Initialization state of a NSS module. */
enum nss_module_state
{
--
2.31.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 7/7] nss: Access nss_files through direct references
2021-06-29 10:11 ` [PATCH 7/7] nss: Access nss_files through direct references Florian Weimer
@ 2021-07-07 13:49 ` Adhemerval Zanella
0 siblings, 0 replies; 17+ messages in thread
From: Adhemerval Zanella @ 2021-07-07 13:49 UTC (permalink / raw)
To: Florian Weimer, libc-alpha
On 29/06/2021 07:11, Florian Weimer via Libc-alpha wrote:
> This partially fixes static-only NSS support (bug 27959): The files
> module no longer needs dlopen. Support for the dns module remains
> to be added, and also support for disabling dlopen altogher.
s/altogher/altogether
LGTM, only a minor nit below.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> include/nss_files.h | 10 ++++++++
> nss/Makefile | 3 ++-
> nss/nss_files/files-XXX.c | 6 ++++-
> nss/nss_files/files-alias.c | 7 +++---
> nss/nss_files/files-ethers.c | 2 --
> nss/nss_files/files-grp.c | 2 --
> nss/nss_files/files-hosts.c | 6 +++--
> nss/nss_files/files-init.c | 4 +--
> nss/nss_files/files-initgroups.c | 3 +--
> nss/nss_files/files-netgrp.c | 5 ++--
> nss/nss_files/files-network.c | 1 -
> nss/nss_files/files-proto.c | 2 --
> nss/nss_files/files-pwd.c | 2 --
> nss/nss_files/files-rpc.c | 2 --
> nss/nss_files/files-service.c | 2 --
> nss/nss_files/files-sgrp.c | 2 --
> nss/nss_files/files-spwd.c | 2 --
> nss/nss_files_functions.c | 43 ++++++++++++++++++++++++++++++++
> nss/nss_module.c | 38 +++++++++++++++++++++++++++-
> nss/nss_module.h | 4 +++
> 20 files changed, 114 insertions(+), 32 deletions(-)
> create mode 100644 nss/nss_files_functions.c
>
> diff --git a/include/nss_files.h b/include/nss_files.h
> index dd0081a0f1..6190cac6be 100644
> --- a/include/nss_files.h
> +++ b/include/nss_files.h
> @@ -19,6 +19,7 @@
> #ifndef _NSS_FILES_H
> #define _NSS_FILES_H
>
> +#include <nss.h>
> #include <stdio.h>
> #if IS_IN (libc)
> #include <libc-lock.h>
> @@ -134,6 +135,15 @@ libc_hidden_proto (_nss_files_parse_servent)
> libc_hidden_proto (_nss_files_parse_sgent)
> libc_hidden_proto (_nss_files_parse_spent)
>
> +NSS_DECLARE_MODULE_FUNCTIONS (files)
> +#undef DEFINE_NSS_FUNCTION
> +#define DEFINE_NSS_FUNCTION(x) libc_hidden_proto (_nss_files_##x)
> +#include <nss/function.def>
> +#undef DEFINE_NSS_FUNCTION
> +
> +void _nss_files_init (void (*cb) (size_t, struct traced_file *));
> +libc_hidden_proto (_nss_files_init)
> +
> /* Generic implementation of fget*ent_r. Reads lines from FP until
> EOF or a successful parse into *RESULT using PARSER. Returns 0 on
> success, ENOENT on EOF, ERANGE on too-small buffer. */
Ok.
> diff --git a/nss/Makefile b/nss/Makefile
> index 8905a5fd9b..75afb22cb3 100644
> --- a/nss/Makefile
> +++ b/nss/Makefile
> @@ -31,7 +31,8 @@ routines = nsswitch getnssent getnssent_r digits_dots \
> compat-lookup nss_hash nss_files_fopen \
> nss_readline nss_parse_line_result \
> nss_fgetent_r nss_module nss_action \
> - nss_action_parse nss_database nss_files_data
> + nss_action_parse nss_database nss_files_data \
> + nss_files_functions
>
> # These are the databases that go through nss dispatch.
> # Caution: if you add a database here, you must add its real name
Maybe add one entry per line here?
> diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
> index 91553d7ca5..c158a891bd 100644
> --- a/nss/nss_files/files-XXX.c
> +++ b/nss/nss_files/files-XXX.c
> @@ -91,12 +91,14 @@ CONCAT(_nss_files_set,ENTNAME) (int stayopen)
> {
> return __nss_files_data_setent (CONCAT (nss_file_, ENTNAME), DATAFILE);
> }
> +libc_hidden_def (CONCAT (_nss_files_set,ENTNAME))
>
> enum nss_status
> CONCAT(_nss_files_end,ENTNAME) (void)
> {
> return __nss_files_data_endent (CONCAT (nss_file_, ENTNAME));
> }
> +libc_hidden_def (CONCAT (_nss_files_end,ENTNAME))
> \f
>
> /* Parsing the database file into `struct STRUCTURE' data structures. */
> @@ -179,6 +181,7 @@ CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, char *buffer,
> __nss_files_data_put (data);
> return status;
> }
> +libc_hidden_def (CONCAT (_nss_files_get,ENTNAME_r))
> \f
> /* Macro for defining lookup functions for this file-based database.
>
> @@ -215,4 +218,5 @@ _nss_files_get##name##_r (proto, \
> } \
> \
> return status; \
> -}
> +} \
> +libc_hidden_def (_nss_files_get##name##_r)
Ok.
> diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
> index 75d91e0b0a..8c6e176ff6 100644
> --- a/nss/nss_files/files-alias.c
> +++ b/nss/nss_files/files-alias.c
> @@ -31,8 +31,6 @@
> #include "nsswitch.h"
> #include <nss_files.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> \f
> /* Maintenance of the stream open on the database file. For getXXent
> operations the stream needs to be held open across calls, the other
> @@ -63,12 +61,14 @@ _nss_files_setaliasent (void)
> {
> return __nss_files_data_setent (nss_file_aliasent, "/etc/aliases");
> }
> +libc_hidden_def (_nss_files_setaliasent)
>
> enum nss_status
> _nss_files_endaliasent (void)
> {
> return __nss_files_data_endent (nss_file_aliasent);
> }
> +libc_hidden_def (_nss_files_endaliasent)
> \f
> /* Parsing the database file into `struct aliasent' data structures. */
> static enum nss_status
> @@ -354,7 +354,7 @@ _nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen,
> __nss_files_data_put (data);
> return status;
> }
> -
> +libc_hidden_def (_nss_files_getaliasent_r)
>
> enum nss_status
> _nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
> @@ -387,3 +387,4 @@ _nss_files_getaliasbyname_r (const char *name, struct aliasent *result,
>
> return status;
> }
> +libc_hidden_def (_nss_files_getaliasbyname_r)
Ok.
> diff --git a/nss/nss_files/files-ethers.c b/nss/nss_files/files-ethers.c
> index 2fe7f81e4b..7c2c2b9833 100644
> --- a/nss/nss_files/files-ethers.c
> +++ b/nss/nss_files/files-ethers.c
> @@ -20,8 +20,6 @@
> #include <netinet/if_ether.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> struct etherent_data {};
>
> #define ENTNAME etherent
Ok.
> diff --git a/nss/nss_files/files-grp.c b/nss/nss_files/files-grp.c
> index 49be38e8b1..a716d948e2 100644
> --- a/nss/nss_files/files-grp.c
> +++ b/nss/nss_files/files-grp.c
> @@ -19,8 +19,6 @@
> #include <grp.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> #define STRUCTURE group
> #define ENTNAME grent
> #define DATABASE "group"
Ok.
> diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
> index 894b85d501..d54d91d038 100644
> --- a/nss/nss_files/files-hosts.c
> +++ b/nss/nss_files/files-hosts.c
> @@ -26,8 +26,6 @@
> #include <alloc_buffer.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> /* Get implementation for some internal functions. */
> #include "../resolv/res_hconf.h"
>
> @@ -358,6 +356,7 @@ _nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result,
>
> return status;
> }
> +libc_hidden_def (_nss_files_gethostbyname3_r)
>
> enum nss_status
> _nss_files_gethostbyname_r (const char *name, struct hostent *result,
> @@ -367,6 +366,7 @@ _nss_files_gethostbyname_r (const char *name, struct hostent *result,
> return _nss_files_gethostbyname3_r (name, AF_INET, result, buffer, buflen,
> errnop, herrnop, NULL, NULL);
> }
> +libc_hidden_def (_nss_files_gethostbyname_r)
>
> enum nss_status
> _nss_files_gethostbyname2_r (const char *name, int af, struct hostent *result,
> @@ -376,6 +376,7 @@ _nss_files_gethostbyname2_r (const char *name, int af, struct hostent *result,
> return _nss_files_gethostbyname3_r (name, af, result, buffer, buflen,
> errnop, herrnop, NULL, NULL);
> }
> +libc_hidden_def (_nss_files_gethostbyname2_r)
>
> enum nss_status
> _nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
> @@ -491,3 +492,4 @@ _nss_files_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat,
>
> return status;
> }
> +libc_hidden_def (_nss_files_gethostbyname4_r)
Ok.
> diff --git a/nss/nss_files/files-init.c b/nss/nss_files/files-init.c
> index 36d5ebce1f..18d48168e8 100644
> --- a/nss/nss_files/files-init.c
> +++ b/nss/nss_files/files-init.c
> @@ -21,8 +21,7 @@
> #include <string.h>
> #include <nscd/nscd.h>
> #include <nss.h>
> -
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> +#include <nss_files.h>
>
> static void
> register_file (void (*cb) (size_t, struct traced_file *),
> @@ -49,5 +48,6 @@ _nss_files_init (void (*cb) (size_t, struct traced_file *))
> register_file (cb, servdb, "/etc/services", 0);
> register_file (cb, netgrdb, "/etc/netgroup", 0);
> }
> +libc_hidden_def (_nss_files_init)
>
> #endif
Ok.
> diff --git a/nss/nss_files/files-initgroups.c b/nss/nss_files/files-initgroups.c
> index 6fcea40b55..b44211e50b 100644
> --- a/nss/nss_files/files-initgroups.c
> +++ b/nss/nss_files/files-initgroups.c
> @@ -28,8 +28,6 @@
> #include <nss.h>
> #include <nss_files.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> enum nss_status
> _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
> long int *size, gid_t **groupsp, long int limit,
> @@ -129,3 +127,4 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
>
> return status == NSS_STATUS_SUCCESS && !any ? NSS_STATUS_NOTFOUND : status;
> }
> +libc_hidden_def (_nss_files_initgroups_dyn)
Ok.
> diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c
> index be9c72accf..75bfbd9e44 100644
> --- a/nss/nss_files/files-netgrp.c
> +++ b/nss/nss_files/files-netgrp.c
> @@ -28,8 +28,6 @@
> #include "netgroup.h"
> #include <nss_files.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> #define DATAFILE "/etc/netgroup"
>
> libc_hidden_proto (_nss_files_endnetgrent)
> @@ -152,7 +150,7 @@ _nss_files_setnetgrent (const char *group, struct __netgrent *result)
>
> return status;
> }
> -
> +libc_hidden_def (_nss_files_setnetgrent)
>
> enum nss_status
> _nss_files_endnetgrent (struct __netgrent *result)
> @@ -293,3 +291,4 @@ _nss_files_getnetgrent_r (struct __netgrent *result, char *buffer,
>
> return status;
> }
> +libc_hidden_def (_nss_files_getnetgrent_r)
Ok.
> diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
> index 75c9f8a57e..217ed78609 100644
> --- a/nss/nss_files/files-network.c
> +++ b/nss/nss_files/files-network.c
> @@ -21,7 +21,6 @@
> #include <netdb.h>
> #include <stdint.h>
> #include <nss.h>
> -#include <nss_files.h>
>
> #define ENTNAME netent
> #define DATABASE "networks"
Ok.
> diff --git a/nss/nss_files/files-proto.c b/nss/nss_files/files-proto.c
> index 98d082c642..13072692c1 100644
> --- a/nss/nss_files/files-proto.c
> +++ b/nss/nss_files/files-proto.c
> @@ -19,8 +19,6 @@
> #include <netdb.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> #define ENTNAME protoent
> #define DATABASE "protocols"
>
Ok.
> diff --git a/nss/nss_files/files-pwd.c b/nss/nss_files/files-pwd.c
> index b04165ddde..5c74c6da9b 100644
> --- a/nss/nss_files/files-pwd.c
> +++ b/nss/nss_files/files-pwd.c
> @@ -19,8 +19,6 @@
> #include <pwd.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> #define STRUCTURE passwd
> #define ENTNAME pwent
> #define DATABASE "passwd"
Ok.
> diff --git a/nss/nss_files/files-rpc.c b/nss/nss_files/files-rpc.c
> index eeb2725d2c..3dea8f18f2 100644
> --- a/nss/nss_files/files-rpc.c
> +++ b/nss/nss_files/files-rpc.c
> @@ -19,8 +19,6 @@
> #include <rpc/netdb.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> #define ENTNAME rpcent
> #define DATABASE "rpc"
>
Ok.
> diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c
> index f4f0985377..a8d83e094e 100644
> --- a/nss/nss_files/files-service.c
> +++ b/nss/nss_files/files-service.c
> @@ -20,8 +20,6 @@
> #include <netdb.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> #define ENTNAME servent
> #define DATABASE "services"
>
Ok.
> diff --git a/nss/nss_files/files-sgrp.c b/nss/nss_files/files-sgrp.c
> index 6b1c9eac02..213a408e7b 100644
> --- a/nss/nss_files/files-sgrp.c
> +++ b/nss/nss_files/files-sgrp.c
> @@ -19,8 +19,6 @@
> #include <gshadow.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> #define STRUCTURE sgrp
> #define ENTNAME sgent
> #define DATABASE "gshadow"
> diff --git a/nss/nss_files/files-spwd.c b/nss/nss_files/files-spwd.c
> index 976deaf918..d031257a20 100644
> --- a/nss/nss_files/files-spwd.c
> +++ b/nss/nss_files/files-spwd.c
> @@ -19,8 +19,6 @@
> #include <shadow.h>
> #include <nss.h>
>
> -NSS_DECLARE_MODULE_FUNCTIONS (files)
> -
> #define STRUCTURE spwd
> #define ENTNAME spent
> #define DATABASE "shadow"
Ok.
> diff --git a/nss/nss_files_functions.c b/nss/nss_files_functions.c
> new file mode 100644
> index 0000000000..85720b4311
> --- /dev/null
> +++ b/nss/nss_files_functions.c
> @@ -0,0 +1,43 @@
> +/* Direct access for nss_files functions for NSS module loading.
> + Copyright (C) 2021 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <https://www.gnu.org/licenses/>. */
> +
> +#include <nss_module.h>
> +#include <nss_files.h>
> +
> +void
> +__nss_files_functions (nss_module_functions_untyped pointers)
> +{
> + void **fptr = pointers;
> +
> + /* Functions which are not implemented. */
> +#define _nss_files_getcanonname_r NULL
> +#define _nss_files_gethostbyaddr2_r NULL
> +#define _nss_files_getpublickey NULL
> +#define _nss_files_getsecretkey NULL
> +#define _nss_files_netname2user NULL
> +
> +#undef DEFINE_NSS_FUNCTION
> +#define DEFINE_NSS_FUNCTION(x) *fptr++ = _nss_files_##x;
> +#include "function.def"
> +
> +#ifdef PTR_MANGLE
> + void **end = fptr;
> + for (fptr = pointers; fptr != end; ++fptr)
> + PTR_MANGLE (*fptr);
> +#endif
> +}
Ok.
> diff --git a/nss/nss_module.c b/nss/nss_module.c
> index 60c070c851..7b42c585a4 100644
> --- a/nss/nss_module.c
> +++ b/nss/nss_module.c
> @@ -30,6 +30,7 @@
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> +#include <nss_files.h>
>
> /* Suffix after .so of NSS service modules. This is a bit of magic,
> but we assume LIBNSS_FILES_SO looks like "libnss_files.so.2" and we
> @@ -110,10 +111,45 @@ static const function_name nss_function_name_array[] =
> #include "function.def"
> };
>
> +static bool
> +module_load_nss_files (struct nss_module *module)
> +{
> + if (is_nscd)
> + {
> + void (*cb) (size_t, struct traced_file *) = nscd_init_cb;
> +# ifdef PTR_DEMANGLE
> + PTR_DEMANGLE (cb);
> +# endif
> + _nss_files_init (cb);
> + }
> +
> + /* Initialize the function pointers, following the double-checked
> + locking idiom. */
> + __libc_lock_lock (nss_module_list_lock);
> + switch ((enum nss_module_state) atomic_load_acquire (&module->state))
> + {
> + case nss_module_uninitialized:
> + case nss_module_failed:
> + __nss_files_functions (module->functions.untyped);
> + module->handle = NULL;
> + /* Synchronizes with unlocked __nss_module_load atomic_load_acquire. */
> + atomic_store_release (&module->state, nss_module_loaded);
> + break;
> + case nss_module_loaded:
> + /* Nothing to clean up. */
> + break;
> + }
> + __libc_lock_unlock (nss_module_list_lock);
> + return true;
> +}
> +
Ok (it is mainly the code already presented on module_load()).
> /* Internal implementation of __nss_module_load. */
> static bool
> module_load (struct nss_module *module)
> {
> + if (strcmp (module->name, "files") == 0)
> + return module_load_nss_files (module);
> +
> void *handle;
> {
> char *shlib_name;
> @@ -360,7 +396,7 @@ __nss_module_freeres (void)
> struct nss_module *current = nss_module_list;
> while (current != NULL)
> {
> - if (current->state == nss_module_loaded)
> + if (current->state == nss_module_loaded && current->handle != NULL)
> __libc_dlclose (current->handle);
>
> struct nss_module *next = current->next;
Ok.
> diff --git a/nss/nss_module.h b/nss/nss_module.h
> index 05c4791d11..c1a1d90b60 100644
> --- a/nss/nss_module.h
> +++ b/nss/nss_module.h
> @@ -38,6 +38,10 @@ struct nss_module_functions
> typedef void *nss_module_functions_untyped[sizeof (struct nss_module_functions)
> / sizeof (void *)];
>
> +/* Locate the nss_files functions, as if by dlopen/dlsym. */
> +void __nss_files_functions (nss_module_functions_untyped pointers)
> + attribute_hidden;
> +
> /* Initialization state of a NSS module. */
> enum nss_module_state
> {
>
Ok.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 0/7] nss_files move
2021-06-29 10:11 [PATCH v2 0/7] nss_files move Florian Weimer
` (6 preceding siblings ...)
2021-06-29 10:11 ` [PATCH 7/7] nss: Access nss_files through direct references Florian Weimer
@ 2021-07-08 10:28 ` Andreas Schwab
2021-07-08 10:33 ` Florian Weimer
7 siblings, 1 reply; 17+ messages in thread
From: Andreas Schwab @ 2021-07-08 10:28 UTC (permalink / raw)
To: Florian Weimer via Libc-alpha; +Cc: Florian Weimer
This now creates and installs libnss_files.a and libnss_files_p.a, which
didn't exist previously. I think the latter definitely shouldn't exist.
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
"And now for something completely different."
^ permalink raw reply [flat|nested] 17+ messages in thread