]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
tweak windows build for inet_pton and other build problems
authorMichael Jerris <mike@jerris.com>
Mon, 21 Apr 2008 14:35:14 +0000 (14:35 +0000)
committerMichael Jerris <mike@jerris.com>
Mon, 21 Apr 2008 14:35:14 +0000 (14:35 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@8131 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_utils.h
src/inet_pton.c [new file with mode: 0644]
src/mod/applications/mod_enum/mod_enum.c
src/mod/applications/mod_voicemail/mod_voicemail.c
src/switch_core.c
src/switch_utils.c
w32/Library/FreeSwitchCore.2008.vcproj

index 741e580e4dac58d3be87749dd605825e33b0253e..2b439f157aa38bcc446f86809a7fa95f89213a11 100644 (file)
@@ -356,6 +356,7 @@ SWITCH_DECLARE(switch_status_t) switch_network_list_add_host_mask(switch_network
 SWITCH_DECLARE(switch_bool_t) switch_network_list_validate_ip(switch_network_list_t *list, uint32_t ip);
 #define switch_test_subnet(_ip, _net, _mask) (_mask ? ((_net & _mask) == (_ip & _mask)) : _net ? _net == _ip : 1)
 
+int switch_inet_pton(int af, const char *src, void *dst);
 
 /* malloc or DIE macros */
 #ifdef NDEBUG
diff --git a/src/inet_pton.c b/src/inet_pton.c
new file mode 100644 (file)
index 0000000..0234abe
--- /dev/null
@@ -0,0 +1,240 @@
+/* This is from the BIND 4.9.4 release, modified to compile by itself */\r
+\r
+/* Copyright (c) 1996 by Internet Software Consortium.\r
+ *\r
+ * Permission to use, copy, modify, and distribute this software for any\r
+ * purpose with or without fee is hereby granted, provided that the above\r
+ * copyright notice and this permission notice appear in all copies.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS\r
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES\r
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE\r
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL\r
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR\r
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS\r
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS\r
+ * SOFTWARE.\r
+ */\r
+\r
+#ifndef HAVE_INET_PTON\r
+\r
+#ifdef HAVE_SYS_PARAM_H\r
+#include <sys/param.h>\r
+#endif\r
+#ifdef HAVE_SYS_TYPES_H\r
+#include <sys/types.h>\r
+#endif\r
+#ifdef HAVE_SYS_SOCKET_H\r
+#include <sys/socket.h>\r
+#endif\r
+#ifdef HAVE_NETINET_IN_H\r
+#include <netinet/in.h>\r
+#endif\r
+#ifdef HAVE_ARPA_INET_H\r
+#include <arpa/inet.h>\r
+#endif\r
+#include <string.h>\r
+#include <errno.h>\r
+\r
+#include "inet_pton.h"\r
+\r
+#define IN6ADDRSZ       16\r
+#define INADDRSZ         4\r
+#define INT16SZ          2\r
+\r
+#ifdef WIN32\r
+#include <winsock2.h>\r
+#define EAFNOSUPPORT    WSAEAFNOSUPPORT\r
+#endif\r
+\r
+/*\r
+ * WARNING: Don't even consider trying to compile this on a system where\r
+ * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.\r
+ */\r
+\r
+static int      inet_pton4(const char *src, unsigned char *dst);\r
+#ifdef ENABLE_IPV6\r
+static int      inet_pton6(const char *src, unsigned char *dst);\r
+#endif\r
+\r
+/* int\r
+ * inet_pton(af, src, dst)\r
+ *      convert from presentation format (which usually means ASCII printable)\r
+ *      to network format (which is usually some kind of binary format).\r
+ * return:\r
+ *      1 if the address was valid for the specified address family\r
+ *      0 if the address wasn't valid (`dst' is untouched in this case)\r
+ *      -1 if some other error occurred (`dst' is untouched in this case, too)\r
+ * author:\r
+ *      Paul Vixie, 1996.\r
+ */\r
+int\r
+switch_inet_pton(int af, const char *src, void *dst)\r
+{\r
+  switch (af) {\r
+  case AF_INET:\r
+    return (inet_pton4(src, (unsigned char *)dst));\r
+#ifdef ENABLE_IPV6\r
+#ifndef AF_INET6\r
+#define AF_INET6        (AF_MAX+1)        /* just to let this compile */\r
+#endif\r
+  case AF_INET6:\r
+    return (inet_pton6(src, (unsigned char *)dst));\r
+#endif\r
+  default:\r
+    errno = EAFNOSUPPORT;\r
+    return (-1);\r
+  }\r
+  /* NOTREACHED */\r
+}\r
+\r
+/* int\r
+ * inet_pton4(src, dst)\r
+ *      like inet_aton() but without all the hexadecimal and shorthand.\r
+ * return:\r
+ *      1 if `src' is a valid dotted quad, else 0.\r
+ * notice:\r
+ *      does not touch `dst' unless it's returning 1.\r
+ * author:\r
+ *      Paul Vixie, 1996.\r
+ */\r
+static int\r
+inet_pton4(const char *src, unsigned char *dst)\r
+{\r
+  static const char digits[] = "0123456789";\r
+  int saw_digit, octets, ch;\r
+  unsigned char tmp[INADDRSZ], *tp;\r
+\r
+  saw_digit = 0;\r
+  octets = 0;\r
+  tp = tmp;\r
+  *tp = 0;\r
+  while ((ch = *src++) != '\0') {\r
+    const char *pch;\r
+\r
+    if ((pch = strchr(digits, ch)) != NULL) {\r
+      unsigned int val = *tp * 10 + (unsigned int)(pch - digits);\r
+\r
+      if (val > 255)\r
+        return (0);\r
+      *tp = (unsigned char)val;\r
+      if (! saw_digit) {\r
+        if (++octets > 4)\r
+          return (0);\r
+        saw_digit = 1;\r
+      }\r
+    } else if (ch == '.' && saw_digit) {\r
+      if (octets == 4)\r
+        return (0);\r
+      *++tp = 0;\r
+      saw_digit = 0;\r
+    } else\r
+      return (0);\r
+  }\r
+  if (octets < 4)\r
+    return (0);\r
+  /* bcopy(tmp, dst, INADDRSZ); */\r
+  memcpy(dst, tmp, INADDRSZ);\r
+  return (1);\r
+}\r
+\r
+#ifdef ENABLE_IPV6\r
+/* int\r
+ * inet_pton6(src, dst)\r
+ *      convert presentation level address to network order binary form.\r
+ * return:\r
+ *      1 if `src' is a valid [RFC1884 2.2] address, else 0.\r
+ * notice:\r
+ *      (1) does not touch `dst' unless it's returning 1.\r
+ *      (2) :: in a full address is silently ignored.\r
+ * credit:\r
+ *      inspired by Mark Andrews.\r
+ * author:\r
+ *      Paul Vixie, 1996.\r
+ */\r
+static int\r
+inet_pton6(const char *src, unsigned char *dst)\r
+{\r
+  static const char xdigits_l[] = "0123456789abcdef",\r
+    xdigits_u[] = "0123456789ABCDEF";\r
+  unsigned char tmp[IN6ADDRSZ], *tp, *endp, *colonp;\r
+  const char *xdigits, *curtok;\r
+  int ch, saw_xdigit;\r
+  unsigned int val;\r
+\r
+  memset((tp = tmp), 0, IN6ADDRSZ);\r
+  endp = tp + IN6ADDRSZ;\r
+  colonp = NULL;\r
+  /* Leading :: requires some special handling. */\r
+  if (*src == ':')\r
+    if (*++src != ':')\r
+      return (0);\r
+  curtok = src;\r
+  saw_xdigit = 0;\r
+  val = 0;\r
+  while ((ch = *src++) != '\0') {\r
+    const char *pch;\r
+\r
+    if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL)\r
+      pch = strchr((xdigits = xdigits_u), ch);\r
+    if (pch != NULL) {\r
+      val <<= 4;\r
+      val |= (pch - xdigits);\r
+      if (val > 0xffff)\r
+        return (0);\r
+      saw_xdigit = 1;\r
+      continue;\r
+    }\r
+    if (ch == ':') {\r
+      curtok = src;\r
+      if (!saw_xdigit) {\r
+        if (colonp)\r
+          return (0);\r
+        colonp = tp;\r
+        continue;\r
+      }\r
+      if (tp + INT16SZ > endp)\r
+        return (0);\r
+      *tp++ = (unsigned char) (val >> 8) & 0xff;\r
+      *tp++ = (unsigned char) val & 0xff;\r
+      saw_xdigit = 0;\r
+      val = 0;\r
+      continue;\r
+    }\r
+    if (ch == '.' && ((tp + INADDRSZ) <= endp) &&\r
+        inet_pton4(curtok, tp) > 0) {\r
+      tp += INADDRSZ;\r
+      saw_xdigit = 0;\r
+      break;    /* '\0' was seen by inet_pton4(). */\r
+    }\r
+    return (0);\r
+  }\r
+  if (saw_xdigit) {\r
+    if (tp + INT16SZ > endp)\r
+      return (0);\r
+    *tp++ = (unsigned char) (val >> 8) & 0xff;\r
+    *tp++ = (unsigned char) val & 0xff;\r
+  }\r
+  if (colonp != NULL) {\r
+    /*\r
+     * Since some memmove()'s erroneously fail to handle\r
+     * overlapping regions, we'll do the shift by hand.\r
+     */\r
+    const int n = tp - colonp;\r
+    int i;\r
+\r
+    for (i = 1; i <= n; i++) {\r
+      endp[- i] = colonp[n - i];\r
+      colonp[n - i] = 0;\r
+    }\r
+    tp = endp;\r
+  }\r
+  if (tp != endp)\r
+    return (0);\r
+  /* bcopy(tmp, dst, IN6ADDRSZ); */\r
+  memcpy(dst, tmp, IN6ADDRSZ);\r
+  return (1);\r
+}\r
+#endif /* ENABLE_IPV6 */\r
+\r
+#endif /* HAVE_INET_PTON */\r
index 6cf26b540c403bb333efbbde16f431f6fbc4bfe7..56d0408f07e0656a5ec869237cc153cff06d3ef6 100644 (file)
@@ -767,7 +767,8 @@ SWITCH_STANDARD_API(enum_function)
        if ((argc = switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))))) {
                dest = argv[0];
                root = argv[1];
-               
+               switch_assert(dest);
+
                if (!strcasecmp(dest, "reload")) {
                        do_load();
                        stream->write_function(stream, "+OK ENUM Reloaded.\n");
index bb38a909ffb39e54fffe2f515b8b6718d78ed44d..a837a5c3b36bae8f236330f8a79b0610f979c1ab 100644 (file)
@@ -1480,8 +1480,8 @@ case VM_CHECK_CONFIG:
                        vm_check_state = VM_CHECK_MENU;
                } else if (!strcmp(input, profile->choose_greeting_key)) {
                        int num;
-                       switch_input_args_t args = { 0 };
-                       args.input_callback = cancel_on_dtmf;
+                       switch_input_args_t greeting_args = { 0 };
+                       greeting_args.input_callback = cancel_on_dtmf;
 
                        TRY_CODE(vm_macro_get(session, VM_CHOOSE_GREETING_MACRO, key_buf, input, sizeof(input), 1, "", &term, timeout));
 
@@ -1493,13 +1493,13 @@ case VM_CHECK_CONFIG:
                        } else {
                                switch_file_handle_t fh = { 0 };
                                memset(&fh, 0, sizeof(fh));
-                               args.input_callback = control_playback;
+                               greeting_args.input_callback = control_playback;
                                memset(&cc, 0, sizeof(cc));
                                cc.profile = profile;
                                cc.fh = &fh;
                                cc.noexit = 1;
-                               args.buf = &cc;
-                               status = switch_ivr_play_file(session, NULL, file_path, &args);
+                               greeting_args.buf = &cc;
+                               status = switch_ivr_play_file(session, NULL, file_path, &greeting_args);
                        }
                        if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) {
                                TRY_CODE(switch_ivr_phrase_macro(session, VM_CHOOSE_GREETING_FAIL_MACRO, NULL, NULL, NULL));
index 34a4176beb5810ee329e5e6ac5bbbd6bfe808107..32112455090619b91674c959f590ac6378de0f9c 100644 (file)
@@ -700,7 +700,7 @@ SWITCH_DECLARE(switch_bool_t) switch_check_network_list_ip(const char *ip_str, c
        switch_bool_t ok = SWITCH_FALSE;
        
        switch_mutex_lock(runtime.global_mutex);
-       inet_pton(AF_INET, ip_str, &ip);
+       switch_inet_pton(AF_INET, ip_str, &ip);
        
        if ((list = switch_core_hash_find(IP_LIST.hash, list_name))) {
                ok = switch_network_list_validate_ip(list, ip);
index 92e507f1e842d4116bbf1a3cb4373d75e6489104..d64dae7829a452679506502b0f56143c33604099 100644 (file)
@@ -53,6 +53,12 @@ struct switch_network_list {
        switch_memory_pool_t *pool;
 };
 
+#ifndef WIN32
+int switch_inet_pton(int af, const char *src, void *dst)
+{
+       return inet_pton(af, src, dst);
+}
+#endif
 
 SWITCH_DECLARE(switch_status_t) switch_network_list_create(switch_network_list_t **list, switch_bool_t default_type, switch_memory_pool_t *pool)
 {
@@ -120,8 +126,8 @@ SWITCH_DECLARE(switch_status_t) switch_network_list_add_host_mask(switch_network
        int ip, mask;
        switch_network_node_t *node;
 
-       inet_pton(AF_INET, host, &ip);
-       inet_pton(AF_INET, mask_str, &mask);
+       switch_inet_pton(AF_INET, host, &ip);
+       switch_inet_pton(AF_INET, mask_str, &mask);
        
        node = switch_core_alloc(list->pool, sizeof(*node));
        
@@ -162,7 +168,7 @@ SWITCH_DECLARE(int) switch_parse_cidr(const char *string, uint32_t *ip, uint32_t
        }
 
        bits = atoi(bit_str);
-       inet_pton(AF_INET, host, ip);
+       switch_inet_pton(AF_INET, host, ip);
        *mask = 0xFFFFFFFF & ~(0xFFFFFFFF << bits);
        *bitp = bits;
 
@@ -766,7 +772,7 @@ SWITCH_DECLARE(switch_status_t) switch_find_local_ip(char *buf, int len, int fam
                        memset(&remote, 0, sizeof(struct sockaddr_in6));
 
                        remote.sin6_family = AF_INET6;
-                       inet_pton(AF_INET6, buf, &remote.sin6_addr);
+                       switch_inet_pton(AF_INET6, buf, &remote.sin6_addr);
                        remote.sin6_port = htons(4242);
 
                        memset(&iface_out, 0, sizeof(iface_out));
index c0cc431434305e1d4984dee3638c52b7c37835fe..29e90327f4b78848833b8eb7fa0c773e27bd7061 100644 (file)
                                        />\r
                                </FileConfiguration>\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\..\src\inet_pton.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
                        <File\r
                                RelativePath="..\..\libs\stfu\stfu.c"\r
                                >\r