}
static void start_subproc(struct polypath *st, void (*make_fdpair)(int[2]),
- void (*child)(struct polypath *st, int childfd))
+ void (*child)(struct polypath *st, int childfd),
+ const char *desc)
{
int pfds[2];
st->monitor_pid=pid;
st->monitor_fd=pfds[0];
setnonblock(st->monitor_fd);
+
+ lg_perror(LG,M_NOTICE,0, "%s: spawning %s [pid %ld]",
+ st->uc.cc.cl.description, desc, (long)st->monitor_pid);
}
static void polypath_phase_startmonitor(void *sst, uint32_t newphase)
{
struct polypath *st=sst;
- start_subproc(st,pipe_cloexec,child_monitor);
+ start_subproc(st,pipe_cloexec,child_monitor,"interface monitor");
register_for_poll(st,polypath_beforepoll,
polypath_afterpoll_monitor,"polypath");
}
}
}
+static void polypath_phase_childpersist(void *sst, uint32_t newphase)
+{
+ struct polypath *st=sst;
+ struct interf *interf;
+
+ LIST_FOREACH(interf,&st->interfs,entry)
+ udp_socks_childpersist(&st->uc,&interf->socks);
+}
+
#undef BAD
#undef BADE
add_hook(PHASE_RUN, polypath_phase_startmonitor,st);
add_hook(PHASE_SHUTDOWN, polypath_phase_shutdown, st);
+ add_hook(PHASE_CHILDPERSIST,polypath_phase_childpersist,st);
return new_closure(&cc->cl);
}