| 15 | DWORD WINAPI threadfunc(LPVOID p) { |
| 16 | #else |
| 17 | void * threadfunc (void *p) { |
| 18 | #endif |
| 19 | int i = 0; |
| 20 | if(param->srv->cbsock != INVALID_SOCKET){ |
| 21 | SASIZETYPE size = sizeof(param->sinsr); |
| 22 | for(i=0; i<3; i++){ |
| 23 | param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size); |
| 24 | if(param->remsock == INVALID_SOCKET) { |
| 25 | param->res = 13; |
| 26 | param->srv->logfunc(param, (unsigned char *)"Connect back accept() failed"); |
| 27 | continue; |
| 28 | } |
| 29 | #ifndef WITHMAIN |
| 30 | param->req = param->sinsr; |
| 31 | if(param->srv->acl) param->res = checkACL(param); |
| 32 | if(param->res){ |
| 33 | param->srv->logfunc(param, (unsigned char *)"Connect back ACL failed"); |
| 34 | so._closesocket(param->remsock); |
| 35 | param->remsock = INVALID_SOCKET; |
| 36 | continue; |
| 37 | } |
| 38 | #endif |
| 39 | if(so._sendto(param->remsock, "C", 1, 0, (struct sockaddr*)¶m->sinsr, size) != 1){ |
| 40 | param->srv->logfunc(param, (unsigned char *)"Connect back sending command failed"); |
| 41 | so._closesocket(param->remsock); |
| 42 | param->remsock = INVALID_SOCKET; |
| 43 | continue; |
| 44 | } |
| 45 | |
| 46 | break; |
| 47 | } |
| 48 | } |
| 49 | if(i == 3){ |
| 50 | freeparam(param); |
| 51 | } |
| 52 | else { |
| 53 | ((struct clientparam *) p)->srv->pf((struct clientparam *)p); |
| 54 | } |
| 55 | #ifdef _WIN32 |
| 56 | return 0; |
| 57 | #else |
| 58 | return NULL; |
| 59 | #endif |
| 60 | } |
| 61 | #undef param |
| 62 | |
| 63 | |