unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/7] More type safety for NSS modules
@ 2020-02-12 14:34 Florian Weimer
  2020-02-12 14:34 ` [PATCH 1/7] nss_compat: Do not use nss_* names for function pointers Florian Weimer
                   ` (8 more replies)
  0 siblings, 9 replies; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:34 UTC (permalink / raw)
  To: libc-alpha

This series adds a macro NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h>.
Module authors can use this macro to declare all the possible functions
for a module, and define only the function they need.  This avoids type
mismatches in these interfaces.

As a side effect, we now have what is hopefully a complete list of all
such module functions.  This should help with re-architecting the
internal NSS functions for nsswitch.conf reloading.

Thanks,
Florian

Florian Weimer (7):
  nss_compat: Do not use nss_* names for function pointers
  nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to
    <nss.h>
  nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS
  nss_compat: Use NSS_DECLARE_MODULE_FUNCTIONS
  nss_db: Use NSS_DECLARE_MODULE_FUNCTIONS
  nss_files: Use NSS_DECLARE_MODULE_FUNCTIONS
  nss_dns: Use NSS_DECLARE_MODULE_FUNCTIONS

 hesiod/nss_hesiod/hesiod-grp.c     |   2 +
 hesiod/nss_hesiod/hesiod-proto.c   |   2 +
 hesiod/nss_hesiod/hesiod-pwd.c     |   2 +
 hesiod/nss_hesiod/hesiod-service.c |   2 +
 nscd/aicache.c                     |  23 +---
 nss/nss.h                          | 203 ++++++++++++++++++++++++++++-
 nss/nss_compat/compat-grp.c        |  56 ++++----
 nss/nss_compat/compat-initgroups.c |  73 ++++++-----
 nss/nss_compat/compat-pwd.c        |  58 +++++----
 nss/nss_compat/compat-spwd.c       |  46 +++----
 nss/nss_db/db-init.c               |   2 +
 nss/nss_db/db-initgroups.c         |   1 -
 nss/nss_db/nss_db.h                |   1 +
 nss/nss_files/files-alias.c        |   2 +
 nss/nss_files/files-ethers.c       |   3 +
 nss/nss_files/files-grp.c          |   3 +
 nss/nss_files/files-hosts.c        |   2 +
 nss/nss_files/files-init.c         |   3 +
 nss/nss_files/files-initgroups.c   |   3 +
 nss/nss_files/files-key.c          |   2 +
 nss/nss_files/files-netgrp.c       |   2 +
 nss/nss_files/files-network.c      |   3 +
 nss/nss_files/files-proto.c        |   2 +
 nss/nss_files/files-pwd.c          |   3 +
 nss/nss_files/files-rpc.c          |   2 +
 nss/nss_files/files-service.c      |   2 +
 nss/nss_files/files-sgrp.c         |   3 +
 nss/nss_files/files-spwd.c         |   3 +
 resolv/nss_dns/dns-canon.c         |   2 +
 resolv/nss_dns/dns-host.c          |   2 +
 resolv/nss_dns/dns-network.c       |   2 +
 sysdeps/posix/getaddrinfo.c        |  18 +--
 32 files changed, 384 insertions(+), 149 deletions(-)

-- 
2.24.1


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

* [PATCH 1/7] nss_compat: Do not use nss_* names for function pointers
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
@ 2020-02-12 14:34 ` Florian Weimer
  2020-02-12 22:36   ` DJ Delorie
  2020-02-12 14:34 ` [PATCH 2/7] nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h> Florian Weimer
                   ` (7 subsequent siblings)
  8 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:34 UTC (permalink / raw)
  To: libc-alpha

A future commit will use these names for types of functions
in NSS service modules.
---
 nss/nss_compat/compat-grp.c        | 54 +++++++++++------------
 nss/nss_compat/compat-initgroups.c | 71 +++++++++++++++---------------
 nss/nss_compat/compat-pwd.c        | 56 +++++++++++------------
 nss/nss_compat/compat-spwd.c       | 44 +++++++++---------
 4 files changed, 112 insertions(+), 113 deletions(-)

diff --git a/nss/nss_compat/compat-grp.c b/nss/nss_compat/compat-grp.c
index a8de1e03b3..561511c91a 100644
--- a/nss/nss_compat/compat-grp.c
+++ b/nss/nss_compat/compat-grp.c
@@ -28,16 +28,16 @@
 #include <kernel-features.h>
 
 static service_user *ni;
-static enum nss_status (*nss_setgrent) (int stayopen);
-static enum nss_status (*nss_getgrnam_r) (const char *name,
-					  struct group * grp, char *buffer,
-					  size_t buflen, int *errnop);
-static enum nss_status (*nss_getgrgid_r) (gid_t gid, struct group * grp,
-					  char *buffer, size_t buflen,
-					  int *errnop);
-static enum nss_status (*nss_getgrent_r) (struct group * grp, char *buffer,
-					  size_t buflen, int *errnop);
-static enum nss_status (*nss_endgrent) (void);
+static enum nss_status (*setgrent_impl) (int stayopen);
+static enum nss_status (*getgrnam_r_impl) (const char *name,
+					   struct group * grp, char *buffer,
+					   size_t buflen, int *errnop);
+static enum nss_status (*getgrgid_r_impl) (gid_t gid, struct group * grp,
+					   char *buffer, size_t buflen,
+					   int *errnop);
+static enum nss_status (*getgrent_r_impl) (struct group * grp, char *buffer,
+					   size_t buflen, int *errnop);
+static enum nss_status (*endgrent_impl) (void);
 
 /* Get the declaration of the parser function.  */
 #define ENTNAME grent
@@ -80,11 +80,11 @@ init_nss_interface (void)
 {
   if (__nss_database_lookup2 ("group_compat", NULL, "nis", &ni) >= 0)
     {
-      nss_setgrent = __nss_lookup_function (ni, "setgrent");
-      nss_getgrnam_r = __nss_lookup_function (ni, "getgrnam_r");
-      nss_getgrgid_r = __nss_lookup_function (ni, "getgrgid_r");
-      nss_getgrent_r = __nss_lookup_function (ni, "getgrent_r");
-      nss_endgrent = __nss_lookup_function (ni, "endgrent");
+      setgrent_impl = __nss_lookup_function (ni, "setgrent");
+      getgrnam_r_impl = __nss_lookup_function (ni, "getgrnam_r");
+      getgrgid_r_impl = __nss_lookup_function (ni, "getgrgid_r");
+      getgrent_r_impl = __nss_lookup_function (ni, "getgrent_r");
+      endgrent_impl = __nss_lookup_function (ni, "endgrent");
     }
 }
 
@@ -117,8 +117,8 @@ internal_setgrent (ent_t *ent, int stayopen, int needent)
   else
     rewind (ent->stream);
 
-  if (needent && status == NSS_STATUS_SUCCESS && nss_setgrent)
-    ent->setent_status = nss_setgrent (stayopen);
+  if (needent && status == NSS_STATUS_SUCCESS && setgrent_impl)
+    ent->setent_status = setgrent_impl (stayopen);
 
   return status;
 }
@@ -170,8 +170,8 @@ _nss_compat_endgrent (void)
 
   __libc_lock_lock (lock);
 
-  if (nss_endgrent)
-    nss_endgrent ();
+  if (endgrent_impl)
+    endgrent_impl ();
 
   result = internal_endgrent (&ext_ent);
 
@@ -185,7 +185,7 @@ static enum nss_status
 getgrent_next_nss (struct group *result, ent_t *ent, char *buffer,
 		   size_t buflen, int *errnop)
 {
-  if (!nss_getgrent_r)
+  if (!getgrent_r_impl)
     return NSS_STATUS_UNAVAIL;
 
   /* If the setgrent call failed, say so.  */
@@ -196,7 +196,7 @@ getgrent_next_nss (struct group *result, ent_t *ent, char *buffer,
     {
       enum nss_status status;
 
-      if ((status = nss_getgrent_r (result, buffer, buflen, errnop))
+      if ((status = getgrent_r_impl (result, buffer, buflen, errnop))
 	  != NSS_STATUS_SUCCESS)
 	return status;
     }
@@ -210,11 +210,11 @@ static enum nss_status
 getgrnam_plusgroup (const char *name, struct group *result, ent_t *ent,
 		    char *buffer, size_t buflen, int *errnop)
 {
-  if (!nss_getgrnam_r)
+  if (!getgrnam_r_impl)
     return NSS_STATUS_UNAVAIL;
 
-  enum nss_status status = nss_getgrnam_r (name, result, buffer, buflen,
-					   errnop);
+  enum nss_status status = getgrnam_r_impl (name, result, buffer, buflen,
+					    errnop);
   if (status != NSS_STATUS_SUCCESS)
     return status;
 
@@ -578,11 +578,11 @@ internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent,
       /* +:... */
       if (result->gr_name[0] == '+' && result->gr_name[1] == '\0')
 	{
-	  if (!nss_getgrgid_r)
+	  if (!getgrgid_r_impl)
 	    return NSS_STATUS_UNAVAIL;
 
-	  enum nss_status status = nss_getgrgid_r (gid, result, buffer, buflen,
-						   errnop);
+	  enum nss_status status = getgrgid_r_impl (gid, result,
+						    buffer, buflen, errnop);
 	  if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
 	    return NSS_STATUS_NOTFOUND;
 	  else
diff --git a/nss/nss_compat/compat-initgroups.c b/nss/nss_compat/compat-initgroups.c
index 939b25b33b..d2a280d9c3 100644
--- a/nss/nss_compat/compat-initgroups.c
+++ b/nss/nss_compat/compat-initgroups.c
@@ -31,20 +31,19 @@
 #include <scratch_buffer.h>
 
 static service_user *ni;
-/* Type of the lookup function.  */
-static enum nss_status (*nss_initgroups_dyn) (const char *, gid_t,
-					      long int *, long int *,
-					      gid_t **, long int, int *);
-static enum nss_status (*nss_getgrnam_r) (const char *name,
-					  struct group * grp, char *buffer,
-					  size_t buflen, int *errnop);
-static enum nss_status (*nss_getgrgid_r) (gid_t gid, struct group * grp,
-					  char *buffer, size_t buflen,
-					  int *errnop);
-static enum nss_status (*nss_setgrent) (int stayopen);
-static enum nss_status (*nss_getgrent_r) (struct group * grp, char *buffer,
-					  size_t buflen, int *errnop);
-static enum nss_status (*nss_endgrent) (void);
+static enum nss_status (*initgroups_dyn_impl) (const char *, gid_t,
+					       long int *, long int *,
+					       gid_t **, long int, int *);
+static enum nss_status (*getgrnam_r_impl) (const char *name,
+					   struct group * grp, char *buffer,
+					   size_t buflen, int *errnop);
+static enum nss_status (*getgrgid_r_impl) (gid_t gid, struct group * grp,
+					   char *buffer, size_t buflen,
+					   int *errnop);
+static enum nss_status (*setgrent_impl) (int stayopen);
+static enum nss_status (*getgrent_r_impl) (struct group * grp, char *buffer,
+					   size_t buflen, int *errnop);
+static enum nss_status (*endgrent_impl) (void);
 
 /* Protect global state against multiple changers.  */
 __libc_lock_define_initialized (static, lock)
@@ -91,12 +90,12 @@ init_nss_interface (void)
   if (ni == NULL
       && __nss_database_lookup2 ("group_compat", NULL, "nis", &ni) >= 0)
     {
-      nss_initgroups_dyn = __nss_lookup_function (ni, "initgroups_dyn");
-      nss_getgrnam_r = __nss_lookup_function (ni, "getgrnam_r");
-      nss_getgrgid_r = __nss_lookup_function (ni, "getgrgid_r");
-      nss_setgrent = __nss_lookup_function (ni, "setgrent");
-      nss_getgrent_r = __nss_lookup_function (ni, "getgrent_r");
-      nss_endgrent = __nss_lookup_function (ni, "endgrent");
+      initgroups_dyn_impl = __nss_lookup_function (ni, "initgroups_dyn");
+      getgrnam_r_impl = __nss_lookup_function (ni, "getgrnam_r");
+      getgrgid_r_impl = __nss_lookup_function (ni, "getgrgid_r");
+      setgrent_impl = __nss_lookup_function (ni, "setgrent");
+      getgrent_r_impl = __nss_lookup_function (ni, "getgrent_r");
+      endgrent_impl = __nss_lookup_function (ni, "endgrent");
     }
 
   __libc_lock_unlock (lock);
@@ -151,8 +150,8 @@ internal_endgrent (ent_t *ent)
   else
     ent->blacklist.current = 0;
 
-  if (ent->need_endgrent && nss_endgrent != NULL)
-    nss_endgrent ();
+  if (ent->need_endgrent && endgrent_impl != NULL)
+    endgrent_impl ();
 
   return NSS_STATUS_SUCCESS;
 }
@@ -244,8 +243,8 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
 	 getgrent_r through the whole group database. But for large
 	 group databases this is faster, since the user can only be
 	 in a limited number of groups.  */
-      if (nss_initgroups_dyn (user, group, &mystart, &mysize, &mygroups,
-			      limit, errnop) == NSS_STATUS_SUCCESS)
+      if (initgroups_dyn_impl (user, group, &mystart, &mysize, &mygroups,
+			       limit, errnop) == NSS_STATUS_SUCCESS)
 	{
 	  status = NSS_STATUS_NOTFOUND;
 
@@ -264,8 +263,8 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
 
 	      for (int i = 0; i < mystart; i++)
 		{
-		  while ((status = nss_getgrgid_r (mygroups[i], &grpbuf,
-						   tmpbuf, tmplen, errnop))
+		  while ((status = getgrgid_r_impl (mygroups[i], &grpbuf,
+						    tmpbuf, tmplen, errnop))
 			 == NSS_STATUS_TRYAGAIN
 			 && *errnop == ERANGE)
                     {
@@ -301,9 +300,9 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
 			  && check_and_add_group (user, group, start, size,
 						  groupsp, limit, &grpbuf))
 			{
-			  if (nss_setgrent != NULL)
+			  if (setgrent_impl != NULL)
 			    {
-			      nss_setgrent (1);
+			      setgrent_impl (1);
 			      ent->need_endgrent = true;
 			    }
 			  ent->skip_initgroups_dyn = true;
@@ -334,7 +333,7 @@ getgrent_next_nss (ent_t *ent, char *buffer, size_t buflen, const char *user,
  iter:
   do
     {
-      if ((status = nss_getgrent_r (&grpbuf, buffer, buflen, errnop))
+      if ((status = getgrent_r_impl (&grpbuf, buffer, buflen, errnop))
 	  != NSS_STATUS_SUCCESS)
 	break;
     }
@@ -426,10 +425,10 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user,
 	  /* Store the group in the blacklist for the "+" at the end of
 	     /etc/group */
 	  blacklist_store_name (&grpbuf.gr_name[1], ent);
-	  if (nss_getgrnam_r == NULL)
+	  if (getgrnam_r_impl == NULL)
 	    return NSS_STATUS_UNAVAIL;
-	  else if (nss_getgrnam_r (&grpbuf.gr_name[1], &grpbuf, buffer,
-				   buflen, errnop) != NSS_STATUS_SUCCESS)
+	  else if (getgrnam_r_impl (&grpbuf.gr_name[1], &grpbuf, buffer,
+				    buflen, errnop) != NSS_STATUS_SUCCESS)
 	    continue;
 
 	  check_and_add_group (user, group, start, size, groupsp,
@@ -444,16 +443,16 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user,
 	  /* If the selected module does not support getgrent_r or
 	     initgroups_dyn, abort. We cannot find the needed group
 	     entries.  */
-	  if (nss_initgroups_dyn == NULL || nss_getgrgid_r == NULL)
+	  if (initgroups_dyn_impl == NULL || getgrgid_r_impl == NULL)
 	    {
-	      if (nss_setgrent != NULL)
+	      if (setgrent_impl != NULL)
 		{
-		  nss_setgrent (1);
+		  setgrent_impl (1);
 		  ent->need_endgrent = true;
 		}
 	      ent->skip_initgroups_dyn = true;
 
-	      if (nss_getgrent_r == NULL)
+	      if (getgrent_r_impl == NULL)
 		return NSS_STATUS_UNAVAIL;
 	    }
 
diff --git a/nss/nss_compat/compat-pwd.c b/nss/nss_compat/compat-pwd.c
index ec3f35c594..b964e6f644 100644
--- a/nss/nss_compat/compat-pwd.c
+++ b/nss/nss_compat/compat-pwd.c
@@ -32,16 +32,16 @@
 #include "nisdomain.h"
 
 static service_user *ni;
-static enum nss_status (*nss_setpwent) (int stayopen);
-static enum nss_status (*nss_getpwnam_r) (const char *name,
-					  struct passwd * pwd, char *buffer,
-					  size_t buflen, int *errnop);
-static enum nss_status (*nss_getpwuid_r) (uid_t uid, struct passwd * pwd,
-					  char *buffer, size_t buflen,
-					  int *errnop);
-static enum nss_status (*nss_getpwent_r) (struct passwd * pwd, char *buffer,
-					  size_t buflen, int *errnop);
-static enum nss_status (*nss_endpwent) (void);
+static enum nss_status (*setpwent_impl) (int stayopen);
+static enum nss_status (*getpwnam_r_impl) (const char *name,
+					   struct passwd * pwd, char *buffer,
+					   size_t buflen, int *errnop);
+static enum nss_status (*getpwuid_r_impl) (uid_t uid, struct passwd * pwd,
+					   char *buffer, size_t buflen,
+					   int *errnop);
+static enum nss_status (*getpwent_r_impl) (struct passwd * pwd, char *buffer,
+					   size_t buflen, int *errnop);
+static enum nss_status (*endpwent_impl) (void);
 
 /* Get the declaration of the parser function.  */
 #define ENTNAME pwent
@@ -90,11 +90,11 @@ init_nss_interface (void)
 {
   if (__nss_database_lookup2 ("passwd_compat", NULL, "nis", &ni) >= 0)
     {
-      nss_setpwent = __nss_lookup_function (ni, "setpwent");
-      nss_getpwnam_r = __nss_lookup_function (ni, "getpwnam_r");
-      nss_getpwuid_r = __nss_lookup_function (ni, "getpwuid_r");
-      nss_getpwent_r = __nss_lookup_function (ni, "getpwent_r");
-      nss_endpwent = __nss_lookup_function (ni, "endpwent");
+      setpwent_impl = __nss_lookup_function (ni, "setpwent");
+      getpwnam_r_impl = __nss_lookup_function (ni, "getpwnam_r");
+      getpwuid_r_impl = __nss_lookup_function (ni, "getpwuid_r");
+      getpwent_r_impl = __nss_lookup_function (ni, "getpwent_r");
+      endpwent_impl = __nss_lookup_function (ni, "endpwent");
     }
 }
 
@@ -234,8 +234,8 @@ internal_setpwent (ent_t *ent, int stayopen, int needent)
 
   give_pwd_free (&ent->pwd);
 
-  if (needent && status == NSS_STATUS_SUCCESS && nss_setpwent)
-    ent->setent_status = nss_setpwent (stayopen);
+  if (needent && status == NSS_STATUS_SUCCESS && setpwent_impl)
+    ent->setent_status = setpwent_impl (stayopen);
 
   return status;
 }
@@ -294,8 +294,8 @@ _nss_compat_endpwent (void)
 
   __libc_lock_lock (lock);
 
-  if (nss_endpwent)
-    nss_endpwent ();
+  if (endpwent_impl)
+    endpwent_impl ();
 
   result = internal_endpwent (&ext_ent);
 
@@ -316,7 +316,7 @@ getpwent_next_nss_netgr (const char *name, struct passwd *result, ent_t *ent,
 
   /* Leave function if NSS module does not support getpwnam_r,
      we need this function here.  */
-  if (!nss_getpwnam_r)
+  if (!getpwnam_r_impl)
     return NSS_STATUS_UNAVAIL;
 
   if (ent->first)
@@ -370,7 +370,7 @@ getpwent_next_nss_netgr (const char *name, struct passwd *result, ent_t *ent,
       p2 = buffer + (buflen - p2len);
       buflen -= p2len;
 
-      if (nss_getpwnam_r (user, result, buffer, buflen, errnop)
+      if (getpwnam_r_impl (user, result, buffer, buflen, errnop)
 	  != NSS_STATUS_SUCCESS)
 	continue;
 
@@ -397,7 +397,7 @@ getpwent_next_nss (struct passwd *result, ent_t *ent, char *buffer,
   size_t p2len;
 
   /* Return if NSS module does not support getpwent_r.  */
-  if (!nss_getpwent_r)
+  if (!getpwent_r_impl)
     return NSS_STATUS_UNAVAIL;
 
   /* If the setpwent call failed, say so.  */
@@ -418,7 +418,7 @@ getpwent_next_nss (struct passwd *result, ent_t *ent, char *buffer,
 
   do
     {
-      if ((status = nss_getpwent_r (result, buffer, buflen, errnop))
+      if ((status = getpwent_r_impl (result, buffer, buflen, errnop))
 	  != NSS_STATUS_SUCCESS)
 	return status;
     }
@@ -434,7 +434,7 @@ static enum nss_status
 getpwnam_plususer (const char *name, struct passwd *result, ent_t *ent,
 		   char *buffer, size_t buflen, int *errnop)
 {
-  if (!nss_getpwnam_r)
+  if (!getpwnam_r_impl)
     return NSS_STATUS_UNAVAIL;
 
   struct passwd pwd;
@@ -451,8 +451,8 @@ getpwnam_plususer (const char *name, struct passwd *result, ent_t *ent,
   char *p = buffer + (buflen - plen);
   buflen -= plen;
 
-  enum nss_status status = nss_getpwnam_r (name, result, buffer, buflen,
-					   errnop);
+  enum nss_status status = getpwnam_r_impl (name, result, buffer, buflen,
+					    errnop);
   if (status != NSS_STATUS_SUCCESS)
     return status;
 
@@ -836,7 +836,7 @@ getpwuid_plususer (uid_t uid, struct passwd *result, char *buffer,
   char *p;
   size_t plen;
 
-  if (!nss_getpwuid_r)
+  if (!getpwuid_r_impl)
     return NSS_STATUS_UNAVAIL;
 
   memset (&pwd, '\0', sizeof (struct passwd));
@@ -852,7 +852,7 @@ getpwuid_plususer (uid_t uid, struct passwd *result, char *buffer,
   p = buffer + (buflen - plen);
   buflen -= plen;
 
-  if (nss_getpwuid_r (uid, result, buffer, buflen, errnop) ==
+  if (getpwuid_r_impl (uid, result, buffer, buflen, errnop) ==
       NSS_STATUS_SUCCESS)
     {
       copy_pwd_changes (result, &pwd, p, plen);
diff --git a/nss/nss_compat/compat-spwd.c b/nss/nss_compat/compat-spwd.c
index f6b7a1ef15..15f5b95bb0 100644
--- a/nss/nss_compat/compat-spwd.c
+++ b/nss/nss_compat/compat-spwd.c
@@ -32,13 +32,13 @@
 #include "nisdomain.h"
 
 static service_user *ni;
-static enum nss_status (*nss_setspent) (int stayopen);
-static enum nss_status (*nss_getspnam_r) (const char *name, struct spwd * sp,
-					  char *buffer, size_t buflen,
-					  int *errnop);
-static enum nss_status (*nss_getspent_r) (struct spwd * sp, char *buffer,
-					  size_t buflen, int *errnop);
-static enum nss_status (*nss_endspent) (void);
+static enum nss_status (*setspent_impl) (int stayopen);
+static enum nss_status (*getspnam_r_impl) (const char *name, struct spwd * sp,
+					   char *buffer, size_t buflen,
+					   int *errnop);
+static enum nss_status (*getspent_r_impl) (struct spwd * sp, char *buffer,
+					   size_t buflen, int *errnop);
+static enum nss_status (*endspent_impl) (void);
 
 /* Get the declaration of the parser function.  */
 #define ENTNAME spent
@@ -88,10 +88,10 @@ init_nss_interface (void)
   if (__nss_database_lookup2 ("shadow_compat", "passwd_compat",
 			      "nis", &ni) >= 0)
     {
-      nss_setspent = __nss_lookup_function (ni, "setspent");
-      nss_getspnam_r = __nss_lookup_function (ni, "getspnam_r");
-      nss_getspent_r = __nss_lookup_function (ni, "getspent_r");
-      nss_endspent = __nss_lookup_function (ni, "endspent");
+      setspent_impl = __nss_lookup_function (ni, "setspent");
+      getspnam_r_impl = __nss_lookup_function (ni, "getspnam_r");
+      getspent_r_impl = __nss_lookup_function (ni, "getspent_r");
+      endspent_impl = __nss_lookup_function (ni, "endspent");
     }
 }
 
@@ -190,8 +190,8 @@ internal_setspent (ent_t *ent, int stayopen, int needent)
 
   give_spwd_free (&ent->pwd);
 
-  if (needent && status == NSS_STATUS_SUCCESS && nss_setspent)
-    ent->setent_status = nss_setspent (stayopen);
+  if (needent && status == NSS_STATUS_SUCCESS && setspent_impl)
+    ent->setent_status = setspent_impl (stayopen);
 
   return status;
 }
@@ -251,8 +251,8 @@ _nss_compat_endspent (void)
 
   __libc_lock_lock (lock);
 
-  if (nss_endspent)
-    nss_endspent ();
+  if (endspent_impl)
+    endspent_impl ();
 
   result = internal_endspent (&ext_ent);
 
@@ -270,7 +270,7 @@ getspent_next_nss_netgr (const char *name, struct spwd *result, ent_t *ent,
   char *curdomain = NULL, *host, *user, *domain, *p2;
   size_t p2len;
 
-  if (!nss_getspnam_r)
+  if (!getspnam_r_impl)
     return NSS_STATUS_UNAVAIL;
 
   /* If the setpwent call failed, say so.  */
@@ -330,7 +330,7 @@ getspent_next_nss_netgr (const char *name, struct spwd *result, ent_t *ent,
       p2 = buffer + (buflen - p2len);
       buflen -= p2len;
 
-      if (nss_getspnam_r (user, result, buffer, buflen, errnop)
+      if (getspnam_r_impl (user, result, buffer, buflen, errnop)
 	  != NSS_STATUS_SUCCESS)
 	continue;
 
@@ -356,7 +356,7 @@ getspent_next_nss (struct spwd *result, ent_t *ent,
   char *p2;
   size_t p2len;
 
-  if (!nss_getspent_r)
+  if (!getspent_r_impl)
     return NSS_STATUS_UNAVAIL;
 
   p2len = spwd_need_buflen (&ent->pwd);
@@ -369,7 +369,7 @@ getspent_next_nss (struct spwd *result, ent_t *ent,
   buflen -= p2len;
   do
     {
-      if ((status = nss_getspent_r (result, buffer, buflen, errnop))
+      if ((status = getspent_r_impl (result, buffer, buflen, errnop))
 	  != NSS_STATUS_SUCCESS)
 	return status;
     }
@@ -386,7 +386,7 @@ static enum nss_status
 getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,
 		   char *buffer, size_t buflen, int *errnop)
 {
-  if (!nss_getspnam_r)
+  if (!getspnam_r_impl)
     return NSS_STATUS_UNAVAIL;
 
   struct spwd pwd;
@@ -407,8 +407,8 @@ getspnam_plususer (const char *name, struct spwd *result, ent_t *ent,
   char *p = buffer + (buflen - plen);
   buflen -= plen;
 
-  enum nss_status status = nss_getspnam_r (name, result, buffer, buflen,
-					   errnop);
+  enum nss_status status = getspnam_r_impl (name, result, buffer, buflen,
+					    errnop);
   if (status != NSS_STATUS_SUCCESS)
     return status;
 
-- 
2.24.1



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

* [PATCH 2/7] nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h>
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
  2020-02-12 14:34 ` [PATCH 1/7] nss_compat: Do not use nss_* names for function pointers Florian Weimer
@ 2020-02-12 14:34 ` Florian Weimer
  2020-02-13  1:10   ` DJ Delorie
  2020-02-12 14:34 ` [PATCH 3/7] nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS Florian Weimer
                   ` (6 subsequent siblings)
  8 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:34 UTC (permalink / raw)
  To: libc-alpha

This macro allows to add type safety to the implementation of NSS
service modules.
---
 nscd/aicache.c              |  23 +---
 nss/nss.h                   | 203 +++++++++++++++++++++++++++++++++++-
 sysdeps/posix/getaddrinfo.c |  18 +---
 3 files changed, 209 insertions(+), 35 deletions(-)

diff --git a/nscd/aicache.c b/nscd/aicache.c
index 46db40fceb..ee9c9b8843 100644
--- a/nscd/aicache.c
+++ b/nscd/aicache.c
@@ -33,19 +33,6 @@
 #include "nscd.h"
 
 
-typedef enum nss_status (*nss_gethostbyname4_r)
-  (const char *name, struct gaih_addrtuple **pat,
-   char *buffer, size_t buflen, int *errnop,
-   int *h_errnop, int32_t *ttlp);
-typedef enum nss_status (*nss_gethostbyname3_r)
-  (const char *name, int af, struct hostent *host,
-   char *buffer, size_t buflen, int *errnop,
-   int *h_errnop, int32_t *, char **);
-typedef enum nss_status (*nss_getcanonname_r)
-  (const char *name, char *buffer, size_t buflen, char **result,
-   int *errnop, int *h_errnop);
-
-
 static const ai_response_header notfound =
 {
   .version = NSCD_VERSION,
@@ -127,8 +114,8 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
       char *canon = NULL;
       size_t canonlen;
 
-      nss_gethostbyname4_r fct4 = __nss_lookup_function (nip,
-							 "gethostbyname4_r");
+      nss_gethostbyname4_r *fct4 = __nss_lookup_function (nip,
+							  "gethostbyname4_r");
       if (fct4 != NULL)
 	{
 	  struct gaih_addrtuple atmem;
@@ -212,8 +199,8 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
 	{
 	  /* Prefer the function which also returns the TTL and
 	     canonical name.  */
-	  nss_gethostbyname3_r fct = __nss_lookup_function (nip,
-							    "gethostbyname3_r");
+	  nss_gethostbyname3_r *fct
+	    = __nss_lookup_function (nip, "gethostbyname3_r");
 	  if (fct == NULL)
 	    fct = __nss_lookup_function (nip, "gethostbyname2_r");
 
@@ -279,7 +266,7 @@ addhstaiX (struct database_dyn *db, int fd, request_header *req,
 	  if (canon == NULL)
 	    {
 	      /* Determine the canonical name.  */
-	      nss_getcanonname_r cfct;
+	      nss_getcanonname_r *cfct;
 	      cfct = __nss_lookup_function (nip, "getcanonname_r");
 	      if (cfct != NULL)
 		{
diff --git a/nss/nss.h b/nss/nss.h
index 390ea34aaf..80422975e5 100644
--- a/nss/nss.h
+++ b/nss/nss.h
@@ -19,10 +19,12 @@
    and for implementors of new services.  */
 
 #ifndef _NSS_H
-#define _NSS_H	1
+#define _NSS_H  1
 
 #include <features.h>
+#include <stddef.h>
 #include <stdint.h>
+#include <sys/types.h>
 
 
 __BEGIN_DECLS
@@ -56,7 +58,204 @@ struct gaih_addrtuple
    Attention: Using this function repeatedly will slowly eat up the
    whole memory since previous selection data cannot be freed.  */
 extern int __nss_configure_lookup (const char *__dbname,
-				   const char *__string) __THROW;
+                                   const char *__string) __THROW;
+
+/* NSS-related types.  */
+struct __netgrent;
+struct aliasent;
+struct ether_addr;
+struct etherent;
+struct group;
+struct hostent;
+struct netent;
+struct passwd;
+struct protoent;
+struct rpcent;
+struct servent;
+struct sgrp;
+struct spwd;
+struct traced_file;
+
+/* Types of functions exported from NSS service modules.  */
+typedef enum nss_status nss_endaliasent (void);
+typedef enum nss_status nss_endetherent (void);
+typedef enum nss_status nss_endgrent (void);
+typedef enum nss_status nss_endhostent (void);
+typedef enum nss_status nss_endnetent (void);
+typedef enum nss_status nss_endnetgrent (struct __netgrent *);
+typedef enum nss_status nss_endprotoent (void);
+typedef enum nss_status nss_endpwent (void);
+typedef enum nss_status nss_endrpcent (void);
+typedef enum nss_status nss_endservent (void);
+typedef enum nss_status nss_endsgent (void);
+typedef enum nss_status nss_endspent (void);
+typedef enum nss_status nss_getaliasbyname_r (const char *, struct aliasent *,
+                                              char *, size_t, int *);
+typedef enum nss_status nss_getaliasent_r (struct aliasent *,
+                                           char *, size_t, int *);
+typedef enum nss_status nss_getcanonname_r (const char *, char *, size_t,
+                                            char **, int *, int *);
+typedef enum nss_status nss_getetherent_r (struct etherent *,
+                                           char *, size_t, int *);
+typedef enum nss_status nss_getgrent_r (struct group *, char *, size_t, int *);
+typedef enum nss_status nss_getgrgid_r (__gid_t, struct group *,
+                                        char *, size_t, int *);
+typedef enum nss_status nss_getgrnam_r (const char *, struct group *,
+                                        char *, size_t, int *);
+typedef enum nss_status nss_gethostbyaddr2_r (const void *, __socklen_t, int,
+                                              struct hostent *, char *, size_t,
+                                              int *, int *, int32_t *);
+typedef enum nss_status nss_gethostbyaddr_r (const void *, __socklen_t, int,
+                                             struct hostent *, char *, size_t,
+                                             int *, int *);
+typedef enum nss_status nss_gethostbyname2_r (const char *, int,
+                                              struct hostent *, char *, size_t,
+                                              int *, int *);
+typedef enum nss_status nss_gethostbyname3_r (const char *, int,
+                                              struct hostent *, char *, size_t,
+                                              int *, int *, int32_t *,
+                                              char **);
+typedef enum nss_status nss_gethostbyname4_r (const char *,
+                                              struct gaih_addrtuple **,
+                                              char *, size_t,
+                                              int *, int *, int32_t *);
+typedef enum nss_status nss_gethostbyname_r (const char *, struct hostent *,
+                                             char *, size_t, int *, int *);
+typedef enum nss_status nss_gethostent_r (struct hostent *, char *, size_t,
+                                          int *, int *);
+typedef enum nss_status nss_gethostton_r (const char *, struct etherent *,
+                                          char *, size_t, int *);
+typedef enum nss_status nss_getnetbyaddr_r (uint32_t, int, struct netent *,
+                                            char *, size_t, int *, int *);
+typedef enum nss_status nss_getnetbyname_r (const char *, struct netent *,
+                                            char *, size_t, int *, int *);
+typedef enum nss_status nss_getnetent_r (struct netent *,
+                                         char *, size_t, int *, int *);
+typedef enum nss_status nss_getnetgrent_r (struct __netgrent *,
+                                           char *, size_t, int *);
+typedef enum nss_status nss_getntohost_r (const struct ether_addr *,
+                                          struct etherent *, char *, size_t,
+                                          int *);
+typedef enum nss_status nss_getprotobyname_r (const char *, struct protoent *,
+                                              char *, size_t, int *);
+typedef enum nss_status nss_getprotobynumber_r (int, struct protoent *,
+                                                char *, size_t, int *);
+typedef enum nss_status nss_getprotoent_r (struct protoent *,
+                                           char *, size_t, int *);
+typedef enum nss_status nss_getpublickey (const char *, char *, int *);
+typedef enum nss_status nss_getpwent_r (struct passwd *,
+                                        char *, size_t, int *);
+typedef enum nss_status nss_getpwnam_r (const char *, struct passwd *,
+                                        char *, size_t, int *);
+typedef enum nss_status nss_getpwuid_r (__uid_t, struct passwd *,
+                                        char *, size_t, int *);
+typedef enum nss_status nss_getrpcbyname_r (const char *, struct rpcent *,
+                                            char *, size_t, int *);
+typedef enum nss_status nss_getrpcbynumber_r (int, struct rpcent *,
+                                              char *, size_t, int *);
+typedef enum nss_status nss_getrpcent_r (struct rpcent *,
+                                         char *, size_t, int *);
+typedef enum nss_status nss_getsecretkey (const char *, char *, char *, int *);
+typedef enum nss_status nss_getservbyname_r (const char *, const char *,
+                                             struct servent *, char *, size_t,
+                                             int *);
+typedef enum nss_status nss_getservbyport_r (int, const char *,
+                                             struct servent *, char *, size_t,
+                                             int *);
+typedef enum nss_status nss_getservent_r (struct servent *, char *, size_t,
+                                          int *);
+typedef enum nss_status nss_getsgent_r (struct sgrp *, char *, size_t, int *);
+typedef enum nss_status nss_getsgnam_r (const char *, struct sgrp *,
+                                        char *, size_t, int *);
+typedef enum nss_status nss_getspent_r (struct spwd *, char *, size_t, int *);
+typedef enum nss_status nss_getspnam_r (const char *, struct spwd *,
+                                        char *, size_t, int *);
+typedef void nss_init (void (*) (size_t, struct traced_file *));
+typedef enum nss_status nss_initgroups_dyn (const char *, __gid_t, long int *,
+                                            long int *, __gid_t **, long int,
+                                            int *);
+typedef enum nss_status nss_netname2user (char [], __uid_t *, __gid_t *,
+                                          int *, __gid_t *, int *);
+typedef enum nss_status nss_setaliasent (void);
+typedef enum nss_status nss_setetherent (int);
+typedef enum nss_status nss_setgrent (int);
+typedef enum nss_status nss_sethostent (int);
+typedef enum nss_status nss_setnetent (int);
+typedef enum nss_status nss_setnetgrent (const char *, struct __netgrent *);
+typedef enum nss_status nss_setprotoent (int);
+typedef enum nss_status nss_setpwent (int);
+typedef enum nss_status nss_setrpcent (int);
+typedef enum nss_status nss_setservent (int);
+typedef enum nss_status nss_setsgent (int);
+typedef enum nss_status nss_setspent (int);
+
+/* Declare all NSS functions for MODULE.  */
+#define NSS_DECLARE_MODULE_FUNCTIONS(module)                            \
+  extern nss_endaliasent _nss_##module##_endaliasent;                    \
+  extern nss_endetherent _nss_##module##_endetherent;                    \
+  extern nss_endgrent _nss_##module##_endgrent;                          \
+  extern nss_endhostent _nss_##module##_endhostent;                      \
+  extern nss_endnetent _nss_##module##_endnetent;                        \
+  extern nss_endnetgrent _nss_##module##__endnetgrent;                   \
+  extern nss_endprotoent _nss_##module##_endprotoent;                    \
+  extern nss_endpwent _nss_##module##_endpwent;                          \
+  extern nss_endrpcent _nss_##module##_endrpcent;                        \
+  extern nss_endservent _nss_##module##_endservent;                      \
+  extern nss_endsgent _nss_##module##_endsgent;                          \
+  extern nss_endspent _nss_##module##_endspent;                          \
+  extern nss_getaliasbyname_r _nss_##module##_getaliasbyname_r;          \
+  extern nss_getaliasent_r _nss_##module##_getaliasent_r;                \
+  extern nss_getcanonname_r _nss_##module##_getcanonname_r;              \
+  extern nss_getetherent_r _nss_##module##_getetherent_r;                \
+  extern nss_getgrent_r _nss_##module##_getgrent_r;                      \
+  extern nss_getgrgid_r _nss_##module##_getgrgid_r;                      \
+  extern nss_getgrnam_r _nss_##module##_getgrnam_r;                      \
+  extern nss_gethostbyaddr2_r _nss_##module##_gethostbyaddr2_r;          \
+  extern nss_gethostbyaddr_r _nss_##module##_gethostbyaddr_r;            \
+  extern nss_gethostbyname2_r _nss_##module##_gethostbyname2_r;          \
+  extern nss_gethostbyname3_r _nss_##module##_gethostbyname3_r;          \
+  extern nss_gethostbyname4_r _nss_##module##_gethostbyname4_r;          \
+  extern nss_gethostbyname_r _nss_##module##_gethostbyname_r;            \
+  extern nss_gethostent_r _nss_##module##_gethostent_r;                  \
+  extern nss_gethostton_r _nss_##module##_gethostton_r;                  \
+  extern nss_getnetbyaddr_r _nss_##module##_getnetbyaddr_r;              \
+  extern nss_getnetbyname_r _nss_##module##_getnetbyname_r;              \
+  extern nss_getnetent_r _nss_##module##_getnetent_r;                    \
+  extern nss_getnetgrent_r _nss_##module##_getnetgrent_r;                \
+  extern nss_getntohost_r _nss_##module##_getntohost_r;                  \
+  extern nss_getprotobyname_r _nss_##module##_getprotobyname_r;          \
+  extern nss_getprotobynumber_r _nss_##module##_getprotobynumber_r;      \
+  extern nss_getprotoent_r _nss_##module##_getprotoent_r;                \
+  extern nss_getpublickey _nss_##module##_getpublickey;                  \
+  extern nss_getpwent_r _nss_##module##_getpwent_r;                      \
+  extern nss_getpwnam_r _nss_##module##_getpwnam_r;                      \
+  extern nss_getpwuid_r _nss_##module##_getpwuid_r;                      \
+  extern nss_getrpcbyname_r _nss_##module##_getrpcbyname_r;              \
+  extern nss_getrpcbynumber_r _nss_##module##_getrpcbynumber_r;          \
+  extern nss_getrpcent_r _nss_##module##_getrpcent_r;                    \
+  extern nss_getsecretkey _nss_##module##_getsecretkey;                  \
+  extern nss_getservbyname_r _nss_##module##_getservbyname_r;            \
+  extern nss_getservbyport_r _nss_##module##_getservbyport_r;            \
+  extern nss_getservent_r _nss_##module##_getservent_r;                  \
+  extern nss_getsgent_r _nss_##module##_getsgent_r;                      \
+  extern nss_getsgnam_r _nss_##module##_getsgnam_r;                      \
+  extern nss_getspent_r _nss_##module##_getspent_r;                      \
+  extern nss_getspnam_r _nss_##module##_getspnam_r;                      \
+  extern nss_init _nss_##module##_init;                                  \
+  extern nss_initgroups_dyn _nss_##module##_initgroups_dyn;              \
+  extern nss_netname2user _nss_##module##_netname2user;                  \
+  extern nss_setaliasent _nss_##module##_setaliasent;                    \
+  extern nss_setetherent _nss_##module##_setetherent;                    \
+  extern nss_setgrent _nss_##module##_setgrent;                          \
+  extern nss_sethostent _nss_##module##_sethostent;                      \
+  extern nss_setnetent _nss_##module##_setnetent;                        \
+  extern nss_setnetgrent _nss_##module##_setnetgrent;                    \
+  extern nss_setprotoent _nss_##module##_setprotoent;                    \
+  extern nss_setpwent _nss_##module##_setpwent;                          \
+  extern nss_setrpcent _nss_##module##_setrpcent;                        \
+  extern nss_setservent _nss_##module##_setservent;                      \
+  extern nss_setsgent _nss_##module##_setsgent;                          \
+  extern nss_setspent _nss_##module##_setspent;                          \
 
 __END_DECLS
 
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 538691a598..ed04e564f9 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -300,18 +300,6 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req,
  }
 
 
-typedef enum nss_status (*nss_gethostbyname4_r)
-  (const char *name, struct gaih_addrtuple **pat,
-   char *buffer, size_t buflen, int *errnop,
-   int *h_errnop, int32_t *ttlp);
-typedef enum nss_status (*nss_gethostbyname3_r)
-  (const char *name, int af, struct hostent *host,
-   char *buffer, size_t buflen, int *errnop,
-   int *h_errnop, int32_t *ttlp, char **canonp);
-typedef enum nss_status (*nss_getcanonname_r)
-  (const char *name, char *buffer, size_t buflen, char **result,
-   int *errnop, int *h_errnop);
-
 /* This function is called if a canonical name is requested, but if
    the service function did not provide it.  It tries to obtain the
    name using getcanonname_r from the same service NIP.  If the name
@@ -321,7 +309,7 @@ typedef enum nss_status (*nss_getcanonname_r)
 static char *
 getcanonname (service_user *nip, struct gaih_addrtuple *at, const char *name)
 {
-  nss_getcanonname_r cfct = __nss_lookup_function (nip, "getcanonname_r");
+  nss_getcanonname_r *cfct = __nss_lookup_function (nip, "getcanonname_r");
   char *s = (char *) name;
   if (cfct != NULL)
     {
@@ -751,7 +739,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
 	  while (!no_more)
 	    {
 	      no_data = 0;
-	      nss_gethostbyname4_r fct4 = NULL;
+	      nss_gethostbyname4_r *fct4 = NULL;
 
 	      /* gethostbyname4_r sends out parallel A and AAAA queries and
 		 is thus only suitable for PF_UNSPEC.  */
@@ -827,7 +815,7 @@ gaih_inet (const char *name, const struct gaih_service *service,
 		}
 	      else
 		{
-		  nss_gethostbyname3_r fct = NULL;
+		  nss_gethostbyname3_r *fct = NULL;
 		  if (req->ai_flags & AI_CANONNAME)
 		    /* No need to use this function if we do not look for
 		       the canonical name.  The function does not exist in
-- 
2.24.1



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

* [PATCH 3/7] nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
  2020-02-12 14:34 ` [PATCH 1/7] nss_compat: Do not use nss_* names for function pointers Florian Weimer
  2020-02-12 14:34 ` [PATCH 2/7] nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h> Florian Weimer
@ 2020-02-12 14:34 ` Florian Weimer
  2020-02-13  1:11   ` DJ Delorie
  2020-02-12 14:34 ` [PATCH 4/7] nss_compat: " Florian Weimer
                   ` (5 subsequent siblings)
  8 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:34 UTC (permalink / raw)
  To: libc-alpha

---
 hesiod/nss_hesiod/hesiod-grp.c     | 2 ++
 hesiod/nss_hesiod/hesiod-proto.c   | 2 ++
 hesiod/nss_hesiod/hesiod-pwd.c     | 2 ++
 hesiod/nss_hesiod/hesiod-service.c | 2 ++
 4 files changed, 8 insertions(+)

diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c
index c6d02247b7..158d4f02d8 100644
--- a/hesiod/nss_hesiod/hesiod-grp.c
+++ b/hesiod/nss_hesiod/hesiod-grp.c
@@ -26,6 +26,8 @@
 #include <string.h>
 #include <sys/param.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (hesiod)
+
 /* Get the declaration of the parser function.  */
 #define ENTNAME grent
 #define STRUCTURE group
diff --git a/hesiod/nss_hesiod/hesiod-proto.c b/hesiod/nss_hesiod/hesiod-proto.c
index d317fb71df..03f4fa2131 100644
--- a/hesiod/nss_hesiod/hesiod-proto.c
+++ b/hesiod/nss_hesiod/hesiod-proto.c
@@ -25,6 +25,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (hesiod)
+
 /* Declare a parser for Hesiod protocol entries.  Although the format
    of the entries is identical to those in /etc/protocols, here is no
    predefined parser for us to use.  */
diff --git a/hesiod/nss_hesiod/hesiod-pwd.c b/hesiod/nss_hesiod/hesiod-pwd.c
index 335b594f31..36ca3d1a19 100644
--- a/hesiod/nss_hesiod/hesiod-pwd.c
+++ b/hesiod/nss_hesiod/hesiod-pwd.c
@@ -24,6 +24,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (hesiod)
+
 /* Get the declaration of the parser function.  */
 #define ENTNAME pwent
 #define STRUCTURE passwd
diff --git a/hesiod/nss_hesiod/hesiod-service.c b/hesiod/nss_hesiod/hesiod-service.c
index 94fa5112c9..ce93fd3d8f 100644
--- a/hesiod/nss_hesiod/hesiod-service.c
+++ b/hesiod/nss_hesiod/hesiod-service.c
@@ -25,6 +25,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (hesiod)
+
 /* Hesiod uses a format for service entries that differs from the
    traditional format.  We therefore declare our own parser.  */
 
-- 
2.24.1



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

* [PATCH 4/7] nss_compat: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
                   ` (2 preceding siblings ...)
  2020-02-12 14:34 ` [PATCH 3/7] nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS Florian Weimer
@ 2020-02-12 14:34 ` Florian Weimer
  2020-02-13  1:14   ` DJ Delorie
  2020-02-12 14:34 ` [PATCH 5/7] nss_db: " Florian Weimer
                   ` (4 subsequent siblings)
  8 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:34 UTC (permalink / raw)
  To: libc-alpha

---
 nss/nss_compat/compat-grp.c        | 2 ++
 nss/nss_compat/compat-initgroups.c | 2 ++
 nss/nss_compat/compat-pwd.c        | 2 ++
 nss/nss_compat/compat-spwd.c       | 2 ++
 4 files changed, 8 insertions(+)

diff --git a/nss/nss_compat/compat-grp.c b/nss/nss_compat/compat-grp.c
index 561511c91a..14aadc6f01 100644
--- a/nss/nss_compat/compat-grp.c
+++ b/nss/nss_compat/compat-grp.c
@@ -27,6 +27,8 @@
 #include <libc-lock.h>
 #include <kernel-features.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (compat)
+
 static service_user *ni;
 static enum nss_status (*setgrent_impl) (int stayopen);
 static enum nss_status (*getgrnam_r_impl) (const char *name,
diff --git a/nss/nss_compat/compat-initgroups.c b/nss/nss_compat/compat-initgroups.c
index d2a280d9c3..67a4c100f6 100644
--- a/nss/nss_compat/compat-initgroups.c
+++ b/nss/nss_compat/compat-initgroups.c
@@ -30,6 +30,8 @@
 #include <kernel-features.h>
 #include <scratch_buffer.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (compat)
+
 static service_user *ni;
 static enum nss_status (*initgroups_dyn_impl) (const char *, gid_t,
 					       long int *, long int *,
diff --git a/nss/nss_compat/compat-pwd.c b/nss/nss_compat/compat-pwd.c
index b964e6f644..dfb454f777 100644
--- a/nss/nss_compat/compat-pwd.c
+++ b/nss/nss_compat/compat-pwd.c
@@ -31,6 +31,8 @@
 #include "netgroup.h"
 #include "nisdomain.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (compat)
+
 static service_user *ni;
 static enum nss_status (*setpwent_impl) (int stayopen);
 static enum nss_status (*getpwnam_r_impl) (const char *name,
diff --git a/nss/nss_compat/compat-spwd.c b/nss/nss_compat/compat-spwd.c
index 15f5b95bb0..0a1fde1ea4 100644
--- a/nss/nss_compat/compat-spwd.c
+++ b/nss/nss_compat/compat-spwd.c
@@ -31,6 +31,8 @@
 #include "netgroup.h"
 #include "nisdomain.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (compat)
+
 static service_user *ni;
 static enum nss_status (*setspent_impl) (int stayopen);
 static enum nss_status (*getspnam_r_impl) (const char *name, struct spwd * sp,
-- 
2.24.1



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

* [PATCH 5/7] nss_db: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
                   ` (3 preceding siblings ...)
  2020-02-12 14:34 ` [PATCH 4/7] nss_compat: " Florian Weimer
@ 2020-02-12 14:34 ` Florian Weimer
  2020-02-13  1:18   ` DJ Delorie
  2020-02-12 14:34 ` [PATCH 6/7] nss_files: " Florian Weimer
                   ` (3 subsequent siblings)
  8 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:34 UTC (permalink / raw)
  To: libc-alpha

---
 nss/nss_db/db-init.c       | 2 ++
 nss/nss_db/db-initgroups.c | 1 -
 nss/nss_db/nss_db.h        | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/nss/nss_db/db-init.c b/nss/nss_db/db-init.c
index 1ba5b70dfd..6f48b821f3 100644
--- a/nss/nss_db/db-init.c
+++ b/nss/nss_db/db-init.c
@@ -22,6 +22,8 @@
 #include <nscd/nscd.h>
 #include <string.h>
 
+#include "nss_db.h"
+
 #define PWD_FILENAME (_PATH_VARDB "passwd.db")
 define_traced_file (pwd, PWD_FILENAME);
 
diff --git a/nss/nss_db/db-initgroups.c b/nss/nss_db/db-initgroups.c
index 0ea81c90bb..a8c39d68d9 100644
--- a/nss/nss_db/db-initgroups.c
+++ b/nss/nss_db/db-initgroups.c
@@ -32,7 +32,6 @@
 /* The hashing function we use.  */
 #include "../intl/hash-string.h"
 
-
 enum nss_status
 _nss_db_initgroups_dyn (const char *user, gid_t group, long int *start,
 			long int *size, gid_t **groupsp, long int limit,
diff --git a/nss/nss_db/nss_db.h b/nss/nss_db/nss_db.h
index 24942f5ec9..e354909c58 100644
--- a/nss/nss_db/nss_db.h
+++ b/nss/nss_db/nss_db.h
@@ -23,6 +23,7 @@
 #include <stdint.h>
 #include <libc-lock.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (db)
 
 /* String table index type.  */
 typedef uint32_t stridx_t;
-- 
2.24.1



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

* [PATCH 6/7] nss_files: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
                   ` (4 preceding siblings ...)
  2020-02-12 14:34 ` [PATCH 5/7] nss_db: " Florian Weimer
@ 2020-02-12 14:34 ` Florian Weimer
  2020-02-13  1:26   ` DJ Delorie
  2020-02-12 14:34 ` [PATCH 7/7] nss_dns: " Florian Weimer
                   ` (2 subsequent siblings)
  8 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:34 UTC (permalink / raw)
  To: libc-alpha

---
 nss/nss_files/files-alias.c      | 2 ++
 nss/nss_files/files-ethers.c     | 3 +++
 nss/nss_files/files-grp.c        | 3 +++
 nss/nss_files/files-hosts.c      | 2 ++
 nss/nss_files/files-init.c       | 3 +++
 nss/nss_files/files-initgroups.c | 3 +++
 nss/nss_files/files-key.c        | 2 ++
 nss/nss_files/files-netgrp.c     | 2 ++
 nss/nss_files/files-network.c    | 3 +++
 nss/nss_files/files-proto.c      | 2 ++
 nss/nss_files/files-pwd.c        | 3 +++
 nss/nss_files/files-rpc.c        | 2 ++
 nss/nss_files/files-service.c    | 2 ++
 nss/nss_files/files-sgrp.c       | 3 +++
 nss/nss_files/files-spwd.c       | 3 +++
 15 files changed, 38 insertions(+)

diff --git a/nss/nss_files/files-alias.c b/nss/nss_files/files-alias.c
index 7062181e5b..6aff7b4c10 100644
--- a/nss/nss_files/files-alias.c
+++ b/nss/nss_files/files-alias.c
@@ -30,6 +30,8 @@
 
 #include "nsswitch.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (files)
+
 /* Locks the static variables in this file.  */
 __libc_lock_define_initialized (static, lock)
 \f
diff --git a/nss/nss_files/files-ethers.c b/nss/nss_files/files-ethers.c
index dc618e4027..72c803a35c 100644
--- a/nss/nss_files/files-ethers.c
+++ b/nss/nss_files/files-ethers.c
@@ -18,6 +18,9 @@
 #include <string.h>
 #include <netinet/ether.h>
 #include <netinet/if_ether.h>
+#include <nss.h>
+
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 struct etherent_data {};
 
diff --git a/nss/nss_files/files-grp.c b/nss/nss_files/files-grp.c
index 7db3e42888..8746e033ee 100644
--- a/nss/nss_files/files-grp.c
+++ b/nss/nss_files/files-grp.c
@@ -17,6 +17,9 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <grp.h>
+#include <nss.h>
+
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 #define STRUCTURE	group
 #define ENTNAME		grent
diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
index 92c5d9728d..9f0ed6f085 100644
--- a/nss/nss_files/files-hosts.c
+++ b/nss/nss_files/files-hosts.c
@@ -24,7 +24,9 @@
 #include <resolv/resolv-internal.h>
 #include <scratch_buffer.h>
 #include <alloc_buffer.h>
+#include <nss.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 /* Get implementation for some internal functions.  */
 #include "../resolv/res_hconf.h"
diff --git a/nss/nss_files/files-init.c b/nss/nss_files/files-init.c
index 0929d09b6a..b36220e480 100644
--- a/nss/nss_files/files-init.c
+++ b/nss/nss_files/files-init.c
@@ -20,6 +20,9 @@
 
 #include <string.h>
 #include <nscd/nscd.h>
+#include <nss.h>
+
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 #define PWD_FILENAME "/etc/passwd"
 define_traced_file (pwd, PWD_FILENAME);
diff --git a/nss/nss_files/files-initgroups.c b/nss/nss_files/files-initgroups.c
index 2dd0882d29..577d6ddf1e 100644
--- a/nss/nss_files/files-initgroups.c
+++ b/nss/nss_files/files-initgroups.c
@@ -25,6 +25,9 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include <scratch_buffer.h>
+#include <nss.h>
+
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 enum nss_status
 _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start,
diff --git a/nss/nss_files/files-key.c b/nss/nss_files/files-key.c
index 9ae5a01c1f..cf0a7d9ad9 100644
--- a/nss/nss_files/files-key.c
+++ b/nss/nss_files/files-key.c
@@ -24,6 +24,8 @@
 #include <rpc/des_crypt.h>
 #include "nsswitch.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (files)
+
 #define DATAFILE "/etc/publickey"
 
 
diff --git a/nss/nss_files/files-netgrp.c b/nss/nss_files/files-netgrp.c
index 407ee06d71..2c580af01d 100644
--- a/nss/nss_files/files-netgrp.c
+++ b/nss/nss_files/files-netgrp.c
@@ -27,6 +27,8 @@
 #include "nsswitch.h"
 #include "netgroup.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (files)
+
 #define DATAFILE	"/etc/netgroup"
 
 libnss_files_hidden_proto (_nss_files_endnetgrent)
diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
index 6530d51c3b..cc71e3ab2e 100644
--- a/nss/nss_files/files-network.c
+++ b/nss/nss_files/files-network.c
@@ -20,6 +20,9 @@
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <stdint.h>
+#include <nss.h>
+
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 #define ENTNAME		netent
 #define DATABASE	"networks"
diff --git a/nss/nss_files/files-proto.c b/nss/nss_files/files-proto.c
index a30ac52e7b..c30bedc0aa 100644
--- a/nss/nss_files/files-proto.c
+++ b/nss/nss_files/files-proto.c
@@ -17,7 +17,9 @@
    <https://www.gnu.org/licenses/>.  */
 
 #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 91c728e86c..51aa9a0cd3 100644
--- a/nss/nss_files/files-pwd.c
+++ b/nss/nss_files/files-pwd.c
@@ -17,6 +17,9 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <pwd.h>
+#include <nss.h>
+
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 #define STRUCTURE	passwd
 #define ENTNAME		pwent
diff --git a/nss/nss_files/files-rpc.c b/nss/nss_files/files-rpc.c
index a2587bbaa8..ea4bcb1423 100644
--- a/nss/nss_files/files-rpc.c
+++ b/nss/nss_files/files-rpc.c
@@ -17,7 +17,9 @@
    <https://www.gnu.org/licenses/>.  */
 
 #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 e2f461677c..bfc2590699 100644
--- a/nss/nss_files/files-service.c
+++ b/nss/nss_files/files-service.c
@@ -18,7 +18,9 @@
 
 #include <netinet/in.h>
 #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 00d206bcbc..303c8fa690 100644
--- a/nss/nss_files/files-sgrp.c
+++ b/nss/nss_files/files-sgrp.c
@@ -17,6 +17,9 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <gshadow.h>
+#include <nss.h>
+
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 #define STRUCTURE	sgrp
 #define ENTNAME		sgent
diff --git a/nss/nss_files/files-spwd.c b/nss/nss_files/files-spwd.c
index 74874ad136..13680451c0 100644
--- a/nss/nss_files/files-spwd.c
+++ b/nss/nss_files/files-spwd.c
@@ -17,6 +17,9 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <shadow.h>
+#include <nss.h>
+
+NSS_DECLARE_MODULE_FUNCTIONS (files)
 
 #define STRUCTURE	spwd
 #define ENTNAME		spent
-- 
2.24.1



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

* [PATCH 7/7] nss_dns: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
                   ` (5 preceding siblings ...)
  2020-02-12 14:34 ` [PATCH 6/7] nss_files: " Florian Weimer
@ 2020-02-12 14:34 ` Florian Weimer
  2020-02-13  1:19   ` DJ Delorie
  2020-02-12 14:39 ` [PATCH 8/7] nss_nisplus: " Florian Weimer
  2020-02-13  9:01 ` [PATCH 9/7] nss_nis: " Florian Weimer
  8 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:34 UTC (permalink / raw)
  To: libc-alpha

---
 resolv/nss_dns/dns-canon.c   | 2 ++
 resolv/nss_dns/dns-host.c    | 2 ++
 resolv/nss_dns/dns-network.c | 2 ++
 3 files changed, 6 insertions(+)

diff --git a/resolv/nss_dns/dns-canon.c b/resolv/nss_dns/dns-canon.c
index 0849c04dbe..5bcd16958e 100644
--- a/resolv/nss_dns/dns-canon.c
+++ b/resolv/nss_dns/dns-canon.c
@@ -26,6 +26,8 @@
 #include <resolv/resolv_context.h>
 #include <resolv/resolv-internal.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (dns)
+
 #if PACKETSZ > 65536
 # define MAXPACKET	PACKETSZ
 #else
diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c
index fe90328175..91c0a3b0e4 100644
--- a/resolv/nss_dns/dns-host.c
+++ b/resolv/nss_dns/dns-host.c
@@ -90,6 +90,8 @@
 #include <resolv/mapv4v6addr.h>
 #include <resolv/mapv4v6hostent.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (dns)
+
 #define RESOLVSORT
 
 #if PACKETSZ > 65536
diff --git a/resolv/nss_dns/dns-network.c b/resolv/nss_dns/dns-network.c
index 906a3a6b06..250e7e7187 100644
--- a/resolv/nss_dns/dns-network.c
+++ b/resolv/nss_dns/dns-network.c
@@ -70,6 +70,8 @@
 #include <resolv/resolv-internal.h>
 #include <resolv/resolv_context.h>
 
+NSS_DECLARE_MODULE_FUNCTIONS (dns)
+
 /* Maximum number of aliases we allow.  */
 #define MAX_NR_ALIASES	48
 
-- 
2.24.1


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

* [PATCH 8/7] nss_nisplus: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
                   ` (6 preceding siblings ...)
  2020-02-12 14:34 ` [PATCH 7/7] nss_dns: " Florian Weimer
@ 2020-02-12 14:39 ` Florian Weimer
  2020-02-13  1:31   ` DJ Delorie
  2020-02-13  9:01 ` [PATCH 9/7] nss_nis: " Florian Weimer
  8 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-12 14:39 UTC (permalink / raw)
  To: libc-alpha

-----
 nis/nss-nisplus.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/nis/nss-nisplus.h b/nis/nss-nisplus.h
index ca6ef67654..92c67880b9 100644
--- a/nis/nss-nisplus.h
+++ b/nis/nss-nisplus.h
@@ -23,6 +23,7 @@
 
 #include "nsswitch.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (nisplus)
 
 /* Convert NIS+ error number to NSS error number.  */
 extern const enum nss_status __niserr2nss_tab[] attribute_hidden;


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

* Re: [PATCH 1/7] nss_compat: Do not use nss_* names for function pointers
  2020-02-12 14:34 ` [PATCH 1/7] nss_compat: Do not use nss_* names for function pointers Florian Weimer
@ 2020-02-12 22:36   ` DJ Delorie
  0 siblings, 0 replies; 29+ messages in thread
From: DJ Delorie @ 2020-02-12 22:36 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha


Florian Weimer <fweimer@redhat.com> writes:
> A future commit will use these names for types of functions
> in NSS service modules.
> ---
>  nss/nss_compat/compat-grp.c        | 54 +++++++++++------------
>  nss/nss_compat/compat-initgroups.c | 71 +++++++++++++++---------------
>  nss/nss_compat/compat-pwd.c        | 56 +++++++++++------------
>  nss/nss_compat/compat-spwd.c       | 44 +++++++++---------
>  4 files changed, 112 insertions(+), 113 deletions(-)

This one just renames symbols, no functional change.  LGTM.

Reviewed-by: DJ Delorie <dj@redhat.com>


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

* Re: [PATCH 2/7] nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h>
  2020-02-12 14:34 ` [PATCH 2/7] nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h> Florian Weimer
@ 2020-02-13  1:10   ` DJ Delorie
  0 siblings, 0 replies; 29+ messages in thread
From: DJ Delorie @ 2020-02-13  1:10 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha


Florian Weimer <fweimer@redhat.com> writes:
> This macro allows to add type safety to the implementation of NSS
> service modules.
> ---
>  nscd/aicache.c              |  23 +---
>  nss/nss.h                   | 203 +++++++++++++++++++++++++++++++++++-
>  sysdeps/posix/getaddrinfo.c |  18 +---
>  3 files changed, 209 insertions(+), 35 deletions(-)

LGTM.

Reviewed-by: DJ Delorie <dj@redhat.com>



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

* Re: [PATCH 3/7] nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 ` [PATCH 3/7] nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS Florian Weimer
@ 2020-02-13  1:11   ` DJ Delorie
  0 siblings, 0 replies; 29+ messages in thread
From: DJ Delorie @ 2020-02-13  1:11 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:
>  hesiod/nss_hesiod/hesiod-grp.c     | 2 ++
>  hesiod/nss_hesiod/hesiod-proto.c   | 2 ++
>  hesiod/nss_hesiod/hesiod-pwd.c     | 2 ++
>  hesiod/nss_hesiod/hesiod-service.c | 2 ++
>  4 files changed, 8 insertions(+)

LGTM.

Reviewed-by: DJ Delorie <dj@redhat.com>


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

* Re: [PATCH 4/7] nss_compat: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 ` [PATCH 4/7] nss_compat: " Florian Weimer
@ 2020-02-13  1:14   ` DJ Delorie
  0 siblings, 0 replies; 29+ messages in thread
From: DJ Delorie @ 2020-02-13  1:14 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:
>  nss/nss_compat/compat-grp.c        | 2 ++
>  nss/nss_compat/compat-initgroups.c | 2 ++
>  nss/nss_compat/compat-pwd.c        | 2 ++
>  nss/nss_compat/compat-spwd.c       | 2 ++
>  4 files changed, 8 insertions(+)

LGTM.

Reviewed-by: DJ Delorie <dj@redhat.com>


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

* Re: [PATCH 5/7] nss_db: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 ` [PATCH 5/7] nss_db: " Florian Weimer
@ 2020-02-13  1:18   ` DJ Delorie
  0 siblings, 0 replies; 29+ messages in thread
From: DJ Delorie @ 2020-02-13  1:18 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha


Florian Weimer <fweimer@redhat.com> writes:
>  nss/nss_db/db-init.c       | 2 ++
>  nss/nss_db/db-initgroups.c | 1 -
>  nss/nss_db/nss_db.h        | 1 +
>  3 files changed, 3 insertions(+), 1 deletion(-)

LGTM.

Reviewed-by: DJ Delorie <dj@redhat.com

Unneeded whitespace change though:

diff --git a/nss/nss_db/db-initgroups.c b/nss/nss_db/db-initgroups.c
index 0ea81c90bb..a8c39d68d9 100644
--- a/nss/nss_db/db-initgroups.c
+++ b/nss/nss_db/db-initgroups.c
@@ -32,7 +32,6 @@
 /* The hashing function we use.  */
 #include "../intl/hash-string.h"
 
-
 enum nss_status
 _nss_db_initgroups_dyn (const char *user, gid_t group, long int *start,
 			long int *size, gid_t **groupsp, long int limit,


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

* Re: [PATCH 7/7] nss_dns: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 ` [PATCH 7/7] nss_dns: " Florian Weimer
@ 2020-02-13  1:19   ` DJ Delorie
  0 siblings, 0 replies; 29+ messages in thread
From: DJ Delorie @ 2020-02-13  1:19 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:
>  resolv/nss_dns/dns-canon.c   | 2 ++
>  resolv/nss_dns/dns-host.c    | 2 ++
>  resolv/nss_dns/dns-network.c | 2 ++
>  3 files changed, 6 insertions(+)

LGTM.

Reviewed-by: DJ Delorie <dj@redhat.com>


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

* Re: [PATCH 6/7] nss_files: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 ` [PATCH 6/7] nss_files: " Florian Weimer
@ 2020-02-13  1:26   ` DJ Delorie
  2020-02-13  8:12     ` Florian Weimer
  0 siblings, 1 reply; 29+ messages in thread
From: DJ Delorie @ 2020-02-13  1:26 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:
>  nss/nss_files/files-alias.c      | 2 ++
>  nss/nss_files/files-ethers.c     | 3 +++
>  nss/nss_files/files-grp.c        | 3 +++
>  nss/nss_files/files-hosts.c      | 2 ++
>  nss/nss_files/files-init.c       | 3 +++
>  nss/nss_files/files-initgroups.c | 3 +++
>  nss/nss_files/files-key.c        | 2 ++
>  nss/nss_files/files-netgrp.c     | 2 ++
>  nss/nss_files/files-network.c    | 3 +++
>  nss/nss_files/files-proto.c      | 2 ++
>  nss/nss_files/files-pwd.c        | 3 +++
>  nss/nss_files/files-rpc.c        | 2 ++
>  nss/nss_files/files-service.c    | 2 ++
>  nss/nss_files/files-sgrp.c       | 3 +++
>  nss/nss_files/files-spwd.c       | 3 +++
>  15 files changed, 38 insertions(+)

LGTM.  Seems to be some inconsistency about whether to use <nss.h> or
"nsswitch.h" - I wonder if always using "nsswitch.h" *just* for
consistency would be worth the cost?

Reviewed-by: DJ Delorie <dj@redhat.com>


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

* Re: [PATCH 8/7] nss_nisplus: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:39 ` [PATCH 8/7] nss_nisplus: " Florian Weimer
@ 2020-02-13  1:31   ` DJ Delorie
  2020-02-13  8:11     ` Florian Weimer
  0 siblings, 1 reply; 29+ messages in thread
From: DJ Delorie @ 2020-02-13  1:31 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

Florian Weimer <fweimer@redhat.com> writes:
>  nis/nss-nisplus.h | 1 +
>  1 file changed, 1 insertion(+)

LGTM.  Will nis-nss be on the list too?

Reviewed-by: DJ Delorie <dj@redhat.com>


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

* Re: [PATCH 8/7] nss_nisplus: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-13  1:31   ` DJ Delorie
@ 2020-02-13  8:11     ` Florian Weimer
  0 siblings, 0 replies; 29+ messages in thread
From: Florian Weimer @ 2020-02-13  8:11 UTC (permalink / raw)
  To: DJ Delorie; +Cc: libc-alpha

* DJ Delorie:

> Florian Weimer <fweimer@redhat.com> writes:
>>  nis/nss-nisplus.h | 1 +
>>  1 file changed, 1 insertion(+)
>
> LGTM.  Will nis-nss be on the list too?
>
> Reviewed-by: DJ Delorie <dj@redhat.com>

Thanks for the reviews.  Looks like I have to send 9/7, too. 8-/

Florian


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

* Re: [PATCH 6/7] nss_files: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-13  1:26   ` DJ Delorie
@ 2020-02-13  8:12     ` Florian Weimer
  0 siblings, 0 replies; 29+ messages in thread
From: Florian Weimer @ 2020-02-13  8:12 UTC (permalink / raw)
  To: DJ Delorie; +Cc: libc-alpha

* DJ Delorie:

> Florian Weimer <fweimer@redhat.com> writes:
>>  nss/nss_files/files-alias.c      | 2 ++
>>  nss/nss_files/files-ethers.c     | 3 +++
>>  nss/nss_files/files-grp.c        | 3 +++
>>  nss/nss_files/files-hosts.c      | 2 ++
>>  nss/nss_files/files-init.c       | 3 +++
>>  nss/nss_files/files-initgroups.c | 3 +++
>>  nss/nss_files/files-key.c        | 2 ++
>>  nss/nss_files/files-netgrp.c     | 2 ++
>>  nss/nss_files/files-network.c    | 3 +++
>>  nss/nss_files/files-proto.c      | 2 ++
>>  nss/nss_files/files-pwd.c        | 3 +++
>>  nss/nss_files/files-rpc.c        | 2 ++
>>  nss/nss_files/files-service.c    | 2 ++
>>  nss/nss_files/files-sgrp.c       | 3 +++
>>  nss/nss_files/files-spwd.c       | 3 +++
>>  15 files changed, 38 insertions(+)
>
> LGTM.  Seems to be some inconsistency about whether to use <nss.h> or
> "nsswitch.h" - I wonder if always using "nsswitch.h" *just* for
> consistency would be worth the cost?
>
> Reviewed-by: DJ Delorie <dj@redhat.com>

Maybe we should add nss_files.h if there any common declarations?

Thanks,
Florian


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

* [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
                   ` (7 preceding siblings ...)
  2020-02-12 14:39 ` [PATCH 8/7] nss_nisplus: " Florian Weimer
@ 2020-02-13  9:01 ` Florian Weimer
  2020-02-13  9:16   ` Andreas Schwab
  2020-02-13  9:21   ` Andreas Schwab
  8 siblings, 2 replies; 29+ messages in thread
From: Florian Weimer @ 2020-02-13  9:01 UTC (permalink / raw)
  To: libc-alpha

This commit removes the minor optimization based on strong aliases
because it loses type safety.

-----
 nis/nss-nis.h             |  1 +
 nis/nss_nis/nis-hosts.c   | 13 ++++++++-----
 nis/nss_nis/nis-network.c | 15 ++++++++++-----
 nis/nss_nis/nis-spwd.c    | 13 +++++++++----
 4 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/nis/nss-nis.h b/nis/nss-nis.h
index dc091d1a20..7c009d7e87 100644
--- a/nis/nss-nis.h
+++ b/nis/nss-nis.h
@@ -22,6 +22,7 @@
 
 #include "nsswitch.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (nis)
 
 /* Convert YP error number to NSS error number.  */
 extern const enum nss_status __yperr2nss_tab[] attribute_hidden;
diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
index 2d08076382..1ee5444cfc 100644
--- a/nis/nss_nis/nis-hosts.c
+++ b/nis/nss_nis/nis-hosts.c
@@ -90,9 +90,16 @@ static bool_t new_start = 1;
 static char *oldkey = NULL;
 static int oldkeylen = 0;
 
+hidden_proto (_nss_nis_endhostent)
 
 enum nss_status
 _nss_nis_sethostent (int stayopen)
+{
+  return _nss_nis_endhostent ();
+}
+
+enum nss_status
+_nss_nis_endhostent (void)
 {
   __libc_lock_lock (lock);
 
@@ -108,11 +115,7 @@ _nss_nis_sethostent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endhostent an alias of _nss_nis_sethostent.  We do this
-   even though the prototypes don't match.  The argument of sethostent
-   is used so this makes no difference.  */
-strong_alias (_nss_nis_sethostent, _nss_nis_endhostent)
-
+hidden_def (_nss_nis_endhostent)
 
 /* The calling function always need to get a lock first. */
 static enum nss_status
diff --git a/nis/nss_nis/nis-network.c b/nis/nss_nis/nis-network.c
index dcafd26148..511de00bd3 100644
--- a/nis/nss_nis/nis-network.c
+++ b/nis/nss_nis/nis-network.c
@@ -45,10 +45,18 @@ static bool_t new_start = 1;
 static char *oldkey;
 static int oldkeylen;
 
+hidden_proto (_nss_nis_endnetent)
+
 enum nss_status
 _nss_nis_setnetent (int stayopen)
 {
-  __libc_lock_lock (lock);
+  return _nss_nis_endnetent ();
+}
+
+enum nss_status
+_nss_nis_endnetent (void)
+{
+__libc_lock_lock (lock);
 
   new_start = 1;
   if (oldkey != NULL)
@@ -62,10 +70,7 @@ _nss_nis_setnetent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endnetent an alias of _nss_nis_setnetent.  We do this
-   even though the prototypes don't match.  The argument of setnetent
-   is not used so this makes no difference.  */
-strong_alias (_nss_nis_setnetent, _nss_nis_endnetent)
+hidden_def (_nss_nis_endnetent)
 
 static enum nss_status
 internal_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen,
diff --git a/nis/nss_nis/nis-spwd.c b/nis/nss_nis/nis-spwd.c
index 6cd46b4022..660447b544 100644
--- a/nis/nss_nis/nis-spwd.c
+++ b/nis/nss_nis/nis-spwd.c
@@ -46,8 +46,16 @@ static bool ent_adjunct_used;
 static char *oldkey;
 static int oldkeylen;
 
+hidden_proto (_nss_nis_endspent)
+
 enum nss_status
 _nss_nis_setspent (int stayopen)
+{
+  return _nss_nis_endspent ();
+}
+
+enum nss_status
+_nss_nis_endspent (void)
 {
   __libc_lock_lock (lock);
 
@@ -61,10 +69,7 @@ _nss_nis_setspent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endspent an alias of _nss_nis_setspent.  We do this
-   even though the prototypes don't match.  The argument of setspent
-   is not used so this makes no difference.  */
-strong_alias (_nss_nis_setspent, _nss_nis_endspent)
+hidden_def (_nss_nis_endspent)
 
 static enum nss_status
 internal_nis_getspent_r (struct spwd *sp, char *buffer, size_t buflen,


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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-13  9:01 ` [PATCH 9/7] nss_nis: " Florian Weimer
@ 2020-02-13  9:16   ` Andreas Schwab
  2020-02-13  9:21   ` Andreas Schwab
  1 sibling, 0 replies; 29+ messages in thread
From: Andreas Schwab @ 2020-02-13  9:16 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

On Feb 13 2020, Florian Weimer wrote:

> diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
> index 2d08076382..1ee5444cfc 100644
> --- a/nis/nss_nis/nis-hosts.c
> +++ b/nis/nss_nis/nis-hosts.c
> @@ -90,9 +90,16 @@ static bool_t new_start = 1;
>  static char *oldkey = NULL;
>  static int oldkeylen = 0;
>  
> +hidden_proto (_nss_nis_endhostent)
>  
>  enum nss_status
>  _nss_nis_sethostent (int stayopen)
> +{
> +  return _nss_nis_endhostent ();
> +}
> +
> +enum nss_status
> +_nss_nis_endhostent (void)
>  {
>    __libc_lock_lock (lock);
>  
> @@ -108,11 +115,7 @@ _nss_nis_sethostent (int stayopen)
>  
>    return NSS_STATUS_SUCCESS;
>  }
> -/* Make _nss_nis_endhostent an alias of _nss_nis_sethostent.  We do this
> -   even though the prototypes don't match.  The argument of sethostent
> -   is used so this makes no difference.  */
> -strong_alias (_nss_nis_sethostent, _nss_nis_endhostent)
> -
> +hidden_def (_nss_nis_endhostent)

Please also remove the #define/#undef above.

> diff --git a/nis/nss_nis/nis-network.c b/nis/nss_nis/nis-network.c
> index dcafd26148..511de00bd3 100644
> --- a/nis/nss_nis/nis-network.c
> +++ b/nis/nss_nis/nis-network.c
> @@ -45,10 +45,18 @@ static bool_t new_start = 1;
>  static char *oldkey;
>  static int oldkeylen;
>  
> +hidden_proto (_nss_nis_endnetent)
> +
>  enum nss_status
>  _nss_nis_setnetent (int stayopen)
>  {
> -  __libc_lock_lock (lock);
> +  return _nss_nis_endnetent ();
> +}
> +
> +enum nss_status
> +_nss_nis_endnetent (void)
> +{
> +__libc_lock_lock (lock);
>  
>    new_start = 1;
>    if (oldkey != NULL)
> @@ -62,10 +70,7 @@ _nss_nis_setnetent (int stayopen)
>  
>    return NSS_STATUS_SUCCESS;
>  }
> -/* Make _nss_nis_endnetent an alias of _nss_nis_setnetent.  We do this
> -   even though the prototypes don't match.  The argument of setnetent
> -   is not used so this makes no difference.  */
> -strong_alias (_nss_nis_setnetent, _nss_nis_endnetent)
> +hidden_def (_nss_nis_endnetent)

Likewise.

> diff --git a/nis/nss_nis/nis-spwd.c b/nis/nss_nis/nis-spwd.c
> index 6cd46b4022..660447b544 100644
> --- a/nis/nss_nis/nis-spwd.c
> +++ b/nis/nss_nis/nis-spwd.c
> @@ -46,8 +46,16 @@ static bool ent_adjunct_used;
>  static char *oldkey;
>  static int oldkeylen;
>  
> +hidden_proto (_nss_nis_endspent)
> +
>  enum nss_status
>  _nss_nis_setspent (int stayopen)
> +{
> +  return _nss_nis_endspent ();
> +}
> +
> +enum nss_status
> +_nss_nis_endspent (void)
>  {
>    __libc_lock_lock (lock);
>  
> @@ -61,10 +69,7 @@ _nss_nis_setspent (int stayopen)
>  
>    return NSS_STATUS_SUCCESS;
>  }
> -/* Make _nss_nis_endspent an alias of _nss_nis_setspent.  We do this
> -   even though the prototypes don't match.  The argument of setspent
> -   is not used so this makes no difference.  */
> -strong_alias (_nss_nis_setspent, _nss_nis_endspent)
> +hidden_def (_nss_nis_endspent)

Likewise.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-13  9:01 ` [PATCH 9/7] nss_nis: " Florian Weimer
  2020-02-13  9:16   ` Andreas Schwab
@ 2020-02-13  9:21   ` Andreas Schwab
  2020-02-13  9:31     ` Florian Weimer
  1 sibling, 1 reply; 29+ messages in thread
From: Andreas Schwab @ 2020-02-13  9:21 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

On Feb 13 2020, Florian Weimer wrote:

> diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
> index 2d08076382..1ee5444cfc 100644
> --- a/nis/nss_nis/nis-hosts.c
> +++ b/nis/nss_nis/nis-hosts.c
> @@ -90,9 +90,16 @@ static bool_t new_start = 1;
>  static char *oldkey = NULL;
>  static int oldkeylen = 0;
>  
> +hidden_proto (_nss_nis_endhostent)

The hidden_proto should be in the header.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-13  9:21   ` Andreas Schwab
@ 2020-02-13  9:31     ` Florian Weimer
  2020-02-13  9:38       ` Andreas Schwab
  0 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-13  9:31 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: libc-alpha

* Andreas Schwab:

> On Feb 13 2020, Florian Weimer wrote:
>
>> diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
>> index 2d08076382..1ee5444cfc 100644
>> --- a/nis/nss_nis/nis-hosts.c
>> +++ b/nis/nss_nis/nis-hosts.c
>> @@ -90,9 +90,16 @@ static bool_t new_start = 1;
>>  static char *oldkey = NULL;
>>  static int oldkeylen = 0;
>>  
>> +hidden_proto (_nss_nis_endhostent)
>
> The hidden_proto should be in the header.

Which header?  nss_nis.h?

We don't have libnss_nis_hidden_proto yet.  Should I define that, too?

Thanks,
Florian


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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-13  9:31     ` Florian Weimer
@ 2020-02-13  9:38       ` Andreas Schwab
  2020-02-25 14:50         ` Florian Weimer
  0 siblings, 1 reply; 29+ messages in thread
From: Andreas Schwab @ 2020-02-13  9:38 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

On Feb 13 2020, Florian Weimer wrote:

> * Andreas Schwab:
>
>> On Feb 13 2020, Florian Weimer wrote:
>>
>>> diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
>>> index 2d08076382..1ee5444cfc 100644
>>> --- a/nis/nss_nis/nis-hosts.c
>>> +++ b/nis/nss_nis/nis-hosts.c
>>> @@ -90,9 +90,16 @@ static bool_t new_start = 1;
>>>  static char *oldkey = NULL;
>>>  static int oldkeylen = 0;
>>>  
>>> +hidden_proto (_nss_nis_endhostent)
>>
>> The hidden_proto should be in the header.
>
> Which header?  nss_nis.h?

netdb.h, after the prototype.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-13  9:38       ` Andreas Schwab
@ 2020-02-25 14:50         ` Florian Weimer
  2020-02-25 15:09           ` Andreas Schwab
  0 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-25 14:50 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: libc-alpha

* Andreas Schwab:

> On Feb 13 2020, Florian Weimer wrote:
>
>> * Andreas Schwab:
>>
>>> On Feb 13 2020, Florian Weimer wrote:
>>>
>>>> diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
>>>> index 2d08076382..1ee5444cfc 100644
>>>> --- a/nis/nss_nis/nis-hosts.c
>>>> +++ b/nis/nss_nis/nis-hosts.c
>>>> @@ -90,9 +90,16 @@ static bool_t new_start = 1;
>>>>  static char *oldkey = NULL;
>>>>  static int oldkeylen = 0;
>>>>  
>>>> +hidden_proto (_nss_nis_endhostent)
>>>
>>> The hidden_proto should be in the header.
>>
>> Which header?  nss_nis.h?
>
> netdb.h, after the prototype.

Do you mean like this?

Changing DECLARE_NSS_PROTOTYPES would require updating all NSS modules
to use hidden_def because with a hidden_proto, the function definition
would only define the internal alias, and the exported function would be
gone.

Thanks,
Florian
8<------------------------------------------------------------------8<

This commit removes the minor optimization based on strong aliases
because it loses type safety.

-----
 include/netdb.h           |  7 ++++++-
 nis/nss-nis.h             |  1 +
 nis/nss_nis/nis-hosts.c   | 17 +++++++----------
 nis/nss_nis/nis-network.c | 17 ++++++++---------
 nis/nss_nis/nis-spwd.c    | 16 ++++++++--------
 5 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/include/netdb.h b/include/netdb.h
index e230b1f4fc..a2bd5eef44 100644
--- a/include/netdb.h
+++ b/include/netdb.h
@@ -279,7 +279,8 @@ extern enum nss_status _nss_ ## service ## _getnetbyname_r		      \
 extern enum nss_status _nss_ ## service ## _getnetbyaddr_r		      \
 		       (uint32_t addr, int type, struct netent *net,	      \
 			char *buffer, size_t buflen, int *errnop,	      \
-			int *herrnop);
+			int *herrnop);					      \
+extern enum nss_status _nss_ ## service ## _endspent (void);
 
 DECLARE_NSS_PROTOTYPES (compat)
 DECLARE_NSS_PROTOTYPES (dns)
@@ -288,6 +289,10 @@ DECLARE_NSS_PROTOTYPES (hesiod)
 DECLARE_NSS_PROTOTYPES (nis)
 DECLARE_NSS_PROTOTYPES (nisplus)
 
+hidden_proto (_nss_nis_endhostent)
+hidden_proto (_nss_nis_endnetent)
+hidden_proto (_nss_nis_endspent)
+
 #undef DECLARE_NSS_PROTOTYPES
 #endif
 
diff --git a/nis/nss-nis.h b/nis/nss-nis.h
index dc091d1a20..7c009d7e87 100644
--- a/nis/nss-nis.h
+++ b/nis/nss-nis.h
@@ -22,6 +22,7 @@
 
 #include "nsswitch.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (nis)
 
 /* Convert YP error number to NSS error number.  */
 extern const enum nss_status __yperr2nss_tab[] attribute_hidden;
diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
index 2d08076382..7c28580659 100644
--- a/nis/nss_nis/nis-hosts.c
+++ b/nis/nss_nis/nis-hosts.c
@@ -19,11 +19,7 @@
 #include <assert.h>
 #include <nss.h>
 #include <ctype.h>
-/* The following is an ugly trick to avoid a prototype declaration for
-   _nss_nis_endgrent.  */
-#define _nss_nis_endhostent _nss_nis_endhostent_XXX
 #include <netdb.h>
-#undef _nss_nis_endhostent
 #include <string.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -90,9 +86,14 @@ static bool_t new_start = 1;
 static char *oldkey = NULL;
 static int oldkeylen = 0;
 
-
 enum nss_status
 _nss_nis_sethostent (int stayopen)
+{
+  return _nss_nis_endhostent ();
+}
+
+enum nss_status
+_nss_nis_endhostent (void)
 {
   __libc_lock_lock (lock);
 
@@ -108,11 +109,7 @@ _nss_nis_sethostent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endhostent an alias of _nss_nis_sethostent.  We do this
-   even though the prototypes don't match.  The argument of sethostent
-   is used so this makes no difference.  */
-strong_alias (_nss_nis_sethostent, _nss_nis_endhostent)
-
+hidden_def (_nss_nis_endhostent)
 
 /* The calling function always need to get a lock first. */
 static enum nss_status
diff --git a/nis/nss_nis/nis-network.c b/nis/nss_nis/nis-network.c
index dcafd26148..23975cb93f 100644
--- a/nis/nss_nis/nis-network.c
+++ b/nis/nss_nis/nis-network.c
@@ -17,11 +17,7 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <nss.h>
-/* The following is an ugly trick to avoid a prototype declaration for
-   _nss_nis_endgrent.  */
-#define _nss_nis_endnetent _nss_nis_endnetent_XXX
 #include <netdb.h>
-#undef _nss_nis_endnetent
 #include <ctype.h>
 #include <errno.h>
 #include <stdint.h>
@@ -48,7 +44,13 @@ static int oldkeylen;
 enum nss_status
 _nss_nis_setnetent (int stayopen)
 {
-  __libc_lock_lock (lock);
+  return _nss_nis_endnetent ();
+}
+
+enum nss_status
+_nss_nis_endnetent (void)
+{
+__libc_lock_lock (lock);
 
   new_start = 1;
   if (oldkey != NULL)
@@ -62,10 +64,7 @@ _nss_nis_setnetent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endnetent an alias of _nss_nis_setnetent.  We do this
-   even though the prototypes don't match.  The argument of setnetent
-   is not used so this makes no difference.  */
-strong_alias (_nss_nis_setnetent, _nss_nis_endnetent)
+hidden_def (_nss_nis_endnetent)
 
 static enum nss_status
 internal_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen,
diff --git a/nis/nss_nis/nis-spwd.c b/nis/nss_nis/nis-spwd.c
index 6cd46b4022..be882431d7 100644
--- a/nis/nss_nis/nis-spwd.c
+++ b/nis/nss_nis/nis-spwd.c
@@ -20,14 +20,11 @@
 #include <ctype.h>
 #include <errno.h>
 #include <string.h>
-/* The following is an ugly trick to avoid a prototype declaration for
-   _nss_nis_endspent.  */
-#define _nss_nis_endspent _nss_nis_endspent_XXX
 #include <shadow.h>
-#undef _nss_nis_endspent
 #include <libc-lock.h>
 #include <rpcsvc/yp.h>
 #include <rpcsvc/ypclnt.h>
+#include <netdb.h>
 
 #include "nss-nis.h"
 #include <libnsl.h>
@@ -48,6 +45,12 @@ static int oldkeylen;
 
 enum nss_status
 _nss_nis_setspent (int stayopen)
+{
+  return _nss_nis_endspent ();
+}
+
+enum nss_status
+_nss_nis_endspent (void)
 {
   __libc_lock_lock (lock);
 
@@ -61,10 +64,7 @@ _nss_nis_setspent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endspent an alias of _nss_nis_setspent.  We do this
-   even though the prototypes don't match.  The argument of setspent
-   is not used so this makes no difference.  */
-strong_alias (_nss_nis_setspent, _nss_nis_endspent)
+hidden_def (_nss_nis_endspent)
 
 static enum nss_status
 internal_nis_getspent_r (struct spwd *sp, char *buffer, size_t buflen,


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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-25 14:50         ` Florian Weimer
@ 2020-02-25 15:09           ` Andreas Schwab
  2020-02-25 16:10             ` Florian Weimer
  0 siblings, 1 reply; 29+ messages in thread
From: Andreas Schwab @ 2020-02-25 15:09 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

On Feb 25 2020, Florian Weimer wrote:

> @@ -288,6 +289,10 @@ DECLARE_NSS_PROTOTYPES (hesiod)
>  DECLARE_NSS_PROTOTYPES (nis)
>  DECLARE_NSS_PROTOTYPES (nisplus)
>  
> +hidden_proto (_nss_nis_endhostent)
> +hidden_proto (_nss_nis_endnetent)
> +hidden_proto (_nss_nis_endspent)
> +

The hidden_proto should only exist if IS_IN(libnss_nis).

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-25 15:09           ` Andreas Schwab
@ 2020-02-25 16:10             ` Florian Weimer
  2020-02-25 16:41               ` Andreas Schwab
  0 siblings, 1 reply; 29+ messages in thread
From: Florian Weimer @ 2020-02-25 16:10 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: libc-alpha

* Andreas Schwab:

> On Feb 25 2020, Florian Weimer wrote:
>
>> @@ -288,6 +289,10 @@ DECLARE_NSS_PROTOTYPES (hesiod)
>>  DECLARE_NSS_PROTOTYPES (nis)
>>  DECLARE_NSS_PROTOTYPES (nisplus)
>>  
>> +hidden_proto (_nss_nis_endhostent)
>> +hidden_proto (_nss_nis_endnetent)
>> +hidden_proto (_nss_nis_endspent)
>> +
>
> The hidden_proto should only exist if IS_IN(libnss_nis).

Okay, then let's add the infrastructure for this.  What about the patch
below?

Thanks,
Florian
8<------------------------------------------------------------------8<

This commit removes the minor optimization based on strong aliases
because it loses type safety.

-----
 include/libc-symbols.h    | 23 +++++++++++++++++++++++
 include/netdb.h           |  8 +++++++-
 nis/nss-nis.h             |  1 +
 nis/nss_nis/nis-hosts.c   | 17 +++++++----------
 nis/nss_nis/nis-network.c | 17 ++++++++---------
 nis/nss_nis/nis-spwd.c    | 16 ++++++++--------
 6 files changed, 54 insertions(+), 28 deletions(-)

diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index 33e2d34c53..b0b75a087e 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -835,6 +835,29 @@ for linking")
 # define libnsl_hidden_data_ver(local, name)
 #endif
 
+#if IS_IN (libnss_nis)
+# define libnss_nis_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
+# define libnss_nis_hidden_tls_proto(name, attrs...) \
+  hidden_tls_proto (name, ##attrs)
+# define libnss_nis_hidden_def(name) hidden_def (name)
+# define libnss_nis_hidden_weak(name) hidden_weak (name)
+# define libnss_nis_hidden_ver(local, name) hidden_ver (local, name)
+# define libnss_nis_hidden_data_def(name) hidden_data_def (name)
+# define libnss_nis_hidden_tls_def(name) hidden_tls_def (name)
+# define libnss_nis_hidden_data_weak(name) hidden_data_weak (name)
+# define libnss_nis_hidden_data_ver(local, name) hidden_data_ver (local, name)
+#else
+# define libnss_nis_hidden_proto(name, attrs...)
+# define libnss_nis_hidden_tls_proto(name, attrs...)
+# define libnss_nis_hidden_def(name)
+# define libnss_nis_hidden_weak(name)
+# define libnss_nis_hidden_ver(local, name)
+# define libnss_nis_hidden_data_def(name)
+# define libnss_nis_hidden_tls_def(name)
+# define libnss_nis_hidden_data_weak(name)
+# define libnss_nis_hidden_data_ver(local, name)
+#endif
+
 #if IS_IN (libnss_nisplus)
 # define libnss_nisplus_hidden_proto(name, attrs...) hidden_proto (name, ##attrs)
 # define libnss_nisplus_hidden_tls_proto(name, attrs...) \
diff --git a/include/netdb.h b/include/netdb.h
index e230b1f4fc..3c78da60c5 100644
--- a/include/netdb.h
+++ b/include/netdb.h
@@ -279,7 +279,8 @@ extern enum nss_status _nss_ ## service ## _getnetbyname_r		      \
 extern enum nss_status _nss_ ## service ## _getnetbyaddr_r		      \
 		       (uint32_t addr, int type, struct netent *net,	      \
 			char *buffer, size_t buflen, int *errnop,	      \
-			int *herrnop);
+			int *herrnop);					      \
+extern enum nss_status _nss_ ## service ## _endspent (void);
 
 DECLARE_NSS_PROTOTYPES (compat)
 DECLARE_NSS_PROTOTYPES (dns)
@@ -289,6 +290,11 @@ DECLARE_NSS_PROTOTYPES (nis)
 DECLARE_NSS_PROTOTYPES (nisplus)
 
 #undef DECLARE_NSS_PROTOTYPES
+
+libnss_nis_hidden_proto (_nss_nis_endhostent)
+libnss_nis_hidden_proto (_nss_nis_endnetent)
+libnss_nis_hidden_proto (_nss_nis_endspent)
+
 #endif
 
 #endif /* !_NETDB_H */
diff --git a/nis/nss-nis.h b/nis/nss-nis.h
index dc091d1a20..7c009d7e87 100644
--- a/nis/nss-nis.h
+++ b/nis/nss-nis.h
@@ -22,6 +22,7 @@
 
 #include "nsswitch.h"
 
+NSS_DECLARE_MODULE_FUNCTIONS (nis)
 
 /* Convert YP error number to NSS error number.  */
 extern const enum nss_status __yperr2nss_tab[] attribute_hidden;
diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
index 2d08076382..eb074783f7 100644
--- a/nis/nss_nis/nis-hosts.c
+++ b/nis/nss_nis/nis-hosts.c
@@ -19,11 +19,7 @@
 #include <assert.h>
 #include <nss.h>
 #include <ctype.h>
-/* The following is an ugly trick to avoid a prototype declaration for
-   _nss_nis_endgrent.  */
-#define _nss_nis_endhostent _nss_nis_endhostent_XXX
 #include <netdb.h>
-#undef _nss_nis_endhostent
 #include <string.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
@@ -90,9 +86,14 @@ static bool_t new_start = 1;
 static char *oldkey = NULL;
 static int oldkeylen = 0;
 
-
 enum nss_status
 _nss_nis_sethostent (int stayopen)
+{
+  return _nss_nis_endhostent ();
+}
+
+enum nss_status
+_nss_nis_endhostent (void)
 {
   __libc_lock_lock (lock);
 
@@ -108,11 +109,7 @@ _nss_nis_sethostent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endhostent an alias of _nss_nis_sethostent.  We do this
-   even though the prototypes don't match.  The argument of sethostent
-   is used so this makes no difference.  */
-strong_alias (_nss_nis_sethostent, _nss_nis_endhostent)
-
+libnss_nis_hidden_def (_nss_nis_endhostent)
 
 /* The calling function always need to get a lock first. */
 static enum nss_status
diff --git a/nis/nss_nis/nis-network.c b/nis/nss_nis/nis-network.c
index dcafd26148..8d87c69d8e 100644
--- a/nis/nss_nis/nis-network.c
+++ b/nis/nss_nis/nis-network.c
@@ -17,11 +17,7 @@
    <https://www.gnu.org/licenses/>.  */
 
 #include <nss.h>
-/* The following is an ugly trick to avoid a prototype declaration for
-   _nss_nis_endgrent.  */
-#define _nss_nis_endnetent _nss_nis_endnetent_XXX
 #include <netdb.h>
-#undef _nss_nis_endnetent
 #include <ctype.h>
 #include <errno.h>
 #include <stdint.h>
@@ -48,7 +44,13 @@ static int oldkeylen;
 enum nss_status
 _nss_nis_setnetent (int stayopen)
 {
-  __libc_lock_lock (lock);
+  return _nss_nis_endnetent ();
+}
+
+enum nss_status
+_nss_nis_endnetent (void)
+{
+__libc_lock_lock (lock);
 
   new_start = 1;
   if (oldkey != NULL)
@@ -62,10 +64,7 @@ _nss_nis_setnetent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endnetent an alias of _nss_nis_setnetent.  We do this
-   even though the prototypes don't match.  The argument of setnetent
-   is not used so this makes no difference.  */
-strong_alias (_nss_nis_setnetent, _nss_nis_endnetent)
+libnss_nis_hidden_def (_nss_nis_endnetent)
 
 static enum nss_status
 internal_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen,
diff --git a/nis/nss_nis/nis-spwd.c b/nis/nss_nis/nis-spwd.c
index 6cd46b4022..9790dd4104 100644
--- a/nis/nss_nis/nis-spwd.c
+++ b/nis/nss_nis/nis-spwd.c
@@ -20,14 +20,11 @@
 #include <ctype.h>
 #include <errno.h>
 #include <string.h>
-/* The following is an ugly trick to avoid a prototype declaration for
-   _nss_nis_endspent.  */
-#define _nss_nis_endspent _nss_nis_endspent_XXX
 #include <shadow.h>
-#undef _nss_nis_endspent
 #include <libc-lock.h>
 #include <rpcsvc/yp.h>
 #include <rpcsvc/ypclnt.h>
+#include <netdb.h>
 
 #include "nss-nis.h"
 #include <libnsl.h>
@@ -48,6 +45,12 @@ static int oldkeylen;
 
 enum nss_status
 _nss_nis_setspent (int stayopen)
+{
+  return _nss_nis_endspent ();
+}
+
+enum nss_status
+_nss_nis_endspent (void)
 {
   __libc_lock_lock (lock);
 
@@ -61,10 +64,7 @@ _nss_nis_setspent (int stayopen)
 
   return NSS_STATUS_SUCCESS;
 }
-/* Make _nss_nis_endspent an alias of _nss_nis_setspent.  We do this
-   even though the prototypes don't match.  The argument of setspent
-   is not used so this makes no difference.  */
-strong_alias (_nss_nis_setspent, _nss_nis_endspent)
+libnss_nis_hidden_def (_nss_nis_endspent)
 
 static enum nss_status
 internal_nis_getspent_r (struct spwd *sp, char *buffer, size_t buflen,


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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-25 16:10             ` Florian Weimer
@ 2020-02-25 16:41               ` Andreas Schwab
  2020-02-25 16:44                 ` Florian Weimer
  0 siblings, 1 reply; 29+ messages in thread
From: Andreas Schwab @ 2020-02-25 16:41 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

On Feb 25 2020, Florian Weimer wrote:

> This commit removes the minor optimization based on strong aliases
> because it loses type safety.

Ok.

Andreas.

-- 
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."

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

* Re: [PATCH 9/7] nss_nis: Use NSS_DECLARE_MODULE_FUNCTIONS
  2020-02-25 16:41               ` Andreas Schwab
@ 2020-02-25 16:44                 ` Florian Weimer
  0 siblings, 0 replies; 29+ messages in thread
From: Florian Weimer @ 2020-02-25 16:44 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: libc-alpha

* Andreas Schwab:

> On Feb 25 2020, Florian Weimer wrote:
>
>> This commit removes the minor optimization based on strong aliases
>> because it loses type safety.
>
> Ok.

Thanks, pushed.

Florian


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

end of thread, other threads:[~2020-02-25 16:44 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-12 14:34 [PATCH 0/7] More type safety for NSS modules Florian Weimer
2020-02-12 14:34 ` [PATCH 1/7] nss_compat: Do not use nss_* names for function pointers Florian Weimer
2020-02-12 22:36   ` DJ Delorie
2020-02-12 14:34 ` [PATCH 2/7] nss: Add function types and NSS_DECLARE_MODULE_FUNCTIONS macro to <nss.h> Florian Weimer
2020-02-13  1:10   ` DJ Delorie
2020-02-12 14:34 ` [PATCH 3/7] nss_hesiod: Use NSS_DECLARE_MODULE_FUNCTIONS Florian Weimer
2020-02-13  1:11   ` DJ Delorie
2020-02-12 14:34 ` [PATCH 4/7] nss_compat: " Florian Weimer
2020-02-13  1:14   ` DJ Delorie
2020-02-12 14:34 ` [PATCH 5/7] nss_db: " Florian Weimer
2020-02-13  1:18   ` DJ Delorie
2020-02-12 14:34 ` [PATCH 6/7] nss_files: " Florian Weimer
2020-02-13  1:26   ` DJ Delorie
2020-02-13  8:12     ` Florian Weimer
2020-02-12 14:34 ` [PATCH 7/7] nss_dns: " Florian Weimer
2020-02-13  1:19   ` DJ Delorie
2020-02-12 14:39 ` [PATCH 8/7] nss_nisplus: " Florian Weimer
2020-02-13  1:31   ` DJ Delorie
2020-02-13  8:11     ` Florian Weimer
2020-02-13  9:01 ` [PATCH 9/7] nss_nis: " Florian Weimer
2020-02-13  9:16   ` Andreas Schwab
2020-02-13  9:21   ` Andreas Schwab
2020-02-13  9:31     ` Florian Weimer
2020-02-13  9:38       ` Andreas Schwab
2020-02-25 14:50         ` Florian Weimer
2020-02-25 15:09           ` Andreas Schwab
2020-02-25 16:10             ` Florian Weimer
2020-02-25 16:41               ` Andreas Schwab
2020-02-25 16:44                 ` 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).