35
if ((r = calloc(1, sizeof(*r))) == NULL)
38
if ((r->fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
39
return (route_close(r));
40
if ((r = calloc(1, sizeof(*r))) != NULL) {
41
if ((r->fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
42
return (route_close(r));
45
48
route_add(route_t *r, const struct route_entry *entry)
49
53
memset(&rt, 0, sizeof(rt));
51
if (addr_ntos(&entry->route_dst, &rt.rt_dst) < 0 ||
52
addr_ntos(&entry->route_gw, &rt.rt_gateway) < 0)
54
rt.rt_flags = RTF_UP | RTF_GATEWAY;
56
if (ADDR_ISHOST(&entry->route_dst)) {
57
rt.rt_flags |= RTF_HOST;
58
memcpy(&dst, &entry->route_dst, sizeof(dst));
60
addr_net(&entry->route_dst, &dst);
62
if (addr_ntos(&dst, &rt.rt_dst) < 0 ||
63
addr_ntos(&entry->route_gw, &rt.rt_gateway) < 0 ||
64
addr_btom(entry->route_dst.addr_bits, &rt.rt_subnetmask,
55
if (entry->route_dst.addr_bits < IP_ADDR_BITS) {
56
rt.rt_flags = RTF_UP | RTF_GATEWAY;
57
if (addr_btom(entry->route_dst.addr_bits, &rt.rt_subnetmask,
61
rt.rt_flags = RTF_UP | RTF_HOST | RTF_GATEWAY;
62
addr_btom(IP_ADDR_BITS, &rt.rt_subnetmask, IP_ADDR_LEN);
64
68
return (ioctl(r->fd, SIOCADDRT, &rt));
68
72
route_delete(route_t *r, const struct route_entry *entry)
72
77
memset(&rt, 0, sizeof(rt));
74
if (addr_ntos(&entry->route_dst, &rt.rt_dst) < 0)
80
if (ADDR_ISHOST(&entry->route_dst)) {
81
rt.rt_flags |= RTF_HOST;
82
memcpy(&dst, &entry->route_dst, sizeof(dst));
84
addr_net(&entry->route_dst, &dst);
86
if (addr_ntos(&dst, &rt.rt_dst) < 0 ||
87
addr_btom(entry->route_dst.addr_bits, &rt.rt_subnetmask,
77
if (entry->route_dst.addr_bits < IP_ADDR_BITS) {
79
if (addr_btom(entry->route_dst.addr_bits, &rt.rt_subnetmask,
83
rt.rt_flags = RTF_UP | RTF_HOST;
84
addr_btom(IP_ADDR_BITS, &rt.rt_subnetmask, IP_ADDR_LEN);
86
91
return (ioctl(r->fd, SIOCDELRT, &rt));