ksockaddr.cpp

来自「konqueror3 embedded版本, KDE环境下的当家浏览器的嵌入式版」· C++ 代码 · 共 895 行 · 第 1/2 页

CPP
895
字号
#endif  d->sockfamily = family;  return true;}bool KInetSocketAddress::setPort(unsigned short port){  // set port on all socket types  d->sin.sin_port = htons(port);#ifdef AF_INET6  d->sin6.sin6_port = htons(port);#endif  return true;}bool KInetSocketAddress::setFamily(int _family){  if (_family != AF_INET#ifdef AF_INET6      && _family != AF_INET6#endif      )    {      kdWarning() << "KInetSocketAddress::setFamily(int) called with unknown family\n";      return false;    }  d->sockfamily = _family;  if (_family == AF_INET)    fromV4();#ifdef AF_INET6  else if (_family == AF_INET6)    fromV6();#endif  return true;}bool KInetSocketAddress::setFlowinfo(Q_UINT32 flowinfo){#ifdef AF_INET6  if (d->sockfamily == AF_INET6)    {      d->sin6.sin6_flowinfo = flowinfo;      return true;    }#endif  return false;}bool KInetSocketAddress::setScopeId(int scopeid){#if defined(AF_INET6) && defined(HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID)  if (d->sockfamily == AF_INET6)    {      d->sin6.sin6_scope_id = scopeid;      return true;    }#endif  (void)scopeid;  return false;}const sockaddr_in* KInetSocketAddress::addressV4() const{  if (d->sockfamily == AF_INET)    return &d->sin;#ifdef AF_INET6  else if (d->sockfamily == AF_INET6)    {      // check if this IPv6 address was converted without loss      if (V6_CAN_CONVERT_TO_V4(&d->sin6.sin6_addr))	return &d->sin;      else	return NULL;		// there was loss, so return nothing    }#endif  kdWarning() << "KInetSocketAddress::addressV4() called on uninitialized socket\n";  return NULL;}const sockaddr_in6* KInetSocketAddress::addressV6() const{#ifdef AF_INET6  return &d->sin6;#else  return NULL;#endif}in_addr KInetSocketAddress::hostV4() const{  // this might be empty  return d->sin.sin_addr;}/* * ATTENTION * This function is left undefined if no IPv6 support exists * This is intentional */#ifdef AF_INET6in6_addr KInetSocketAddress::hostV6() const{  return d->sin6.sin6_addr;}#endifQString KInetSocketAddress::pretty() const{  if (d->sockfamily != AF_INET#ifdef AF_INET6      && d->sockfamily != AF_INET6#endif      )    {      kdWarning() << "KInetSocketAddress::pretty() called on uninitialized class\n";      return i18n("<empty>");    }  return i18n("1: hostname, 2: port number", "%1 port %2").arg(nodeName()).arg(serviceName());}QString KInetSocketAddress::nodeName() const{  char buf[INET6_ADDRSTRLEN];	// INET6_ADDRSTRLEN > INET_ADDRSTRLEN  if (d->sockfamily == AF_INET)    inet_ntop(d->sockfamily, (void*)&d->sin.sin_addr, buf, sizeof(buf));#ifdef AF_INET6  else if (d->sockfamily == AF_INET6)    inet_ntop(d->sockfamily, (void*)&d->sin6.sin6_addr, buf, sizeof(buf));#endif  else    {      kdWarning() << "KInetSocketAddress::nodeName() called on uninitialized class\n";      return i18n("<empty>");    }  return QString::fromLatin1(buf); // FIXME! What's the encoding?}QString KInetSocketAddress::serviceName() const{  return QString::number(port());}unsigned short KInetSocketAddress::port() const{#ifdef AF_INET6  // we prefer sin6 here because fromV6() might make sin.sin_port be 0  return ntohs(d->sin6.sin6_port);#else  return ntohs(d->sin.sin_port);#endif}Q_UINT32 KInetSocketAddress::flowinfo() const{#ifdef AF_INET6  if (d->sockfamily == AF_INET6)    return (Q_UINT32)d->sin6.sin6_flowinfo;#endif  return 0;}ksocklen_t KInetSocketAddress::size() const{  if (d->sockfamily == AF_INET)    return sizeof(d->sin);#ifdef AF_INET6  else if (d->sockfamily == AF_INET6)    return sizeof(d->sin6);#endif  else    return 0;}bool KInetSocketAddress::areEqualInet(const KSocketAddress &s1, const KSocketAddress &s2, bool coreOnly){   if (s1.family() != s2.family())      return false;   if ((s1.size() < sizeof(sockaddr_in)) || (s2.size() < sizeof(sockaddr_in)))      return false;   struct sockaddr_in *sin1 = (sockaddr_in *) s1.address();   struct sockaddr_in *sin2 = (sockaddr_in *) s2.address();   if (coreOnly)      return (memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(struct in_addr))  == 0);   else      return (sin1->sin_port == sin2->sin_port) &&              (memcmp(&sin1->sin_addr, &sin2->sin_addr, sizeof(struct in_addr))  == 0);}bool KInetSocketAddress::areEqualInet6(const KSocketAddress &s1, const KSocketAddress &s2, bool coreOnly){#ifdef AF_INET6   if (s1.family() != s2.family())      return false;   if ((s1.size() < sizeof(sockaddr_in6)) || (s2.size() < sizeof(sockaddr_in6)))      return false;   struct sockaddr_in6 *sin1 = (sockaddr_in6 *) s1.address();   struct sockaddr_in6 *sin2 = (sockaddr_in6 *) s2.address();   if (coreOnly)     return (memcmp(&sin1->sin6_addr, &sin2->sin6_addr, sizeof(struct in6_addr))  == 0);   else     return (sin1->sin6_port == sin2->sin6_port) &&             (sin1->sin6_flowinfo == sin2->sin6_flowinfo) && #ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID            (sin1->sin6_scope_id == sin2->sin6_scope_id) && #endif            (memcmp(&sin1->sin6_addr, &sin2->sin6_addr, sizeof(struct in6_addr))  == 0);#else   return false;#endif}void KInetSocketAddress::fromV4(){  // converts an address from v4#ifdef AF_INET6  d->sin6.sin6_port = d->sin.sin_port;  // Make this a v4-mapped address  ((Q_UINT32*)&d->sin6.sin6_addr)[0] = ((Q_UINT32*)&d->sin6.sin6_addr)[1] = 0;  ((Q_UINT32*)&d->sin6.sin6_addr)[2] = htonl(0xffff);  ((Q_UINT32*)&d->sin6.sin6_addr)[3] = *(Q_UINT32*)&d->sin.sin_addr;  // Clear flowinfo and scopeid  d->sin6.sin6_flowinfo = 0;# ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID  d->sin6.sin6_scope_id = 0;# endif#endif  // data == KSocketAddress::data  data = (sockaddr*)&d->sin;  datasize = sizeof( sockaddr_in );	}void KInetSocketAddress::fromV6(){#ifdef AF_INET6  // convert to v4 only if this is a v4-mapped or v4-compat address  if (V6_CAN_CONVERT_TO_V4(&d->sin6.sin6_addr))    {      d->sin.sin_port = d->sin6.sin6_port;      *(Q_UINT32*)&d->sin.sin_addr = ((Q_UINT32*)&d->sin6.sin6_addr)[3];    }  else    {      d->sin.sin_port = 0;      memset(&d->sin.sin_addr, 0, sizeof(d->sin.sin_addr));    }  data = (sockaddr*)&d->sin6;  datasize = sizeof( d->sin6 );#endif}QString KInetSocketAddress::addrToString(int family, const void* addr){  char buf[INET6_ADDRSTRLEN+1];  return QString::fromLatin1(inet_ntop(family, addr, buf, INET6_ADDRSTRLEN));}bool KInetSocketAddress::stringToAddr(int family, const char *text, void *dest){  return inet_pton(family, text, dest) != 0;}/** * class KUnixSocketAddress */class KUnixSocketAddressPrivate{public:  sockaddr_un *m_sun;  KUnixSocketAddressPrivate() : m_sun(NULL)  { }};KUnixSocketAddress::KUnixSocketAddress() :  d(new KUnixSocketAddressPrivate){}KUnixSocketAddress::KUnixSocketAddress(const sockaddr_un* _sun, ksocklen_t size) :  d(new KUnixSocketAddressPrivate){  setAddress(_sun, size);}KUnixSocketAddress::KUnixSocketAddress(QCString pathname) :  d(new KUnixSocketAddressPrivate){  setAddress(pathname);}KUnixSocketAddress::~KUnixSocketAddress(){  delete d;}bool KUnixSocketAddress::setAddress(const sockaddr_un* _sun, ksocklen_t _size){  if (_sun->sun_family != AF_UNIX)    {      kdWarning() << "KUnixSocketAddress::setAddress called with invalid socket\n";      return false;    }  if (owndata && (d->m_sun != NULL) && (datasize >= _size))    {      // reuse this without reallocating      memcpy(d->m_sun, _sun, _size);    }  else    {      if (owndata && (d->m_sun != NULL))	free(d->m_sun);      d->m_sun = (sockaddr_un*)malloc(_size);      if (d->m_sun == NULL)	{	  // problems	  owndata = false;	  return false;	}      memcpy(d->m_sun, _sun, _size);    }  datasize = _size;  data = (sockaddr*)d->m_sun;  owndata = true;#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN  data->sa_len = _size;#endif  return 1;}bool KUnixSocketAddress::setAddress(QCString path){  // the +1 is necessary for the ending zero  ksocklen_t newsize = offsetof(sockaddr_un, sun_path) + path.length() + 1;  if (owndata && (d->m_sun != NULL) && (datasize >= newsize))    {      // we can reuse this      strcpy(d->m_sun->sun_path, path);#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN      data->sa_len = newsize;#endif      return true;    }  // nah, we have to do better  if (owndata && (d->m_sun != NULL))    free(d->m_sun);  d->m_sun = (sockaddr_un*) malloc(newsize);  if (d->m_sun == NULL)    {      owndata = false;      return false;    }  d->m_sun->sun_family = AF_UNIX;  strcpy(d->m_sun->sun_path, path);  data = (sockaddr*)d->m_sun;  datasize = newsize;#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN  data->sa_len = newsize;#endif  return 1;}QCString KUnixSocketAddress::pathname() const{  if (d->m_sun != NULL)    {      if (datasize > offsetof(sockaddr_un, sun_path))	return d->m_sun->sun_path;      return "";    }  return QCString(0);}QString KUnixSocketAddress::pretty() const{  QCString pname = pathname();  if (pname.isEmpty())    return i18n("<empty UNIX socket>");  return QFile::decodeName(pathname());}QString KUnixSocketAddress::serviceName() const{  return QString::fromUtf8(pathname());}const sockaddr_un* KUnixSocketAddress::address() const{  return d->m_sun;}bool KUnixSocketAddress::areEqualUnix(const KSocketAddress &s1, const KSocketAddress &s2, bool /* coreOnly */){   if (s1.family() != s2.family())      return false;      if ((s1.size() < MIN_SOCKADDR_LEN) || (s2.size() < MIN_SOCKADDR_LEN))      return false;   struct sockaddr_un *sun1 = (sockaddr_un *) s1.address();   struct sockaddr_un *sun2 = (sockaddr_un *) s2.address();   if (s1.size() == MIN_SOCKADDR_LEN && s2.size() == MIN_SOCKADDR_LEN)     return true;		// unnamed Unix sockets   return (strcmp(sun1->sun_path, sun2->sun_path) == 0);}void KSocketAddress::virtual_hook( int, void* ){ /*BASE::virtual_hook( id, data );*/ }void KInetSocketAddress::virtual_hook( int id, void* data ){ KSocketAddress::virtual_hook( id, data ); }void KUnixSocketAddress::virtual_hook( int id, void* data ){ KSocketAddress::virtual_hook( id, data ); }#include "ksockaddr.moc"

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?