int config_parse_label(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) { Network *network = userdata; _cleanup_address_free_ Address *n = NULL; char *label; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = address_new_static(network, section_line, &n); if (r < 0) return r; label = strdup(rvalue); if (!label) return log_oom(); if (!ascii_is_valid(label) || strlen(label) >= IFNAMSIZ) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Interface label is not ASCII clean or is too" " long, ignoring assignment: %s", rvalue); free(label); return 0; } free(n->label); if (*label) n->label = label; else { free(label); n->label = NULL; } n = NULL; return 0; }
int config_parse_broadcast(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) { Network *network = userdata; _cleanup_address_free_ Address *n = NULL; _cleanup_free_ char *address = NULL; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = address_new_static(network, section_line, &n); if (r < 0) return r; if (n->family == AF_INET6) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Broadcast is not valid for IPv6 addresses, " "ignoring assignment: %s", address); return 0; } r = net_parse_inaddr(address, &n->family, &n->broadcast); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Broadcast is invalid, ignoring assignment: %s", address); return 0; } n = NULL; return 0; }
int config_parse_address(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) { Network *network = userdata; _cleanup_address_free_ Address *n = NULL; _cleanup_free_ char *address = NULL; const char *e; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); if (streq(section, "Network")) { /* we are not in an Address section, so treat * this as the special '0' section */ section_line = 0; } r = address_new_static(network, section_line, &n); if (r < 0) return r; /* Address=address/prefixlen */ /* prefixlen */ e = strchr(rvalue, '/'); if (e) { unsigned i; r = safe_atou(e + 1, &i); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Interface prefix length is invalid, " "ignoring assignment: %s", e + 1); return 0; } n->prefixlen = (unsigned char) i; address = strndup(rvalue, e - rvalue); if (!address) return log_oom(); } else { address = strdup(rvalue); if (!address) return log_oom(); } r = net_parse_inaddr(address, &n->family, &n->in_addr); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Address is invalid, ignoring assignment: %s", address); return 0; } if (n->family == AF_INET && !n->broadcast.s_addr) n->broadcast.s_addr = n->in_addr.in.s_addr | htonl(0xfffffffflu >> n->prefixlen); n = NULL; return 0; }