ifchgcb_t * ifchgcb (cbv cb) { if (!lazy) { if (!myipaddrs (&ifchg_addrs)) fatal ("myipaddrs: %m\n"); lazy = lazycb (60, wrap (ifchgcb_test)); } ifchgcb_t *chg = New ifchgcb_t (cb); chglist.insert_head (chg); return chg; }
void ifchgcb_test () { vec<in_addr> newaddrs; if (!myipaddrs (&newaddrs)) return; if (newaddrs.size () == ifchg_addrs.size () && !memcmp (newaddrs.base (), ifchg_addrs.base (), ifchg_addrs.size () * sizeof (in_addr))) return; ifchg_addrs.swap (newaddrs); ++ifchg_count; list<ifchgcb_t, &ifchgcb_t::link> olist; chglist.swap (olist); while (ifchgcb_t *chg = olist.first) { olist.remove (chg); chglist.insert_head (chg); (*chg->cb) (); } }
chord_hostname my_addr () { vec<in_addr> addrs; if (!myipaddrs (&addrs)) fatal ("my_addr: cannot find my IP address.\n"); in_addr *addr = addrs.base (); in_addr *loopback = 0; while (addr < addrs.lim ()) { if (ntohl (addr->s_addr) == INADDR_LOOPBACK) loopback = addr; else break; addr++; } if (addr >= addrs.lim () && (loopback == NULL)) fatal ("my_addr: cannot find my IP address.\n"); if (addr >= addrs.lim ()) { warnx << "my_addr: use loopback address as my address\n"; addr = loopback; } str ids = inet_ntoa (*addr); return ids; }