⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 q3dns.cpp

📁 qt-x11-opensource-src-4.1.4.tar.gz源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    Q3DnsRR * rr;    while( (rr=cached->current()) != 0 ) {	if ( rr->current && !rr->nxdomain ) {	    QString str( rr->target );	    result.append( str );	}	cached->next();    }    delete cached;    return result;}/*!    Returns a list of texts if the record type is \c Txt.    Note that if you want to iterate over the list, you should iterate    over a copy, e.g.    \code    QStringList list = myDns.texts();    QStringList::Iterator it = list.begin();    while( it != list.end() ) {        myProcessing( *it );        ++it;    }    \endcode*/QStringList Q3Dns::texts() const{#if defined(Q3DNS_DEBUG)    qDebug( "Q3Dns::texts (%s)", l.ascii() );#endif    QStringList result;    if ( t != Txt )	return result;    Q3PtrList<Q3DnsRR> * cached = Q3DnsDomain::cached( this );    Q3DnsRR * rr;    while( (rr=cached->current()) != 0 ) {	if ( rr->current && !rr->nxdomain ) {	    QString str( rr->text );	    result.append( str );	}	cached->next();    }    delete cached;    return result;}/*!    Returns the canonical name for this DNS node. (This works    regardless of what recordType() is set to.)    If the canonical name isn't known, this function returns a null    string.    The canonical name of a DNS node is its full name, or the full    name of the target of its CNAME. For example, if l.trolltech.com    is a CNAME to lillian.troll.no, and the search path for Q3Dns is    "trolltech.com", then the canonical name for all of "lillian",    "l", "lillian.troll.no." and "l.trolltech.com" is    "lillian.troll.no.".*/QString Q3Dns::canonicalName() const{    // the cname should work regardless of the recordType(), so set the record    // type temporarily to cname when you look at the cache    Q3Dns *that = (Q3Dns*) this; // mutable function    RecordType oldType = t;    that->t = Cname;    Q3PtrList<Q3DnsRR> * cached = Q3DnsDomain::cached( that );    that->t = oldType;    Q3DnsRR * rr;    while( (rr=cached->current()) != 0 ) {	if ( rr->current && !rr->nxdomain && rr->domain ) {	    delete cached;	    return rr->target;	}	cached->next();    }    delete cached;    return QString();}#if defined(Q_DNS_SYNCHRONOUS)/*! \reimp*/void Q3Dns::connectNotify( const char *signal ){    if ( d->noEventLoop && qstrcmp(signal,SIGNAL(resultsReady()) )==0 ) {	doSynchronousLookup();    }}#endif#if defined(Q_OS_WIN32) || defined(Q_OS_CYGWIN)#if defined(Q_DNS_SYNCHRONOUS)void Q3Dns::doSynchronousLookup(){    // ### not implemented yet}#endif// the following typedefs are needed for GetNetworkParams() API call#ifndef IP_TYPES_INCLUDED#define MAX_HOSTNAME_LEN    128#define MAX_DOMAIN_NAME_LEN 128#define MAX_SCOPE_ID_LEN    256typedef struct {    char String[4 * 4];} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;typedef struct _IP_ADDR_STRING {    struct _IP_ADDR_STRING* Next;    IP_ADDRESS_STRING IpAddress;    IP_MASK_STRING IpMask;    DWORD Context;} IP_ADDR_STRING, *PIP_ADDR_STRING;typedef struct {    char HostName[MAX_HOSTNAME_LEN + 4] ;    char DomainName[MAX_DOMAIN_NAME_LEN + 4];    PIP_ADDR_STRING CurrentDnsServer;    IP_ADDR_STRING DnsServerList;    UINT NodeType;    char ScopeId[MAX_SCOPE_ID_LEN + 4];    UINT EnableRouting;    UINT EnableProxy;    UINT EnableDns;} FIXED_INFO, *PFIXED_INFO;#endiftypedef DWORD (WINAPI *GNP)( PFIXED_INFO, PULONG );// ### FIXME: this code is duplicated in qfiledialog.cppstatic QString getWindowsRegString( HKEY key, const QString &subKey ){    QString s;    QT_WA( {	char buf[1024];	DWORD bsz = sizeof(buf);	int r = RegQueryValueEx( key, (TCHAR*)subKey.ucs2(), 0, 0, (LPBYTE)buf, &bsz );	if ( r == ERROR_SUCCESS ) {	    s = QString::fromUcs2( (unsigned short *)buf );	} else if ( r == ERROR_MORE_DATA ) {	    char *ptr = new char[bsz+1];	    r = RegQueryValueEx( key, (TCHAR*)subKey.ucs2(), 0, 0, (LPBYTE)ptr, &bsz );	    if ( r == ERROR_SUCCESS )		s = ptr;	    delete [] ptr;	}    } , {	char buf[512];	DWORD bsz = sizeof(buf);	int r = RegQueryValueExA( key, subKey.local8Bit(), 0, 0, (LPBYTE)buf, &bsz );	if ( r == ERROR_SUCCESS ) {	    s = buf;	} else if ( r == ERROR_MORE_DATA ) {	    char *ptr = new char[bsz+1];	    r = RegQueryValueExA( key, subKey.local8Bit(), 0, 0, (LPBYTE)ptr, &bsz );	    if ( r == ERROR_SUCCESS )		s = ptr;	    delete [] ptr;	}    } );    return s;}static bool getDnsParamsFromRegistry( const QString &path,	QString *domainName, QString *nameServer, QString *searchList ){    HKEY k;    int r;    QT_WA( {	r = RegOpenKeyEx( HKEY_LOCAL_MACHINE,			  (TCHAR*)path.ucs2(),			  0, KEY_READ, &k );    } , {	r = RegOpenKeyExA( HKEY_LOCAL_MACHINE,			   path.latin1(),			   0, KEY_READ, &k );    } );    if ( r == ERROR_SUCCESS ) {	*domainName = getWindowsRegString( k, "DhcpDomain" );	if ( domainName->isEmpty() )	    *domainName = getWindowsRegString( k, "Domain" );	*nameServer = getWindowsRegString( k, "DhcpNameServer" );	if ( nameServer->isEmpty() )	    *nameServer = getWindowsRegString( k, "NameServer" );	*searchList = getWindowsRegString( k, "SearchList" );    }    RegCloseKey( k );    return r == ERROR_SUCCESS;}void Q3Dns::doResInit(){    char separator = 0;    if ( ns )        delete ns;    ns = new Q3PtrList<QHostAddress>;    ns->setAutoDelete( true );    domains = new Q3StrList( true );    domains->setAutoDelete( true );    QString domainName, nameServer, searchList;    bool gotNetworkParams = false;    // try the API call GetNetworkParams() first and use registry lookup only    // as a fallback#ifdef Q_OS_TEMP    HINSTANCE hinstLib = LoadLibraryW( L"iphlpapi" );#else    HINSTANCE hinstLib = LoadLibraryA( "iphlpapi" );#endif    if ( hinstLib != 0 ) {#ifdef Q_OS_TEMP	GNP getNetworkParams = (GNP) GetProcAddressW( hinstLib, L"GetNetworkParams" );#else	GNP getNetworkParams = (GNP) GetProcAddress( hinstLib, "GetNetworkParams" );#endif	if ( getNetworkParams != 0 ) {	    ULONG l = 0;	    DWORD res;	    res = getNetworkParams( 0, &l );	    if ( res == ERROR_BUFFER_OVERFLOW ) {		FIXED_INFO *finfo = (FIXED_INFO*)new char[l];		res = getNetworkParams( finfo, &l );		if ( res == ERROR_SUCCESS ) {		    domainName = finfo->DomainName;		    nameServer = "";		    IP_ADDR_STRING *dnsServer = &finfo->DnsServerList;		    while ( dnsServer != 0 ) {			nameServer += dnsServer->IpAddress.String;			dnsServer = dnsServer->Next;			if ( dnsServer != 0 )			    nameServer += " ";		    }		    searchList = "";		    separator = ' ';		    gotNetworkParams = true;		}		delete[] finfo;	    }	}	FreeLibrary( hinstLib );    }    if ( !gotNetworkParams ) {	if ( getDnsParamsFromRegistry(	    QString( "System\\CurrentControlSet\\Services\\Tcpip\\Parameters" ),		    &domainName, &nameServer, &searchList )) {	    // for NT	    separator = ' ';	} else if ( getDnsParamsFromRegistry(	    QString( "System\\CurrentControlSet\\Services\\VxD\\MSTCP" ),		    &domainName, &nameServer, &searchList )) {	    // for Windows 98	    separator = ',';	} else {	    // Could not access the TCP/IP parameters	    domainName = "";	    nameServer = "127.0.0.1";	    searchList = "";	    separator = ' ';	}    }    nameServer = nameServer.simplifyWhiteSpace();    int first, last;    if ( !nameServer.isEmpty() ) {	first = 0;	do {	    last = nameServer.find( separator, first );	    if ( last < 0 )		last = nameServer.length();	    Q3Dns tmp( nameServer.mid( first, last-first ), Q3Dns::A );	    Q3ValueList<QHostAddress> address = tmp.addresses();	    Q_LONG i = address.count();	    while( i )		ns->append( new QHostAddress(address[--i]) );	    first = last+1;	} while( first < (int)nameServer.length() );    }    searchList = searchList + " " + domainName;    searchList = searchList.simplifyWhiteSpace().lower();    first = 0;    do {	last = searchList.find( separator, first );	if ( last < 0 )	    last = searchList.length();	domains->append( qstrdup( searchList.mid( first, last-first ).latin1() ) );	first = last+1;    } while( first < (int)searchList.length() );}#elif defined(Q_OS_UNIX)#if defined(Q_DNS_SYNCHRONOUS)void Q3Dns::doSynchronousLookup(){    if ( t!=None && !l.isEmpty() ) {	Q3ValueListIterator<QString> it = n.begin();	Q3ValueListIterator<QString> end = n.end();	int type;	switch( t ) {	    case Q3Dns::A:		type = 1;		break;	    case Q3Dns::Aaaa:		type = 28;		break;	    case Q3Dns::Mx:		type = 15;		break;	    case Q3Dns::Srv:		type = 33;		break;	    case Q3Dns::Cname:		type = 5;		break;	    case Q3Dns::Ptr:		type = 12;		break;	    case Q3Dns::Txt:		type = 16;		break;	    default:		type = (char)255; // any		break;	}	while( it != end ) {	    QString s = *it;	    it++;	    QByteArray ba( 512 );	    int len = res_search( s.latin1(), 1, type, (uchar*)ba.data(), ba.size() );	    if ( len > 0 ) {		ba.resize( len );		Q3DnsQuery * query = new Q3DnsQuery;		query->started = now();		query->id = ++::id;		query->t = t;		query->l = s;		Q3DnsAnswer a( ba, query );		a.parse();	    } else if ( len == -1 ) {		// res_search error	    }	}	emit resultsReady();    }}#endif#if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 3)))#define Q_MODERN_RES_API#elsestatic int q3dns_res_init(){#ifdef Q_OS_MAC    extern void *qt_mac_resolve_sys(void *handle, const char *symbol);    typedef int (*PtrRes_init)();    static PtrRes_init ptrRes_init = 0;    if (!ptrRes_init)	ptrRes_init = (PtrRes_init)qt_mac_resolve_sys(RTLD_NEXT, "res_init");    if (ptrRes_init)	return (*ptrRes_init)();    else	return -1;#elif defined(Q_OS_UNIX)    return res_init();#else    return 0; // not called at all on Windows.#endif}#endifvoid Q3Dns::doResInit(){    if ( ns )	return;    ns = new Q3PtrList<QHostAddress>;    ns->setAutoDelete( true );    domains = new Q3StrList( true );    domains->setAutoDelete( true );    // read resolv.conf manually.    QFile resolvConf("/etc/resolv.conf");    if (resolvConf.open(QIODevice::ReadOnly)) {        QTextStream stream( &resolvConf );	QString line;	while ( !stream.atEnd() ) {            line = stream.readLine();	    QStringList list = QStringList::split( " ", line );	    if( line.startsWith( "#" ) || list.size() < 2 )	       continue;	    const QString type = list[0].lower();	    if ( type == "nameserver" ) {		QHostAddress *address = new QHostAddress();		if ( address->setAddress( QString(list[1]) ) ) {		    // only add ipv6 addresses from resolv.conf if		    // this host supports ipv6.		    if ( address->isIPv4Address() || ipv6support )			ns->append( address );		} else {		    delete address;		}	    } else if ( type == "search" ) {		QStringList srch = QStringList::split( " ", list[1] );		for ( QStringList::Iterator i = srch.begin(); i != srch.end(); ++i )		    domains->append( (*i).lower().local8Bit() );	    } else if ( type == "domain" ) {		domains->append( list[1].lower().local8Bit() );	    }	}    }    if (ns->isEmpty()) {#if defined(Q_MODERN_RES_API)	struct __res_state res;	res_ninit( &res );	int i;	// find the name servers to use	for( i=0; i < MAXNS && i < res.nscount; i++ )	    ns->append( new QHostAddress( ntohl( res.nsaddr_list[i].sin_addr.s_addr ) ) );#  if defined(MAXDFLSRCH)	for( i=0; i < MAXDFLSRCH; i++ ) {	    if ( res.dnsrch[i] && *(res.dnsrch[i]) )		domains->append( QString::fromLatin1( res.dnsrch[i] ).lower().local8Bit() );	    else		break;	}#  endif	if ( *res.defdname )	    domains->append( QString::fromLatin1( res.defdname ).lower().local8Bit() );#else	q3dns_res_init();	int i;	// find the name servers to use	for( i=0; i < MAXNS && i < _res.nscount; i++ )	    ns->append( new QHostAddress( ntohl( _res.nsaddr_list[i].sin_addr.s_addr ) ) );#  if defined(MAXDFLSRCH)	for( i=0; i < MAXDFLSRCH; i++ ) {	    if ( _res.dnsrch[i] && *(_res.dnsrch[i]) )		domains->append( QString::fromLatin1( _res.dnsrch[i] ).lower().local8Bit() );	    else		break;	}#  endif	if ( *_res.defdname )	    domains->append( QString::fromLatin1( _res.defdname ).lower().local8Bit() );#endif	// the code above adds "0.0.0.0" as a name server at the slightest	// hint of trouble. so remove those again.	ns->first();	while( ns->current() ) {	    if ( ns->current()->isNull() )		delete ns->take();	    else		ns->next();	}    }    QFile hosts( QString::fromLatin1( "/etc/hosts" ) );    if ( hosts.open( QIODevice::ReadOnly ) ) {	// read the /etc/hosts file, creating long-life A and PTR RRs	// for the things we find.	QTextStream i( &hosts );	QString line;	while( !i.atEnd() ) {	    line = i.readLine().simplifyWhiteSpace().lower();	    uint n = 0;	    while( (int) n < line.length() && line[(int)n] != '#' )		n++;	    line.truncate( n );	    n = 0;	    while( (int) n < line.length() && !line[(int)n].isSpace() )		n++;	    QString ip = line.left( n );	    QHostAddress a;	    a.setAddress( ip );	    if ( ( a.isIPv4Address() || a.isIPv6Address() ) && !a.isNull() ) {		bool first = true;		line = line.mid( n+1 );		n = 0;		while( (int) n < line.length() && !line[(int)n].isSpace() )		    n++;		QString hostname = line.left( n );		// ### in case of bad syntax, hostname is invalid. do we care?		if ( n ) {		    Q3DnsRR * rr = new Q3DnsRR( hostname );		    if ( a.isIPv4Address() )			rr->t = Q3Dns::A;		    else			rr->t = Q3Dns::Aaaa;		    rr->address = a;		    rr->deleteTime = UINT_MAX;		    rr->expireTime = UINT_MAX;		    rr->current = true;		    if ( first ) {			first = false;			Q3DnsRR * ptr = new Q3DnsRR( Q3Dns::toInAddrArpaDomain( a ) );			ptr->t = Q3Dns::Ptr;			ptr->target = hostname;			ptr->deleteTime = UINT_MAX;			ptr->expireTime = UINT_MAX;			ptr->current = true;		    }		}	    }	}    }}#endif#endif // QT_NO_DNS

⌨️ 快捷键说明

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