+ return True;
+
+failed:
+ udp_destroy_socket(uc,us);
+ return False;
+
+#undef FAIL
+}
+
+void udp_socks_register(struct udpcommon *uc, struct udpsocks *socks)
+{
+ socks->uc=uc;
+ socks->interest=
+ register_for_poll(socks,udp_socks_beforepoll,udp_socks_afterpoll,"udp");
+}
+
+void udp_socks_deregister(struct udpcommon *uc, struct udpsocks *socks)
+{
+ socks->uc=uc;
+ deregister_for_poll(socks->interest);
+}
+
+void udp_socks_childpersist(struct udpcommon *uc, struct udpsocks *socks)
+{
+ int i;
+ for (i=0; i<socks->n_socks; i++)
+ udp_destroy_socket(uc,&socks->socks[i]);
+}
+
+static void udp_childpersist_hook(void *sst, uint32_t new_phase)
+{
+ struct udp *st=sst;
+ udp_socks_childpersist(&st->uc,&st->socks);
+}
+
+static void udp_phase_hook(void *sst, uint32_t new_phase)
+{
+ struct udp *st=sst;
+ struct udpsocks *socks=&st->socks;
+ struct udpcommon *uc=&st->uc;
+ int i;
+ for (i=0; i<socks->n_socks; i++)
+ udp_make_socket(uc,&socks->socks[i],M_FATAL);
+
+ udp_socks_register(uc,socks);