int config_parse_routing_policy_rule_tos( 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) { _cleanup_routing_policy_rule_free_ RoutingPolicyRule *n = NULL; Network *network = userdata; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = routing_policy_rule_new_static(network, filename, section_line, &n); if (r < 0) return r; r = safe_atou8(rvalue, &n->tos); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse RPDB rule tos, ignoring: %s", rvalue); return 0; } n = NULL; return 0; }
int config_parse_route_protocol(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_route_free_ Route *n = NULL; int r; r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; if (streq(rvalue, "kernel")) n->protocol = RTPROT_KERNEL; else if (streq(rvalue, "boot")) n->protocol = RTPROT_BOOT; else if (streq(rvalue, "static")) n->protocol = RTPROT_STATIC; else { r = safe_atou8(rvalue , &n->protocol); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Could not parse route protocol \"%s\", ignoring assignment: %m", rvalue); return 0; } } n = NULL; return 0; }
static int parse_argv(int argc, char *argv[]) { enum { ARG_LOG_LEVEL = 0x100, ARG_LOG_TARGET, ARG_LOG_COLOR, ARG_LOG_LOCATION, ARG_EXIT_CODE, }; static const struct option options[] = { { "log-level", required_argument, NULL, ARG_LOG_LEVEL }, { "log-target", required_argument, NULL, ARG_LOG_TARGET }, { "log-color", optional_argument, NULL, ARG_LOG_COLOR }, { "log-location", optional_argument, NULL, ARG_LOG_LOCATION }, { "exit-code", required_argument, NULL, ARG_EXIT_CODE }, {} }; int c, r; assert(argc >= 1); assert(argv); /* "-" prevents getopt from permuting argv[] and moving the verb away * from argv[1]. Our interface to initrd promises it'll be there. */ while ((c = getopt_long(argc, argv, "-", options, NULL)) >= 0) switch (c) { case ARG_LOG_LEVEL: r = log_set_max_level_from_string(optarg); if (r < 0) log_error("Failed to parse log level %s, ignoring.", optarg); break; case ARG_LOG_TARGET: r = log_set_target_from_string(optarg); if (r < 0) log_error("Failed to parse log target %s, ignoring", optarg); break; case ARG_LOG_COLOR: if (optarg) { r = log_show_color_from_string(optarg); if (r < 0) log_error("Failed to parse log color setting %s, ignoring", optarg); } else log_show_color(true); break; case ARG_LOG_LOCATION: if (optarg) { r = log_show_location_from_string(optarg); if (r < 0) log_error("Failed to parse log location setting %s, ignoring", optarg); } else log_show_location(true); break; case ARG_EXIT_CODE: r = safe_atou8(optarg, &arg_exit_code); if (r < 0) log_error("Failed to parse exit code %s, ignoring", optarg); break; case '\001': if (!arg_verb) arg_verb = optarg; else log_error("Excess arguments, ignoring"); break; case '?': return -EINVAL; default: assert_not_reached("Unhandled option code."); } if (!arg_verb) { log_error("Verb argument missing."); return -EINVAL; } return 0; }
int config_parse_destination(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_route_free_ Route *n = NULL; const char *address, *e; union in_addr_union buffer; unsigned char prefixlen; int r, f; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, section_line, &n); if (r < 0) return r; /* Destination|Source=address/prefixlen */ /* address */ e = strchr(rvalue, '/'); if (e) address = strndupa(rvalue, e - rvalue); else address = rvalue; r = in_addr_from_string_auto(address, &f, &buffer); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Destination is invalid, ignoring assignment: %s", address); return 0; } if (f != AF_INET && f != AF_INET6) { log_syntax(unit, LOG_ERR, filename, line, 0, "Unknown address family, ignoring assignment: %s", address); return 0; } /* prefixlen */ if (e) { r = safe_atou8(e + 1, &prefixlen); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Route destination prefix length is invalid, ignoring assignment: %s", e + 1); return 0; } } else { switch (f) { case AF_INET: prefixlen = 32; break; case AF_INET6: prefixlen = 128; break; } } n->family = f; if (streq(lvalue, "Destination")) { n->dst_addr = buffer; n->dst_prefixlen = prefixlen; } else if (streq(lvalue, "Source")) { n->src_addr = buffer; n->src_prefixlen = prefixlen; } else assert_not_reached(lvalue); n = NULL; return 0; }