X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fshared%2Fnet-util.c;h=fa89bd904fea589d52dfd63d0544fea37bd20f18;hp=f853add1ec159cdf480b1f8e7133a6e33849c40d;hb=9bf3b53533cdc9b95c921b71da755401f223f765;hpb=b3e013148603aa670bc2c060ac63d48e54d76fc2 diff --git a/src/shared/net-util.c b/src/shared/net-util.c index f853add1e..fa89bd904 100644 --- a/src/shared/net-util.c +++ b/src/shared/net-util.c @@ -20,7 +20,8 @@ ***/ #include -#include +#include +#include #include "net-util.h" #include "log.h" @@ -86,6 +87,7 @@ int config_parse_ifname(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -122,10 +124,52 @@ int config_parse_ifname(const char *unit, return 0; } +int config_parse_ifalias(const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + char **s = data; + char *n; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + n = strdup(rvalue); + if (!n) + return log_oom(); + + if (!ascii_is_valid(n) || strlen(n) >= IFALIASZ) { + log_syntax(unit, LOG_ERR, filename, line, EINVAL, + "Interface alias is not ASCII clean or is too long, ignoring assignment: %s", rvalue); + free(n); + return 0; + } + + free(*s); + if (*n) + *s = n; + else { + free(n); + *s = NULL; + } + + return 0; +} + int config_parse_hwaddr(const char *unit, const char *filename, unsigned line, const char *section, + unsigned section_line, const char *lvalue, int ltype, const char *rvalue, @@ -163,3 +207,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; +}