| 1881 | } |
| 1882 | |
| 1883 | static void HandleBrowserRecord(Browser* browser, const uint8_t* data, uint32_t size, uint32_t* offset) |
| 1884 | { |
| 1885 | char name[256]; |
| 1886 | uint16_t type = 0; |
| 1887 | uint16_t klass = 0; |
| 1888 | uint32_t ttl = 0; |
| 1889 | uint16_t rdlength = 0; |
| 1890 | |
| 1891 | if (!ReadName(data, size, offset, name, sizeof(name)) |
| 1892 | || !ReadU16(data, size, offset, &type) |
| 1893 | || !ReadU16(data, size, offset, &klass) |
| 1894 | || !ReadU32(data, size, offset, &ttl) |
| 1895 | || !ReadU16(data, size, offset, &rdlength)) |
| 1896 | { |
| 1897 | *offset = size; |
| 1898 | return; |
| 1899 | } |
| 1900 | |
| 1901 | (void) klass; |
| 1902 | |
| 1903 | if (*offset + rdlength > size) |
| 1904 | { |
| 1905 | *offset = size; |
| 1906 | return; |
| 1907 | } |
| 1908 | |
| 1909 | uint32_t rdata_offset = *offset; |
| 1910 | *offset += rdlength; |
| 1911 | |
| 1912 | if (type == DNS_TYPE_PTR && NameEquals(name, browser->m_ServiceTypeLocal)) |
| 1913 | { |
| 1914 | uint32_t name_offset = rdata_offset; |
| 1915 | char full_service_name[256]; |
| 1916 | if (!ReadName(data, size, &name_offset, full_service_name, sizeof(full_service_name))) |
| 1917 | return; |
| 1918 | |
| 1919 | int32_t service_index = FindBrowserService(browser->m_Services, full_service_name); |
| 1920 | bool created = false; |
| 1921 | if (service_index < 0) |
| 1922 | { |
| 1923 | if (browser->m_Services.Full()) |
| 1924 | browser->m_Services.OffsetCapacity(8); |
| 1925 | |
| 1926 | BrowserService service; |
| 1927 | dmStrlCpy(service.m_FullServiceName, full_service_name, sizeof(service.m_FullServiceName)); |
| 1928 | dmStrlCpy(service.m_ServiceTypeLocal, browser->m_ServiceTypeLocal, sizeof(service.m_ServiceTypeLocal)); |
| 1929 | BuildInstanceName(service.m_FullServiceName, service.m_ServiceTypeLocal, service.m_InstanceName, sizeof(service.m_InstanceName)); |
| 1930 | browser->m_Services.Push(service); |
| 1931 | service_index = (int32_t) (browser->m_Services.Size() - 1); |
| 1932 | created = true; |
| 1933 | } |
| 1934 | |
| 1935 | BrowserService& service = browser->m_Services[(uint32_t) service_index]; |
| 1936 | |
| 1937 | if (ttl == 0) |
| 1938 | { |
| 1939 | EmitBrowserRemoved(browser, &service); |
| 1940 | browser->m_Services.EraseSwap((uint32_t) service_index); |
no test coverage detected