00001 #include "resolver.h"
00002
00003 namespace n2nc {
00004 namespace net {
00005
00006
00007 Address& Resolver::getAddressByName(std::string &name, bool resolve){
00008
00009 }
00010
00011
00012 Address* Resolver::getAddressByFQDN(std::string &addr,bool resolve)
00013 {
00014 Address *t_addr;
00015 struct addrinfo ai,*ai_list;
00016 int ret;
00017
00018 memset(&ai,0,sizeof(ai));
00019 ai.ai_flags = AI_ADDRCONFIG ;
00020 ai.ai_flags |= (resolve ? 0 : AI_NUMERICHOST ) ;
00021 ai.ai_socktype = SOCK_STREAM;
00022
00023 ret = getaddrinfo(addr.c_str(),NULL,&ai,&ai_list);
00024 if (ret){
00025 ;
00026 N2NC_PRINT("getaddressbyfqdn() an error occured: %s\n",gai_strerror(ret)) ;
00027 return NULL ;
00028 }else{
00029 switch(ai_list->ai_family){
00030 case (AF_INET):
00031 t_addr = new IP4Address(&((struct sockaddr_in*)ai_list->ai_addr)->sin_addr);
00032 break;
00033 case (AF_INET6):
00034 t_addr = new IP6Address();
00035 memcpy (&((IP6Address*)t_addr)->m_addr, &((struct sockaddr_in6*)ai_list->ai_addr)->sin6_addr,sizeof(struct in6_addr));
00036 break;
00037 case (AF_UNIX):
00038 std::cerr << "not implemented yet!" << std::endl ;
00039 exit(1);
00040 break;
00041 }
00042 std::cerr << t_addr->toString() << std::endl ;
00043 ai_list = ai_list->ai_next ;
00044 freeaddrinfo(ai_list);
00045 }
00046 return t_addr ;
00047 }
00048
00049
00050 std::string& Resolver::getFQDNbyAddress(Address &addr){
00051 struct sockaddr *sa;
00052 struct sockaddr_in sa4 ;
00053 struct sockaddr_in6 sa6 ;
00054 void *in46_addr ;
00055 size_t addr_len ,salen ;
00056 int ret;
00057 char s_fqdn[255];
00058
00059 addr.getRawAddress(&in46_addr,&addr_len);
00060 switch (addr.getAddressFamily()){
00061 case(AF_INET):
00062 salen = sizeof(struct sockaddr_in);
00063 memset(&sa4,0,salen);
00064 memcpy( &sa4.sin_addr,in46_addr,addr_len);
00065 sa4.sin_family = AF_INET ;
00066 sa = (struct sockaddr*)&sa4 ;
00067 break;
00068
00069 case(AF_INET6):
00070 salen = sizeof(struct sockaddr_in6);
00071 memset(&sa6,0,salen);
00072 memcpy( &sa6.sin6_addr,in46_addr,addr_len);
00073 sa6.sin6_family = AF_INET6 ;
00074 sa = (struct sockaddr*)&sa6 ;
00075 break;
00076
00077 case(AF_UNIX):
00078 std::cerr << "not implemented yet!" << std::endl ;
00079 exit (1);
00080 break;
00081 }
00082 ret = getnameinfo(sa,salen,s_fqdn,255,NULL,0,NI_NOFQDN);
00083 if (ret){
00084 std::cerr << gai_strerror(ret);
00085 }else{
00086 }
00087 std::string *ret_fqdn = new std::string(s_fqdn);
00088 return *ret_fqdn ;
00089
00090 }
00091
00093 SocketAddress* Resolver::getSocketAddressByService(const std::string& fqdn,const std::string& port, int type,int af,bool resolve){
00094 struct addrinfo ai,*ai_list;
00095 SocketAddress *t_saddr;
00096 int ret ;
00097 memset(&ai,0,sizeof(ai));
00098 ai.ai_flags = AI_ADDRCONFIG ;
00099 ai.ai_flags |= (resolve ? 0 : AI_NUMERICHOST ) ;
00100 ai.ai_socktype = type ;
00101 ai.ai_family = af ;
00102 std::cerr << "addrinfo_port: " << port << " host: " << fqdn << std::endl ;
00103 ret = getaddrinfo(fqdn == "any" ? NULL :fqdn.c_str(),port.c_str(),&ai,&ai_list);
00104 if (ret){
00105 ;
00106 std::cerr << "addrinfo_error: " << gai_strerror(ret) << std::endl ;
00107 return NULL ;
00108 }else{
00109 t_saddr = new SocketAddress(ai_list->ai_addr);
00110 freeaddrinfo(ai_list);
00111 }
00112 return t_saddr ;
00113
00114 }
00115
00116 SocketAddress* Resolver::getSocketAddressByService(const std::string& fqdn,const int port, int type,int af,bool resolve){
00117
00118 char buffer[6];
00119
00120 ::sprintf(buffer, "%d", port);
00121 return Resolver::getSocketAddressByService(fqdn,buffer,type,af,resolve);
00122
00123
00124 }
00125
00126 SocketAddress * Resolver::getSocketAddressByService(const Address & addr, const int port, int type){
00127 int af = addr.getAddressFamily();
00128 std::string str_addr = addr.toString();
00129 return Resolver::getSocketAddressByService(str_addr, port, type, af, false);
00130 }
00131
00132 }
00133 }
00134
00135