summaryrefslogtreecommitdiff
path: root/src/shared
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2013-11-09 22:19:42 +0100
committerTom Gundersen <teg@jklm.no>2013-11-09 23:41:17 +0100
commitf52841825ad01e80465aa662358c57dc7addbb9a (patch)
treee71c5685c683122d3984541c4f1ee5e2d04f8755 /src/shared
parentb226deba789ba1a0d2cbc742ddc8160b7feb09c4 (diff)
net-util: add inet address/family parsing
Diffstat (limited to 'src/shared')
-rw-r--r--src/shared/net-util.c28
-rw-r--r--src/shared/net-util.h2
2 files changed, 30 insertions, 0 deletions
diff --git a/src/shared/net-util.c b/src/shared/net-util.c
index f853add1ec..2734d119ce 100644
--- a/src/shared/net-util.c
+++ b/src/shared/net-util.c
@@ -21,6 +21,7 @@
#include <netinet/ether.h>
#include <net/if.h>
+#include <arpa/inet.h>
#include "net-util.h"
#include "log.h"
@@ -163,3 +164,30 @@ int config_parse_hwaddr(const char *unit,
return 0;
}
+
+int net_parse_inaddr(const char *address, unsigned char *family, void *dst) {
+ int r;
+
+ assert(address);
+ assert(family);
+ assert(dst);
+
+ /* IPv4 */
+ r = inet_pton(AF_INET, address, dst);
+ if (r > 0)
+ *family = AF_INET; /* successfully parsed IPv4 address */
+ else if (r < 0)
+ return -errno;
+ else {
+ /* not an IPv4 address, so let's try IPv6 */
+ r = inet_pton(AF_INET6, address, dst);
+ if (r > 0)
+ *family = AF_INET6; /* successfully parsed IPv6 address */
+ else if (r < 0)
+ return -errno;
+ else
+ return -EINVAL;
+ }
+
+ return 0;
+}
diff --git a/src/shared/net-util.h b/src/shared/net-util.h
index 54981725b0..eac394bffa 100644
--- a/src/shared/net-util.h
+++ b/src/shared/net-util.h
@@ -42,3 +42,5 @@ int config_parse_hwaddr(const char *unit, const char *filename, unsigned line,
int config_parse_ifname(const char *unit, const char *filename, unsigned line,
const char *section, const char *lvalue, int ltype,
const char *rvalue, void *data, void *userdata);
+
+int net_parse_inaddr(const char *address, unsigned char *family, void *dst);