public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 0/7] nss_files move
@ 2021-06-29 10:11 Florian Weimer
  2021-06-29 10:11 ` [PATCH 1/7] inet: Add hidden prototype for __inet_network Florian Weimer
                   ` (7 more replies)
  0 siblings, 8 replies; 17+ messages in thread
From: Florian Weimer @ 2021-06-29 10:11 UTC (permalink / raw)
  To: libc-alpha

This is a repost of the previous series, minus the first patch (Andreas
had reviewd it, and I pushed it).

This resolves a conflict around the gconv refactor and the getdelim
cleanup in this series.

Tested on i686-linux-gnu, x86_64-linux-gnu.  Built with
build-many-glibcs.py.

Thanks,
Florian

Florian Weimer (7):
  inet: Add hidden prototype for __inet_network
  libio: Add hidden prototype for ungetc
  libio: Replace internal _IO_getdelim symbol with __getdelim
  nss_files: Allocate nscd file registration data on the heap
  nss_files: Add generic code for set*ent, end*ent and file open
  nss_files: Move into libc
  nss: Access nss_files through direct references

 iconv/gconv_parseconfdir.h              |   2 +-
 include/arpa/inet.h                     |   2 +
 include/libc-symbols.h                  |  23 ----
 include/netdb.h                         |   2 +-
 include/nss_files.h                     |  80 +++++++++++-
 include/stdio.h                         |   2 +
 inet/inet_net.c                         |   4 +-
 libio/iogetdelim.c                      |   7 +-
 libio/ioungetc.c                        |   6 +-
 libio/libioP.h                          |   1 -
 nss/Makefile                            |  14 +--
 nss/Versions                            |  17 ++-
 nss/nss_files/files-XXX.c               |  73 +++--------
 nss/nss_files/files-alias.c             |  86 ++++---------
 nss/nss_files/files-ethers.c            |   2 -
 nss/nss_files/files-grp.c               |   2 -
 nss/nss_files/files-hosts.c             |  17 +--
 nss/nss_files/files-init.c              |  58 ++++-----
 nss/nss_files/files-initgroups.c        |   3 +-
 nss/nss_files/files-netgrp.c            |  11 +-
 nss/nss_files/files-network.c           |   4 +-
 nss/nss_files/files-parse.c             |   8 +-
 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_data.c                    | 159 ++++++++++++++++++++++++
 nss/nss_files_functions.c               |  43 +++++++
 nss/nss_module.c                        |  38 +++++-
 nss/nss_module.h                        |   4 +
 nss/nss_readline.c                      |   4 +-
 stdio-common/getline.c                  |   2 +-
 sysdeps/unix/sysv/linux/readonly-area.c |   2 +-
 35 files changed, 440 insertions(+), 248 deletions(-)
 create mode 100644 nss/nss_files_data.c
 create mode 100644 nss/nss_files_functions.c

-- 
2.31.1


^ permalink raw reply	[flat|nested] 17+ messages in thread

* [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

* [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

* [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

* [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

* [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

* [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

* [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 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

* 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

* 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

* 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

* 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

* 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

* 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

* Re: [PATCH v2 0/7] nss_files move
  2021-07-08 10:28 ` [PATCH v2 0/7] nss_files move Andreas Schwab
@ 2021-07-08 10:33   ` Florian Weimer
  0 siblings, 0 replies; 17+ messages in thread
From: Florian Weimer @ 2021-07-08 10:33 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: Florian Weimer via Libc-alpha

* Andreas Schwab:

> 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.

You are right.  I will look at fixing this today.

Thanks,
Florian


^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2021-07-08 10:33 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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-07-07 13:33   ` Adhemerval Zanella
2021-06-29 10:11 ` [PATCH 2/7] libio: Add hidden prototype for ungetc 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
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
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
2021-07-07 13:42   ` Adhemerval Zanella
2021-06-29 10:11 ` [PATCH 6/7] nss_files: Move into libc 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-07 13:49   ` Adhemerval Zanella
2021-07-08 10:28 ` [PATCH v2 0/7] nss_files move Andreas Schwab
2021-07-08 10:33   ` Florian Weimer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).