public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] SERVICES_AUTHORITATIVE
@ 2004-04-02  9:01 Jakub Jelinek
  2004-04-02  9:17 ` Ulrich Drepper
  0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2004-04-02  9:01 UTC (permalink / raw)
  To: Ulrich Drepper, Thorsten Kukuk; +Cc: Glibc hackers

[-- Attachment #1: Type: text/plain, Size: 748 bytes --]

Hi!

For compatibility reasons, still getservbyname{,_r} needs to read whole
servyces.byname map for requests for non-existent protocols.
This patch allows the admin to say in /etc/default/nss that
services.byservicename exists and is authoritative and thus avoid fetching
the whole map ever by getservbyname*.
Attached are also incremental patch to ypserv (on top of the one from 
yesterday) and a full ypserv patch.
Apparently at least Solaris 9 is building the services.byservicename map
properly (i.e. say for
qotd            17/tcp          quote
qotd            17/udp          quote
there will be qotd/tcp, qotd, quote/tcp, quote, qotd/udp and quote/udp
keys) while the Makefile I googled up would not add in the case above
"quote".

	Jakub

[-- Attachment #2: glibc-services-authoritative.patch --]
[-- Type: text/plain, Size: 8078 bytes --]

2004-04-02  Jakub Jelinek  <jakub@redhat.com>

	* nis/nss: Add SERVICES_AUTHORITATIVE.
	* nis/nss-nis.h (NSS_FLAG_SET, NSS_FLAG_NETID_AUTHORITATIVE,
	NSS_FLAG_SERVICES_AUTHORITATIVE): Define.
	(_nis_default_nss_flags, _nis_check_default_nss): New decls.
	(_nis_default_nss): New inline.
	* nis/nss-nis.c: Include ctype.h, stdio.h and stdio_ext.h.
	(_nis_default_nss_flags, default_nss): New variables.
	(_nis_check_default_nss): New function.
	* nis/nss_nis/nis-initgroups.c: Don't include stdio.h and
	stdio_ext.h.
	(check_default_nss, default_nss): Move to nss-nis.c.
	(init): Removed.
	(_nss_nis_initgroups_dyn): Use _nis_default_nss ().
	* nis/nss_nis/nis-services.c (_nss_nis_getservbyname_r): If
	NSS_FLAG_SERVICES_AUTHORITATIVE and services.byservicename lookup
	fails, return immediately.

--- libc/nis/nss.jj	2004-03-30 20:32:38.000000000 +0200
+++ libc/nis/nss	2004-04-02 10:35:18.525894354 +0200
@@ -1,12 +1,20 @@
 # /etc/default/nss
 # This file can theoretically contain a bunch of customization variables
-# for Name Service Switch in the GNU C library.  For now there is only one
-# variable:
+# for Name Service Switch in the GNU C library.  For now there are only two
+# variables:
 #
 # NETID_AUTHORITATIVE
-#   If set to TRUE the initgroups() function will accept the information
+#   If set to TRUE, the initgroups() function will accept the information
 #   from the netid.byname NIS map as authoritative.  This can speed up the
 #   function significantly if the group.byname map is large.  The content
 #   of the netid.byname map is used AS IS.  The system administrator has
 #   to make sure it is correctly generated.
 #NETID_AUTHORITATIVE=TRUE
+#
+# SERVICES_AUTHORITATIVE
+#   If set to TRUE, the getservbyname{,_r}() function will assume
+#   services.byservicename NIS map exists and is authoritative, particularly
+#   that it contains both keys with /proto and without /proto for both
+#   primary service names and service aliases.  The system administrator
+#   has to make sure it is correctly generated.
+#SERVICES_AUTHORITATIVE=TRUE
--- libc/nis/nss-nis.h.jj	2001-07-06 06:55:36.000000000 +0200
+++ libc/nis/nss-nis.h	2004-04-02 10:19:32.816377812 +0200
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,4 +36,16 @@ yperr2nss (int errval)
   return __yperr2nss_tab[(unsigned int) errval];
 }
 
+#define NSS_FLAG_SET			1
+#define NSS_FLAG_NETID_AUTHORITATIVE	2
+#define NSS_FLAG_SERVICES_AUTHORITATIVE	4
+extern int _nis_default_nss_flags attribute_hidden;
+extern int _nis_check_default_nss (void) attribute_hidden;
+
+extern inline __attribute__((always_inline)) int
+_nis_default_nss (void)
+{
+  return _nis_default_nss_flags ?: _nis_check_default_nss ();
+}
+
 #endif /* nis/nss-nis.h */
--- libc/nis/nss-nis.c.jj	2001-07-06 06:55:36.000000000 +0200
+++ libc/nis/nss-nis.c	2004-04-02 10:32:11.116480561 +0200
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 2001, 2004 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -16,6 +16,9 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <ctype.h>
+#include <stdio.h>
+#include <stdio_ext.h>
 #include <rpcsvc/ypclnt.h>
 
 #include "nss-nis.h"
@@ -45,3 +48,81 @@ const enum nss_status __yperr2nss_tab[] 
 };
 const unsigned int __yperr2nss_count = (sizeof (__yperr2nss_tab)
 				        / sizeof (__yperr2nss_tab[0]));
+
+int _nis_default_nss_flags;
+
+static const char default_nss[] = "/etc/default/nss";
+
+int
+_nis_check_default_nss (void)
+{
+  FILE *fp = fopen (default_nss, "rc");
+  int flags = NSS_FLAG_SET;
+  if (fp != NULL)
+    {
+      char *line = NULL;
+      size_t linelen = 0;
+
+      __fsetlocking (fp, FSETLOCKING_BYCALLER);
+
+      while (!feof_unlocked (fp))
+	{
+	  ssize_t n = getline (&line, &linelen, fp);
+	  if (n <= 0)
+	    break;
+
+	  /* There currently are only two variables we expect, so
+	     simplify the parsing.  Recognize only
+
+	       NETID_AUTHORITATIVE = TRUE
+	       SERVICES_AUTHORITATIVE = TRUE
+
+	     with arbitrary white spaces.  */
+	  char *cp = line;
+	  while (isspace (*cp))
+	    ++cp;
+
+	  /* Recognize comment lines.  */
+	  if (*cp == '#')
+	    continue;
+
+	  static const char netid_authoritative[] = "NETID_AUTHORITATIVE";
+	  static const char services_authoritative[]
+	    = "SERVICES_AUTHORITATIVE";
+	  size_t flag_len;
+	  if (strncmp (cp, netid_authoritative,
+		       flag_len = sizeof (netid_authoritative) - 1) != 0
+	      && strncmp (cp, services_authoritative,
+			  flag_len = sizeof (services_authoritative) - 1)
+		 != 0)
+	    continue;
+
+	  cp += flag_len;
+	  while (isspace (*cp))
+	    ++cp;
+	  if (*cp++ != '=')
+	    continue;
+	  while (isspace (*cp))
+	    ++cp;
+
+	  if (strncmp (cp, "TRUE", 4) != 0)
+	    continue;
+	  cp += 4;
+
+	  while (isspace (*cp))
+	    ++cp;
+
+	  if (*cp == '\0')
+	    flags |= flag_len == sizeof (netid_authoritative) - 1
+		     ? NSS_FLAG_NETID_AUTHORITATIVE
+		     : NSS_FLAG_SERVICES_AUTHORITATIVE;
+	}
+
+      free (line);
+
+      fclose (fp);
+    }
+
+  _nis_default_nss_flags = flags;
+  return flags;
+}
--- libc/nis/nss_nis/nis-service.c.jj	2004-04-02 10:06:51.000000000 +0200
+++ libc/nis/nss_nis/nis-service.c	2004-04-02 10:44:50.672358259 +0200
@@ -330,6 +330,10 @@ _nss_nis_getservbyname_r (const char *na
 	return NSS_STATUS_SUCCESS;
     }
 
+  /* Check if it is safe to rely on services.byservicename.  */
+  if (_nis_default_nss () & NSS_FLAG_SERVICES_AUTHORITATIVE)
+    return status;
+
   struct ypall_callback ypcb;
   struct search_t req;
 
--- libc/nis/nss_nis/nis-initgroups.c.jj	2004-04-02 09:55:51.000000000 +0200
+++ libc/nis/nss_nis/nis-initgroups.c	2004-04-02 10:26:41.217602735 +0200
@@ -23,8 +23,6 @@
 #include <grp.h>
 #include <nss.h>
 #include <pwd.h>
-#include <stdio.h>
-#include <stdio_ext.h>
 #include <string.h>
 #include <unistd.h>
 #include <rpcsvc/yp.h>
@@ -129,78 +127,6 @@ internal_getgrent_r (struct group *grp, 
 }
 
 
-static int init;
-static int use_netid;
-
-
-static const char default_nss[] = "/etc/default/nss";
-
-static void
-check_default_nss (void)
-{
-  FILE *fp = fopen (default_nss, "rc");
-  if (fp != NULL)
-    {
-      char *line = NULL;
-      size_t linelen = 0;
-
-      __fsetlocking (fp, FSETLOCKING_BYCALLER);
-
-      while (!feof_unlocked (fp))
-	{
-	  ssize_t n = getline (&line, &linelen, fp);
-	  if (n <= 0)
-	    break;
-
-	  /* There currently is only one variable we expect, so
-	     simplify the parsing.  Recognize only
-
-	       NETID_AUTHORITATIVE = TRUE
-
-	     with arbitrary white spaces.  */
-	  char *cp = line;
-	  while (isspace (*cp))
-	    ++cp;
-
-	  /* Recognize comment lines.  */
-	  if (*cp == '#')
-	    continue;
-
-	  static const char netid_authoritative[] = "NETID_AUTHORITATIVE";
-	  if (strncmp (cp, netid_authoritative,
-		       sizeof (netid_authoritative) - 1) != 0)
-	    continue;
-
-	  cp += sizeof (netid_authoritative) - 1;
-	  while (isspace (*cp))
-	    ++cp;
-	  if (*cp++ != '=')
-	    continue;
-	  while (isspace (*cp))
-	    ++cp;
-
-	  if (strncmp (cp, "TRUE", 4) != 0)
-	    continue;
-	  cp +=4;
-
-	  while (isspace (*cp))
-	    ++cp;
-
-	  if (*cp == '\0')
-	    use_netid = 1;
-
-	  /* For now, just drop out of the loop.  */
-	  break;
-	}
-
-      free (line);
-
-      fclose (fp);
-    }
-  init = 1;
-}
-
-
 static int
 get_uid (const char *user, uid_t *uidp)
 {
@@ -321,10 +247,7 @@ _nss_nis_initgroups_dyn (const char *use
     return NSS_STATUS_UNAVAIL;
 
   /* Check whether we are supposed to use the netid.byname map.  */
-  if (!init)
-    check_default_nss ();
-
-  if (use_netid)
+  if (_nis_default_nss () & NSS_FLAG_NETID_AUTHORITATIVE)
     {
       /* We need the user ID.  */
       uid_t uid;

[-- Attachment #3: ypserv-servicesbyname-incremental.patch --]
[-- Type: text/plain, Size: 615 bytes --]

--- ypserv-2.12.1/scripts/ypMakefile.in.jj	2004-04-01 10:08:27.000000000 +0200
+++ ypserv-2.12.1/scripts/ypMakefile.in	2004-04-02 10:40:48.734716634 +0200
@@ -278,7 +278,8 @@ services.byservicename: $(SERVICES) $(YP
 		print $$1 TMP"\t"$$0 ; \
 		if (! seen[$$1]) { seen[$$1] = 1 ; print $$1"\t"$$0 ; } \
 		for (N = 3; N <= NF && $$N !~ "#" ; N++) { \
-			if ($$N !~ "#" && $$N != "") print $$N TMP"\t"$$0 \
+			if ($$N !~ "#" && $$N != "") print $$N TMP"\t"$$0 ; \
+			if (! seen[$$N]) { seen[$$N] = 1 ; print $$N"\t"$$0 ; } \
 		} } } ' \
 		$(SERVICES) | $(DBLOAD) -r -i $(SERVICES) \
 		-o $(YPMAPDIR)/$@ - $@

[-- Attachment #4: ypserv-servicesbyname-full.patch --]
[-- Type: text/plain, Size: 825 bytes --]

--- ypserv-2.12.1/scripts/ypMakefile.in.jj	2004-01-20 10:44:54.000000000 +0100
+++ ypserv-2.12.1/scripts/ypMakefile.in	2004-04-02 10:40:48.734716634 +0200
@@ -274,10 +274,12 @@ services.byname: $(SERVICES) $(YPDIR)/Ma
 services.byservicename: $(SERVICES) $(YPDIR)/Makefile
 	@echo "Updating $@..."
 	@$(AWK) '{ if ($$1 !~ "#" && $$1 != "") { \
-		TMP = $$2 ; gsub("[0-9]+","",TMP) ; \
+		split($$2,A,"/") ; TMP = "/" A[2] ; \
 		print $$1 TMP"\t"$$0 ; \
+		if (! seen[$$1]) { seen[$$1] = 1 ; print $$1"\t"$$0 ; } \
 		for (N = 3; N <= NF && $$N !~ "#" ; N++) { \
-			if ($$N !~ "#" && $$N != "") print $$N TMP"\t"$$0 \
+			if ($$N !~ "#" && $$N != "") print $$N TMP"\t"$$0 ; \
+			if (! seen[$$N]) { seen[$$N] = 1 ; print $$N"\t"$$0 ; } \
 		} } } ' \
 		$(SERVICES) | $(DBLOAD) -r -i $(SERVICES) \
 		-o $(YPMAPDIR)/$@ - $@

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

* Re: [PATCH] SERVICES_AUTHORITATIVE
  2004-04-02  9:01 [PATCH] SERVICES_AUTHORITATIVE Jakub Jelinek
@ 2004-04-02  9:17 ` Ulrich Drepper
  0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2004-04-02  9:17 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Thorsten Kukuk, Glibc hackers

Applied.

-- 
➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖

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

end of thread, other threads:[~2004-04-02  9:17 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-04-02  9:01 [PATCH] SERVICES_AUTHORITATIVE Jakub Jelinek
2004-04-02  9:17 ` Ulrich Drepper

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