HostDnsServiceResolvConf.cpp revision 3f2299591cfeb8a37a3578bef9c44c1790860948
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync/* -*- indent-tabs-mode: nil; -*- */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <VBox/com/string.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <VBox/com/ptr.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#ifdef RT_OS_OS2
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync# include <sys/socket.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsynctypedef int socklen_t;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#endif
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <stdio.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <sys/socket.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <netinet/in.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <arpa/inet.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/assert.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/err.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/file.h>
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync#include <iprt/critsect.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <VBox/log.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync#include <string>
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync#include <vector>
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync#include "HostDnsService.h"
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncstruct HostDnsServiceResolvConf::Data
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync Data(const char *fileName):resolvConfFilename(fileName){};
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync std::string resolvConfFilename;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync};
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncconst std::string& HostDnsServiceResolvConf::resolvConf()
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync return m->resolvConfFilename;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync}
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncstatic int fileGets(RTFILE File, void *pvBuf, size_t cbBufSize, size_t *pcbRead)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync size_t cbRead;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char bTest;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync int rc = VERR_NO_MEMORY;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char *pu8Buf = (char *)pvBuf;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync *pcbRead = 0;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync while ( RT_SUCCESS(rc = RTFileRead(File, &bTest, 1, &cbRead))
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync && (pu8Buf - (char *)pvBuf) >= 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && (size_t)(pu8Buf - (char *)pvBuf) < cbBufSize)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if (cbRead == 0)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return VERR_EOF;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if (bTest == '\r' || bTest == '\n')
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync *pu8Buf = 0;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return VINF_SUCCESS;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync *pu8Buf = bTest;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync pu8Buf++;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync (*pcbRead)++;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return rc;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncHostDnsServiceResolvConf::~HostDnsServiceResolvConf()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync if (m) delete m;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncHRESULT HostDnsServiceResolvConf::init(const char *aResolvConfFileName)
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync{
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsMonitor::init();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync m = new Data(aResolvConfFileName);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync readResolvConf();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return S_OK;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncHRESULT HostDnsServiceResolvConf::readResolvConf()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char buff[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char buff2[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync int cNameserversFound = 0;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync bool fWarnTooManyDnsServers = false;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync struct in_addr tmp_addr;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync size_t bytes;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsInformation info;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync RTFILE resolvConfFile;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync int rc = RTFileOpen(&resolvConfFile, m->resolvConfFilename.c_str(),
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync AssertRCReturn(rc, E_FAIL);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync while ( RT_SUCCESS(rc = fileGets(resolvConfFile, buff, sizeof(buff), &bytes))
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && rc != VERR_EOF)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if ( cNameserversFound == 4
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && !fWarnTooManyDnsServers
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && sscanf(buff, "nameserver%*[ \t]%255s", buff2) == 1)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync fWarnTooManyDnsServers = true;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync LogRel(("NAT: too many nameservers registered.\n"));
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if ( sscanf(buff, "nameserver%*[ \t]%255s", buff2) == 1
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cNameserversFound < 4) /* Unix doesn't accept more than 4 name servers*/
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if (!inet_aton(buff2, &tmp_addr))
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync continue;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync info.servers.push_back(std::string(buff2));
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync cNameserversFound++;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if ((!strncmp(buff, "domain", 6) || !strncmp(buff, "search", 6)))
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char *tok;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char *saveptr;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync tok = strtok_r(&buff[6], " \t\n", &saveptr);
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync if (tok != NULL)
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync info.domain = std::string(tok);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync RTFileClose(resolvConfFile);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync setInfo(info);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync return S_OK;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}