]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/parseaddr.c
remap: Change remapping function argument type from void to int16_t / float as approp...
[pulseaudio] / src / pulsecore / parseaddr.c
index 149c9e0076fae01f0e375844a8f8f20d4a17a372..d31e68cbc030d006ca22dc85d7a3ff9ed7d2574f 100644 (file)
@@ -1,5 +1,3 @@
-/* $Id$ */
-
 /***
   This file is part of PulseAudio.
 
 #include <stdlib.h>
 
 #include <pulse/xmalloc.h>
-#include <pulse/util.h>
 
 #include <pulsecore/core-util.h>
 #include <pulsecore/macro.h>
+#include <pulsecore/arpa-inet.h>
 
 #include "parseaddr.h"
 
@@ -53,20 +51,29 @@ static char *parse_host(const char *s, uint16_t *ret_port) {
         if (!(e = strchr(s+1, ']')))
             return NULL;
 
-        if (e[1] == ':')
-            *ret_port = atoi(e+2);
-        else if (e[1] != 0)
+        if (e[1] == ':') {
+            uint32_t p;
+
+            if (pa_atou(e+2, &p) < 0)
+                return NULL;
+
+            *ret_port = (uint16_t) p;
+        } else if (e[1] != 0)
             return NULL;
 
-        return pa_xstrndup(s+1, e-s-1);
+        return pa_xstrndup(s+1, (size_t) (e-s-1));
     } else {
         char *e;
+        uint32_t p;
 
         if (!(e = strrchr(s, ':')))
             return pa_xstrdup(s);
 
-        *ret_port = atoi(e+1);
-        return pa_xstrndup(s, e-s);
+        if (pa_atou(e+1, &p) < 0)
+            return NULL;
+
+        *ret_port = (uint16_t) p;
+        return pa_xstrndup(s, (size_t) (e-s));
     }
 }
 
@@ -80,13 +87,15 @@ int pa_parse_address(const char *name, pa_parsed_address *ret_p) {
     ret_p->type = PA_PARSED_ADDRESS_TCP_AUTO;
 
     if (*name == '{') {
-        char hn[256], *pfx;
-        /* The URL starts with a host specification for detecting local connections */
+        char *id, *pfx;
 
-        if (!pa_get_host_name(hn, sizeof(hn)))
+        /* The URL starts with a host id for detecting local connections */
+        if (!(id = pa_machine_id()))
             return -1;
 
-        pfx = pa_sprintf_malloc("{%s}", hn);
+        pfx = pa_sprintf_malloc("{%s}", id);
+        pa_xfree(id);
+
         if (!pa_startswith(name, pfx)) {
             pa_xfree(pfx);
             /* Not local */
@@ -122,3 +131,17 @@ int pa_parse_address(const char *name, pa_parsed_address *ret_p) {
 
     return 0;
 }
+
+bool pa_is_ip_address(const char *a) {
+    char buf[INET6_ADDRSTRLEN];
+
+    pa_assert(a);
+
+    if (inet_pton(AF_INET6, a, buf) >= 1)
+        return true;
+
+    if (inet_pton(AF_INET, a, buf) >= 1)
+        return true;
+
+    return false;
+}