mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-23 18:45:40 +08:00
getip46 corrected
This commit is contained in:
parent
7acf3cc4ed
commit
278955deef
35
src/common.c
35
src/common.c
@ -734,8 +734,7 @@ unsigned long getip(unsigned char *name){
|
|||||||
unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){
|
unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
int ndots=0, ncols=0, nhex=0;
|
int ndots=0, ncols=0, nhex=0;
|
||||||
struct addrinfo *ai, *iter;
|
struct addrinfo *ai, hint;
|
||||||
struct sockaddr *sa4=NULL, *sa6=NULL;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if(!sa) return 0;
|
if(!sa) return 0;
|
||||||
@ -766,31 +765,31 @@ unsigned long getip46(int family, unsigned char *name, struct sockaddr *sa){
|
|||||||
if(!name[i]){
|
if(!name[i]){
|
||||||
if(ndots == 3 && ncols == 0 && nhex == 0){
|
if(ndots == 3 && ncols == 0 && nhex == 0){
|
||||||
*SAFAMILY(sa)=AF_INET;
|
*SAFAMILY(sa)=AF_INET;
|
||||||
return inet_pton(AF_INET, name, SAADDR(sa))? AF_INET : 0;
|
return inet_pton(AF_INET, name, SAADDR(sa))? (family==6? 0:AF_INET) : 0;
|
||||||
}
|
}
|
||||||
if(ncols >= 2) {
|
if(ncols >= 2) {
|
||||||
*SAFAMILY(sa)=AF_INET6;
|
*SAFAMILY(sa)=AF_INET6;
|
||||||
return inet_pton(AF_INET6, name, SAADDR(sa))? AF_INET6 : 0;
|
return inet_pton(AF_INET6, name, SAADDR(sa))?(family==4? 0:AF_INET6) : 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (getaddrinfo(name, NULL, NULL, &ai)) return 0;
|
memset(&hint, 0, sizeof(hint));
|
||||||
for(iter = ai; iter; iter = iter->ai_next){
|
hint.ai_family = (family == 6 || family == 64)?AF_INET6:AF_INET;
|
||||||
if(!sa4 && iter->ai_addr->sa_family == AF_INET) sa4 = iter->ai_addr;
|
if (getaddrinfo(name, NULL, &hint, &ai)) {
|
||||||
if(!sa6 && iter->ai_addr->sa_family == AF_INET6) sa6 = iter->ai_addr;
|
if(family == 64 || family == 46){
|
||||||
|
hint.ai_family = (family == 64)?AF_INET:AF_INET6;
|
||||||
|
if (getaddrinfo(name, NULL, &hint, &ai)) return 0;
|
||||||
}
|
}
|
||||||
if(sa6 && ((family == 6) || (family == 64) || (family == 46 && !sa4))){
|
else return 0;
|
||||||
*SAFAMILY(sa)=AF_INET6;
|
}
|
||||||
memcpy(SAADDR(sa), SAADDR(sa6), SAADDRLEN(sa));
|
if(ai){
|
||||||
|
if(ai->ai_addr->sa_family == AF_INET || ai->ai_addr->sa_family == AF_INET6){
|
||||||
|
*SAFAMILY(sa)=ai->ai_addr->sa_family;
|
||||||
|
memcpy(SAADDR(sa), SAADDR(ai->ai_addr), SAADDRLEN(ai->ai_addr));
|
||||||
freeaddrinfo(ai);
|
freeaddrinfo(ai);
|
||||||
return AF_INET6;
|
return *SAFAMILY(sa);
|
||||||
}
|
|
||||||
else if(sa4 && family != 6){
|
|
||||||
*SAFAMILY(sa)=AF_INET;
|
|
||||||
memcpy(SAADDR(sa), SAADDR(sa4), SAADDRLEN(sa));
|
|
||||||
freeaddrinfo(ai);
|
|
||||||
return AF_INET;
|
|
||||||
}
|
}
|
||||||
freeaddrinfo(ai);
|
freeaddrinfo(ai);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ int
|
|||||||
|
|
||||||
#ifndef NOIPV6
|
#ifndef NOIPV6
|
||||||
#define SAPORT(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? &((struct sockaddr_in6 *)sa)->sin6_port : &((struct sockaddr_in *)sa)->sin_port)
|
#define SAPORT(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? &((struct sockaddr_in6 *)sa)->sin6_port : &((struct sockaddr_in *)sa)->sin_port)
|
||||||
#define SAADDR(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)((struct sockaddr_in6 *)sa)->sin6_addr.s6_addr : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
|
#define SAADDR(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? (unsigned char *)((struct sockaddr_in6 *)sa)->sin6_addr.u.Byte : (unsigned char *)&((struct sockaddr_in *)sa)->sin_addr.s_addr)
|
||||||
#define SAADDRLEN(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)
|
#define SAADDRLEN(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? 16:4)
|
||||||
#define SASOCK(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? PF_INET6:PF_INET)
|
#define SASOCK(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? PF_INET6:PF_INET)
|
||||||
#define SASIZE(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in))
|
#define SASIZE(sa) (((struct sockaddr_in *)sa)->sin_family == AF_INET6? sizeof(struct sockaddr_in6):sizeof(struct sockaddr_in))
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
#define VERSION "3proxy-0.8b-devel"
|
#define VERSION "3proxy-0.8b-devel"
|
||||||
#define BUILDDATE "141103221444"
|
#define BUILDDATE "141109205515"
|
||||||
|
Loading…
Reference in New Issue
Block a user