diff options
| author | Kozlov Dmitry <dima@server> | 2010-08-25 19:50:32 +0400 |
|---|---|---|
| committer | Kozlov Dmitry <dima@server> | 2010-08-25 19:50:32 +0400 |
| commit | 14763d00a0777b7a27eb49eb5f91ac802c05ecb5 (patch) | |
| tree | df01692c930c8fe5d981e7931e41df19f234dc7e /accel-pptpd/pptp.c | |
| parent | 6f071c1e1ffeea801374416e38a9d14ee393ae13 (diff) | |
| download | accel-ppp-14763d00a0777b7a27eb49eb5f91ac802c05ecb5.tar.gz accel-ppp-14763d00a0777b7a27eb49eb5f91ac802c05ecb5.zip | |
rewriting triton library...
Diffstat (limited to 'accel-pptpd/pptp.c')
| -rw-r--r-- | accel-pptpd/pptp.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/accel-pptpd/pptp.c b/accel-pptpd/pptp.c index 6d24460..2351472 100644 --- a/accel-pptpd/pptp.c +++ b/accel-pptpd/pptp.c @@ -38,6 +38,7 @@ struct pptp_conn_t { + struct triton_ctx_t ctx; struct triton_md_handler_t hnd; int state; @@ -397,3 +398,91 @@ static void ppp_finished(struct ppp_t *ppp) conn->state=STATE_FIN; conn->hnd.twait=1000; } + +//================================== + +static int pptp_connect(struct triton_md_handler_t *h) +{ + struct sockaddr_in addr; + socklen_t size=sizeof(addr); + int sock; + struct pptp_conn_t *conn; + + while(1) + { + sock=accept(f->fd,(struct sockaddr *)&addr,&size); + if (sock<0) + { + if (errno==EAGAIN) + return 0; + log_error("pptp: accept failed\n"); + continue; + } + conn=malloc(sizeof(*conn)); + memset(conn,0,sizeof(*conn)); + conn->hnd.fd=fd; + conn->hnd.read=pptp_read; + conn->hnd.write=pptp_write; + conn->hnd.close=pptp_close; + conn->hnd.ctx=&conn->ctx; + conn->in_buf=malloc(PPTP_CTRL_SIZE_MAX); + conn->out_buf=malloc(PPTP_CTRL_SIZE_MAX); + + triton_register_ctx(&conn->ctx); + triton_md_register_handler(&conn->hnd); + triton_md_enable_handler(&conn->hnd,MD_MODE_READ); + } +} +static void pptp_serv_close(struct triton_md_handler_t *h) +{ + triton_md_unregister_handler(h); + close(h->fd); +} + +struct pptp_serv_t +{ + struct triton_context_t ctx; + struct triton_md_handler_t hnd; +}; + +static struct pptp_serv_t serv= +{ + .hnd.read=pptp_connect, + .hnd.close=pptp_serv_close, + .hnd.ctx=&serv.ctx, +}; + +void __constructor pptp_init() +{ + struct sockaddr_in addr; + socklen_t size; + + serv.hnd.fd=socket (PF_INET, SOCK_STREAM, 0); + if (serv.hnd.fd<0) + { + log_error("pptp: failed to create server socket\n"); + return; + } + addr.sin_family = AF_INET; + addr.sin_port = htons (PPTP_PORT); + addr.sin_addr.s_addr = htonl (INADDR_ANY); + if (bind (serv.hnd.fd, (struct sockaddr *) &addr, sizeof (addr)) < 0) + { + perror("pptp: bind"); + log_error("pptp: failed to bind socket\n"); + close(serv.hnd.fd); + return; + } + + if (listen (serv.hnd.fd, 100)<0) + { + log_error("pptp: failed to listen socket\n"); + close(serv.hnd.fd); + return -1; + } + + triton_register_ctx(&serv.ctx); + triton_md_register_handler(&serv.hnd); + triton_md_enable_handler(&serv.hnd,MD_MODE_READ); +} + |
