Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
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;
}