MCPcopy Create free account
hub / github.com/3proxy/3proxy / doconnect

Function doconnect

src/common.c:650–721  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

648#endif
649
650int doconnect(struct clientparam * param){
651 SASIZETYPE size;
652
653
654 if (*SAFAMILY(&param->sincr) == *SAFAMILY(&param->req) && !memcmp(SAADDR(&param->sincr), SAADDR(&param->req), SAADDRLEN(&param->req)) &&
655 *SAPORT(&param->sincr) == *SAPORT(&param->req)) return 519;
656
657 if (param->operation == ADMIN || param->operation == DNSRESOLVE || param->operation == BIND || param->operation == UDPASSOC)
658 return 0;
659 if (param->remsock != INVALID_SOCKET){
660 size = sizeof(param->sinsr);
661 if(so._getpeername(param->remsock, (struct sockaddr *)&param->sinsr, &size)==-1) {return (15);}
662 }
663 else {
664 struct linger lg = {1,conf.timeouts[SINGLEBYTE_S]};
665
666 if(SAISNULL(&param->sinsr)){
667 if(SAISNULL(&param->req)) {
668 return 100;
669 }
670 *SAFAMILY(&param->sinsr) = *SAFAMILY(&param->req);
671 memcpy(SAADDR(&param->sinsr), SAADDR(&param->req), SAADDRLEN(&param->req));
672 }
673 if(!*SAPORT(&param->sinsr))*SAPORT(&param->sinsr) = *SAPORT(&param->req);
674 if ((param->remsock=so._socket(SASOCK(&param->sinsr), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);}
675 so._setsockopt(param->remsock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg));
676#ifdef REUSE
677 {
678 int opt;
679
680#ifdef SO_REUSEADDR
681 opt = 1;
682 so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));
683#endif
684#ifdef SO_REUSEPORT
685 opt = 1;
686 so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
687#endif
688 }
689#endif
690
691 if(SAISNULL(&param->sinsl)){
692#ifndef NOIPV6
693 if(*SAFAMILY(&param->sinsr) == AF_INET6) param->sinsl = param->srv->extsa6;
694 else
695#endif
696 param->sinsl = param->srv->extsa;
697 }
698 *SAPORT(&param->sinsl) = 0;
699 if(so._bind(param->remsock, (struct sockaddr*)&param->sinsl, SASIZE(&param->sinsl))==-1) {
700 return 12;
701 }
702
703 if(param->operation >= 256 || (param->operation & CONNECT)){
704#ifdef _WIN32
705 unsigned long ul = 1;
706#endif
707 if(so._connect(param->remsock,(struct sockaddr *)&param->sinsr,SASIZE(&param->sinsr))) {

Callers 1

alwaysauthFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected