diff --git a/src/preferences/mail/AutoConfig.cpp b/src/preferences/mail/AutoConfig.cpp index e2032d4040..45d612b332 100644 --- a/src/preferences/mail/AutoConfig.cpp +++ b/src/preferences/mail/AutoConfig.cpp @@ -31,7 +31,7 @@ AutoConfig::GetInfoFromMailAddress(const char* email, provider_info *info) status_t AutoConfig::GetMXRecord(const char* provider, provider_info *info) { - BObjectList mxList; + BObjectList mxList(5, true); DNSQuery dnsQuery; if (dnsQuery.GetMXRecords(provider, &mxList) != B_OK) return B_ERROR; diff --git a/src/preferences/mail/DNSQuery.cpp b/src/preferences/mail/DNSQuery.cpp index eec110be75..43317547e2 100644 --- a/src/preferences/mail/DNSQuery.cpp +++ b/src/preferences/mail/DNSQuery.cpp @@ -4,7 +4,6 @@ #include #include -#include #include #include #include @@ -19,9 +18,6 @@ #define PRINT(a...) #endif -#undef B_TRANSLATE_CONTEXT -#define B_TRANSLATE_CONTEXT "E-Mail" - static vint32 gID = 1; @@ -98,12 +94,15 @@ BRawNetBuffer::ReadUint32(uint32& value) status_t BRawNetBuffer::ReadString(BString& string) { + if (fReadPosition >= fBuffer.BufferLength()) + return B_ERROR; + char* buffer = (char*)fBuffer.Buffer(); buffer = &buffer[fReadPosition]; // if the string is compressed we have to follow the links to the // sub strings - while (*buffer != 0) { + while (fReadPosition < fBuffer.BufferLength() && *buffer != 0) { if (uint8(*buffer) == 192) { // found a pointer mark buffer++; @@ -172,8 +171,8 @@ DNSTools::GetDNSServers(BObjectList* serverList) register FILE* fp = fopen(path.Path(), "r"); if (fp == NULL) { - fprintf(stderr, B_TRANSLATE("failed to open '%s' to read " - "nameservers: %s\n"), path.Path(), strerror(errno)); + fprintf(stderr, "failed to open '%s' to read nameservers: %s\n", + path.Path(), strerror(errno)); return B_ENTRY_NOT_FOUND; } @@ -293,14 +292,14 @@ DNSQuery::ReadDNSServer(in_addr* add) if (firstDNS == NULL || inet_aton(firstDNS->String(), add) != 1) return B_ERROR; - PRINT(B_TRANSLATE("dns server found: %s \n"), firstDNS->String()); + PRINT("dns server found: %s \n", firstDNS->String()); return B_OK; } status_t -DNSQuery::GetMXRecords(BString serverName, BObjectList* mxList, - bigtime_t timeout) +DNSQuery::GetMXRecords(const BString& serverName, + BObjectList* mxList, bigtime_t timeout) { // get the DNS server to ask for the mx record in_addr dnsAddress; @@ -314,12 +313,12 @@ DNSQuery::GetMXRecords(BString serverName, BObjectList* mxList, _AppendQueryHeader(buffer, &header); BString serverNameConv = DNSTools::ConvertToDNSName(serverName); - buffer.AppendString(serverNameConv.String()); + buffer.AppendString(serverNameConv); buffer.AppendUint16(uint16(MX_RECORD)); buffer.AppendUint16(uint16(1)); // send the buffer - PRINT(B_TRANSLATE("send buffer\n")); + PRINT("send buffer\n"); BNetAddress netAddress(dnsAddress, 53); BNetEndpoint netEndpoint(SOCK_DGRAM); if (netEndpoint.InitCheck() != B_OK) @@ -327,30 +326,31 @@ DNSQuery::GetMXRecords(BString serverName, BObjectList* mxList, if (netEndpoint.Connect(netAddress) != B_OK) return B_ERROR; - PRINT(B_TRANSLATE("Connected\n")); + PRINT("Connected\n"); -#ifdef DEBUG - int32 bytesSend = -#endif - netEndpoint.Send(buffer.Data(), buffer.Size()); - PRINT(B_TRANSLATE("bytes send %i\n"), int(bytesSend)); + int32 bytesSend = netEndpoint.Send(buffer.Data(), buffer.Size()); + if (bytesSend == B_ERROR) + return B_ERROR; + PRINT("bytes send %i\n", int(bytesSend)); // receive buffer BRawNetBuffer receiBuffer(512); netEndpoint.SetTimeout(timeout); -#ifdef DEBUG - int32 bytesRecei = -#endif - netEndpoint.ReceiveFrom(receiBuffer.Data(), 512, netAddress); - PRINT(B_TRANSLATE("bytes received %i\n"), int(bytesRecei)); + + int32 bytesRecei = netEndpoint.ReceiveFrom(receiBuffer.Data(), 512, + netAddress); + if (bytesRecei == B_ERROR) + return B_ERROR; + PRINT("bytes received %i\n", int(bytesRecei)); + dns_header receiHeader; _ReadQueryHeader(receiBuffer, &receiHeader); - PRINT(B_TRANSLATE("Package contains :")); - PRINT(B_TRANSLATE("%d Questions, "), receiHeader.q_count); - PRINT(B_TRANSLATE("%d Answers, "), receiHeader.ans_count); - PRINT(B_TRANSLATE("%d Authoritative Servers, "), receiHeader.auth_count); - PRINT(B_TRANSLATE("%d Additional records\n"), receiHeader.add_count); + PRINT("Package contains :"); + PRINT("%d Questions, ", receiHeader.q_count); + PRINT("%d Answers, ", receiHeader.ans_count); + PRINT("%d Authoritative Servers, ", receiHeader.auth_count); + PRINT("%d Additional records\n", receiHeader.add_count); // remove name and Question BString dummyS; @@ -364,11 +364,10 @@ DNSQuery::GetMXRecords(BString serverName, BObjectList* mxList, resource_record_head rrHead; _ReadResourceRecord(receiBuffer, &rrHead); if (rrHead.type == MX_RECORD) { - mx_record *mxRec = new mx_record; + mx_record* mxRec = new mx_record; _ReadMXRecord(receiBuffer, mxRec); - PRINT(B_TRANSLATE("MX record found pri %i, name %s\n"), - mxRec->priority, - mxRec->serverName.String()); + PRINT("MX record found pri %i, name %s\n", + mxRec->priority, mxRec->serverName.String()); // Add mx record to the list mxList->AddItem(mxRec); mxRecordFound = true; diff --git a/src/preferences/mail/DNSQuery.h b/src/preferences/mail/DNSQuery.h index 18648096e1..7ddeeaede9 100644 --- a/src/preferences/mail/DNSQuery.h +++ b/src/preferences/mail/DNSQuery.h @@ -58,6 +58,14 @@ public: // see also http://prasshhant.blogspot.com/2007/03/dns-query.html struct dns_header { + dns_header() + { + q_count = 0; + ans_count = 0; + auth_count = 0; + add_count = 0; + } + uint16 id; // A 16 bit identifier unsigned char qr :1; // query (0), or a response (1) @@ -90,7 +98,7 @@ public: DNSQuery(); ~DNSQuery(); status_t ReadDNSServer(in_addr* add); - status_t GetMXRecords(BString serverName, + status_t GetMXRecords(const BString& serverName, BObjectList* mxList, bigtime_t timeout = 500000);