29 #include <config-network.h>
32 #include <sys/types.h>
33 #include <sys/socket.h>
34 #include <sys/param.h>
38 #include <arpa/inet.h>
39 #include <netinet/in.h>
44 #include <QCoreApplication>
48 #include <QStringList>
49 #include <QSharedData>
71 using namespace KNetwork;
72 using namespace KNetwork::Internal;
77 class KNetwork::KResolverEntryPrivate:
public QSharedData
84 QByteArray encodedName;
86 inline KResolverEntryPrivate() :
87 socktype(0), protocol(0)
99 const QString& canonName,
const QByteArray& encodedName) :
100 d(new KResolverEntryPrivate)
103 d->socktype = socktype;
105 d->canonName = canonName;
111 int protocol,
const QString& canonName,
112 const QByteArray& encodedName) :
113 d(new KResolverEntryPrivate)
116 d->socktype = socktype;
118 d->canonName = canonName;
143 return d->addr.length();
149 return d->addr.family();
161 return d->encodedName;
186 class KNetwork::KResolverResultsPrivate:
public QSharedData
190 int errorcode, syserror;
192 KResolverResultsPrivate() :
193 errorcode(0), syserror(0)
199 : d(new KResolverResultsPrivate)
243 d->errorcode = errorcode;
244 d->syserror = systemerror;
264 d->service = service;
416 if (protonum == 0 && name != 0L && *name !=
'\0')
439 KResolverManager::manager()->enqueue(
this, 0L);
453 QMutexLocker locker(&d->
mutex);
470 while (!msec || t.elapsed() < msec)
475 KResolverManager::manager()->notifyWaiters.wait(&d->
mutex, msec - t.elapsed());
477 KResolverManager::manager()->notifyWaiters.wait(&d->
mutex);
498 KResolverManager::manager()->dequeue(
this);
518 if (static_cast<int>(e->type()) == KResolverManager::ResolutionCompleted)
527 void KResolver::emitFinished()
532 QPointer<QObject> p =
this;
543 static const char messages[] =
546 I18N_NOOP(
"requested family not supported for this host name")
"\0"
547 I18N_NOOP(
"temporary failure in name resolution")
"\0"
548 I18N_NOOP(
"non-recoverable failure in name resolution")
"\0"
550 I18N_NOOP(
"memory allocation failure")
"\0"
551 I18N_NOOP(
"name or service not known")
"\0"
552 I18N_NOOP(
"requested family not supported")
"\0"
553 I18N_NOOP(
"requested service not supported for this socket type")
"\0"
554 I18N_NOOP(
"requested socket type not supported")
"\0"
556 I18N_NOOP2(
"1: the i18n'ed system error code, from errno",
557 "system error: %1")
"\0"
561 static const int messages_indices[] = {
562 0, 9, 59, 96, 139, 153, 179, 205,
568 return i18n(
"request was canceled");
570 Q_ASSERT(
int(
SystemError) <= -(
int)(
sizeof(messages_indices)/
sizeof(messages_indices[0])));
574 QString msg =
i18n(messages + messages_indices[-errorcode]);
576 msg.arg(QString::fromLocal8Bit(strerror(syserror)));
585 KResolver qres(host, service, QCoreApplication::instance());
586 qres.setObjectName(QString::fromLatin1(
"synchronous KResolver"));
596 int flags,
int families)
601 qres->setObjectName(QString::fromLatin1(
"asynchronous KResolver"));
605 return qres->
start();
611 #ifndef HAVE_GETPROTOBYNAME_R
614 pe = getprotobynumber(protonum);
617 # ifdef USE_OPENBSD // OpenBSD uses an HP/IBM/DEC API
618 struct protoent protobuf;
619 struct protoent_data pdata;
620 ::memset(&pdata, 0,
sizeof pdata);
622 if (getprotobynumber_r(protonum, &protobuf, &pdata) == 0)
628 size_t buflen = 1024;
629 struct protoent protobuf;
633 buf =
new char[buflen];
634 # ifdef Q_OS_SOLARIS // Solaris uses a 4 argument getprotobynumber_r which returns struct *protoent or NULL
635 if ((pe = getprotobynumber_r(protonum, &protobuf, buf, buflen)) && (errno == ERANGE))
637 if (getprotobynumber_r(protonum, &protobuf, buf, buflen, &pe) == ERANGE)
654 lst.append(pe->p_name);
655 for (
char **p = pe->p_aliases; *p; p++)
659 #ifdef HAVE_GETPROTOBYNAME_R
670 struct protoent *pe = 0L;
671 #ifndef HAVE_GETPROTOBYNAME_R
674 pe = getprotobyname(protoname);
677 # ifdef USE_OPENBSD // OpenBSD uses an HP/IBM/DEC API
678 struct protoent protobuf;
679 struct protoent_data pdata;
680 ::memset(&pdata, 0,
sizeof pdata);
682 if (getprotobyname_r(protoname, &protobuf, &pdata) == 0)
687 size_t buflen = 1024;
688 struct protoent protobuf;
692 buf =
new char[buflen];
693 # ifdef Q_OS_SOLARIS // Solaris uses a 4 argument getprotobyname_r which returns struct *protoent or NULL
694 if ((pe = getprotobyname_r(protoname, &protobuf, buf, buflen)) && (errno == ERANGE))
696 if (getprotobyname_r(protoname, &protobuf, buf, buflen, &pe) == ERANGE)
714 lst.append(pe->p_name);
715 for (
char **p = pe->p_aliases; *p; p++)
719 #ifdef HAVE_GETPROTOBYNAME_R
730 struct protoent *pe = 0L;
731 #ifndef HAVE_GETPROTOBYNAME_R
734 pe = getprotobyname(protoname);
737 # ifdef USE_OPENBSD // OpenBSD uses an HP/IBM/DEC API
738 struct protoent protobuf;
739 struct protoent_data pdata;
740 ::memset(&pdata, 0,
sizeof pdata);
742 if (getprotobyname_r(protoname, &protobuf, &pdata) == 0)
748 size_t buflen = 1024;
749 struct protoent protobuf;
753 buf =
new char[buflen];
754 # ifdef Q_OS_SOLARIS // Solaris uses a 4 argument getprotobyname_r which returns struct *protoent or NULL
755 if ((pe = getprotobyname_r(protoname, &protobuf, buf, buflen)) && (errno == ERANGE))
757 if (getprotobyname_r(protoname, &protobuf, buf, buflen, &pe) == ERANGE)
774 protonum = pe->p_proto;
776 #ifdef HAVE_GETPROTOBYNAME_R
787 struct servent *se = 0L;
788 #ifndef HAVE_GETSERVBYNAME_R
791 se = getservbyname(servname, protoname);
794 # ifdef USE_OPENBSD // OpenBSD uses an HP/IBM/DEC API
795 struct servent servbuf;
796 struct servent_data sdata;
797 ::memset(&sdata, 0,
sizeof sdata);
798 if (getservbyname_r(servname, protoname, &servbuf, &sdata) == 0)
804 size_t buflen = 1024;
805 struct servent servbuf;
809 buf =
new char[buflen];
810 # ifdef Q_OS_SOLARIS // Solaris uses a 5 argument getservbyname_r which returns struct *servent or NULL
811 if ((se = getservbyname_r(servname, protoname, &servbuf, buf, buflen)) && (errno == ERANGE))
813 if (getservbyname_r(servname, protoname, &servbuf, buf, buflen, &se) == ERANGE)
830 servport = ntohs(se->s_port);
832 #ifdef HAVE_GETSERVBYNAME_R
843 struct servent *se = 0L;
844 #ifndef HAVE_GETSERVBYNAME_R
847 se = getservbyname(servname, protoname);
850 # ifdef USE_OPENBSD // OpenBSD uses an HP/IBM/DEC API
851 struct servent servbuf;
852 struct servent_data sdata;
853 ::memset(&sdata, 0,
sizeof sdata);
854 if (getservbyname_r(servname, protoname, &servbuf, &sdata) == 0)
860 size_t buflen = 1024;
861 struct servent servbuf;
865 buf =
new char[buflen];
866 # ifdef Q_OS_SOLARIS // Solaris uses a 5 argument getservbyname_r which returns struct *servent or NULL
867 if ((se = getservbyname_r(servname, protoname, &servbuf, buf, buflen)) && (errno == ERANGE))
869 if (getservbyname_r(servname, protoname, &servbuf, buf, buflen, &se) == ERANGE)
887 lst.append(se->s_name);
888 for (
char **p = se->s_aliases; *p; p++)
892 #ifdef HAVE_GETSERVBYNAME_R
903 struct servent *se = 0L;
904 #ifndef HAVE_GETSERVBYPORT_R
907 se = getservbyport(port, protoname);
910 # ifdef USE_OPENBSD // OpenBSD uses an HP/IBM/DEC API
911 struct servent servbuf;
912 struct servent_data sdata;
913 ::memset(&sdata, 0,
sizeof sdata);
914 if (getservbyport_r(port, protoname, &servbuf, &sdata) == 0)
920 size_t buflen = 1024;
921 struct servent servbuf;
925 buf =
new char[buflen];
926 # ifdef Q_OS_SOLARIS // Solaris uses a 5 argument getservbyport_r which returns struct *servent or NULL
927 if ((se = getservbyport_r(port, protoname, &servbuf, buf, buflen)) && (errno == ERANGE))
929 if (getservbyport_r(port, protoname, &servbuf, buf, buflen, &se) == ERANGE)
947 lst.append(se->s_name);
948 for (
char **p = se->s_aliases; *p; p++)
952 #ifdef HAVE_GETSERVBYPORT_R
966 #ifdef MAXHOSTNAMELEN
967 len = MAXHOSTNAMELEN;
976 if (gethostname(name.data(), len) == 0)
986 if (errno == ENAMETOOLONG || errno == EINVAL)
996 return QLatin1String(
"localhost");
998 if (name.indexOf(
'.') == -1)
1003 if (results.isEmpty())
1005 return QLatin1String(
"localhost");
1007 return results.first().canonicalName();
1015 static bool init =
false;
1018 QByteArray kde_use_idn = qgetenv(
"KDE_USE_IDN");
1019 if (!kde_use_idn.isEmpty())
1020 KUrl::setIdnWhitelist(QString::fromLatin1(kde_use_idn).toLower().split(QLatin1Char(
':')));
1029 return KUrl::toAce(unicodeDomain);
1040 if (asciiDomain.isEmpty())
1043 return KUrl::fromAce(asciiDomain.toLatin1());
1063 #include "k3resolver.moc"