mdns_console.c 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "esp_console.h"
  9. #include "argtable3/argtable3.h"
  10. #include "mdns.h"
  11. #include "mdns_private.h"
  12. #include "inttypes.h"
  13. static const char *ip_protocol_str[] = {"V4", "V6", "MAX"};
  14. static void mdns_print_results(mdns_result_t *results)
  15. {
  16. mdns_result_t *r = results;
  17. mdns_ip_addr_t *a = NULL;
  18. int i = 1;
  19. while (r) {
  20. if (r->esp_netif) {
  21. printf("%d: Interface: %s, Type: %s, TTL: %" PRIu32 "\n", i++, esp_netif_get_ifkey(r->esp_netif),
  22. ip_protocol_str[r->ip_protocol], r->ttl);
  23. }
  24. if (r->instance_name) {
  25. printf(" PTR : %s\n", r->instance_name);
  26. }
  27. if (r->hostname) {
  28. printf(" SRV : %s.local:%u\n", r->hostname, r->port);
  29. }
  30. if (r->txt_count) {
  31. printf(" TXT : [%u] ", (int)r->txt_count);
  32. for (size_t t = 0; t < r->txt_count; t++) {
  33. printf("%s=%s; ", r->txt[t].key, r->txt[t].value);
  34. }
  35. printf("\n");
  36. }
  37. a = r->addr;
  38. while (a) {
  39. if (a->addr.type == ESP_IPADDR_TYPE_V6) {
  40. printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6));
  41. } else {
  42. printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4)));
  43. }
  44. a = a->next;
  45. }
  46. r = r->next;
  47. }
  48. }
  49. static struct {
  50. struct arg_str *hostname;
  51. struct arg_int *timeout;
  52. struct arg_end *end;
  53. } mdns_query_a_args;
  54. #ifdef CONFIG_LWIP_IPV4
  55. static int cmd_mdns_query_a(int argc, char **argv)
  56. {
  57. int nerrors = arg_parse(argc, argv, (void **) &mdns_query_a_args);
  58. if (nerrors != 0) {
  59. arg_print_errors(stderr, mdns_query_a_args.end, argv[0]);
  60. return 1;
  61. }
  62. const char *hostname = mdns_query_a_args.hostname->sval[0];
  63. int timeout = mdns_query_a_args.timeout->ival[0];
  64. if (!hostname || !hostname[0]) {
  65. printf("ERROR: Hostname not supplied\n");
  66. return 1;
  67. }
  68. if (timeout <= 0) {
  69. timeout = 1000;
  70. }
  71. printf("Query A: %s.local, Timeout: %d\n", hostname, timeout);
  72. struct esp_ip4_addr addr;
  73. addr.addr = 0;
  74. esp_err_t err = mdns_query_a(hostname, timeout, &addr);
  75. if (err) {
  76. if (err == ESP_ERR_NOT_FOUND) {
  77. printf("ERROR: Host was not found!\n");
  78. return 0;
  79. }
  80. printf("ERROR: Query Failed\n");
  81. return 1;
  82. }
  83. printf(IPSTR "\n", IP2STR(&addr));
  84. return 0;
  85. }
  86. static void register_mdns_query_a(void)
  87. {
  88. mdns_query_a_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Hostname that is searched for");
  89. mdns_query_a_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  90. mdns_query_a_args.end = arg_end(2);
  91. const esp_console_cmd_t cmd_init = {
  92. .command = "mdns_query_a",
  93. .help = "Query MDNS for IPv4",
  94. .hint = NULL,
  95. .func = &cmd_mdns_query_a,
  96. .argtable = &mdns_query_a_args
  97. };
  98. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  99. }
  100. #endif /* CONFIG_LWIP_IPV4 */
  101. #ifdef CONFIG_LWIP_IPV6
  102. static int cmd_mdns_query_aaaa(int argc, char **argv)
  103. {
  104. int nerrors = arg_parse(argc, argv, (void **) &mdns_query_a_args);
  105. if (nerrors != 0) {
  106. arg_print_errors(stderr, mdns_query_a_args.end, argv[0]);
  107. return 1;
  108. }
  109. const char *hostname = mdns_query_a_args.hostname->sval[0];
  110. int timeout = mdns_query_a_args.timeout->ival[0];
  111. if (!hostname || !hostname[0]) {
  112. printf("ERROR: Hostname not supplied\n");
  113. return 1;
  114. }
  115. if (timeout <= 0) {
  116. timeout = 1000;
  117. }
  118. printf("Query AAAA: %s.local, Timeout: %d\n", hostname, timeout);
  119. struct esp_ip6_addr addr;
  120. memset(addr.addr, 0, 16);
  121. esp_err_t err = mdns_query_aaaa(hostname, timeout, &addr);
  122. if (err) {
  123. if (err == ESP_ERR_NOT_FOUND) {
  124. printf("Host was not found!\n");
  125. return 0;
  126. }
  127. printf("ERROR: Query Failed\n");
  128. return 1;
  129. }
  130. printf(IPV6STR "\n", IPV62STR(addr));
  131. return 0;
  132. }
  133. static void register_mdns_query_aaaa(void)
  134. {
  135. mdns_query_a_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Hostname that is searched for");
  136. mdns_query_a_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  137. mdns_query_a_args.end = arg_end(2);
  138. const esp_console_cmd_t cmd_init = {
  139. .command = "mdns_query_aaaa",
  140. .help = "Query MDNS for IPv6",
  141. .hint = NULL,
  142. .func = &cmd_mdns_query_aaaa,
  143. .argtable = &mdns_query_a_args
  144. };
  145. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  146. }
  147. #endif /* CONFIG_LWIP_IPV6 */
  148. static struct {
  149. struct arg_str *instance;
  150. struct arg_str *service;
  151. struct arg_str *proto;
  152. struct arg_int *timeout;
  153. struct arg_end *end;
  154. } mdns_query_srv_args;
  155. static int cmd_mdns_query_srv(int argc, char **argv)
  156. {
  157. int nerrors = arg_parse(argc, argv, (void **) &mdns_query_srv_args);
  158. if (nerrors != 0) {
  159. arg_print_errors(stderr, mdns_query_srv_args.end, argv[0]);
  160. return 1;
  161. }
  162. const char *instance = mdns_query_srv_args.instance->sval[0];
  163. const char *service = mdns_query_srv_args.service->sval[0];
  164. const char *proto = mdns_query_srv_args.proto->sval[0];
  165. int timeout = mdns_query_srv_args.timeout->ival[0];
  166. if (timeout <= 0) {
  167. timeout = 1000;
  168. }
  169. printf("Query SRV: %s.%s.%s.local, Timeout: %d\n", instance, service, proto, timeout);
  170. mdns_result_t *results = NULL;
  171. esp_err_t err = mdns_query_srv(instance, service, proto, timeout, &results);
  172. if (err) {
  173. printf("ERROR: Query Failed\n");
  174. return 1;
  175. }
  176. if (!results) {
  177. printf("No results found!\n");
  178. return 0;
  179. }
  180. mdns_print_results(results);
  181. mdns_query_results_free(results);
  182. return 0;
  183. }
  184. static void register_mdns_query_srv(void)
  185. {
  186. mdns_query_srv_args.instance = arg_str1(NULL, NULL, "<instance>", "Instance to search for");
  187. mdns_query_srv_args.service = arg_str1(NULL, NULL, "<service>", "Service to search for (ex. _http, _smb, etc.)");
  188. mdns_query_srv_args.proto = arg_str1(NULL, NULL, "<proto>", "Protocol to search for (_tcp, _udp, etc.)");
  189. mdns_query_srv_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  190. mdns_query_srv_args.end = arg_end(2);
  191. const esp_console_cmd_t cmd_init = {
  192. .command = "mdns_query_srv",
  193. .help = "Query MDNS for Service SRV",
  194. .hint = NULL,
  195. .func = &cmd_mdns_query_srv,
  196. .argtable = &mdns_query_srv_args
  197. };
  198. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  199. }
  200. static struct {
  201. struct arg_str *instance;
  202. struct arg_str *service;
  203. struct arg_str *proto;
  204. struct arg_int *timeout;
  205. struct arg_end *end;
  206. } mdns_query_txt_args;
  207. static int cmd_mdns_query_txt(int argc, char **argv)
  208. {
  209. int nerrors = arg_parse(argc, argv, (void **) &mdns_query_txt_args);
  210. if (nerrors != 0) {
  211. arg_print_errors(stderr, mdns_query_txt_args.end, argv[0]);
  212. return 1;
  213. }
  214. const char *instance = mdns_query_txt_args.instance->sval[0];
  215. const char *service = mdns_query_txt_args.service->sval[0];
  216. const char *proto = mdns_query_txt_args.proto->sval[0];
  217. int timeout = mdns_query_txt_args.timeout->ival[0];
  218. printf("Query TXT: %s.%s.%s.local, Timeout: %d\n", instance, service, proto, timeout);
  219. if (timeout <= 0) {
  220. timeout = 5000;
  221. }
  222. mdns_result_t *results = NULL;
  223. esp_err_t err = mdns_query_txt(instance, service, proto, timeout, &results);
  224. if (err) {
  225. printf("ERROR: Query Failed\n");
  226. return 1;
  227. }
  228. if (!results) {
  229. printf("No results found!\n");
  230. return 0;
  231. }
  232. mdns_print_results(results);
  233. mdns_query_results_free(results);
  234. return 0;
  235. }
  236. static void register_mdns_query_txt(void)
  237. {
  238. mdns_query_txt_args.instance = arg_str1(NULL, NULL, "<instance>", "Instance to search for");
  239. mdns_query_txt_args.service = arg_str1(NULL, NULL, "<service>", "Service to search for (ex. _http, _smb, etc.)");
  240. mdns_query_txt_args.proto = arg_str1(NULL, NULL, "<proto>", "Protocol to search for (_tcp, _udp, etc.)");
  241. mdns_query_txt_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  242. mdns_query_txt_args.end = arg_end(2);
  243. const esp_console_cmd_t cmd_init = {
  244. .command = "mdns_query_txt",
  245. .help = "Query MDNS for Service TXT",
  246. .hint = NULL,
  247. .func = &cmd_mdns_query_txt,
  248. .argtable = &mdns_query_txt_args
  249. };
  250. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  251. }
  252. static struct {
  253. struct arg_str *service;
  254. struct arg_str *proto;
  255. struct arg_int *timeout;
  256. struct arg_int *max_results;
  257. struct arg_end *end;
  258. } mdns_query_ptr_args;
  259. static int cmd_mdns_query_ptr(int argc, char **argv)
  260. {
  261. int nerrors = arg_parse(argc, argv, (void **) &mdns_query_ptr_args);
  262. if (nerrors != 0) {
  263. arg_print_errors(stderr, mdns_query_ptr_args.end, argv[0]);
  264. return 1;
  265. }
  266. const char *service = mdns_query_ptr_args.service->sval[0];
  267. const char *proto = mdns_query_ptr_args.proto->sval[0];
  268. int timeout = mdns_query_ptr_args.timeout->ival[0];
  269. int max_results = mdns_query_ptr_args.max_results->ival[0];
  270. if (timeout <= 0) {
  271. timeout = 5000;
  272. }
  273. if (max_results <= 0 || max_results > 255) {
  274. max_results = 255;
  275. }
  276. printf("Query PTR: %s.%s.local, Timeout: %d, Max Results: %d\n", service, proto, timeout, max_results);
  277. mdns_result_t *results = NULL;
  278. esp_err_t err = mdns_query_ptr(service, proto, timeout, max_results, &results);
  279. if (err) {
  280. printf("ERROR: Query Failed\n");
  281. return 1;
  282. }
  283. if (!results) {
  284. printf("No results found!\n");
  285. return 0;
  286. }
  287. mdns_print_results(results);
  288. mdns_query_results_free(results);
  289. return 0;
  290. }
  291. static void register_mdns_query_ptr(void)
  292. {
  293. mdns_query_ptr_args.service = arg_str1(NULL, NULL, "<service>", "Service to search for (ex. _http, _smb, etc.)");
  294. mdns_query_ptr_args.proto = arg_str1(NULL, NULL, "<proto>", "Protocol to search for (_tcp, _udp, etc.)");
  295. mdns_query_ptr_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  296. mdns_query_ptr_args.max_results = arg_int0("m", "max_results", "<max_results>", "Maximum results returned");
  297. mdns_query_ptr_args.end = arg_end(2);
  298. const esp_console_cmd_t cmd_init = {
  299. .command = "mdns_query_ptr",
  300. .help = "Query MDNS for Service",
  301. .hint = NULL,
  302. .func = &cmd_mdns_query_ptr,
  303. .argtable = &mdns_query_ptr_args
  304. };
  305. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  306. }
  307. static struct {
  308. struct arg_str *hostname;
  309. struct arg_int *timeout;
  310. struct arg_int *max_results;
  311. struct arg_end *end;
  312. } mdns_query_ip_args;
  313. static int cmd_mdns_query_ip(int argc, char **argv)
  314. {
  315. int nerrors = arg_parse(argc, argv, (void **) &mdns_query_ip_args);
  316. if (nerrors != 0) {
  317. arg_print_errors(stderr, mdns_query_ip_args.end, argv[0]);
  318. return 1;
  319. }
  320. const char *hostname = mdns_query_ip_args.hostname->sval[0];
  321. int timeout = mdns_query_ip_args.timeout->ival[0];
  322. int max_results = mdns_query_ip_args.max_results->ival[0];
  323. if (!hostname || !hostname[0]) {
  324. printf("ERROR: Hostname not supplied\n");
  325. return 1;
  326. }
  327. if (timeout <= 0) {
  328. timeout = 1000;
  329. }
  330. if (max_results < 0 || max_results > 255) {
  331. max_results = 255;
  332. }
  333. printf("Query IP: %s.local, Timeout: %d, Max Results: %d\n", hostname, timeout, max_results);
  334. mdns_result_t *results = NULL;
  335. esp_err_t err = mdns_query(hostname, NULL, NULL, MDNS_TYPE_ANY, timeout, max_results, &results);
  336. if (err) {
  337. printf("ERROR: Query Failed\n");
  338. return 1;
  339. }
  340. if (!results) {
  341. printf("No results found!\n");
  342. return 0;
  343. }
  344. mdns_print_results(results);
  345. mdns_query_results_free(results);
  346. return 0;
  347. }
  348. static void register_mdns_query_ip(void)
  349. {
  350. mdns_query_ip_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Hostname that is searched for");
  351. mdns_query_ip_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  352. mdns_query_ip_args.max_results = arg_int0("m", "max_results", "<max_results>", "Maximum results returned");
  353. mdns_query_ip_args.end = arg_end(2);
  354. const esp_console_cmd_t cmd_init = {
  355. .command = "mdns_query_ip",
  356. .help = "Query MDNS for IP",
  357. .hint = NULL,
  358. .func = &cmd_mdns_query_ip,
  359. .argtable = &mdns_query_ip_args
  360. };
  361. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  362. }
  363. static struct {
  364. struct arg_str *instance;
  365. struct arg_str *service;
  366. struct arg_str *proto;
  367. struct arg_int *timeout;
  368. struct arg_int *max_results;
  369. struct arg_end *end;
  370. } mdns_query_svc_args;
  371. static int cmd_mdns_query_svc(int argc, char **argv)
  372. {
  373. int nerrors = arg_parse(argc, argv, (void **) &mdns_query_svc_args);
  374. if (nerrors != 0) {
  375. arg_print_errors(stderr, mdns_query_svc_args.end, argv[0]);
  376. return 1;
  377. }
  378. const char *instance = mdns_query_svc_args.instance->sval[0];
  379. const char *service = mdns_query_svc_args.service->sval[0];
  380. const char *proto = mdns_query_svc_args.proto->sval[0];
  381. int timeout = mdns_query_svc_args.timeout->ival[0];
  382. int max_results = mdns_query_svc_args.max_results->ival[0];
  383. if (timeout <= 0) {
  384. timeout = 5000;
  385. }
  386. if (max_results < 0 || max_results > 255) {
  387. max_results = 255;
  388. }
  389. printf("Query SVC: %s.%s.%s.local, Timeout: %d, Max Results: %d\n", instance, service, proto, timeout, max_results);
  390. mdns_result_t *results = NULL;
  391. esp_err_t err = mdns_query(instance, service, proto, MDNS_TYPE_ANY, timeout, max_results, &results);
  392. if (err) {
  393. printf("ERROR: Query Failed\n");
  394. return 1;
  395. }
  396. if (!results) {
  397. printf("No results found!\n");
  398. return 0;
  399. }
  400. mdns_print_results(results);
  401. mdns_query_results_free(results);
  402. return 0;
  403. }
  404. static void register_mdns_query_svc(void)
  405. {
  406. mdns_query_svc_args.instance = arg_str1(NULL, NULL, "<instance>", "Instance to search for");
  407. mdns_query_svc_args.service = arg_str1(NULL, NULL, "<service>", "Service to search for (ex. _http, _smb, etc.)");
  408. mdns_query_svc_args.proto = arg_str1(NULL, NULL, "<proto>", "Protocol to search for (_tcp, _udp, etc.)");
  409. mdns_query_svc_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  410. mdns_query_svc_args.max_results = arg_int0("m", "max_results", "<max_results>", "Maximum results returned");
  411. mdns_query_svc_args.end = arg_end(2);
  412. const esp_console_cmd_t cmd_init = {
  413. .command = "mdns_query_svc",
  414. .help = "Query MDNS for Service TXT & SRV",
  415. .hint = NULL,
  416. .func = &cmd_mdns_query_svc,
  417. .argtable = &mdns_query_svc_args
  418. };
  419. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  420. }
  421. static struct {
  422. struct arg_str *hostname;
  423. struct arg_str *instance;
  424. struct arg_end *end;
  425. } mdns_init_args;
  426. static int cmd_mdns_init(int argc, char **argv)
  427. {
  428. int nerrors = arg_parse(argc, argv, (void **) &mdns_init_args);
  429. if (nerrors != 0) {
  430. arg_print_errors(stderr, mdns_init_args.end, argv[0]);
  431. return 1;
  432. }
  433. ESP_ERROR_CHECK( mdns_init() );
  434. if (mdns_init_args.hostname->sval[0]) {
  435. ESP_ERROR_CHECK( mdns_hostname_set(mdns_init_args.hostname->sval[0]) );
  436. printf("MDNS: Hostname: %s\n", mdns_init_args.hostname->sval[0]);
  437. }
  438. if (mdns_init_args.instance->count) {
  439. ESP_ERROR_CHECK( mdns_instance_name_set(mdns_init_args.instance->sval[0]) );
  440. printf("MDNS: Instance: %s\n", mdns_init_args.instance->sval[0]);
  441. }
  442. return 0;
  443. }
  444. static void register_mdns_init(void)
  445. {
  446. mdns_init_args.hostname = arg_str0("h", "hostname", "<hostname>", "Hostname that the server will advertise");
  447. mdns_init_args.instance = arg_str0("i", "instance", "<instance>", "Default instance name for services");
  448. mdns_init_args.end = arg_end(2);
  449. const esp_console_cmd_t cmd_init = {
  450. .command = "mdns_init",
  451. .help = "Start MDNS Server",
  452. .hint = NULL,
  453. .func = &cmd_mdns_init,
  454. .argtable = &mdns_init_args
  455. };
  456. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  457. }
  458. static int cmd_mdns_free(int argc, char **argv)
  459. {
  460. mdns_free();
  461. return 0;
  462. }
  463. static void register_mdns_free(void)
  464. {
  465. const esp_console_cmd_t cmd_free = {
  466. .command = "mdns_free",
  467. .help = "Stop MDNS Server",
  468. .hint = NULL,
  469. .func = &cmd_mdns_free,
  470. .argtable = NULL
  471. };
  472. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_free) );
  473. }
  474. static struct {
  475. struct arg_str *hostname;
  476. struct arg_end *end;
  477. } mdns_set_hostname_args;
  478. static int cmd_mdns_set_hostname(int argc, char **argv)
  479. {
  480. int nerrors = arg_parse(argc, argv, (void **) &mdns_set_hostname_args);
  481. if (nerrors != 0) {
  482. arg_print_errors(stderr, mdns_set_hostname_args.end, argv[0]);
  483. return 1;
  484. }
  485. if (mdns_set_hostname_args.hostname->sval[0] == NULL) {
  486. printf("ERROR: Bad arguments!\n");
  487. return 1;
  488. }
  489. ESP_ERROR_CHECK( mdns_hostname_set(mdns_set_hostname_args.hostname->sval[0]) );
  490. return 0;
  491. }
  492. static void register_mdns_set_hostname(void)
  493. {
  494. mdns_set_hostname_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Hostname that the server will advertise");
  495. mdns_set_hostname_args.end = arg_end(2);
  496. const esp_console_cmd_t cmd_set_hostname = {
  497. .command = "mdns_set_hostname",
  498. .help = "Set MDNS Server hostname",
  499. .hint = NULL,
  500. .func = &cmd_mdns_set_hostname,
  501. .argtable = &mdns_set_hostname_args
  502. };
  503. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_set_hostname) );
  504. }
  505. static struct {
  506. struct arg_str *instance;
  507. struct arg_end *end;
  508. } mdns_set_instance_args;
  509. static int cmd_mdns_set_instance(int argc, char **argv)
  510. {
  511. int nerrors = arg_parse(argc, argv, (void **) &mdns_set_instance_args);
  512. if (nerrors != 0) {
  513. arg_print_errors(stderr, mdns_set_instance_args.end, argv[0]);
  514. return 1;
  515. }
  516. if (mdns_set_instance_args.instance->sval[0] == NULL) {
  517. printf("ERROR: Bad arguments!\n");
  518. return 1;
  519. }
  520. ESP_ERROR_CHECK( mdns_instance_name_set(mdns_set_instance_args.instance->sval[0]) );
  521. return 0;
  522. }
  523. static void register_mdns_set_instance(void)
  524. {
  525. mdns_set_instance_args.instance = arg_str1(NULL, NULL, "<instance>", "Default instance name for services");
  526. mdns_set_instance_args.end = arg_end(2);
  527. const esp_console_cmd_t cmd_set_instance = {
  528. .command = "mdns_set_instance",
  529. .help = "Set MDNS Server Istance Name",
  530. .hint = NULL,
  531. .func = &cmd_mdns_set_instance,
  532. .argtable = &mdns_set_instance_args
  533. };
  534. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_set_instance) );
  535. }
  536. static mdns_txt_item_t *_convert_items(const char **values, int count)
  537. {
  538. int i = 0, e;
  539. const char *value = NULL;
  540. mdns_txt_item_t *items = (mdns_txt_item_t *) malloc(sizeof(mdns_txt_item_t) * count);
  541. if (!items) {
  542. printf("ERROR: No Memory!\n");
  543. goto fail;
  544. }
  545. memset(items, 0, sizeof(mdns_txt_item_t) * count);
  546. for (i = 0; i < count; i++) {
  547. value = values[i];
  548. char *esign = strchr(value, '=');
  549. if (!esign) {
  550. printf("ERROR: Equal sign not found in '%s'!\n", value);
  551. goto fail;
  552. }
  553. int var_len = esign - value;
  554. int val_len = strlen(value) - var_len - 1;
  555. char *var = (char *)malloc(var_len + 1);
  556. if (var == NULL) {
  557. printf("ERROR: No Memory!\n");
  558. goto fail;
  559. }
  560. char *val = (char *)malloc(val_len + 1);
  561. if (val == NULL) {
  562. printf("ERROR: No Memory!\n");
  563. free(var);
  564. goto fail;
  565. }
  566. memcpy(var, value, var_len);
  567. var[var_len] = 0;
  568. memcpy(val, esign + 1, val_len);
  569. val[val_len] = 0;
  570. items[i].key = var;
  571. items[i].value = val;
  572. }
  573. return items;
  574. fail:
  575. for (e = 0; e < i; e++) {
  576. free((char *)items[e].key);
  577. free((char *)items[e].value);
  578. }
  579. free(items);
  580. return NULL;
  581. }
  582. static struct {
  583. struct arg_str *service;
  584. struct arg_str *proto;
  585. struct arg_int *port;
  586. struct arg_str *instance;
  587. struct arg_str *host;
  588. struct arg_str *txt;
  589. struct arg_end *end;
  590. } mdns_add_args;
  591. static int cmd_mdns_service_add(int argc, char **argv)
  592. {
  593. int nerrors = arg_parse(argc, argv, (void **) &mdns_add_args);
  594. if (nerrors != 0) {
  595. arg_print_errors(stderr, mdns_add_args.end, argv[0]);
  596. return 1;
  597. }
  598. if (!mdns_add_args.service->sval[0] || !mdns_add_args.proto->sval[0] || !mdns_add_args.port->ival[0]) {
  599. printf("ERROR: Bad arguments!\n");
  600. return 1;
  601. }
  602. const char *instance = NULL;
  603. if (mdns_add_args.instance->sval[0] && mdns_add_args.instance->sval[0][0]) {
  604. instance = mdns_add_args.instance->sval[0];
  605. printf("MDNS: Service Instance: %s\n", instance);
  606. }
  607. const char *host = NULL;
  608. if (mdns_add_args.host->count && mdns_add_args.host->sval[0]) {
  609. host = mdns_add_args.host->sval[0];
  610. printf("MDNS: Service for delegated host: %s\n", host);
  611. }
  612. mdns_txt_item_t *items = NULL;
  613. if (mdns_add_args.txt->count) {
  614. items = _convert_items(mdns_add_args.txt->sval, mdns_add_args.txt->count);
  615. if (!items) {
  616. printf("ERROR: No Memory!\n");
  617. return 1;
  618. }
  619. }
  620. ESP_ERROR_CHECK( mdns_service_add_for_host(instance, mdns_add_args.service->sval[0], mdns_add_args.proto->sval[0],
  621. host, mdns_add_args.port->ival[0], items, mdns_add_args.txt->count) );
  622. free(items);
  623. return 0;
  624. }
  625. static void register_mdns_service_add(void)
  626. {
  627. mdns_add_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  628. mdns_add_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  629. mdns_add_args.port = arg_int1(NULL, NULL, "<port>", "Service Port");
  630. mdns_add_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  631. mdns_add_args.host = arg_str0("h", "host", "<hostname>", "Service for this (delegated) host");
  632. mdns_add_args.txt = arg_strn(NULL, NULL, "item", 0, 30, "TXT Items (name=value)");
  633. mdns_add_args.end = arg_end(2);
  634. const esp_console_cmd_t cmd_add = {
  635. .command = "mdns_service_add",
  636. .help = "Add service to MDNS",
  637. .hint = NULL,
  638. .func = &cmd_mdns_service_add,
  639. .argtable = &mdns_add_args
  640. };
  641. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) );
  642. }
  643. static struct {
  644. struct arg_str *instance;
  645. struct arg_str *service;
  646. struct arg_str *proto;
  647. struct arg_str *host;
  648. struct arg_end *end;
  649. } mdns_remove_args;
  650. static int cmd_mdns_service_remove(int argc, char **argv)
  651. {
  652. int nerrors = arg_parse(argc, argv, (void **) &mdns_remove_args);
  653. if (nerrors != 0) {
  654. arg_print_errors(stderr, mdns_remove_args.end, argv[0]);
  655. return 1;
  656. }
  657. if (!mdns_remove_args.service->sval[0] || !mdns_remove_args.proto->sval[0]) {
  658. printf("ERROR: Bad arguments!\n");
  659. return 1;
  660. }
  661. const char *instance = NULL;
  662. if (mdns_remove_args.instance->count && mdns_remove_args.instance->sval[0]) {
  663. instance = mdns_remove_args.instance->sval[0];
  664. }
  665. const char *host = NULL;
  666. if (mdns_remove_args.host->count && mdns_remove_args.host->sval[0]) {
  667. host = mdns_remove_args.host->sval[0];
  668. }
  669. ESP_ERROR_CHECK( mdns_service_remove_for_host(instance, mdns_remove_args.service->sval[0], mdns_remove_args.proto->sval[0], host) );
  670. return 0;
  671. }
  672. static void register_mdns_service_remove(void)
  673. {
  674. mdns_remove_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  675. mdns_remove_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  676. mdns_remove_args.host = arg_str0("h", "host", "<hostname>", "Service for this (delegated) host");
  677. mdns_remove_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  678. mdns_remove_args.end = arg_end(4);
  679. const esp_console_cmd_t cmd_remove = {
  680. .command = "mdns_service_remove",
  681. .help = "Remove service from MDNS",
  682. .hint = NULL,
  683. .func = &cmd_mdns_service_remove,
  684. .argtable = &mdns_remove_args
  685. };
  686. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_remove) );
  687. }
  688. static struct {
  689. struct arg_str *service;
  690. struct arg_str *proto;
  691. struct arg_str *instance;
  692. struct arg_str *host;
  693. struct arg_str *old_instance;
  694. struct arg_end *end;
  695. } mdns_service_instance_set_args;
  696. static int cmd_mdns_service_instance_set(int argc, char **argv)
  697. {
  698. int nerrors = arg_parse(argc, argv, (void **) &mdns_service_instance_set_args);
  699. if (nerrors != 0) {
  700. arg_print_errors(stderr, mdns_service_instance_set_args.end, argv[0]);
  701. return 1;
  702. }
  703. if (!mdns_service_instance_set_args.service->sval[0] || !mdns_service_instance_set_args.proto->sval[0] || !mdns_service_instance_set_args.instance->sval[0]) {
  704. printf("ERROR: Bad arguments!\n");
  705. return 1;
  706. }
  707. const char *host = NULL;
  708. if (mdns_service_instance_set_args.host->count && mdns_service_instance_set_args.host->sval[0]) {
  709. host = mdns_service_instance_set_args.host->sval[0];
  710. }
  711. const char *old_instance = NULL;
  712. if (mdns_service_instance_set_args.old_instance->count && mdns_service_instance_set_args.old_instance->sval[0]) {
  713. old_instance = mdns_service_instance_set_args.old_instance->sval[0];
  714. }
  715. esp_err_t err = mdns_service_instance_name_set_for_host(old_instance, mdns_service_instance_set_args.service->sval[0], mdns_service_instance_set_args.proto->sval[0], host, mdns_service_instance_set_args.instance->sval[0]);
  716. if (err != ESP_OK) {
  717. printf("mdns_service_instance_name_set_for_host() failed with %s\n", esp_err_to_name(err));
  718. return 1;
  719. }
  720. return 0;
  721. }
  722. static void register_mdns_service_instance_set(void)
  723. {
  724. mdns_service_instance_set_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  725. mdns_service_instance_set_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  726. mdns_service_instance_set_args.instance = arg_str1(NULL, NULL, "<instance>", "Instance name");
  727. mdns_service_instance_set_args.host = arg_str0("h", "host", "<hostname>", "Service for this (delegated) host");
  728. mdns_service_instance_set_args.old_instance = arg_str0("i", "old_instance", "<old_instance>", "Instance name before update");
  729. mdns_service_instance_set_args.end = arg_end(4);
  730. const esp_console_cmd_t cmd_add = {
  731. .command = "mdns_service_instance_set",
  732. .help = "Set MDNS Service Instance Name",
  733. .hint = NULL,
  734. .func = &cmd_mdns_service_instance_set,
  735. .argtable = &mdns_service_instance_set_args
  736. };
  737. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) );
  738. }
  739. static struct {
  740. struct arg_str *service;
  741. struct arg_str *proto;
  742. struct arg_int *port;
  743. struct arg_str *host;
  744. struct arg_str *instance;
  745. struct arg_end *end;
  746. } mdns_service_port_set_args;
  747. static int cmd_mdns_service_port_set(int argc, char **argv)
  748. {
  749. int nerrors = arg_parse(argc, argv, (void **) &mdns_service_port_set_args);
  750. if (nerrors != 0) {
  751. arg_print_errors(stderr, mdns_service_port_set_args.end, argv[0]);
  752. return 1;
  753. }
  754. if (!mdns_service_port_set_args.service->sval[0] || !mdns_service_port_set_args.proto->sval[0] || !mdns_service_port_set_args.port->ival[0]) {
  755. printf("ERROR: Bad arguments!\n");
  756. return 1;
  757. }
  758. const char *host = NULL;
  759. if (mdns_service_port_set_args.host->count && mdns_service_port_set_args.host->sval[0]) {
  760. host = mdns_service_port_set_args.host->sval[0];
  761. }
  762. const char *instance = NULL;
  763. if (mdns_service_port_set_args.instance->count && mdns_service_port_set_args.instance->sval[0]) {
  764. instance = mdns_service_port_set_args.instance->sval[0];
  765. }
  766. esp_err_t err = mdns_service_port_set_for_host(instance, mdns_service_port_set_args.service->sval[0], mdns_service_port_set_args.proto->sval[0], host, mdns_service_port_set_args.port->ival[0]);
  767. if (err != ESP_OK) {
  768. printf("mdns_service_port_set_for_host() failed with %s\n", esp_err_to_name(err));
  769. return 1;
  770. }
  771. return 0;
  772. }
  773. static void register_mdns_service_port_set(void)
  774. {
  775. mdns_service_port_set_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  776. mdns_service_port_set_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  777. mdns_service_port_set_args.port = arg_int1(NULL, NULL, "<port>", "Service Port");
  778. mdns_service_port_set_args.host = arg_str0("h", "host", "<hostname>", "Service for this (delegated) host");
  779. mdns_service_port_set_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  780. mdns_service_port_set_args.end = arg_end(2);
  781. const esp_console_cmd_t cmd_add = {
  782. .command = "mdns_service_port_set",
  783. .help = "Set MDNS Service port",
  784. .hint = NULL,
  785. .func = &cmd_mdns_service_port_set,
  786. .argtable = &mdns_service_port_set_args
  787. };
  788. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) );
  789. }
  790. static struct {
  791. struct arg_str *service;
  792. struct arg_str *proto;
  793. struct arg_str *instance;
  794. struct arg_str *host;
  795. struct arg_str *txt;
  796. struct arg_end *end;
  797. } mdns_txt_replace_args;
  798. static int cmd_mdns_service_txt_replace(int argc, char **argv)
  799. {
  800. mdns_txt_item_t *items = NULL;
  801. int nerrors = arg_parse(argc, argv, (void **) &mdns_txt_replace_args);
  802. if (nerrors != 0) {
  803. arg_print_errors(stderr, mdns_txt_replace_args.end, argv[0]);
  804. return 1;
  805. }
  806. if (!mdns_txt_replace_args.service->sval[0] || !mdns_txt_replace_args.proto->sval[0]) {
  807. printf("ERROR: Bad arguments!\n");
  808. return 1;
  809. }
  810. const char *instance = NULL;
  811. if (mdns_txt_replace_args.instance->count && mdns_txt_replace_args.instance->sval[0]) {
  812. instance = mdns_txt_replace_args.instance->sval[0];
  813. printf("MDNS: Service Instance: %s\n", instance);
  814. }
  815. const char *host = NULL;
  816. if (mdns_txt_replace_args.host->count && mdns_txt_replace_args.host->sval[0]) {
  817. host = mdns_txt_replace_args.host->sval[0];
  818. printf("MDNS: Service for delegated host: %s\n", host);
  819. }
  820. if (mdns_txt_replace_args.txt->count) {
  821. items = _convert_items(mdns_txt_replace_args.txt->sval, mdns_txt_replace_args.txt->count);
  822. if (!items) {
  823. printf("ERROR: No Memory!\n");
  824. return 1;
  825. }
  826. }
  827. ESP_ERROR_CHECK( mdns_service_txt_set_for_host(instance, mdns_txt_replace_args.service->sval[0], mdns_txt_replace_args.proto->sval[0], host, items, mdns_txt_replace_args.txt->count) );
  828. free(items);
  829. return 0;
  830. }
  831. static void register_mdns_service_txt_replace(void)
  832. {
  833. mdns_txt_replace_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  834. mdns_txt_replace_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  835. mdns_txt_replace_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  836. mdns_txt_replace_args.host = arg_str0("h", "host", "<hostname>", "Service for this (delegated) host");
  837. mdns_txt_replace_args.txt = arg_strn(NULL, NULL, "item", 0, 30, "TXT Items (name=value)");
  838. mdns_txt_replace_args.end = arg_end(5);
  839. const esp_console_cmd_t cmd_txt_set = {
  840. .command = "mdns_service_txt_replace",
  841. .help = "Replace MDNS service TXT items",
  842. .hint = NULL,
  843. .func = &cmd_mdns_service_txt_replace,
  844. .argtable = &mdns_txt_replace_args
  845. };
  846. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_set) );
  847. }
  848. static struct {
  849. struct arg_str *service;
  850. struct arg_str *proto;
  851. struct arg_str *instance;
  852. struct arg_str *host;
  853. struct arg_str *var;
  854. struct arg_str *value;
  855. struct arg_end *end;
  856. } mdns_txt_set_args;
  857. static int cmd_mdns_service_txt_set(int argc, char **argv)
  858. {
  859. int nerrors = arg_parse(argc, argv, (void **) &mdns_txt_set_args);
  860. if (nerrors != 0) {
  861. arg_print_errors(stderr, mdns_txt_set_args.end, argv[0]);
  862. return 1;
  863. }
  864. if (!mdns_txt_set_args.service->sval[0] || !mdns_txt_set_args.proto->sval[0] || !mdns_txt_set_args.var->sval[0]) {
  865. printf("ERROR: Bad arguments!\n");
  866. return 1;
  867. }
  868. const char *instance = NULL;
  869. if (mdns_txt_set_args.instance->count && mdns_txt_set_args.instance->sval[0]) {
  870. instance = mdns_txt_set_args.instance->sval[0];
  871. printf("MDNS: Service Instance: %s\n", instance);
  872. }
  873. const char *host = NULL;
  874. if (mdns_txt_set_args.host->count && mdns_txt_set_args.host->sval[0]) {
  875. host = mdns_txt_set_args.host->sval[0];
  876. printf("MDNS: Service for delegated host: %s\n", host);
  877. }
  878. ESP_ERROR_CHECK( mdns_service_txt_item_set_for_host(instance, mdns_txt_set_args.service->sval[0], mdns_txt_set_args.proto->sval[0], host, mdns_txt_set_args.var->sval[0], mdns_txt_set_args.value->sval[0]) );
  879. return 0;
  880. }
  881. static void register_mdns_service_txt_set(void)
  882. {
  883. mdns_txt_set_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  884. mdns_txt_set_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  885. mdns_txt_set_args.var = arg_str1(NULL, NULL, "<var>", "Item Name");
  886. mdns_txt_set_args.value = arg_str1(NULL, NULL, "<value>", "Item Value");
  887. mdns_txt_set_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  888. mdns_txt_set_args.host = arg_str0("h", "host", "<hostname>", "Service for this (delegated) host");
  889. mdns_txt_set_args.end = arg_end(6);
  890. const esp_console_cmd_t cmd_txt_set = {
  891. .command = "mdns_service_txt_set",
  892. .help = "Add/Set MDNS service TXT item",
  893. .hint = NULL,
  894. .func = &cmd_mdns_service_txt_set,
  895. .argtable = &mdns_txt_set_args
  896. };
  897. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_set) );
  898. }
  899. static struct {
  900. struct arg_str *service;
  901. struct arg_str *proto;
  902. struct arg_str *var;
  903. struct arg_str *instance;
  904. struct arg_str *host;
  905. struct arg_end *end;
  906. } mdns_txt_remove_args;
  907. static int cmd_mdns_service_txt_remove(int argc, char **argv)
  908. {
  909. int nerrors = arg_parse(argc, argv, (void **) &mdns_txt_remove_args);
  910. if (nerrors != 0) {
  911. arg_print_errors(stderr, mdns_txt_remove_args.end, argv[0]);
  912. return 1;
  913. }
  914. if (!mdns_txt_remove_args.service->sval[0] || !mdns_txt_remove_args.proto->sval[0] || !mdns_txt_remove_args.var->sval[0]) {
  915. printf("ERROR: Bad arguments!\n");
  916. return 1;
  917. }
  918. const char *instance = NULL;
  919. if (mdns_txt_remove_args.instance->count && mdns_txt_remove_args.instance->sval[0]) {
  920. instance = mdns_txt_remove_args.instance->sval[0];
  921. }
  922. const char *host = NULL;
  923. if (mdns_txt_remove_args.host->count && mdns_txt_remove_args.host->sval[0]) {
  924. host = mdns_txt_remove_args.host->sval[0];
  925. }
  926. ESP_ERROR_CHECK( mdns_service_txt_item_remove_for_host(instance, mdns_txt_remove_args.service->sval[0], mdns_txt_remove_args.proto->sval[0], host, mdns_txt_remove_args.var->sval[0]) );
  927. return 0;
  928. }
  929. static void register_mdns_service_txt_remove(void)
  930. {
  931. mdns_txt_remove_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  932. mdns_txt_remove_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  933. mdns_txt_remove_args.var = arg_str1(NULL, NULL, "<var>", "Item Name");
  934. mdns_txt_remove_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  935. mdns_txt_remove_args.host = arg_str0("h", "host", "<hostname>", "Service for this (delegated) host");
  936. mdns_txt_remove_args.end = arg_end(2);
  937. const esp_console_cmd_t cmd_txt_remove = {
  938. .command = "mdns_service_txt_remove",
  939. .help = "Remove MDNS service TXT item",
  940. .hint = NULL,
  941. .func = &cmd_mdns_service_txt_remove,
  942. .argtable = &mdns_txt_remove_args
  943. };
  944. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_remove) );
  945. }
  946. static int cmd_mdns_service_remove_all(int argc, char **argv)
  947. {
  948. mdns_service_remove_all();
  949. return 0;
  950. }
  951. static void register_mdns_service_remove_all(void)
  952. {
  953. const esp_console_cmd_t cmd_free = {
  954. .command = "mdns_service_remove_all",
  955. .help = "Remove all MDNS services",
  956. .hint = NULL,
  957. .func = &cmd_mdns_service_remove_all,
  958. .argtable = NULL
  959. };
  960. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_free) );
  961. }
  962. #define MDNS_MAX_LOOKUP_RESULTS CONFIG_MDNS_MAX_SERVICES
  963. static struct {
  964. struct arg_str *instance;
  965. struct arg_str *service;
  966. struct arg_str *proto;
  967. struct arg_lit *delegated;
  968. struct arg_end *end;
  969. } mdns_lookup_service_args;
  970. static esp_err_t lookup_service(const char *instance, const char *service, const char *proto, size_t max_results,
  971. mdns_result_t **result, bool delegated)
  972. {
  973. if (delegated) {
  974. return mdns_lookup_delegated_service(instance, service, proto, max_results, result);
  975. }
  976. return mdns_lookup_selfhosted_service(instance, service, proto, max_results, result);
  977. }
  978. static int cmd_mdns_lookup_service(int argc, char **argv)
  979. {
  980. int nerrors = arg_parse(argc, argv, (void **) &mdns_lookup_service_args);
  981. if (nerrors != 0) {
  982. arg_print_errors(stderr, mdns_lookup_service_args.end, argv[0]);
  983. return 1;
  984. }
  985. if (!mdns_lookup_service_args.instance->sval[0] || !mdns_lookup_service_args.service->sval[0] || !mdns_lookup_service_args.proto->sval[0]) {
  986. printf("ERROR: Bad arguments!\n");
  987. return 1;
  988. }
  989. mdns_result_t *results = NULL;
  990. esp_err_t err = lookup_service(mdns_lookup_service_args.instance->count ? mdns_lookup_service_args.instance->sval[0] : NULL,
  991. mdns_lookup_service_args.service->sval[0], mdns_lookup_service_args.proto->sval[0],
  992. MDNS_MAX_LOOKUP_RESULTS, &results, mdns_lookup_service_args.delegated->count);
  993. if (err) {
  994. printf("Service lookup failed\n");
  995. return 1;
  996. }
  997. if (!results) {
  998. printf("No results found!\n");
  999. return 0;
  1000. }
  1001. mdns_print_results(results);
  1002. mdns_query_results_free(results);
  1003. return 0;
  1004. }
  1005. static void register_mdns_lookup_service(void)
  1006. {
  1007. mdns_lookup_service_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  1008. mdns_lookup_service_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  1009. mdns_lookup_service_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  1010. mdns_lookup_service_args.delegated = arg_lit0("d", "delegated", "Lookup delegated services");
  1011. mdns_lookup_service_args.end = arg_end(4);
  1012. const esp_console_cmd_t cmd_lookup_service = {
  1013. .command = "mdns_service_lookup",
  1014. .help = "Lookup registered service",
  1015. .hint = NULL,
  1016. .func = &cmd_mdns_lookup_service,
  1017. .argtable = &mdns_lookup_service_args
  1018. };
  1019. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_lookup_service) );
  1020. }
  1021. static struct {
  1022. struct arg_str *hostname;
  1023. struct arg_str *address;
  1024. struct arg_end *end;
  1025. } mdns_delegate_host_args;
  1026. static int cmd_mdns_delegate_host(int argc, char **argv)
  1027. {
  1028. int nerrors = arg_parse(argc, argv, (void **) &mdns_delegate_host_args);
  1029. if (nerrors != 0) {
  1030. arg_print_errors(stderr, mdns_delegate_host_args.end, argv[0]);
  1031. return 1;
  1032. }
  1033. if (!mdns_delegate_host_args.hostname->sval[0] || !mdns_delegate_host_args.address->sval[0]) {
  1034. printf("ERROR: Bad arguments!\n");
  1035. return 1;
  1036. }
  1037. mdns_ip_addr_t addr = { .next = NULL};
  1038. esp_netif_str_to_ip4(mdns_delegate_host_args.address->sval[0], &addr.addr.u_addr.ip4);
  1039. addr.addr.type = ESP_IPADDR_TYPE_V4;
  1040. esp_err_t err = mdns_delegate_hostname_add(mdns_delegate_host_args.hostname->sval[0], &addr);
  1041. if (err) {
  1042. printf("mdns_delegate_hostname_add() failed\n");
  1043. return 1;
  1044. }
  1045. return 0;
  1046. }
  1047. static void register_mdns_delegate_host(void)
  1048. {
  1049. mdns_delegate_host_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Delegated hostname");
  1050. mdns_delegate_host_args.address = arg_str1(NULL, NULL, "<address>", "Delegated hosts address");
  1051. mdns_delegate_host_args.end = arg_end(2);
  1052. const esp_console_cmd_t cmd_delegate_host = {
  1053. .command = "mdns_delegate_host",
  1054. .help = "Add delegated hostname",
  1055. .hint = NULL,
  1056. .func = &cmd_mdns_delegate_host,
  1057. .argtable = &mdns_delegate_host_args
  1058. };
  1059. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_delegate_host) );
  1060. }
  1061. static struct {
  1062. struct arg_str *hostname;
  1063. struct arg_end *end;
  1064. } mdns_undelegate_host_args;
  1065. static int cmd_mdns_undelegate_host(int argc, char **argv)
  1066. {
  1067. int nerrors = arg_parse(argc, argv, (void **) &mdns_undelegate_host_args);
  1068. if (nerrors != 0) {
  1069. arg_print_errors(stderr, mdns_undelegate_host_args.end, argv[0]);
  1070. return 1;
  1071. }
  1072. if (!mdns_undelegate_host_args.hostname->sval[0]) {
  1073. printf("ERROR: Bad arguments!\n");
  1074. return 1;
  1075. }
  1076. if (mdns_delegate_hostname_remove(mdns_undelegate_host_args.hostname->sval[0]) != ESP_OK) {
  1077. printf("mdns_delegate_hostname_remove() failed\n");
  1078. return 1;
  1079. }
  1080. return 0;
  1081. }
  1082. static void register_mdns_undelegate_host(void)
  1083. {
  1084. mdns_undelegate_host_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Delegated hostname");
  1085. mdns_undelegate_host_args.end = arg_end(2);
  1086. const esp_console_cmd_t cmd_undelegate_host = {
  1087. .command = "mdns_undelegate_host",
  1088. .help = "Remove delegated hostname",
  1089. .hint = NULL,
  1090. .func = &cmd_mdns_undelegate_host,
  1091. .argtable = &mdns_undelegate_host_args
  1092. };
  1093. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_undelegate_host) );
  1094. }
  1095. static struct {
  1096. struct arg_str *service;
  1097. struct arg_str *proto;
  1098. struct arg_str *sub;
  1099. struct arg_str *instance;
  1100. struct arg_str *host;
  1101. struct arg_end *end;
  1102. } mdns_service_subtype_args;
  1103. static int cmd_mdns_service_subtype(int argc, char **argv)
  1104. {
  1105. int nerrors = arg_parse(argc, argv, (void **) &mdns_service_subtype_args);
  1106. if (nerrors != 0) {
  1107. arg_print_errors(stderr, mdns_service_subtype_args.end, argv[0]);
  1108. return 1;
  1109. }
  1110. if (!mdns_service_subtype_args.service->sval[0] || !mdns_service_subtype_args.proto->sval[0] || !mdns_service_subtype_args.sub->sval[0]) {
  1111. printf("ERROR: Bad arguments!\n");
  1112. return 1;
  1113. }
  1114. const char *instance = NULL;
  1115. if (mdns_service_subtype_args.instance->count && mdns_service_subtype_args.instance->sval[0]) {
  1116. instance = mdns_service_subtype_args.instance->sval[0];
  1117. }
  1118. const char *host = NULL;
  1119. if (mdns_service_subtype_args.host->count && mdns_service_subtype_args.host->sval[0]) {
  1120. host = mdns_service_subtype_args.host->sval[0];
  1121. }
  1122. ESP_ERROR_CHECK( mdns_service_subtype_add_for_host(instance, mdns_service_subtype_args.service->sval[0], mdns_service_subtype_args.proto->sval[0], host, mdns_service_subtype_args.sub->sval[0]) );
  1123. return 0;
  1124. }
  1125. static void register_mdns_service_subtype_set(void)
  1126. {
  1127. mdns_service_subtype_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  1128. mdns_service_subtype_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  1129. mdns_service_subtype_args.sub = arg_str1(NULL, NULL, "<sub>", "Subtype");
  1130. mdns_service_subtype_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  1131. mdns_service_subtype_args.host = arg_str0("h", "host", "<hostname>", "Service for this (delegated) host");
  1132. mdns_service_subtype_args.end = arg_end(5);
  1133. const esp_console_cmd_t cmd_service_sub = {
  1134. .command = "mdns_service_subtype",
  1135. .help = "Adds subtype for service",
  1136. .hint = NULL,
  1137. .func = &cmd_mdns_service_subtype,
  1138. .argtable = &mdns_service_subtype_args
  1139. };
  1140. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_service_sub) );
  1141. }
  1142. static struct {
  1143. struct arg_str *service;
  1144. struct arg_str *proto;
  1145. struct arg_end *end;
  1146. } mdns_browse_args;
  1147. static void mdns_browse_notifier(mdns_result_t *result)
  1148. {
  1149. if (result) {
  1150. mdns_print_results(result);
  1151. }
  1152. }
  1153. static int cmd_mdns_browse(int argc, char **argv)
  1154. {
  1155. int nerrors = arg_parse(argc, argv, (void **) &mdns_browse_args);
  1156. if (nerrors != 0) {
  1157. arg_print_errors(stderr, mdns_browse_args.end, argv[0]);
  1158. return 1;
  1159. }
  1160. if (!mdns_browse_args.service->sval[0] || !mdns_browse_args.proto->sval[0]) {
  1161. printf("ERROR: Bad arguments!\n");
  1162. return 1;
  1163. }
  1164. mdns_browse_t *handle = mdns_browse_new(mdns_browse_args.service->sval[0], mdns_browse_args.proto->sval[0], mdns_browse_notifier);
  1165. return handle ? 0 : 1;
  1166. }
  1167. static void register_mdns_browse(void)
  1168. {
  1169. mdns_browse_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  1170. mdns_browse_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  1171. mdns_browse_args.end = arg_end(2);
  1172. const esp_console_cmd_t cmd_browse = {
  1173. .command = "mdns_browse",
  1174. .help = "Start browsing",
  1175. .hint = NULL,
  1176. .func = &cmd_mdns_browse,
  1177. .argtable = &mdns_browse_args
  1178. };
  1179. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_browse) );
  1180. }
  1181. static int cmd_mdns_browse_del(int argc, char **argv)
  1182. {
  1183. int nerrors = arg_parse(argc, argv, (void **) &mdns_browse_args);
  1184. if (nerrors != 0) {
  1185. arg_print_errors(stderr, mdns_browse_args.end, argv[0]);
  1186. return 1;
  1187. }
  1188. if (!mdns_browse_args.service->sval[0] || !mdns_browse_args.proto->sval[0]) {
  1189. printf("ERROR: Bad arguments!\n");
  1190. return 1;
  1191. }
  1192. esp_err_t err = mdns_browse_delete(mdns_browse_args.service->sval[0], mdns_browse_args.proto->sval[0]);
  1193. return err == ESP_OK ? 0 : 1;
  1194. }
  1195. static void register_mdns_browse_del(void)
  1196. {
  1197. mdns_browse_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  1198. mdns_browse_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  1199. mdns_browse_args.end = arg_end(2);
  1200. const esp_console_cmd_t cmd_browse_del = {
  1201. .command = "mdns_browse_del",
  1202. .help = "Stop browsing",
  1203. .hint = NULL,
  1204. .func = &cmd_mdns_browse_del,
  1205. .argtable = &mdns_browse_args
  1206. };
  1207. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_browse_del) );
  1208. }
  1209. void mdns_console_register(void)
  1210. {
  1211. register_mdns_init();
  1212. register_mdns_free();
  1213. register_mdns_set_hostname();
  1214. register_mdns_set_instance();
  1215. register_mdns_service_add();
  1216. register_mdns_service_remove();
  1217. register_mdns_service_instance_set();
  1218. register_mdns_service_port_set();
  1219. register_mdns_service_txt_replace();
  1220. register_mdns_service_txt_set();
  1221. register_mdns_service_txt_remove();
  1222. register_mdns_service_remove_all();
  1223. register_mdns_lookup_service();
  1224. register_mdns_delegate_host();
  1225. register_mdns_undelegate_host();
  1226. register_mdns_service_subtype_set();
  1227. register_mdns_browse();
  1228. register_mdns_browse_del();
  1229. #ifdef CONFIG_LWIP_IPV4
  1230. register_mdns_query_a();
  1231. #endif
  1232. #ifdef CONFIG_LWIP_IPV6
  1233. register_mdns_query_aaaa();
  1234. #endif
  1235. register_mdns_query_txt();
  1236. register_mdns_query_srv();
  1237. register_mdns_query_ptr();
  1238. register_mdns_query_ip();
  1239. register_mdns_query_svc();
  1240. }