Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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;
}