/* 3APA3A simpliest proxy server (c) 2002-2004 by ZARAZA <3APA3A@security.nnov.ru> please read License Agreement $Id: udppm.c,v 1.9 2005/05/20 12:54:05 vlad Exp $ */ #include "proxy.h" #ifndef PORTMAP #define PORTMAP #endif #ifndef UDP #define UDP #endif #define RETURN(xxx) { param->res = xxx; goto CLEANRET; } void * udppmchild(void * data) { #define param ((struct clientparam*)data) unsigned long ip; unsigned char *buf = NULL; SASIZETYPE size; int res, i; ip=getip(param->target); if (! ip) {RETURN (100);} param->sins.sin_family = AF_INET; param->sins.sin_port = htons(0); param->sins.sin_addr.s_addr = param->extip; if ((param->remsock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) {RETURN (11);} if(bind(param->remsock,(struct sockaddr *)¶m->sins,sizeof(param->sins))) {RETURN (12);} param->sins.sin_addr.s_addr = ip; param->sins.sin_port = param->targetport; size = sizeof(param->sinc); if(!param->clibuf && (!(param->clibuf=myalloc(UDPBUFSIZE)) || !(param->clibufsize = UDPBUFSIZE))){ RETURN (21); } param->cliinbuf = param->clioffset = 0; i = recvfrom(param->clisock, param->clibuf, param->clibufsize, 0, (struct sockaddr *)¶m->sinc, &size); if(param->singlepacket) param->srvfds->events = POLLIN; if(i<=0){RETURN (214);} param->cliinbuf = i; param->statscli+=i; param->operation = UDPASSOC; if((res = (*param->authfunc)(param))) {RETURN(res);} RETURN (sockmap(param, conf.timeouts[(param->singlepacket)?SINGLEBYTE_L:STRING_L])); CLEANRET: if(buf)myfree(buf); if(!param->singlepacket) param->srvfds->events = POLLIN; (*param->logfunc)(param, NULL); param->clisock = INVALID_SOCKET; freeparam(param); return (NULL); } #ifdef WITHMAIN struct proxydef childdef = { udppmchild, 0, 1, S_UDPPM, " -s single packet UDP service for request/reply (DNS-like) services\n" }; #include "proxymain.c" #endif