TEST(ort, RtCreateFile1) { TEST_ASSERT_EQUAL(0, rt_put(rt, "128", "192.168.1.007:1")); TEST_ASSERT_EQUAL(0, rt_put(rt, "129", "192.168.1.203:1")); TEST_ASSERT_EQUAL(0, rt_put(rt, "012", "192.168.1.007:2")); TEST_ASSERT_EQUAL(0, rt_put(rt, "013", "192.168.1.007:2")); TEST_ASSERT_EQUAL(0, rt_put(rt, "014", "192.168.1.203:2")); TEST_ASSERT_EQUAL(0, rt_put(rt, "015", "192.168.1.203:2")); rt_remove(rt, "014"); rt_remove(rt, "129"); TEST_ASSERT_EQUAL(0, rt_put(rt, "013", "192.168.1.007:1")); TEST_ASSERT_EQUAL(0, rt_put(rt, "134", "192.168.1.203:1")); TEST_ASSERT_EQUAL(0, rt_put(rt, "024", "192.168.1.007:2")); TEST_ASSERT_EQUAL(0, rt_put(rt, "025", "192.168.1.203:2")); rt_save(rt, "rt_glob1"); }
/* ARGSUSED */ void rde_dispatch_parent(int fd, short event, void *bula) { struct imsg imsg; struct rt_node *rt; struct kroute kr; struct imsgev *iev = bula; struct imsgbuf *ibuf = &iev->ibuf; ssize_t n; int shut = 0; if (event & EV_READ) { if ((n = imsg_read(ibuf)) == -1) fatal("imsg_read error"); if (n == 0) /* connection closed */ shut = 1; } if (event & EV_WRITE) { if (msgbuf_write(&ibuf->w) == -1 && errno != EAGAIN) fatal("msgbuf_write"); } for (;;) { if ((n = imsg_get(ibuf, &imsg)) == -1) fatal("rde_dispatch_parent: imsg_read error"); if (n == 0) break; switch (imsg.hdr.type) { case IMSG_NETWORK_ADD: if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(kr)) { log_warnx("rde_dispatch: wrong imsg len"); break; } memcpy(&kr, imsg.data, sizeof(kr)); rt = rt_new_kr(&kr); rt_insert(rt); break; case IMSG_NETWORK_DEL: if (imsg.hdr.len - IMSG_HEADER_SIZE != sizeof(kr)) { log_warnx("rde_dispatch: wrong imsg len"); break; } memcpy(&kr, imsg.data, sizeof(kr)); if ((rt = rt_find(kr.prefix.s_addr, kr.netmask.s_addr)) != NULL) rt_remove(rt); break; default: log_debug("rde_dispatch_parent: unexpected imsg %d", imsg.hdr.type); break; } imsg_free(&imsg); } if (!shut) imsg_event_add(iev); else { /* this pipe is dead, so remove the event handler */ event_del(&iev->ev); event_loopexit(NULL); } }