10 #include "interface.h"
11 #include "interface-ip.h"
17 addr_cmp(const void *k1
, const void *k2
, void *ptr
)
19 return memcmp(k1
, k2
, sizeof(struct device_addr
) -
20 offsetof(struct device_addr
, mask
));
24 route_cmp(const void *k1
, const void *k2
, void *ptr
)
26 return memcmp(k1
, k2
, sizeof(struct device_route
) -
27 offsetof(struct device_route
, mask
));
31 interface_update_proto_addr(struct vlist_tree
*tree
,
32 struct vlist_node
*node_new
,
33 struct vlist_node
*node_old
)
35 struct interface
*iface
;
37 struct device_addr
*addr
;
39 iface
= container_of(tree
, struct interface
, proto_addr
);
40 dev
= iface
->l3_dev
->dev
;
43 addr
= container_of(node_old
, struct device_addr
, node
);
44 if (!(addr
->flags
& DEVADDR_EXTERNAL
))
45 system_del_address(dev
, addr
);
50 addr
= container_of(node_new
, struct device_addr
, node
);
51 if (!(addr
->flags
& DEVADDR_EXTERNAL
))
52 system_add_address(dev
, addr
);
57 interface_update_proto_route(struct vlist_tree
*tree
,
58 struct vlist_node
*node_new
,
59 struct vlist_node
*node_old
)
61 struct interface
*iface
;
63 struct device_route
*route
;
65 iface
= container_of(tree
, struct interface
, proto_route
);
66 dev
= iface
->l3_dev
->dev
;
69 route
= container_of(node_old
, struct device_route
, node
);
70 if (!(route
->flags
& DEVADDR_EXTERNAL
))
71 system_del_route(dev
, route
);
76 route
= container_of(node_new
, struct device_route
, node
);
77 if (!(route
->flags
& DEVADDR_EXTERNAL
))
78 system_add_route(dev
, route
);
83 interface_clear_dns_servers(struct interface
*iface
)
85 struct dns_server
*s
, *tmp
;
87 list_for_each_entry_safe(s
, tmp
, &iface
->proto_dns_servers
, list
) {
94 interface_clear_dns_search(struct interface
*iface
)
96 struct dns_search_domain
*s
, *tmp
;
98 list_for_each_entry_safe(s
, tmp
, &iface
->proto_dns_search
, list
) {
105 interface_clear_dns(struct interface
*iface
)
107 interface_clear_dns_servers(iface
);
108 interface_clear_dns_search(iface
);
112 interface_write_resolv_conf(void)
114 struct interface
*iface
;
115 struct dns_server
*s
;
116 struct dns_search_domain
*d
;
117 char *path
= alloca(strlen(resolv_conf
) + 5);
122 sprintf(path
, "%s.tmp", resolv_conf
);
124 f
= fopen(path
, "w");
126 D(INTERFACE
, "Failed to open %s for writing\n", path
);
130 vlist_for_each_element(&interfaces
, iface
, node
) {
131 if (iface
->state
!= IFS_UP
)
134 if (list_empty(&iface
->proto_dns_search
) &&
135 list_empty(&iface
->proto_dns_servers
))
138 fprintf(f
, "# Interface %s\n", iface
->name
);
139 list_for_each_entry(s
, &iface
->proto_dns_servers
, list
) {
140 str
= inet_ntop(s
->af
, &s
->addr
, buf
, sizeof(buf
));
144 fprintf(f
, "nameserver %s\n", str
);
147 list_for_each_entry(d
, &iface
->proto_dns_search
, list
) {
148 fprintf(f
, "search %s\n", d
->name
);
152 if (rename(path
, resolv_conf
) < 0) {
153 D(INTERFACE
, "Failed to replace %s\n", resolv_conf
);
159 interface_ip_init(struct interface
*iface
)
161 vlist_init(&iface
->proto_route
, route_cmp
, interface_update_proto_route
,
162 struct device_route
, node
, mask
);
163 vlist_init(&iface
->proto_addr
, addr_cmp
, interface_update_proto_addr
,
164 struct device_addr
, node
, mask
);