static int if_module_pppd_run(int rd, int wr, void *userdata) { struct pppd_ctx *ctx = userdata; const char *pppd = ctx->pc_pppd; const char *ip = ctx->pc_ip; pid_t pid; int rc; pid = fork(); PPPOAT_ASSERT(pid >= 0); if (pid == 0) { rc = dup2(rd, 0); PPPOAT_ASSERT(rc >= 0); rc = dup2(wr, 1); PPPOAT_ASSERT(rc >= 0); close(rd); close(wr); /* XXX opposite sides of the pipes are not closed */ pppoat_debug("pppd", "%s nodetach noauth notty passive %s", pppd, ip == NULL ? "" : ip); execl(pppd, pppd, "nodetach", "noauth", "notty", "passive", ip, NULL); pppoat_error("main", "execl() should never return"); exit(1); } ctx->pc_pid = pid; return 0; }
int main(int argc, char **argv) { const struct pppoat_module *m; const struct pppoat_if_module *im; void *m_data; void *im_data; int rd[2]; int wr[2]; int rc; pppoat_log_init(PPPOAT_DEBUG); if (argc > 1 && strcmp(argv[1], "--help") == 0) { help_print(stdout, argv[0]); exit(0); } if (argc > 1 && strcmp(argv[1], "--list") == 0) { module_list_print(stdout); exit(0); } im = if_module_tbl[0]; PPPOAT_ASSERT(im != NULL); m = module_find("udp"); PPPOAT_ASSERT(m != NULL); /* init modules */ rc = im->im_init(argc, argv, &im_data); PPPOAT_ASSERT_INFO(rc == 0, "rc=%d", rc); rc = m->m_init(argc, argv, &m_data); PPPOAT_ASSERT_INFO(rc == 0, "rc=%d", rc); /* create pipes for communication with pppd */ rc = pipe(rd); PPPOAT_ASSERT(rc == 0); rc = pipe(wr); PPPOAT_ASSERT(rc == 0); /* exec pppd */ rc = im->im_run(wr[0], rd[1], im_data); PPPOAT_ASSERT_INFO(rc == 0, "rc=%d", rc); close(rd[1]); close(wr[0]); /* run appropriate module's function */ rc = m->m_run(rd[0], wr[1], 0 /* XXX */, m_data); pppoat_error("main", "rc=%d", rc); /* finalisation */ im->im_stop(im_data); im->im_fini(im_data); m->m_fini(m_data); close(rd[0]); close(wr[1]); pppoat_log_fini(); return 0; }
static int if_module_pppd_stop(void *userdata) { struct pppd_ctx *ctx = userdata; pid_t pid; int rc; rc = kill(ctx->pc_pid, SIGTERM); PPPOAT_ASSERT(rc == 0); do { pid = waitpid(ctx->pc_pid, NULL, 0); } while (pid < 0 && errno == EINTR); PPPOAT_ASSERT(pid > 0); return 0; }