| 1065 | } |
| 1066 | |
| 1067 | static uint32_t BuildQueryMessage(const Browser* browser, uint64_t now, uint8_t* buffer, uint32_t buffer_size) |
| 1068 | { |
| 1069 | uint32_t offset = 0; |
| 1070 | uint16_t answer_count = 0; |
| 1071 | if (!WriteU16(buffer, buffer_size, &offset, 0) // id |
| 1072 | || !WriteU16(buffer, buffer_size, &offset, 0) // query |
| 1073 | || !WriteU16(buffer, buffer_size, &offset, 1) // one question |
| 1074 | || !WriteU16(buffer, buffer_size, &offset, 0) // answers (known answers patched later) |
| 1075 | || !WriteU16(buffer, buffer_size, &offset, 0) |
| 1076 | || !WriteU16(buffer, buffer_size, &offset, 0) |
| 1077 | || !WriteName(buffer, buffer_size, &offset, browser->m_ServiceTypeLocal) |
| 1078 | || !WriteU16(buffer, buffer_size, &offset, DNS_TYPE_PTR) |
| 1079 | || !WriteU16(buffer, buffer_size, &offset, DNS_CLASS_IN)) |
| 1080 | { |
| 1081 | return 0; |
| 1082 | } |
| 1083 | |
| 1084 | for (uint32_t i = 0; i < browser->m_Services.Size(); ++i) |
| 1085 | { |
| 1086 | const BrowserService& service = browser->m_Services[i]; |
| 1087 | if (!ShouldIncludeKnownAnswer(service, now)) |
| 1088 | continue; |
| 1089 | |
| 1090 | const uint32_t ttl = RemainingTtlSeconds(service.m_PtrExpires, now); |
| 1091 | if (ttl == 0) |
| 1092 | continue; |
| 1093 | |
| 1094 | if (!WriteRecordPtr(buffer, buffer_size, &offset, browser->m_ServiceTypeLocal, service.m_FullServiceName, ttl)) |
| 1095 | return 0; |
| 1096 | ++answer_count; |
| 1097 | } |
| 1098 | |
| 1099 | buffer[6] = (uint8_t) ((answer_count >> 8) & 0xff); |
| 1100 | buffer[7] = (uint8_t) (answer_count & 0xff); |
| 1101 | |
| 1102 | return offset; |
| 1103 | } |
| 1104 | |
| 1105 | static int32_t FindRegisteredService(dmArray<RegisteredService>& services, const char* id) |
| 1106 | { |
no test coverage detected