| 1030 | |
| 1031 | |
| 1032 | unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, unsigned *retttl, struct clientparam* param, int makeauth){ |
| 1033 | |
| 1034 | int i,n; |
| 1035 | unsigned long retval; |
| 1036 | |
| 1037 | if((af == AF_INET) && (retval = hashresolv(&dns_table, name, value, retttl))) { |
| 1038 | return retval; |
| 1039 | } |
| 1040 | if((af == AF_INET6) && (retval = hashresolv(&dns6_table, name, value, retttl))) { |
| 1041 | return retval; |
| 1042 | } |
| 1043 | n = (makeauth && !SAISNULL(&authnserver.addr))? 1 : numservers; |
| 1044 | for(i=0; i<n; i++){ |
| 1045 | unsigned short nq, na; |
| 1046 | unsigned char b[4098], *buf, *s1, *s2; |
| 1047 | int j, k, len, flen; |
| 1048 | SOCKET sock; |
| 1049 | unsigned ttl; |
| 1050 | #ifndef NOIPV6 |
| 1051 | struct sockaddr_in6 addr; |
| 1052 | struct sockaddr_in6 *sinsr, *sinsl; |
| 1053 | #else |
| 1054 | struct sockaddr_in addr; |
| 1055 | struct sockaddr_in *sinsr, *sinsl; |
| 1056 | #endif |
| 1057 | int usetcp = 0; |
| 1058 | unsigned short serial = 1; |
| 1059 | |
| 1060 | buf = b+2; |
| 1061 | |
| 1062 | sinsl = (param && !makeauth)? ¶m->sinsl : &addr; |
| 1063 | sinsr = (param && !makeauth)? ¶m->sinsr : &addr; |
| 1064 | memset(sinsl, 0, sizeof(addr)); |
| 1065 | memset(sinsr, 0, sizeof(addr)); |
| 1066 | |
| 1067 | |
| 1068 | if(makeauth && !SAISNULL(&authnserver.addr)){ |
| 1069 | usetcp = authnserver.usetcp; |
| 1070 | *SAFAMILY(sinsl) = *SAFAMILY(&authnserver.addr); |
| 1071 | } |
| 1072 | else { |
| 1073 | usetcp = nservers[i].usetcp; |
| 1074 | *SAFAMILY(sinsl) = *SAFAMILY(&nservers[i].addr); |
| 1075 | } |
| 1076 | if((sock=so._socket(SASOCK(sinsl), usetcp?SOCK_STREAM:SOCK_DGRAM, usetcp?IPPROTO_TCP:IPPROTO_UDP)) == INVALID_SOCKET) break; |
| 1077 | if(so._bind(sock,(struct sockaddr *)sinsl,SASIZE(sinsl))){ |
| 1078 | so._shutdown(sock, SHUT_RDWR); |
| 1079 | so._closesocket(sock); |
| 1080 | break; |
| 1081 | } |
| 1082 | if(makeauth && !SAISNULL(&authnserver.addr)){ |
| 1083 | *sinsr = authnserver.addr; |
| 1084 | } |
| 1085 | else { |
| 1086 | *sinsr = nservers[i].addr; |
| 1087 | } |
| 1088 | if(usetcp){ |
| 1089 | if(so._connect(sock,(struct sockaddr *)sinsr,SASIZE(sinsr))) { |
no test coverage detected