struct connected * connected_add_by_prefix (struct interface *ifp, struct prefix *p, struct prefix *destination) { struct connected *ifc; /* Allocate new connected address. */ ifc = connected_new (); ifc->ifp = ifp; /* Fetch interface address */ ifc->address = prefix_new(); memcpy (ifc->address, p, sizeof(struct prefix)); /* Fetch dest address */ if (destination) { ifc->destination = prefix_new(); memcpy (ifc->destination, destination, sizeof(struct prefix)); } /* Add connected address to the interface. */ listnode_add (ifp->connected, ifc); return ifc; }
/* Allocate a new ip version 6 route */ struct prefix_ipv6 *prefix_ipv6_new(void) { struct prefix_ipv6 *p; /* Allocate a full-size struct prefix to avoid problems with structure size mismatches. */ p = (struct prefix_ipv6 *)prefix_new(); p->family = AF_INET6; return p; }
/* Allocate new prefix_ipv4 structure. */ struct prefix_ipv4 *prefix_ipv4_new() { struct prefix_ipv4 *p; /* Call prefix_new to allocate a full-size struct prefix to avoid problems where the struct prefix_ipv4 is cast to struct prefix and unallocated bytes were being referenced (e.g. in structure assignments). */ p = (struct prefix_ipv4 *)prefix_new(); p->family = AF_INET; return p; }
static int prefix_new_static(Network *network, const char *filename, unsigned section_line, Prefix **ret) { _cleanup_(network_config_section_freep) NetworkConfigSection *n = NULL; _cleanup_(prefix_freep) Prefix *prefix = NULL; int r; assert(network); assert(ret); assert(!!filename == (section_line > 0)); if (filename) { r = network_config_section_new(filename, section_line, &n); if (r < 0) return r; if (section_line) { prefix = hashmap_get(network->prefixes_by_section, n); if (prefix) { *ret = TAKE_PTR(prefix); return 0; } } } r = prefix_new(&prefix); if (r < 0) return r; prefix->network = network; LIST_APPEND(prefixes, network->static_prefixes, prefix); network->n_static_prefixes++; if (filename) { prefix->section = TAKE_PTR(n); r = hashmap_ensure_allocated(&network->prefixes_by_section, &network_config_hash_ops); if (r < 0) return r; r = hashmap_put(network->prefixes_by_section, prefix->section, prefix); if (r < 0) return r; } *ret = TAKE_PTR(prefix); return 0; }
int prefix_new_static(Network *network, const char *filename, unsigned section_line, Prefix **ret) { _cleanup_network_config_section_free_ NetworkConfigSection *n = NULL; _cleanup_prefix_free_ Prefix *prefix = NULL; int r; assert(network); assert(ret); assert(!!filename == (section_line > 0)); if (filename) { r = network_config_section_new(filename, section_line, &n); if (r < 0) return r; if (section_line) { prefix = hashmap_get(network->prefixes_by_section, n); if (prefix) { *ret = prefix; prefix = NULL; return 0; } } } r = prefix_new(&prefix); if (r < 0) return r; if (filename) { prefix->section = n; n = NULL; r = hashmap_put(network->prefixes_by_section, prefix->section, prefix); if (r < 0) return r; } prefix->network = network; LIST_APPEND(prefixes, network->static_prefixes, prefix); network->n_static_prefixes++; *ret = prefix; prefix = NULL; return 0; }