react-native-zeroconf 0.13.8 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/NOTICE +49 -0
  2. package/README.md +473 -65
  3. package/android/build.gradle +28 -22
  4. package/android/src/main/AndroidManifest.xml +1 -2
  5. package/android/src/main/java/com/balthazargronon/RCTZeroconf/rx2dnssd/DnssdImpl.java +19 -3
  6. package/android/src/main/java/com/github/druk/dnssd/BaseListener.java +33 -0
  7. package/android/src/main/java/com/github/druk/dnssd/BrowseListener.java +67 -0
  8. package/android/src/main/java/com/github/druk/dnssd/DNSRecord.java +47 -0
  9. package/android/src/main/java/com/github/druk/dnssd/DNSSD.java +650 -0
  10. package/android/src/main/java/com/github/druk/dnssd/DNSSDBindable.java +67 -0
  11. package/android/src/main/java/com/github/druk/dnssd/DNSSDEmbedded.java +135 -0
  12. package/android/src/main/java/com/github/druk/dnssd/DNSSDException.java +66 -0
  13. package/android/src/main/java/com/github/druk/dnssd/DNSSDRecordRegistrar.java +55 -0
  14. package/android/src/main/java/com/github/druk/dnssd/DNSSDRegistration.java +54 -0
  15. package/android/src/main/java/com/github/druk/dnssd/DNSSDService.java +35 -0
  16. package/android/src/main/java/com/github/druk/dnssd/DomainListener.java +57 -0
  17. package/android/src/main/java/com/github/druk/dnssd/InternalBrowseListener.java +76 -0
  18. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSD.java +870 -0
  19. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDRecordRegistrar.java +30 -0
  20. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDRegistration.java +34 -0
  21. package/android/src/main/java/com/github/druk/dnssd/InternalDNSSDService.java +29 -0
  22. package/android/src/main/java/com/github/druk/dnssd/InternalDomainListener.java +62 -0
  23. package/android/src/main/java/com/github/druk/dnssd/InternalQueryListener.java +61 -0
  24. package/android/src/main/java/com/github/druk/dnssd/InternalRegisterListener.java +51 -0
  25. package/android/src/main/java/com/github/druk/dnssd/InternalResolveListener.java +58 -0
  26. package/android/src/main/java/com/github/druk/dnssd/NSClass.java +16 -0
  27. package/android/src/main/java/com/github/druk/dnssd/NSType.java +58 -0
  28. package/android/src/main/java/com/github/druk/dnssd/QueryListener.java +54 -0
  29. package/android/src/main/java/com/github/druk/dnssd/RegisterListener.java +46 -0
  30. package/android/src/main/java/com/github/druk/dnssd/RegisterRecordListener.java +35 -0
  31. package/android/src/main/java/com/github/druk/dnssd/ResolveListener.java +55 -0
  32. package/android/src/main/java/com/github/druk/dnssd/TXTRecord.java +293 -0
  33. package/android/src/main/java/com/github/druk/rx2dnssd/BonjourService.java +400 -0
  34. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2BrowseListener.java +55 -0
  35. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2Dnssd.java +127 -0
  36. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2DnssdBindable.java +35 -0
  37. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2DnssdCommon.java +280 -0
  38. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2DnssdEmbedded.java +31 -0
  39. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2QueryListener.java +70 -0
  40. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2RegisterListener.java +47 -0
  41. package/android/src/main/java/com/github/druk/rx2dnssd/Rx2ResolveListener.java +51 -0
  42. package/android/src/main/jni/Android.mk +95 -0
  43. package/android/src/main/jni/Application.mk +3 -0
  44. package/android/src/main/jni/DNSSD.java.h +290 -0
  45. package/android/src/main/jni/JNISupport.c +1140 -0
  46. package/android/src/main/jni/mdnsresponder/Android.bp +215 -0
  47. package/android/src/main/jni/mdnsresponder/Clients/ClientCommon.c +75 -0
  48. package/android/src/main/jni/mdnsresponder/Clients/ClientCommon.h +41 -0
  49. package/android/src/main/jni/mdnsresponder/Clients/Makefile +54 -0
  50. package/android/src/main/jni/mdnsresponder/Clients/ReadMe.txt +25 -0
  51. package/android/src/main/jni/mdnsresponder/Clients/dns-sd.c +1351 -0
  52. package/android/src/main/jni/mdnsresponder/LICENSE +13 -0
  53. package/android/src/main/jni/mdnsresponder/MODULE_LICENSE_APACHE2 +0 -0
  54. package/android/src/main/jni/mdnsresponder/Makefile +41 -0
  55. package/android/src/main/jni/mdnsresponder/NOTICE +13 -0
  56. package/android/src/main/jni/mdnsresponder/PrivateDNS.txt +275 -0
  57. package/android/src/main/jni/mdnsresponder/README.txt +166 -0
  58. package/android/src/main/jni/mdnsresponder/README.version +3 -0
  59. package/android/src/main/jni/mdnsresponder/android/caseMapping/Iphlpapi.h +1 -0
  60. package/android/src/main/jni/mdnsresponder/android/caseMapping/README +3 -0
  61. package/android/src/main/jni/mdnsresponder/android/caseMapping/Resource.h +1 -0
  62. package/android/src/main/jni/mdnsresponder/android/caseMapping/Ws2tcpip.h +1 -0
  63. package/android/src/main/jni/mdnsresponder/android/caseMapping/ipExport.h +1 -0
  64. package/android/src/main/jni/mdnsresponder/android/windows_firewall_dummy.c +10 -0
  65. package/android/src/main/jni/mdnsresponder/mDNSCore/DNSCommon.c +3157 -0
  66. package/android/src/main/jni/mdnsresponder/mDNSCore/DNSCommon.h +292 -0
  67. package/android/src/main/jni/mdnsresponder/mDNSCore/DNSDigest.c +1579 -0
  68. package/android/src/main/jni/mdnsresponder/mDNSCore/Implementer Notes.txt +66 -0
  69. package/android/src/main/jni/mdnsresponder/mDNSCore/mDNS.c +11469 -0
  70. package/android/src/main/jni/mdnsresponder/mDNSCore/mDNSDebug.h +164 -0
  71. package/android/src/main/jni/mdnsresponder/mDNSCore/mDNSEmbeddedAPI.h +2974 -0
  72. package/android/src/main/jni/mdnsresponder/mDNSCore/uDNS.c +4969 -0
  73. package/android/src/main/jni/mdnsresponder/mDNSCore/uDNS.h +132 -0
  74. package/android/src/main/jni/mdnsresponder/mDNSPosix/Client.c +223 -0
  75. package/android/src/main/jni/mdnsresponder/mDNSPosix/ExampleClientApp.c +91 -0
  76. package/android/src/main/jni/mdnsresponder/mDNSPosix/ExampleClientApp.h +18 -0
  77. package/android/src/main/jni/mdnsresponder/mDNSPosix/Identify.c +378 -0
  78. package/android/src/main/jni/mdnsresponder/mDNSPosix/Makefile +520 -0
  79. package/android/src/main/jni/mdnsresponder/mDNSPosix/NetMonitor.c +1010 -0
  80. package/android/src/main/jni/mdnsresponder/mDNSPosix/PosixDaemon.c +329 -0
  81. package/android/src/main/jni/mdnsresponder/mDNSPosix/ProxyResponder.c +300 -0
  82. package/android/src/main/jni/mdnsresponder/mDNSPosix/ReadMe.txt +314 -0
  83. package/android/src/main/jni/mdnsresponder/mDNSPosix/Responder.c +792 -0
  84. package/android/src/main/jni/mdnsresponder/mDNSPosix/Services.txt +36 -0
  85. package/android/src/main/jni/mdnsresponder/mDNSPosix/libnss_mdns.8 +148 -0
  86. package/android/src/main/jni/mdnsresponder/mDNSPosix/mDNSPosix.c +1685 -0
  87. package/android/src/main/jni/mdnsresponder/mDNSPosix/mDNSPosix.h +88 -0
  88. package/android/src/main/jni/mdnsresponder/mDNSPosix/mDNSUNP.c +726 -0
  89. package/android/src/main/jni/mdnsresponder/mDNSPosix/mDNSUNP.h +130 -0
  90. package/android/src/main/jni/mdnsresponder/mDNSPosix/mdnsd.sh +73 -0
  91. package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_ReadMe.txt +125 -0
  92. package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.c +2723 -0
  93. package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.conf +13 -0
  94. package/android/src/main/jni/mdnsresponder/mDNSPosix/nss_mdns.conf.5 +135 -0
  95. package/android/src/main/jni/mdnsresponder/mDNSPosix/parselog.py +247 -0
  96. package/android/src/main/jni/mdnsresponder/mDNSResponder.sln +400 -0
  97. package/android/src/main/jni/mdnsresponder/mDNSShared/CommonServices.h +1537 -0
  98. package/android/src/main/jni/mdnsresponder/mDNSShared/DebugServices.c +3075 -0
  99. package/android/src/main/jni/mdnsresponder/mDNSShared/DebugServices.h +1607 -0
  100. package/android/src/main/jni/mdnsresponder/mDNSShared/GenLinkedList.c +319 -0
  101. package/android/src/main/jni/mdnsresponder/mDNSShared/GenLinkedList.h +90 -0
  102. package/android/src/main/jni/mdnsresponder/mDNSShared/PlatformCommon.c +220 -0
  103. package/android/src/main/jni/mdnsresponder/mDNSShared/PlatformCommon.h +18 -0
  104. package/android/src/main/jni/mdnsresponder/mDNSShared/dns-sd.1 +194 -0
  105. package/android/src/main/jni/mdnsresponder/mDNSShared/dns_sd.h +2452 -0
  106. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.8 +69 -0
  107. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.c +3146 -0
  108. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.conf +60 -0
  109. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd.h +163 -0
  110. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd_lexer.l +84 -0
  111. package/android/src/main/jni/mdnsresponder/mDNSShared/dnsextd_parser.y +585 -0
  112. package/android/src/main/jni/mdnsresponder/mDNSShared/dnssd_clientlib.c +368 -0
  113. package/android/src/main/jni/mdnsresponder/mDNSShared/dnssd_clientshim.c +802 -0
  114. package/android/src/main/jni/mdnsresponder/mDNSShared/dnssd_clientstub.c +1988 -0
  115. package/android/src/main/jni/mdnsresponder/mDNSShared/dnssd_ipc.c +161 -0
  116. package/android/src/main/jni/mdnsresponder/mDNSShared/dnssd_ipc.h +219 -0
  117. package/android/src/main/jni/mdnsresponder/mDNSShared/mDNS.1 +198 -0
  118. package/android/src/main/jni/mdnsresponder/mDNSShared/mDNSDebug.c +93 -0
  119. package/android/src/main/jni/mdnsresponder/mDNSShared/mDNSResponder.8 +116 -0
  120. package/android/src/main/jni/mdnsresponder/mDNSShared/uds_daemon.c +4758 -0
  121. package/android/src/main/jni/mdnsresponder/mDNSShared/uds_daemon.h +80 -0
  122. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/BrowsingPage.cpp +441 -0
  123. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/BrowsingPage.h +156 -0
  124. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigDialog.cpp +59 -0
  125. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigDialog.h +48 -0
  126. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigPropertySheet.cpp +301 -0
  127. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ConfigPropertySheet.h +105 -0
  128. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.cpp +380 -0
  129. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.def +20 -0
  130. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.h +84 -0
  131. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.rc +141 -0
  132. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanel.vcproj +727 -0
  133. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelDll.rc +123 -0
  134. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.cpp +373 -0
  135. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.h +48 -0
  136. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.rc +123 -0
  137. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelExe.vcproj +764 -0
  138. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelLocRes.rc +270 -0
  139. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelLocRes.vcproj +487 -0
  140. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelRes.rc +134 -0
  141. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ControlPanelRes.vcproj +518 -0
  142. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/FourthPage.cpp +197 -0
  143. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/FourthPage.h +87 -0
  144. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/RegistrationPage.cpp +387 -0
  145. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/RegistrationPage.h +75 -0
  146. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SecondPage.cpp +544 -0
  147. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SecondPage.h +107 -0
  148. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ServicesPage.cpp +273 -0
  149. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/ServicesPage.h +123 -0
  150. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SharedSecret.cpp +115 -0
  151. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/SharedSecret.h +54 -0
  152. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.dll.manifest +10 -0
  153. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.exe.manifest +17 -0
  154. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.manifest +17 -0
  155. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel.rc2 +13 -0
  156. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/ControlPanel64.manifest +17 -0
  157. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/EnergySaver.ico +0 -0
  158. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/controlpanel.ico +0 -0
  159. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/failure.ico +0 -0
  160. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/res/success.ico +0 -0
  161. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/resource.h +56 -0
  162. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/stdafx.cpp +20 -0
  163. package/android/src/main/jni/mdnsresponder/mDNSWindows/ControlPanel/stdafx.h +64 -0
  164. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dll.aps +0 -0
  165. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dll.rc +102 -0
  166. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dllmain.c +112 -0
  167. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dnssd.def +48 -0
  168. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/dnssd.vcproj +472 -0
  169. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL/resource.h +27 -0
  170. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/AssemblyInfo.cpp +84 -0
  171. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/PString.h +70 -0
  172. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/Stdafx.cpp +22 -0
  173. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/Stdafx.h +33 -0
  174. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.cpp +1234 -0
  175. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.h +1392 -0
  176. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.ico +0 -0
  177. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.rc +113 -0
  178. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/dnssd_NET.vcproj +446 -0
  179. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLL.NET/resource.h +3 -0
  180. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.cpp +693 -0
  181. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.h +52 -0
  182. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLStub/DLLStub.vcproj +324 -0
  183. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.cpp +208 -0
  184. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.def +35 -0
  185. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.idl +491 -0
  186. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.rc +126 -0
  187. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.rgs +11 -0
  188. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DLLX.vcproj +625 -0
  189. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSD.cpp +892 -0
  190. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.cpp +31 -0
  191. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.h +133 -0
  192. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDEventManager.rgs +27 -0
  193. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.cpp +101 -0
  194. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.h +185 -0
  195. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDRecord.rgs +27 -0
  196. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.cpp +2095 -0
  197. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.h +429 -0
  198. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/DNSSDService.rgs +27 -0
  199. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/StringServices.cpp +344 -0
  200. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/StringServices.h +102 -0
  201. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.cpp +381 -0
  202. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.h +203 -0
  203. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/TXTRecord.rgs +27 -0
  204. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/_IDNSSDEvents_CP.h +358 -0
  205. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/dlldatax.c +51 -0
  206. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/dlldatax.h +49 -0
  207. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/resource.h +30 -0
  208. package/android/src/main/jni/mdnsresponder/mDNSWindows/DLLX/stdafx.h +88 -0
  209. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2002.sln +21 -0
  210. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2002.vcproj +253 -0
  211. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2003.sln +21 -0
  212. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/ApplicationVS2003.vcproj +267 -0
  213. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.ico +0 -0
  214. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.rc +323 -0
  215. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Application.rc2 +20 -0
  216. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Resources/Resource.h +53 -0
  217. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/AboutDialog.cpp +71 -0
  218. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/AboutDialog.h +62 -0
  219. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/Application.cpp +111 -0
  220. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/Application.h +68 -0
  221. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/ChooserDialog.cpp +1426 -0
  222. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/ChooserDialog.h +131 -0
  223. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/LoginDialog.cpp +109 -0
  224. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/LoginDialog.h +53 -0
  225. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/StdAfx.cpp +18 -0
  226. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/Windows/Sources/StdAfx.h +48 -0
  227. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcc +37 -0
  228. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcp +868 -0
  229. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Application.vcw +29 -0
  230. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.ico +0 -0
  231. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.rc +194 -0
  232. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/Application.rc2 +13 -0
  233. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/newres.h +28 -0
  234. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Resources/resource.h +22 -0
  235. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/Application.cpp +92 -0
  236. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/Application.h +57 -0
  237. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/BrowserDialog.cpp +394 -0
  238. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/BrowserDialog.h +84 -0
  239. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/StdAfx.cpp +18 -0
  240. package/android/src/main/jni/mdnsresponder/mDNSWindows/DNSServiceBrowser/WindowsCE/Sources/StdAfx.h +46 -0
  241. package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/Java.vcproj +111 -0
  242. package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/jdns_sd.rc +62 -0
  243. package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/makefile +143 -0
  244. package/android/src/main/jni/mdnsresponder/mDNSWindows/Java/makefile64 +143 -0
  245. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.aps +0 -0
  246. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.c +581 -0
  247. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.rc +103 -0
  248. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/NSPTool.vcproj +409 -0
  249. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/Prefix.h +28 -0
  250. package/android/src/main/jni/mdnsresponder/mDNSWindows/NSPTool/resource.h +27 -0
  251. package/android/src/main/jni/mdnsresponder/mDNSWindows/PosixCompat.c +128 -0
  252. package/android/src/main/jni/mdnsresponder/mDNSWindows/PosixCompat.h +70 -0
  253. package/android/src/main/jni/mdnsresponder/mDNSWindows/README.txt +85 -0
  254. package/android/src/main/jni/mdnsresponder/mDNSWindows/RegNames.h +57 -0
  255. package/android/src/main/jni/mdnsresponder/mDNSWindows/Secret.c +338 -0
  256. package/android/src/main/jni/mdnsresponder/mDNSWindows/Secret.h +42 -0
  257. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/EventLog.mc +11 -0
  258. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/EventLogMessages.bin +0 -0
  259. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Firewall.cpp +484 -0
  260. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Firewall.h +79 -0
  261. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Prefix.h +30 -0
  262. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.aps +0 -0
  263. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.c +2669 -0
  264. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.h +30 -0
  265. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.mcp +0 -0
  266. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.rc +114 -0
  267. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/Service.vcproj +562 -0
  268. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/main.c +32 -0
  269. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/res/mDNSResponder.manifest +12 -0
  270. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/res/mDNSResponder64.manifest +12 -0
  271. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/resource.h +17 -0
  272. package/android/src/main/jni/mdnsresponder/mDNSWindows/SystemService/resrc1.h +15 -0
  273. package/android/src/main/jni/mdnsresponder/mDNSWindows/VPCDetect.cpp +165 -0
  274. package/android/src/main/jni/mdnsresponder/mDNSWindows/VPCDetect.h +36 -0
  275. package/android/src/main/jni/mdnsresponder/mDNSWindows/WinServices.cpp +93 -0
  276. package/android/src/main/jni/mdnsresponder/mDNSWindows/WinServices.h +34 -0
  277. package/android/src/main/jni/mdnsresponder/mDNSWindows/WinVersRes.h +35 -0
  278. package/android/src/main/jni/mdnsresponder/mDNSWindows/isocode.h +135 -0
  279. package/android/src/main/jni/mdnsresponder/mDNSWindows/loclibrary.c +268 -0
  280. package/android/src/main/jni/mdnsresponder/mDNSWindows/loclibrary.h +54 -0
  281. package/android/src/main/jni/mdnsresponder/mDNSWindows/mDNSWin32.c +5200 -0
  282. package/android/src/main/jni/mdnsresponder/mDNSWindows/mDNSWin32.h +208 -0
  283. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/ReadMe.txt +15 -0
  284. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.aps +0 -0
  285. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.c +2430 -0
  286. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.def +24 -0
  287. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.rc +104 -0
  288. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/mdnsNSP.vcproj +457 -0
  289. package/android/src/main/jni/mdnsresponder/mDNSWindows/mdnsNSP/resource.h +27 -0
  290. package/android/src/main/jni/mdnsresponder/mdnsd.rc +7 -0
  291. package/android/src/main/jni/nameser.h +588 -0
  292. package/dist/index.js +148 -1
  293. package/package.json +23 -17
  294. package/src/index.js +166 -0
@@ -0,0 +1,1010 @@
1
+ /* -*- Mode: C; tab-width: 4 -*-
2
+ *
3
+ * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ * Formatting notes:
18
+ * This code follows the "Whitesmiths style" C indentation rules. Plenty of discussion
19
+ * on C indentation can be found on the web, such as <http://www.kafejo.com/komp/1tbs.htm>,
20
+ * but for the sake of brevity here I will say just this: Curly braces are not syntactially
21
+ * part of an "if" statement; they are the beginning and ending markers of a compound statement;
22
+ * therefore common sense dictates that if they are part of a compound statement then they
23
+ * should be indented to the same level as everything else in that compound statement.
24
+ * Indenting curly braces at the same level as the "if" implies that curly braces are
25
+ * part of the "if", which is false. (This is as misleading as people who write "char* x,y;"
26
+ * thinking that variables x and y are both of type "char*" -- and anyone who doesn't
27
+ * understand why variable y is not of type "char*" just proves the point that poor code
28
+ * layout leads people to unfortunate misunderstandings about how the C language really works.)
29
+ */
30
+
31
+ //*************************************************************************************************************
32
+ // Incorporate mDNS.c functionality
33
+
34
+ // We want to use much of the functionality provided by "mDNS.c",
35
+ // except we'll steal the packets that would be sent to normal mDNSCoreReceive() routine
36
+ #define mDNSCoreReceive __NOT__mDNSCoreReceive__NOT__
37
+ #include "mDNS.c"
38
+ #undef mDNSCoreReceive
39
+
40
+ //*************************************************************************************************************
41
+ // Headers
42
+
43
+ #include <stdio.h> // For printf()
44
+ #include <stdlib.h> // For malloc()
45
+ #include <string.h> // For strrchr(), strcmp()
46
+ #include <time.h> // For "struct tm" etc.
47
+ #include <signal.h> // For SIGINT, SIGTERM
48
+ #if defined(WIN32)
49
+ // Both mDNS.c and mDNSWin32.h declare UDPSocket_struct type resulting in a compile-time error, so
50
+ // trick the compiler when including mDNSWin32.h
51
+ # define UDPSocket_struct _UDPSocket_struct
52
+ # include <mDNSEmbeddedAPI.h>
53
+ # include <mDNSWin32.h>
54
+ # include <PosixCompat.h>
55
+ # define IFNAMSIZ 256
56
+ static HANDLE gStopEvent = INVALID_HANDLE_VALUE;
57
+ static BOOL WINAPI ConsoleControlHandler( DWORD inControlEvent ) { SetEvent( gStopEvent ); return TRUE; }
58
+ void setlinebuf( FILE * fp ) {}
59
+ #else
60
+ # include <netdb.h> // For gethostbyname()
61
+ # include <sys/socket.h> // For AF_INET, AF_INET6, etc.
62
+ # include <net/if.h> // For IF_NAMESIZE
63
+ # include <netinet/in.h> // For INADDR_NONE
64
+ # include <arpa/inet.h> // For inet_addr()
65
+ # include "mDNSPosix.h" // Defines the specific types needed to run mDNS on this platform
66
+ #endif
67
+ #include "ExampleClientApp.h"
68
+
69
+ //*************************************************************************************************************
70
+ // Types and structures
71
+
72
+ enum
73
+ {
74
+ // Primitive operations
75
+ OP_probe = 0,
76
+ OP_goodbye = 1,
77
+
78
+ // These are meta-categories;
79
+ // Query and Answer operations are actually subdivided into two classes:
80
+ // Browse query/answer and
81
+ // Resolve query/answer
82
+ OP_query = 2,
83
+ OP_answer = 3,
84
+
85
+ // The "Browse" variants of query/answer
86
+ OP_browsegroup = 2,
87
+ OP_browseq = 2,
88
+ OP_browsea = 3,
89
+
90
+ // The "Resolve" variants of query/answer
91
+ OP_resolvegroup = 4,
92
+ OP_resolveq = 4,
93
+ OP_resolvea = 5,
94
+
95
+ OP_NumTypes = 6
96
+ };
97
+
98
+ typedef struct ActivityStat_struct ActivityStat;
99
+ struct ActivityStat_struct
100
+ {
101
+ ActivityStat *next;
102
+ domainname srvtype;
103
+ int printed;
104
+ int totalops;
105
+ int stat[OP_NumTypes];
106
+ };
107
+
108
+ typedef struct FilterList_struct FilterList;
109
+ struct FilterList_struct
110
+ {
111
+ FilterList *next;
112
+ mDNSAddr FilterAddr;
113
+ };
114
+
115
+ //*************************************************************************************************************
116
+ // Constants
117
+
118
+ #define kReportTopServices 15
119
+ #define kReportTopHosts 15
120
+
121
+ //*************************************************************************************************************
122
+ // Globals
123
+
124
+ mDNS mDNSStorage; // mDNS core uses this to store its globals
125
+ static mDNS_PlatformSupport PlatformStorage; // Stores this platform's globals
126
+ mDNSexport const char ProgramName[] = "mDNSNetMonitor";
127
+
128
+ struct timeval tv_start, tv_end, tv_interval;
129
+ static int FilterInterface = 0;
130
+ static FilterList *Filters;
131
+ #define ExactlyOneFilter (Filters && !Filters->next)
132
+
133
+ static int NumPktQ, NumPktL, NumPktR, NumPktB; // Query/Legacy/Response/Bad
134
+ static int NumProbes, NumGoodbyes, NumQuestions, NumLegacy, NumAnswers, NumAdditionals;
135
+
136
+ static ActivityStat *stats;
137
+
138
+ #define OPBanner "Total Ops Probe Goodbye BrowseQ BrowseA ResolveQ ResolveA"
139
+
140
+ //*************************************************************************************************************
141
+ // Utilities
142
+
143
+ // Special version of printf that knows how to print IP addresses, DNS-format name strings, etc.
144
+ mDNSlocal mDNSu32 mprintf(const char *format, ...) IS_A_PRINTF_STYLE_FUNCTION(1,2);
145
+ mDNSlocal mDNSu32 mprintf(const char *format, ...)
146
+ {
147
+ mDNSu32 length;
148
+ unsigned char buffer[512];
149
+ va_list ptr;
150
+ va_start(ptr,format);
151
+ length = mDNS_vsnprintf((char *)buffer, sizeof(buffer), format, ptr);
152
+ va_end(ptr);
153
+ printf("%s", buffer);
154
+ return(length);
155
+ }
156
+
157
+ //*************************************************************************************************************
158
+ // Host Address List
159
+ //
160
+ // Would benefit from a hash
161
+
162
+ typedef enum
163
+ {
164
+ HostPkt_Q = 0, // Query
165
+ HostPkt_L = 1, // Legacy Query
166
+ HostPkt_R = 2, // Response
167
+ HostPkt_B = 3, // Bad
168
+ HostPkt_NumTypes = 4
169
+ } HostPkt_Type;
170
+
171
+ typedef struct
172
+ {
173
+ mDNSAddr addr;
174
+ unsigned long pkts[HostPkt_NumTypes];
175
+ unsigned long totalops;
176
+ unsigned long stat[OP_NumTypes];
177
+ domainname hostname;
178
+ domainname revname;
179
+ UTF8str255 HIHardware;
180
+ UTF8str255 HISoftware;
181
+ mDNSu32 NumQueries;
182
+ mDNSs32 LastQuery;
183
+ } HostEntry;
184
+
185
+ #define HostEntryTotalPackets(H) ((H)->pkts[HostPkt_Q] + (H)->pkts[HostPkt_L] + (H)->pkts[HostPkt_R] + (H)->pkts[HostPkt_B])
186
+
187
+ typedef struct
188
+ {
189
+ long num;
190
+ long max;
191
+ HostEntry *hosts;
192
+ } HostList;
193
+
194
+ static HostList IPv4HostList = { 0, 0, 0 };
195
+ static HostList IPv6HostList = { 0, 0, 0 };
196
+
197
+ mDNSlocal HostEntry *FindHost(const mDNSAddr *addr, HostList *list)
198
+ {
199
+ long i;
200
+
201
+ for (i = 0; i < list->num; i++)
202
+ {
203
+ HostEntry *entry = list->hosts + i;
204
+ if (mDNSSameAddress(addr, &entry->addr))
205
+ return entry;
206
+ }
207
+
208
+ return NULL;
209
+ }
210
+
211
+ mDNSlocal HostEntry *AddHost(const mDNSAddr *addr, HostList *list)
212
+ {
213
+ int i;
214
+ HostEntry *entry;
215
+ if (list->num >= list->max)
216
+ {
217
+ long newMax = list->max + 64;
218
+ HostEntry *newHosts = realloc(list->hosts, newMax * sizeof(HostEntry));
219
+ if (newHosts == NULL)
220
+ return NULL;
221
+ list->max = newMax;
222
+ list->hosts = newHosts;
223
+ }
224
+
225
+ entry = list->hosts + list->num++;
226
+
227
+ entry->addr = *addr;
228
+ for (i=0; i<HostPkt_NumTypes; i++) entry->pkts[i] = 0;
229
+ entry->totalops = 0;
230
+ for (i=0; i<OP_NumTypes; i++) entry->stat[i] = 0;
231
+ entry->hostname.c[0] = 0;
232
+ entry->revname.c[0] = 0;
233
+ entry->HIHardware.c[0] = 0;
234
+ entry->HISoftware.c[0] = 0;
235
+ entry->NumQueries = 0;
236
+
237
+ if (entry->addr.type == mDNSAddrType_IPv4)
238
+ {
239
+ mDNSv4Addr ip = entry->addr.ip.v4;
240
+ char buffer[32];
241
+ // Note: This is reverse order compared to a normal dotted-decimal IP address, so we can't use our customary "%.4a" format code
242
+ mDNS_snprintf(buffer, sizeof(buffer), "%d.%d.%d.%d.in-addr.arpa.", ip.b[3], ip.b[2], ip.b[1], ip.b[0]);
243
+ MakeDomainNameFromDNSNameString(&entry->revname, buffer);
244
+ }
245
+
246
+ return(entry);
247
+ }
248
+
249
+ mDNSlocal HostEntry *GotPacketFromHost(const mDNSAddr *addr, HostPkt_Type t, mDNSOpaque16 id)
250
+ {
251
+ if (ExactlyOneFilter) return(NULL);
252
+ else
253
+ {
254
+ HostList *list = (addr->type == mDNSAddrType_IPv4) ? &IPv4HostList : &IPv6HostList;
255
+ HostEntry *entry = FindHost(addr, list);
256
+ if (!entry) entry = AddHost(addr, list);
257
+ if (!entry) return(NULL);
258
+ // Don't count our own interrogation packets
259
+ if (id.NotAnInteger != 0xFFFF) entry->pkts[t]++;
260
+ return(entry);
261
+ }
262
+ }
263
+
264
+ mDNSlocal void RecordHostInfo(HostEntry *entry, const ResourceRecord *const pktrr)
265
+ {
266
+ if (!entry->hostname.c[0])
267
+ {
268
+ if (pktrr->rrtype == kDNSType_A || pktrr->rrtype == kDNSType_AAAA)
269
+ {
270
+ // Should really check that the rdata in the address record matches the source address of this packet
271
+ entry->NumQueries = 0;
272
+ AssignDomainName(&entry->hostname, pktrr->name);
273
+ }
274
+
275
+ if (pktrr->rrtype == kDNSType_PTR)
276
+ if (SameDomainName(&entry->revname, pktrr->name))
277
+ {
278
+ entry->NumQueries = 0;
279
+ AssignDomainName(&entry->hostname, &pktrr->rdata->u.name);
280
+ }
281
+ }
282
+ else if (pktrr->rrtype == kDNSType_HINFO)
283
+ {
284
+ RDataBody *rd = &pktrr->rdata->u;
285
+ mDNSu8 *rdend = (mDNSu8 *)rd + pktrr->rdlength;
286
+ mDNSu8 *hw = rd->txt.c;
287
+ mDNSu8 *sw = hw + 1 + (mDNSu32)hw[0];
288
+ if (sw + 1 + sw[0] <= rdend)
289
+ {
290
+ AssignDomainName(&entry->hostname, pktrr->name);
291
+ mDNSPlatformMemCopy(entry->HIHardware.c, hw, 1 + (mDNSu32)hw[0]);
292
+ mDNSPlatformMemCopy(entry->HISoftware.c, sw, 1 + (mDNSu32)sw[0]);
293
+ }
294
+ }
295
+ }
296
+
297
+ mDNSlocal void SendUnicastQuery(mDNS *const m, HostEntry *entry, domainname *name, mDNSu16 rrtype, mDNSInterfaceID InterfaceID)
298
+ {
299
+ const mDNSOpaque16 id = { { 0xFF, 0xFF } };
300
+ DNSMessage query;
301
+ mDNSu8 *qptr = query.data;
302
+ const mDNSu8 *const limit = query.data + sizeof(query.data);
303
+ const mDNSAddr *target = &entry->addr;
304
+ InitializeDNSMessage(&query.h, id, QueryFlags);
305
+ qptr = putQuestion(&query, qptr, limit, name, rrtype, kDNSClass_IN);
306
+ entry->LastQuery = m->timenow;
307
+ entry->NumQueries++;
308
+
309
+ // Note: When there are multiple mDNSResponder agents running on a single machine
310
+ // (e.g. Apple mDNSResponder plus a SliMP3 server with embedded mDNSResponder)
311
+ // it is possible that unicast queries may not go to the primary system responder.
312
+ // We try the first query using unicast, but if that doesn't work we try again via multicast.
313
+ if (entry->NumQueries > 2)
314
+ {
315
+ target = &AllDNSLinkGroup_v4;
316
+ }
317
+ else
318
+ {
319
+ //mprintf("%#a Q\n", target);
320
+ InterfaceID = mDNSInterface_Any; // Send query from our unicast reply socket
321
+ }
322
+
323
+ mDNSSendDNSMessage(&mDNSStorage, &query, qptr, InterfaceID, mDNSNULL, target, MulticastDNSPort, mDNSNULL, mDNSNULL);
324
+ }
325
+
326
+ mDNSlocal void AnalyseHost(mDNS *const m, HostEntry *entry, const mDNSInterfaceID InterfaceID)
327
+ {
328
+ // If we've done four queries without answer, give up
329
+ if (entry->NumQueries >= 4) return;
330
+
331
+ // If we've done a query in the last second, give the host a chance to reply before trying again
332
+ if (entry->NumQueries && m->timenow - entry->LastQuery < mDNSPlatformOneSecond) return;
333
+
334
+ // If we don't know the host name, try to find that first
335
+ if (!entry->hostname.c[0])
336
+ {
337
+ if (entry->revname.c[0])
338
+ {
339
+ SendUnicastQuery(m, entry, &entry->revname, kDNSType_PTR, InterfaceID);
340
+ //mprintf("%##s PTR %d\n", entry->revname.c, entry->NumQueries);
341
+ }
342
+ }
343
+ // If we have the host name but no HINFO, now ask for that
344
+ else if (!entry->HIHardware.c[0])
345
+ {
346
+ SendUnicastQuery(m, entry, &entry->hostname, kDNSType_HINFO, InterfaceID);
347
+ //mprintf("%##s HINFO %d\n", entry->hostname.c, entry->NumQueries);
348
+ }
349
+ }
350
+
351
+ mDNSlocal int CompareHosts(const void *p1, const void *p2)
352
+ {
353
+ return (int)(HostEntryTotalPackets((HostEntry *)p2) - HostEntryTotalPackets((HostEntry *)p1));
354
+ }
355
+
356
+ mDNSlocal void ShowSortedHostList(HostList *list, int max)
357
+ {
358
+ HostEntry *e, *end = &list->hosts[(max < list->num) ? max : list->num];
359
+ qsort(list->hosts, list->num, sizeof(HostEntry), CompareHosts);
360
+ if (list->num) mprintf("\n%-25s%s%s\n", "Source Address", OPBanner, " Pkts Query LegacyQ Response");
361
+ for (e = &list->hosts[0]; e < end; e++)
362
+ {
363
+ int len = mprintf("%#-25a", &e->addr);
364
+ if (len > 25) mprintf("\n%25s", "");
365
+ mprintf("%8lu %8lu %8lu %8lu %8lu %8lu %8lu", e->totalops,
366
+ e->stat[OP_probe], e->stat[OP_goodbye],
367
+ e->stat[OP_browseq], e->stat[OP_browsea],
368
+ e->stat[OP_resolveq], e->stat[OP_resolvea]);
369
+ mprintf(" %8lu %8lu %8lu %8lu",
370
+ HostEntryTotalPackets(e), e->pkts[HostPkt_Q], e->pkts[HostPkt_L], e->pkts[HostPkt_R]);
371
+ if (e->pkts[HostPkt_B]) mprintf("Bad: %8lu", e->pkts[HostPkt_B]);
372
+ mprintf("\n");
373
+ if (!e->HISoftware.c[0] && e->NumQueries > 2)
374
+ mDNSPlatformMemCopy(&e->HISoftware, "\x27*** Unknown (Jaguar, Windows, etc.) ***", 0x28);
375
+ if (e->hostname.c[0] || e->HIHardware.c[0] || e->HISoftware.c[0])
376
+ mprintf("%##-45s %#-14s %#s\n", e->hostname.c, e->HIHardware.c, e->HISoftware.c);
377
+ }
378
+ }
379
+
380
+ //*************************************************************************************************************
381
+ // Receive and process packets
382
+
383
+ mDNSexport mDNSBool ExtractServiceType(const domainname *const fqdn, domainname *const srvtype)
384
+ {
385
+ int i, len;
386
+ const mDNSu8 *src = fqdn->c;
387
+ mDNSu8 *dst = srvtype->c;
388
+
389
+ len = *src;
390
+ if (len == 0 || len >= 0x40) return(mDNSfalse);
391
+ if (src[1] != '_') src += 1 + len;
392
+
393
+ len = *src;
394
+ if (len == 0 || len >= 0x40 || src[1] != '_') return(mDNSfalse);
395
+ for (i=0; i<=len; i++) *dst++ = *src++;
396
+
397
+ len = *src;
398
+ if (len == 0 || len >= 0x40 || src[1] != '_') return(mDNSfalse);
399
+ for (i=0; i<=len; i++) *dst++ = *src++;
400
+
401
+ *dst++ = 0; // Put the null root label on the end of the service type
402
+
403
+ return(mDNStrue);
404
+ }
405
+
406
+ mDNSlocal void recordstat(HostEntry *entry, const domainname *fqdn, int op, mDNSu16 rrtype)
407
+ {
408
+ ActivityStat **s = &stats;
409
+ domainname srvtype;
410
+
411
+ if (op != OP_probe)
412
+ {
413
+ if (rrtype == kDNSType_SRV || rrtype == kDNSType_TXT) op = op - OP_browsegroup + OP_resolvegroup;
414
+ else if (rrtype != kDNSType_PTR) return;
415
+ }
416
+
417
+ if (!ExtractServiceType(fqdn, &srvtype)) return;
418
+
419
+ while (*s && !SameDomainName(&(*s)->srvtype, &srvtype)) s = &(*s)->next;
420
+ if (!*s)
421
+ {
422
+ int i;
423
+ *s = malloc(sizeof(ActivityStat));
424
+ if (!*s) exit(-1);
425
+ (*s)->next = NULL;
426
+ (*s)->srvtype = srvtype;
427
+ (*s)->printed = 0;
428
+ (*s)->totalops = 0;
429
+ for (i=0; i<OP_NumTypes; i++) (*s)->stat[i] = 0;
430
+ }
431
+
432
+ (*s)->totalops++;
433
+ (*s)->stat[op]++;
434
+ if (entry)
435
+ {
436
+ entry->totalops++;
437
+ entry->stat[op]++;
438
+ }
439
+ }
440
+
441
+ mDNSlocal void printstats(int max)
442
+ {
443
+ int i;
444
+ if (!stats) return;
445
+ for (i=0; i<max; i++)
446
+ {
447
+ int max = 0;
448
+ ActivityStat *s, *m = NULL;
449
+ for (s = stats; s; s=s->next)
450
+ if (!s->printed && max < s->totalops)
451
+ { m = s; max = s->totalops; }
452
+ if (!m) return;
453
+ m->printed = mDNStrue;
454
+ if (i==0) mprintf("%-25s%s\n", "Service Type", OPBanner);
455
+ mprintf("%##-25s%8d %8d %8d %8d %8d %8d %8d\n", m->srvtype.c, m->totalops, m->stat[OP_probe],
456
+ m->stat[OP_goodbye], m->stat[OP_browseq], m->stat[OP_browsea], m->stat[OP_resolveq], m->stat[OP_resolvea]);
457
+ }
458
+ }
459
+
460
+ mDNSlocal const mDNSu8 *FindUpdate(mDNS *const m, const DNSMessage *const query, const mDNSu8 *ptr, const mDNSu8 *const end,
461
+ DNSQuestion *q, LargeCacheRecord *pkt)
462
+ {
463
+ int i;
464
+ for (i = 0; i < query->h.numAuthorities; i++)
465
+ {
466
+ const mDNSu8 *p2 = ptr;
467
+ ptr = GetLargeResourceRecord(m, query, ptr, end, q->InterfaceID, kDNSRecordTypePacketAuth, pkt);
468
+ if (!ptr) break;
469
+ if (m->rec.r.resrec.RecordType != kDNSRecordTypePacketNegative && ResourceRecordAnswersQuestion(&pkt->r.resrec, q)) return(p2);
470
+ }
471
+ return(mDNSNULL);
472
+ }
473
+
474
+ mDNSlocal void DisplayPacketHeader(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *const end, const mDNSAddr *srcaddr, mDNSIPPort srcport, const mDNSAddr *dstaddr, const mDNSInterfaceID InterfaceID)
475
+ {
476
+ const char *const ptype = (msg->h.flags.b[0] & kDNSFlag0_QR_Response) ? "-R- " :
477
+ (srcport.NotAnInteger == MulticastDNSPort.NotAnInteger) ? "-Q- " : "-LQ-";
478
+
479
+ struct timeval tv;
480
+ struct tm tm;
481
+ const mDNSu32 index = mDNSPlatformInterfaceIndexfromInterfaceID(m, InterfaceID, mDNSfalse);
482
+ char if_name[IFNAMSIZ]; // Older Linux distributions don't define IF_NAMESIZE
483
+ if_indextoname(index, if_name);
484
+ gettimeofday(&tv, NULL);
485
+ localtime_r((time_t*)&tv.tv_sec, &tm);
486
+ mprintf("\n%d:%02d:%02d.%06d Interface %d/%s\n", tm.tm_hour, tm.tm_min, tm.tm_sec, tv.tv_usec, index, if_name);
487
+
488
+ mprintf("%#-16a %s Q:%3d Ans:%3d Auth:%3d Add:%3d Size:%5d bytes",
489
+ srcaddr, ptype, msg->h.numQuestions, msg->h.numAnswers, msg->h.numAuthorities, msg->h.numAdditionals, end - (mDNSu8 *)msg);
490
+
491
+ if (msg->h.id.NotAnInteger) mprintf(" ID:%u", mDNSVal16(msg->h.id));
492
+
493
+ if (!mDNSAddrIsDNSMulticast(dstaddr)) mprintf(" To: %#a", dstaddr);
494
+
495
+ if (msg->h.flags.b[0] & kDNSFlag0_TC)
496
+ {
497
+ if (msg->h.flags.b[0] & kDNSFlag0_QR_Response) mprintf(" Truncated");
498
+ else mprintf(" Truncated (KA list continues in next packet)");
499
+ }
500
+ mprintf("\n");
501
+ }
502
+
503
+ mDNSlocal void DisplayResourceRecord(const mDNSAddr *const srcaddr, const char *const op, const ResourceRecord *const pktrr)
504
+ {
505
+ static const char hexchars[16] = "0123456789ABCDEF";
506
+ #define MaxWidth 132
507
+ char buffer[MaxWidth+8];
508
+ char *p = buffer;
509
+
510
+ RDataBody *rd = &pktrr->rdata->u;
511
+ mDNSu8 *rdend = (mDNSu8 *)rd + pktrr->rdlength;
512
+ int n = mprintf("%#-16a %-5s %-5s%5lu %##s -> ", srcaddr, op, DNSTypeName(pktrr->rrtype), pktrr->rroriginalttl, pktrr->name->c);
513
+
514
+ if (pktrr->RecordType == kDNSRecordTypePacketNegative) { mprintf("**** ERROR: FAILED TO READ RDATA ****\n"); return; }
515
+
516
+ // The kDNSType_OPT case below just calls GetRRDisplayString_rdb
517
+ // Perhaps more (or all?) of the cases should do that?
518
+ switch(pktrr->rrtype)
519
+ {
520
+ case kDNSType_A: n += mprintf("%.4a", &rd->ipv4); break;
521
+ case kDNSType_PTR: n += mprintf("%##.*s", MaxWidth - n, rd->name.c); break;
522
+ case kDNSType_HINFO:// same as kDNSType_TXT below
523
+ case kDNSType_TXT: {
524
+ mDNSu8 *t = rd->txt.c;
525
+ while (t < rdend && t[0] && p < buffer+MaxWidth)
526
+ {
527
+ int i;
528
+ for (i=1; i<=t[0] && p < buffer+MaxWidth; i++)
529
+ {
530
+ if (t[i] == '\\') *p++ = '\\';
531
+ if (t[i] >= ' ') *p++ = t[i];
532
+ else
533
+ {
534
+ *p++ = '\\';
535
+ *p++ = '0';
536
+ *p++ = 'x';
537
+ *p++ = hexchars[t[i] >> 4];
538
+ *p++ = hexchars[t[i] & 0xF];
539
+ }
540
+ }
541
+ t += 1+t[0];
542
+ if (t < rdend && t[0]) { *p++ = '\\'; *p++ = ' '; }
543
+ }
544
+ *p++ = 0;
545
+ n += mprintf("%.*s", MaxWidth - n, buffer);
546
+ } break;
547
+ case kDNSType_AAAA: n += mprintf("%.16a", &rd->ipv6); break;
548
+ case kDNSType_SRV: n += mprintf("%##s:%d", rd->srv.target.c, mDNSVal16(rd->srv.port)); break;
549
+ case kDNSType_OPT: {
550
+ char b[MaxMsg];
551
+ // Quick hack: we don't want the prefix that GetRRDisplayString_rdb puts at the start of its
552
+ // string, because it duplicates the name and rrtype we already display, so we compute the
553
+ // length of that prefix and strip that many bytes off the beginning of the string we display.
554
+ mDNSu32 striplen = mDNS_snprintf(b, MaxMsg-1, "%4d %##s %s ", pktrr->rdlength, pktrr->name->c, DNSTypeName(pktrr->rrtype));
555
+ GetRRDisplayString_rdb(pktrr, &pktrr->rdata->u, b);
556
+ n += mprintf("%.*s", MaxWidth - n, b + striplen);
557
+ } break;
558
+ case kDNSType_NSEC: {
559
+ int i;
560
+ for (i=0; i<255; i++)
561
+ if (rd->nsec.bitmap[i>>3] & (128 >> (i&7)))
562
+ n += mprintf("%s ", DNSTypeName(i));
563
+ } break;
564
+ default: {
565
+ mDNSu8 *s = rd->data;
566
+ while (s < rdend && p < buffer+MaxWidth)
567
+ {
568
+ if (*s == '\\') *p++ = '\\';
569
+ if (*s >= ' ') *p++ = *s;
570
+ else
571
+ {
572
+ *p++ = '\\';
573
+ *p++ = '0';
574
+ *p++ = 'x';
575
+ *p++ = hexchars[*s >> 4];
576
+ *p++ = hexchars[*s & 0xF];
577
+ }
578
+ s++;
579
+ }
580
+ *p++ = 0;
581
+ n += mprintf("%.*s", MaxWidth - n, buffer);
582
+ } break;
583
+ }
584
+
585
+ mprintf("\n");
586
+ }
587
+
588
+ mDNSlocal void HexDump(const mDNSu8 *ptr, const mDNSu8 *const end)
589
+ {
590
+ while (ptr < end)
591
+ {
592
+ int i;
593
+ for (i=0; i<16; i++)
594
+ if (&ptr[i] < end) mprintf("%02X ", ptr[i]);
595
+ else mprintf(" ");
596
+ for (i=0; i<16; i++)
597
+ if (&ptr[i] < end) mprintf("%c", ptr[i] <= ' ' || ptr[i] >= 126 ? '.' : ptr[i]);
598
+ ptr += 16;
599
+ mprintf("\n");
600
+ }
601
+ }
602
+
603
+ mDNSlocal void DisplayError(const mDNSAddr *srcaddr, const mDNSu8 *ptr, const mDNSu8 *const end, char *msg)
604
+ {
605
+ mprintf("%#-16a **** ERROR: FAILED TO READ %s **** \n", srcaddr, msg);
606
+ HexDump(ptr, end);
607
+ }
608
+
609
+ mDNSlocal void DisplayQuery(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *const end,
610
+ const mDNSAddr *srcaddr, mDNSIPPort srcport, const mDNSAddr *dstaddr, const mDNSInterfaceID InterfaceID)
611
+ {
612
+ int i;
613
+ const mDNSu8 *ptr = msg->data;
614
+ const mDNSu8 *auth = LocateAuthorities(msg, end);
615
+ mDNSBool MQ = (srcport.NotAnInteger == MulticastDNSPort.NotAnInteger);
616
+ HostEntry *entry = GotPacketFromHost(srcaddr, MQ ? HostPkt_Q : HostPkt_L, msg->h.id);
617
+ LargeCacheRecord pkt;
618
+
619
+ DisplayPacketHeader(m, msg, end, srcaddr, srcport, dstaddr, InterfaceID);
620
+ if (msg->h.id.NotAnInteger != 0xFFFF)
621
+ {
622
+ if (MQ) NumPktQ++; else NumPktL++;
623
+ }
624
+
625
+ for (i=0; i<msg->h.numQuestions; i++)
626
+ {
627
+ DNSQuestion q;
628
+ mDNSu8 *p2 = (mDNSu8 *)getQuestion(msg, ptr, end, InterfaceID, &q);
629
+ mDNSu16 ucbit = q.qclass & kDNSQClass_UnicastResponse;
630
+ q.qclass &= ~kDNSQClass_UnicastResponse;
631
+ if (!p2) { DisplayError(srcaddr, ptr, end, "QUESTION"); return; }
632
+ ptr = p2;
633
+ p2 = (mDNSu8 *)FindUpdate(m, msg, auth, end, &q, &pkt);
634
+ if (p2)
635
+ {
636
+ NumProbes++;
637
+ DisplayResourceRecord(srcaddr, ucbit ? "(PU)" : "(PM)", &pkt.r.resrec);
638
+ recordstat(entry, &q.qname, OP_probe, q.qtype);
639
+ p2 = (mDNSu8 *)skipDomainName(msg, p2, end);
640
+ // Having displayed this update record, clear type and class so we don't display the same one again.
641
+ p2[0] = p2[1] = p2[2] = p2[3] = 0;
642
+ }
643
+ else
644
+ {
645
+ const char *ptype = ucbit ? "(QU)" : "(QM)";
646
+ if (srcport.NotAnInteger == MulticastDNSPort.NotAnInteger) NumQuestions++;
647
+ else { NumLegacy++; ptype = "(LQ)"; }
648
+ mprintf("%#-16a %-5s %-5s %##s\n", srcaddr, ptype, DNSTypeName(q.qtype), q.qname.c);
649
+ if (msg->h.id.NotAnInteger != 0xFFFF) recordstat(entry, &q.qname, OP_query, q.qtype);
650
+ }
651
+ }
652
+
653
+ for (i=0; i<msg->h.numAnswers; i++)
654
+ {
655
+ const mDNSu8 *ep = ptr;
656
+ ptr = GetLargeResourceRecord(m, msg, ptr, end, InterfaceID, kDNSRecordTypePacketAns, &pkt);
657
+ if (!ptr) { DisplayError(srcaddr, ep, end, "KNOWN ANSWER"); return; }
658
+ DisplayResourceRecord(srcaddr, "(KA)", &pkt.r.resrec);
659
+
660
+ // In the case of queries with long multi-packet KA lists, we count each subsequent KA packet
661
+ // the same as a single query, to more accurately reflect the burden on the network
662
+ // (A query with a six-packet KA list is *at least* six times the burden on the network as a single-packet query.)
663
+ if (msg->h.numQuestions == 0 && i == 0)
664
+ recordstat(entry, pkt.r.resrec.name, OP_query, pkt.r.resrec.rrtype);
665
+ }
666
+
667
+ for (i=0; i<msg->h.numAuthorities; i++)
668
+ {
669
+ const mDNSu8 *ep = ptr;
670
+ ptr = GetLargeResourceRecord(m, msg, ptr, end, InterfaceID, kDNSRecordTypePacketAuth, &pkt);
671
+ if (!ptr) { DisplayError(srcaddr, ep, end, "AUTHORITY"); return; }
672
+ // After we display an Update record with its matching question (above) we zero out its type and class
673
+ // If any remain that haven't been zero'd out, display them here
674
+ if (pkt.r.resrec.rrtype || pkt.r.resrec.rrclass) DisplayResourceRecord(srcaddr, "(AU)", &pkt.r.resrec);
675
+ }
676
+
677
+ for (i=0; i<msg->h.numAdditionals; i++)
678
+ {
679
+ const mDNSu8 *ep = ptr;
680
+ ptr = GetLargeResourceRecord(m, msg, ptr, end, InterfaceID, kDNSRecordTypePacketAdd, &pkt);
681
+ if (!ptr) { DisplayError(srcaddr, ep, end, "ADDITIONAL"); return; }
682
+ DisplayResourceRecord(srcaddr, pkt.r.resrec.rrtype == kDNSType_OPT ? "(OP)" : "(AD)", &pkt.r.resrec);
683
+ }
684
+
685
+ if (entry) AnalyseHost(m, entry, InterfaceID);
686
+ }
687
+
688
+ mDNSlocal void DisplayResponse(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *end,
689
+ const mDNSAddr *srcaddr, mDNSIPPort srcport, const mDNSAddr *dstaddr, const mDNSInterfaceID InterfaceID)
690
+ {
691
+ int i;
692
+ const mDNSu8 *ptr = msg->data;
693
+ HostEntry *entry = GotPacketFromHost(srcaddr, HostPkt_R, msg->h.id);
694
+ LargeCacheRecord pkt;
695
+
696
+ DisplayPacketHeader(m, msg, end, srcaddr, srcport, dstaddr, InterfaceID);
697
+ if (msg->h.id.NotAnInteger != 0xFFFF) NumPktR++;
698
+
699
+ for (i=0; i<msg->h.numQuestions; i++)
700
+ {
701
+ DNSQuestion q;
702
+ const mDNSu8 *ep = ptr;
703
+ ptr = getQuestion(msg, ptr, end, InterfaceID, &q);
704
+ if (!ptr) { DisplayError(srcaddr, ep, end, "QUESTION"); return; }
705
+ if (mDNSAddrIsDNSMulticast(dstaddr))
706
+ mprintf("%#-16a (?) **** ERROR: SHOULD NOT HAVE Q IN mDNS RESPONSE **** %-5s %##s\n", srcaddr, DNSTypeName(q.qtype), q.qname.c);
707
+ else
708
+ mprintf("%#-16a (Q) %-5s %##s\n", srcaddr, DNSTypeName(q.qtype), q.qname.c);
709
+ }
710
+
711
+ for (i=0; i<msg->h.numAnswers; i++)
712
+ {
713
+ const mDNSu8 *ep = ptr;
714
+ ptr = GetLargeResourceRecord(m, msg, ptr, end, InterfaceID, kDNSRecordTypePacketAns, &pkt);
715
+ if (!ptr) { DisplayError(srcaddr, ep, end, "ANSWER"); return; }
716
+ if (pkt.r.resrec.rroriginalttl)
717
+ {
718
+ NumAnswers++;
719
+ DisplayResourceRecord(srcaddr, (pkt.r.resrec.RecordType & kDNSRecordTypePacketUniqueMask) ? "(AN)" : "(AN+)", &pkt.r.resrec);
720
+ if (msg->h.id.NotAnInteger != 0xFFFF) recordstat(entry, pkt.r.resrec.name, OP_answer, pkt.r.resrec.rrtype);
721
+ if (entry) RecordHostInfo(entry, &pkt.r.resrec);
722
+ }
723
+ else
724
+ {
725
+ NumGoodbyes++;
726
+ DisplayResourceRecord(srcaddr, "(DE)", &pkt.r.resrec);
727
+ recordstat(entry, pkt.r.resrec.name, OP_goodbye, pkt.r.resrec.rrtype);
728
+ }
729
+ }
730
+
731
+ for (i=0; i<msg->h.numAuthorities; i++)
732
+ {
733
+ const mDNSu8 *ep = ptr;
734
+ ptr = GetLargeResourceRecord(m, msg, ptr, end, InterfaceID, kDNSRecordTypePacketAuth, &pkt);
735
+ if (!ptr) { DisplayError(srcaddr, ep, end, "AUTHORITY"); return; }
736
+ mprintf("%#-16a (?) **** ERROR: SHOULD NOT HAVE AUTHORITY IN mDNS RESPONSE **** %-5s %##s\n",
737
+ srcaddr, DNSTypeName(pkt.r.resrec.rrtype), pkt.r.resrec.name->c);
738
+ }
739
+
740
+ for (i=0; i<msg->h.numAdditionals; i++)
741
+ {
742
+ const mDNSu8 *ep = ptr;
743
+ ptr = GetLargeResourceRecord(m, msg, ptr, end, InterfaceID, kDNSRecordTypePacketAdd, &pkt);
744
+ if (!ptr) { DisplayError(srcaddr, ep, end, "ADDITIONAL"); return; }
745
+ NumAdditionals++;
746
+ DisplayResourceRecord(srcaddr,
747
+ pkt.r.resrec.rrtype == kDNSType_OPT ? "(OP)" : (pkt.r.resrec.RecordType & kDNSRecordTypePacketUniqueMask) ? "(AD)" : "(AD+)",
748
+ &pkt.r.resrec);
749
+ if (entry) RecordHostInfo(entry, &pkt.r.resrec);
750
+ }
751
+
752
+ if (entry) AnalyseHost(m, entry, InterfaceID);
753
+ }
754
+
755
+ mDNSlocal void ProcessUnicastResponse(mDNS *const m, const DNSMessage *const msg, const mDNSu8 *end, const mDNSAddr *srcaddr, const mDNSInterfaceID InterfaceID)
756
+ {
757
+ int i;
758
+ const mDNSu8 *ptr = LocateAnswers(msg, end);
759
+ HostEntry *entry = GotPacketFromHost(srcaddr, HostPkt_R, msg->h.id);
760
+ //mprintf("%#a R\n", srcaddr);
761
+
762
+ for (i=0; i<msg->h.numAnswers + msg->h.numAuthorities + msg->h.numAdditionals; i++)
763
+ {
764
+ LargeCacheRecord pkt;
765
+ ptr = GetLargeResourceRecord(m, msg, ptr, end, InterfaceID, kDNSRecordTypePacketAns, &pkt);
766
+ if (ptr && pkt.r.resrec.rroriginalttl && entry) RecordHostInfo(entry, &pkt.r.resrec);
767
+ }
768
+ }
769
+
770
+ mDNSlocal mDNSBool AddressMatchesFilterList(const mDNSAddr *srcaddr)
771
+ {
772
+ FilterList *f;
773
+ if (!Filters) return(srcaddr->type == mDNSAddrType_IPv4);
774
+ for (f=Filters; f; f=f->next) if (mDNSSameAddress(srcaddr, &f->FilterAddr)) return(mDNStrue);
775
+ return(mDNSfalse);
776
+ }
777
+
778
+ mDNSexport void mDNSCoreReceive(mDNS *const m, DNSMessage *const msg, const mDNSu8 *const end,
779
+ const mDNSAddr *srcaddr, mDNSIPPort srcport, const mDNSAddr *dstaddr, mDNSIPPort dstport, const mDNSInterfaceID InterfaceID)
780
+ {
781
+ const mDNSu8 StdQ = kDNSFlag0_QR_Query | kDNSFlag0_OP_StdQuery;
782
+ const mDNSu8 StdR = kDNSFlag0_QR_Response | kDNSFlag0_OP_StdQuery;
783
+ const mDNSu8 QR_OP = (mDNSu8)(msg->h.flags.b[0] & kDNSFlag0_QROP_Mask);
784
+ mDNSu8 *ptr = (mDNSu8 *)&msg->h.numQuestions;
785
+ int goodinterface = (FilterInterface == 0);
786
+
787
+ (void)dstaddr; // Unused
788
+ (void)dstport; // Unused
789
+
790
+ // Read the integer parts which are in IETF byte-order (MSB first, LSB second)
791
+ msg->h.numQuestions = (mDNSu16)((mDNSu16)ptr[0] << 8 | ptr[1]);
792
+ msg->h.numAnswers = (mDNSu16)((mDNSu16)ptr[2] << 8 | ptr[3]);
793
+ msg->h.numAuthorities = (mDNSu16)((mDNSu16)ptr[4] << 8 | ptr[5]);
794
+ msg->h.numAdditionals = (mDNSu16)((mDNSu16)ptr[6] << 8 | ptr[7]);
795
+
796
+ // For now we're only interested in monitoring IPv4 traffic.
797
+ // All IPv6 packets should just be duplicates of the v4 packets.
798
+ if (!goodinterface) goodinterface = (FilterInterface == (int)mDNSPlatformInterfaceIndexfromInterfaceID(m, InterfaceID, mDNSfalse));
799
+ if (goodinterface && AddressMatchesFilterList(srcaddr))
800
+ {
801
+ mDNS_Lock(m);
802
+ if (!mDNSAddrIsDNSMulticast(dstaddr))
803
+ {
804
+ if (QR_OP == StdQ) mprintf("Unicast query from %#a\n", srcaddr);
805
+ else if (QR_OP == StdR) ProcessUnicastResponse(m, msg, end, srcaddr, InterfaceID);
806
+ }
807
+ else
808
+ {
809
+ if (QR_OP == StdQ) DisplayQuery (m, msg, end, srcaddr, srcport, dstaddr, InterfaceID);
810
+ else if (QR_OP == StdR) DisplayResponse (m, msg, end, srcaddr, srcport, dstaddr, InterfaceID);
811
+ else
812
+ {
813
+ debugf("Unknown DNS packet type %02X%02X (ignored)", msg->h.flags.b[0], msg->h.flags.b[1]);
814
+ GotPacketFromHost(srcaddr, HostPkt_B, msg->h.id);
815
+ NumPktB++;
816
+ }
817
+ }
818
+ mDNS_Unlock(m);
819
+ }
820
+ }
821
+
822
+ mDNSlocal mStatus mDNSNetMonitor(void)
823
+ {
824
+ struct tm tm;
825
+ int h, m, s, mul, div, TotPkt;
826
+ #if !defined(WIN32)
827
+ sigset_t signals;
828
+ #endif
829
+
830
+ mStatus status = mDNS_Init(&mDNSStorage, &PlatformStorage,
831
+ mDNS_Init_NoCache, mDNS_Init_ZeroCacheSize,
832
+ mDNS_Init_DontAdvertiseLocalAddresses,
833
+ mDNS_Init_NoInitCallback, mDNS_Init_NoInitCallbackContext);
834
+ if (status) return(status);
835
+
836
+ gettimeofday(&tv_start, NULL);
837
+
838
+ #if defined( WIN32 )
839
+ status = SetupInterfaceList(&mDNSStorage);
840
+ if (status) return(status);
841
+ gStopEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
842
+ if (gStopEvent == INVALID_HANDLE_VALUE) return mStatus_UnknownErr;
843
+ if (!SetConsoleCtrlHandler(ConsoleControlHandler, TRUE)) return mStatus_UnknownErr;
844
+ while (WaitForSingleObjectEx(gStopEvent, INFINITE, TRUE) == WAIT_IO_COMPLETION)
845
+ DispatchSocketEvents(&mDNSStorage);
846
+ if (!SetConsoleCtrlHandler(ConsoleControlHandler, FALSE)) return mStatus_UnknownErr;
847
+ CloseHandle(gStopEvent);
848
+ #else
849
+ mDNSPosixListenForSignalInEventLoop(SIGINT);
850
+ mDNSPosixListenForSignalInEventLoop(SIGTERM);
851
+
852
+ do
853
+ {
854
+ struct timeval timeout = { 0x3FFFFFFF, 0 }; // wait until SIGINT or SIGTERM
855
+ mDNSBool gotSomething;
856
+ mDNSPosixRunEventLoopOnce(&mDNSStorage, &timeout, &signals, &gotSomething);
857
+ }
858
+ while ( !( sigismember( &signals, SIGINT) || sigismember( &signals, SIGTERM)));
859
+ #endif
860
+
861
+ // Now display final summary
862
+ TotPkt = NumPktQ + NumPktL + NumPktR;
863
+ gettimeofday(&tv_end, NULL);
864
+ tv_interval = tv_end;
865
+ if (tv_start.tv_usec > tv_interval.tv_usec)
866
+ { tv_interval.tv_usec += 1000000; tv_interval.tv_sec--; }
867
+ tv_interval.tv_sec -= tv_start.tv_sec;
868
+ tv_interval.tv_usec -= tv_start.tv_usec;
869
+ h = (tv_interval.tv_sec / 3600);
870
+ m = (tv_interval.tv_sec % 3600) / 60;
871
+ s = (tv_interval.tv_sec % 60);
872
+ if (tv_interval.tv_sec > 10)
873
+ {
874
+ mul = 60;
875
+ div = tv_interval.tv_sec;
876
+ }
877
+ else
878
+ {
879
+ mul = 60000;
880
+ div = tv_interval.tv_sec * 1000 + tv_interval.tv_usec / 1000;
881
+ if (div == 0) div=1;
882
+ }
883
+
884
+ mprintf("\n\n");
885
+ localtime_r((time_t*)&tv_start.tv_sec, &tm);
886
+ mprintf("Started %3d:%02d:%02d.%06d\n", tm.tm_hour, tm.tm_min, tm.tm_sec, tv_start.tv_usec);
887
+ localtime_r((time_t*)&tv_end.tv_sec, &tm);
888
+ mprintf("End %3d:%02d:%02d.%06d\n", tm.tm_hour, tm.tm_min, tm.tm_sec, tv_end.tv_usec);
889
+ mprintf("Captured for %3d:%02d:%02d.%06d\n", h, m, s, tv_interval.tv_usec);
890
+ if (!Filters)
891
+ {
892
+ mprintf("Unique source addresses seen on network:");
893
+ if (IPv4HostList.num) mprintf(" %ld (IPv4)", IPv4HostList.num);
894
+ if (IPv6HostList.num) mprintf(" %ld (IPv6)", IPv6HostList.num);
895
+ if (!IPv4HostList.num && !IPv6HostList.num) mprintf(" None");
896
+ mprintf("\n");
897
+ }
898
+ mprintf("\n");
899
+ mprintf("Modern Query Packets: %7d (avg%5d/min)\n", NumPktQ, NumPktQ * mul / div);
900
+ mprintf("Legacy Query Packets: %7d (avg%5d/min)\n", NumPktL, NumPktL * mul / div);
901
+ mprintf("Multicast Response Packets: %7d (avg%5d/min)\n", NumPktR, NumPktR * mul / div);
902
+ mprintf("Total Multicast Packets: %7d (avg%5d/min)\n", TotPkt, TotPkt * mul / div);
903
+ mprintf("\n");
904
+ mprintf("Total New Service Probes: %7d (avg%5d/min)\n", NumProbes, NumProbes * mul / div);
905
+ mprintf("Total Goodbye Announcements: %7d (avg%5d/min)\n", NumGoodbyes, NumGoodbyes * mul / div);
906
+ mprintf("Total Query Questions: %7d (avg%5d/min)\n", NumQuestions, NumQuestions * mul / div);
907
+ mprintf("Total Queries from Legacy Clients:%7d (avg%5d/min)\n", NumLegacy, NumLegacy * mul / div);
908
+ mprintf("Total Answers/Announcements: %7d (avg%5d/min)\n", NumAnswers, NumAnswers * mul / div);
909
+ mprintf("Total Additional Records: %7d (avg%5d/min)\n", NumAdditionals, NumAdditionals * mul / div);
910
+ mprintf("\n");
911
+ printstats(kReportTopServices);
912
+
913
+ if (!ExactlyOneFilter)
914
+ {
915
+ ShowSortedHostList(&IPv4HostList, kReportTopHosts);
916
+ ShowSortedHostList(&IPv6HostList, kReportTopHosts);
917
+ }
918
+
919
+ mDNS_Close(&mDNSStorage);
920
+ return(0);
921
+ }
922
+
923
+ mDNSexport int main(int argc, char **argv)
924
+ {
925
+ const char *progname = strrchr(argv[0], '/') ? strrchr(argv[0], '/') + 1 : argv[0];
926
+ int i;
927
+ mStatus status;
928
+
929
+ #if defined(WIN32)
930
+ HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
931
+ #endif
932
+
933
+ setlinebuf(stdout); // Want to see lines as they appear, not block buffered
934
+
935
+ for (i=1; i<argc; i++)
936
+ {
937
+ if (i+1 < argc && !strcmp(argv[i], "-i") && atoi(argv[i+1]))
938
+ {
939
+ FilterInterface = atoi(argv[i+1]);
940
+ i += 2;
941
+ printf("Monitoring interface %d\n", FilterInterface);
942
+ }
943
+ else
944
+ {
945
+ struct in_addr s4;
946
+ struct in6_addr s6;
947
+ FilterList *f;
948
+ mDNSAddr a;
949
+ a.type = mDNSAddrType_IPv4;
950
+
951
+ if (inet_pton(AF_INET, argv[i], &s4) == 1)
952
+ a.ip.v4.NotAnInteger = s4.s_addr;
953
+ else if (inet_pton(AF_INET6, argv[i], &s6) == 1)
954
+ {
955
+ a.type = mDNSAddrType_IPv6;
956
+ mDNSPlatformMemCopy(&a.ip.v6, &s6, sizeof(a.ip.v6));
957
+ }
958
+ else
959
+ {
960
+ struct hostent *h = gethostbyname(argv[i]);
961
+ if (h) a.ip.v4.NotAnInteger = *(long*)h->h_addr;
962
+ else goto usage;
963
+ }
964
+
965
+ f = malloc(sizeof(*f));
966
+ f->FilterAddr = a;
967
+ f->next = Filters;
968
+ Filters = f;
969
+ }
970
+ }
971
+
972
+ status = mDNSNetMonitor();
973
+ if (status) { fprintf(stderr, "%s: mDNSNetMonitor failed %d\n", progname, (int)status); return(status); }
974
+ return(0);
975
+
976
+ usage:
977
+ fprintf(stderr, "\nmDNS traffic monitor\n");
978
+ fprintf(stderr, "Usage: %s [-i index] [host]\n", progname);
979
+ fprintf(stderr, "Optional [-i index] parameter displays only packets from that interface index\n");
980
+ fprintf(stderr, "Optional [host] parameter displays only packets from that host\n");
981
+
982
+ fprintf(stderr, "\nPer-packet header output:\n");
983
+ fprintf(stderr, "-Q- Multicast Query from mDNS client that accepts multicast responses\n");
984
+ fprintf(stderr, "-R- Multicast Response packet containing answers/announcements\n");
985
+ fprintf(stderr, "-LQ- Multicast Query from legacy client that does *not* listen for multicast responses\n");
986
+ fprintf(stderr, "Q/Ans/Auth/Add Number of questions, answers, authority records and additional records in packet\n");
987
+
988
+ fprintf(stderr, "\nPer-record display:\n");
989
+ fprintf(stderr, "(PM) Probe Question (new service starting), requesting multicast response\n");
990
+ fprintf(stderr, "(PU) Probe Question (new service starting), requesting unicast response\n");
991
+ fprintf(stderr, "(DE) Deletion/Goodbye (service going away)\n");
992
+ fprintf(stderr, "(LQ) Legacy Query Question\n");
993
+ fprintf(stderr, "(QM) Query Question, requesting multicast response\n");
994
+ fprintf(stderr, "(QU) Query Question, requesting unicast response\n");
995
+ fprintf(stderr, "(KA) Known Answer (information querier already knows)\n");
996
+ fprintf(stderr, "(AN) Unique Answer to question (or periodic announcment) (entire RR Set)\n");
997
+ fprintf(stderr, "(AN+) Answer to question (or periodic announcment) (add to existing RR Set members)\n");
998
+ fprintf(stderr, "(AD) Unique Additional Record Set (entire RR Set)\n");
999
+ fprintf(stderr, "(AD+) Additional records (add to existing RR Set members)\n");
1000
+
1001
+ fprintf(stderr, "\nFinal summary, sorted by service type:\n");
1002
+ fprintf(stderr, "Probe Probes for this service type starting up\n");
1003
+ fprintf(stderr, "Goodbye Goodbye (deletion) packets for this service type shutting down\n");
1004
+ fprintf(stderr, "BrowseQ Browse questions from clients browsing to find a list of instances of this service\n");
1005
+ fprintf(stderr, "BrowseA Browse answers/announcments advertising instances of this service\n");
1006
+ fprintf(stderr, "ResolveQ Resolve questions from clients actively connecting to an instance of this service\n");
1007
+ fprintf(stderr, "ResolveA Resolve answers/announcments giving connection information for an instance of this service\n");
1008
+ fprintf(stderr, "\n");
1009
+ return(-1);
1010
+ }