gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r24025 - gnunet/src/regex


From: gnunet
Subject: [GNUnet-SVN] r24025 - gnunet/src/regex
Date: Wed, 26 Sep 2012 23:22:44 +0200

Author: szengel
Date: 2012-09-26 23:22:44 +0200 (Wed, 26 Sep 2012)
New Revision: 24025

Modified:
   gnunet/src/regex/regex.c
Log:
ip/prefix to regex

Modified: gnunet/src/regex/regex.c
===================================================================
--- gnunet/src/regex/regex.c    2012-09-26 20:16:30 UTC (rev 24024)
+++ gnunet/src/regex/regex.c    2012-09-26 21:22:44 UTC (rev 24025)
@@ -2939,3 +2939,111 @@
                         iterator_cls);
   iterate_edge (a->start, iterator, iterator_cls);
 }
+
+
+/**
+ * Create a string with binary IP notation for the given 'addr' in 'str'.
+ *
+ * @param af address family of the given 'addr'.
+ * @param addr address that should be converted to a string.
+ *             struct in_addr * for IPv4 and struct in6_addr * for IPv6.
+ * @param str string that will contain binary notation of 'addr'. Expected
+ *            to be at least 33 bytes long for IPv4 and 129 bytes long for 
IPv6.
+ */
+static void
+iptobinstr (const int af, const void *addr, char *str)
+{
+  unsigned int i;
+
+  switch (af)
+  {
+  case AF_INET:
+  {
+    uint32_t b = htonl (((struct in_addr *) addr)->s_addr);
+
+    str[32] = '\0';
+    str += 31;
+    for (i = 31; i >= 0; i--)
+    {
+      *str-- = (b & 1) + '0';
+      b >>= 1;
+    }
+    break;
+  }
+  case AF_INET6:
+  {
+    struct in6_addr b = *(struct in6_addr *) addr;
+
+    str[128] = '\0';
+    str += 127;
+    for (i = 127; i >= 0; i--)
+    {
+      *str-- = (b.s6_addr[i / 8] & 1) + '0';
+      b.s6_addr[i / 8] >>= 1;
+    }
+    break;
+  }
+  }
+}
+
+
+/**
+ * Get the ipv4 network prefix from the given 'netmask'.
+ *
+ * @param netmask netmask for which to get the prefix len.
+ *
+ * @return length of ipv4 prefix for 'netmask'.
+ */
+static unsigned int
+ipv4netmasktoprefixlen (const char *netmask)
+{
+  struct in_addr a;
+  unsigned int len;
+  uint32_t t;
+
+  if (1 != inet_pton (AF_INET, netmask, &a))
+    return 0;
+
+  for (len = 32, t = htonl (~a.s_addr); t & 1; t >>= 1, len--) ;
+
+  return len;
+}
+
+
+/**
+ * Create a regex in 'rxstr' from the given 'ip' and 'netmask'.
+ *
+ * @param ip IPv4 representation.
+ * @param netmask netmask for the ip.
+ * @param rxstr generated regex, must be at least GNUNET_REGEX_IPV4_REGEXLEN
+ *              bytes long.
+ */
+void
+GNUNET_REGEX_ipv4toregex (const struct in_addr *ip, const char *netmask,
+                          char *rxstr)
+{
+  unsigned int pfxlen;
+
+  pfxlen = ipv4netmasktoprefixlen (netmask);
+  iptobinstr (AF_INET, ip, rxstr);
+  rxstr[pfxlen] = '\0';
+  strcat (rxstr, "(0|1)*");
+}
+
+
+/**
+ * Create a regex in 'rxstr' from the given 'ipv6' and 'prefixlen'.
+ *
+ * @param ipv6 IPv6 representation.
+ * @param prefixlen length of the ipv6 prefix.
+ * @param rxstr generated regex, must be at least GNUNET_REGEX_IPV6_REGEXLEN
+ *              bytes long.
+ */
+void
+GNUNET_REGEX_ipv6toregex (const struct in6_addr *ipv6,
+                          const unsigned int prefixlen, char *rxstr)
+{
+  iptobinstr (AF_INET6, ipv6, rxstr);
+  rxstr[prefixlen] = '\0';
+  strcat (rxstr, "(0|1)*");
+}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]