OSDN Git Service

Back out this patch because it is patched inside a later patch.
authorBruce Momjian <bruce@momjian.us>
Thu, 12 Jun 2003 07:00:57 +0000 (07:00 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 12 Jun 2003 07:00:57 +0000 (07:00 +0000)
---------------------------------------------------------------------------

here is a patch that allows CIDR netmasks in pg_hba.conf. It allows two
address/mask forms:

. address/maskbits, or
. address netmask (as now)

If the patch is accepted I will submit a documentation patch to cover
it.

This is submitted by agreement with Kurt Roeckx, who has worked on a
patch that covers this and other IPv6 issues.

src/backend/libpq/hba.c
src/backend/libpq/ip.c
src/include/libpq/ip.h

index 6d4da21..4310261 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.101 2003/06/12 02:12:58 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/libpq/hba.c,v 1.102 2003/06/12 07:00:57 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -588,7 +588,6 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
        else if (strcmp(token, "host") == 0 || strcmp(token, "hostssl") == 0)
        {
                SockAddr file_ip_addr, mask;
-               char * cidr_slash;
 
                if (strcmp(token, "hostssl") == 0)
                {
@@ -619,48 +618,26 @@ parse_hba(List *line, hbaPort *port, bool *found_p, bool *error_p)
                        goto hba_syntax;
                user = lfirst(line);
 
-               /* Read the IP address field. (with or without CIDR netmask) */
+               /* Read the IP address field. */
                line = lnext(line);
                if (!line)
                        goto hba_syntax;
                token = lfirst(line);
 
-               /* Check if it has a CIDR suffix and if so isolate it */
-               cidr_slash = strchr(token,'/');
-               if (cidr_slash)
-                       *cidr_slash = '\0';
-
-               /* Get the IP address either way */
                if(SockAddr_pton(&file_ip_addr, token) < 0)
-               {
-                       if (cidr_slash)
-                               *cidr_slash = '/';
                        goto hba_syntax;
-               }
-
-               /* Get the netmask */
-               if (cidr_slash)
-               {
-                       *cidr_slash = '/';
-                       if (SockAddr_cidr_mask(&mask, ++cidr_slash, file_ip_addr.sa.sa_family) < 0)
-                               goto hba_syntax;
-               }
-               else
-               {
-                       /* Read the mask field. */
-                       line = lnext(line);
-                       if (!line)
-                               goto hba_syntax;
-                       token = lfirst(line);
 
-                       if(SockAddr_pton(&mask, token) < 0)
-                               goto hba_syntax;
-
-                       if(file_ip_addr.sa.sa_family != mask.sa.sa_family)
-                               goto hba_syntax;
-               }
+               /* Read the mask field. */
+               line = lnext(line);
+               if (!line)
+                       goto hba_syntax;
+               token = lfirst(line);
 
+               if(SockAddr_pton(&mask, token) < 0)
+                       goto hba_syntax;
 
+               if(file_ip_addr.sa.sa_family != mask.sa.sa_family)
+                       goto hba_syntax;
 
                /* Read the rest of the line. */
                line = lnext(line);
index 2573829..203317b 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/libpq/ip.c,v 1.10 2003/06/12 02:12:58 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/libpq/ip.c,v 1.11 2003/06/12 07:00:57 momjian Exp $
  *
  * This file and the IPV6 implementation were initially provided by
  * Nigel Kukard <nkukard@lbsd.net>, Linux Based Systems Design
@@ -251,59 +251,6 @@ SockAddr_pton(SockAddr *sa, const char *src)
        }
 }
 
-/*
- *  SockAddr_cidr_mask - make a network mask of the appropriate family
- *    and required number of significant bits
- */
-
-int
-SockAddr_cidr_mask(SockAddr *mask, char *numbits, int family)
-{
-       int i;
-       long bits;
-       char * endptr;
-
-       bits = strtol(numbits,&endptr,10);
-
-       if (*numbits == '\0' || *endptr != '\0')
-               return -1;
-
-
-       if ((bits < 0) || (family == AF_INET && bits > 32)
-#ifdef HAVE_IPV6
-               || (family == AF_INET6 && bits > 128)
-#endif
-               )
-               return -1;
-
-       mask->sa.sa_family = family;
-
-       switch (family)
-       {
-               case AF_INET:
-                       mask->in.sin_addr.s_addr = htonl((0xffffffffUL << (32 - bits)) & 0xffffffffUL);
-                       break;
-#ifdef HAVE_IPV6
-               case AF_INET6:  
-                       for (i = 0; i < 16; i++)
-                       {
-                               if (bits <= 0)
-                                       mask->in6.sin6_addr.s6_addr[i]=0;
-                               else if (bits >= 8)
-                                       mask->in6.sin6_addr.s6_addr[i]=0xff;
-                               else
-                                       mask->in6.sin6_addr.s6_addr[i]=(0xff << (8 - bits)) & 0xff;
-                               bits -= 8;
-
-                       }
-                       break;
-#endif
-               default:
-                       return -1;
-       }
-       return 0;
-
-}
 
 /*
  *     isAF_INETx - check to see if sa is AF_INET or AF_INET6
index a6128e2..b43d997 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 2003, PostgreSQL Global Development Group
  *
- * $Id: ip.h,v 1.6 2003/06/12 02:12:58 momjian Exp $
+ * $Id: ip.h,v 1.7 2003/06/12 07:00:57 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -25,8 +25,6 @@ extern char *SockAddr_ntop(const SockAddr *sa, char *dst, size_t cnt,
                                                   int v4conv);
 extern int   SockAddr_pton(SockAddr *sa, const char *src);
 
-extern int SockAddr_cidr_mask(SockAddr *mask, char *numbits, int family);
-
 extern int   isAF_INETx(const int family);
 extern int   rangeSockAddr(const SockAddr *addr, const SockAddr *netaddr,
                                                   const SockAddr *netmask);