mdns_console.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054
  1. /*
  2. * SPDX-FileCopyrightText: 2015-2022 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. static const char * ip_protocol_str[] = {"V4", "V6", "MAX"};
  12. static void mdns_print_results(mdns_result_t * results)
  13. {
  14. mdns_result_t * r = results;
  15. mdns_ip_addr_t * a = NULL;
  16. int i = 1;
  17. while (r) {
  18. printf("%d: Interface: %s, Type: %s\n", i++, esp_netif_get_ifkey(r->esp_netif), ip_protocol_str[r->ip_protocol]);
  19. if (r->instance_name) {
  20. printf(" PTR : %s\n", r->instance_name);
  21. }
  22. if (r->hostname) {
  23. printf(" SRV : %s.local:%u\n", r->hostname, r->port);
  24. }
  25. if (r->txt_count) {
  26. printf(" TXT : [%u] ", r->txt_count);
  27. for (size_t t=0; t<r->txt_count; t++) {
  28. printf("%s=%s; ", r->txt[t].key, r->txt[t].value);
  29. }
  30. printf("\n");
  31. }
  32. a = r->addr;
  33. while (a) {
  34. if (a->addr.type == ESP_IPADDR_TYPE_V6) {
  35. printf(" AAAA: " IPV6STR "\n", IPV62STR(a->addr.u_addr.ip6));
  36. } else {
  37. printf(" A : " IPSTR "\n", IP2STR(&(a->addr.u_addr.ip4)));
  38. }
  39. a = a->next;
  40. }
  41. r = r->next;
  42. }
  43. }
  44. static struct {
  45. struct arg_str *hostname;
  46. struct arg_int *timeout;
  47. struct arg_end *end;
  48. } mdns_query_a_args;
  49. static int cmd_mdns_query_a(int argc, char** argv)
  50. {
  51. int nerrors = arg_parse(argc, argv, (void**) &mdns_query_a_args);
  52. if (nerrors != 0) {
  53. arg_print_errors(stderr, mdns_query_a_args.end, argv[0]);
  54. return 1;
  55. }
  56. const char * hostname = mdns_query_a_args.hostname->sval[0];
  57. int timeout = mdns_query_a_args.timeout->ival[0];
  58. if (!hostname || !hostname[0]) {
  59. printf("ERROR: Hostname not supplied\n");
  60. return 1;
  61. }
  62. if (timeout <= 0) {
  63. timeout = 1000;
  64. }
  65. printf("Query A: %s.local, Timeout: %d\n", hostname, timeout);
  66. struct esp_ip4_addr addr;
  67. addr.addr = 0;
  68. esp_err_t err = mdns_query_a(hostname, timeout, &addr);
  69. if (err) {
  70. if (err == ESP_ERR_NOT_FOUND) {
  71. printf("ERROR: Host was not found!\n");
  72. return 0;
  73. }
  74. printf("ERROR: Query Failed\n");
  75. return 1;
  76. }
  77. printf(IPSTR "\n", IP2STR(&addr));
  78. return 0;
  79. }
  80. static void register_mdns_query_a(void)
  81. {
  82. mdns_query_a_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Hostname that is searched for");
  83. mdns_query_a_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  84. mdns_query_a_args.end = arg_end(2);
  85. const esp_console_cmd_t cmd_init = {
  86. .command = "mdns_query_a",
  87. .help = "Query MDNS for IPv4",
  88. .hint = NULL,
  89. .func = &cmd_mdns_query_a,
  90. .argtable = &mdns_query_a_args
  91. };
  92. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  93. }
  94. #if CONFIG_LWIP_IPV6
  95. static int cmd_mdns_query_aaaa(int argc, char** argv)
  96. {
  97. int nerrors = arg_parse(argc, argv, (void**) &mdns_query_a_args);
  98. if (nerrors != 0) {
  99. arg_print_errors(stderr, mdns_query_a_args.end, argv[0]);
  100. return 1;
  101. }
  102. const char * hostname = mdns_query_a_args.hostname->sval[0];
  103. int timeout = mdns_query_a_args.timeout->ival[0];
  104. if (!hostname || !hostname[0]) {
  105. printf("ERROR: Hostname not supplied\n");
  106. return 1;
  107. }
  108. if (timeout <= 0) {
  109. timeout = 1000;
  110. }
  111. printf("Query AAAA: %s.local, Timeout: %d\n", hostname, timeout);
  112. struct esp_ip6_addr addr;
  113. memset(addr.addr, 0, 16);
  114. esp_err_t err = mdns_query_aaaa(hostname, timeout, &addr);
  115. if (err) {
  116. if (err == ESP_ERR_NOT_FOUND) {
  117. printf("Host was not found!\n");
  118. return 0;
  119. }
  120. printf("ERROR: Query Failed\n");
  121. return 1;
  122. }
  123. printf(IPV6STR "\n", IPV62STR(addr));
  124. return 0;
  125. }
  126. static void register_mdns_query_aaaa(void)
  127. {
  128. mdns_query_a_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Hostname that is searched for");
  129. mdns_query_a_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  130. mdns_query_a_args.end = arg_end(2);
  131. const esp_console_cmd_t cmd_init = {
  132. .command = "mdns_query_aaaa",
  133. .help = "Query MDNS for IPv6",
  134. .hint = NULL,
  135. .func = &cmd_mdns_query_aaaa,
  136. .argtable = &mdns_query_a_args
  137. };
  138. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  139. }
  140. #endif
  141. static struct {
  142. struct arg_str *instance;
  143. struct arg_str *service;
  144. struct arg_str *proto;
  145. struct arg_int *timeout;
  146. struct arg_end *end;
  147. } mdns_query_srv_args;
  148. static int cmd_mdns_query_srv(int argc, char** argv)
  149. {
  150. int nerrors = arg_parse(argc, argv, (void**) &mdns_query_srv_args);
  151. if (nerrors != 0) {
  152. arg_print_errors(stderr, mdns_query_srv_args.end, argv[0]);
  153. return 1;
  154. }
  155. const char * instance = mdns_query_srv_args.instance->sval[0];
  156. const char * service = mdns_query_srv_args.service->sval[0];
  157. const char * proto = mdns_query_srv_args.proto->sval[0];
  158. int timeout = mdns_query_srv_args.timeout->ival[0];
  159. if (timeout <= 0) {
  160. timeout = 1000;
  161. }
  162. printf("Query SRV: %s.%s.%s.local, Timeout: %d\n", instance, service, proto, timeout);
  163. mdns_result_t * results = NULL;
  164. esp_err_t err = mdns_query_srv(instance, service, proto, timeout, &results);
  165. if (err) {
  166. printf("ERROR: Query Failed\n");
  167. return 1;
  168. }
  169. if (!results) {
  170. printf("No results found!\n");
  171. return 0;
  172. }
  173. mdns_print_results(results);
  174. mdns_query_results_free(results);
  175. return 0;
  176. }
  177. static void register_mdns_query_srv(void)
  178. {
  179. mdns_query_srv_args.instance = arg_str1(NULL, NULL, "<instance>", "Instance to search for");
  180. mdns_query_srv_args.service = arg_str1(NULL, NULL, "<service>", "Service to search for (ex. _http, _smb, etc.)");
  181. mdns_query_srv_args.proto = arg_str1(NULL, NULL, "<proto>", "Protocol to search for (_tcp, _udp, etc.)");
  182. mdns_query_srv_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  183. mdns_query_srv_args.end = arg_end(2);
  184. const esp_console_cmd_t cmd_init = {
  185. .command = "mdns_query_srv",
  186. .help = "Query MDNS for Service SRV",
  187. .hint = NULL,
  188. .func = &cmd_mdns_query_srv,
  189. .argtable = &mdns_query_srv_args
  190. };
  191. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  192. }
  193. static struct {
  194. struct arg_str *instance;
  195. struct arg_str *service;
  196. struct arg_str *proto;
  197. struct arg_int *timeout;
  198. struct arg_end *end;
  199. } mdns_query_txt_args;
  200. static int cmd_mdns_query_txt(int argc, char** argv)
  201. {
  202. int nerrors = arg_parse(argc, argv, (void**) &mdns_query_txt_args);
  203. if (nerrors != 0) {
  204. arg_print_errors(stderr, mdns_query_txt_args.end, argv[0]);
  205. return 1;
  206. }
  207. const char * instance = mdns_query_txt_args.instance->sval[0];
  208. const char * service = mdns_query_txt_args.service->sval[0];
  209. const char * proto = mdns_query_txt_args.proto->sval[0];
  210. int timeout = mdns_query_txt_args.timeout->ival[0];
  211. printf("Query TXT: %s.%s.%s.local, Timeout: %d\n", instance, service, proto, timeout);
  212. if (timeout <= 0) {
  213. timeout = 5000;
  214. }
  215. mdns_result_t * results = NULL;
  216. esp_err_t err = mdns_query_txt(instance, service, proto, timeout, &results);
  217. if (err) {
  218. printf("ERROR: Query Failed\n");
  219. return 1;
  220. }
  221. if (!results) {
  222. printf("No results found!\n");
  223. return 0;
  224. }
  225. mdns_print_results(results);
  226. mdns_query_results_free(results);
  227. return 0;
  228. }
  229. static void register_mdns_query_txt(void)
  230. {
  231. mdns_query_txt_args.instance = arg_str1(NULL, NULL, "<instance>", "Instance to search for");
  232. mdns_query_txt_args.service = arg_str1(NULL, NULL, "<service>", "Service to search for (ex. _http, _smb, etc.)");
  233. mdns_query_txt_args.proto = arg_str1(NULL, NULL, "<proto>", "Protocol to search for (_tcp, _udp, etc.)");
  234. mdns_query_txt_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  235. mdns_query_txt_args.end = arg_end(2);
  236. const esp_console_cmd_t cmd_init = {
  237. .command = "mdns_query_txt",
  238. .help = "Query MDNS for Service TXT",
  239. .hint = NULL,
  240. .func = &cmd_mdns_query_txt,
  241. .argtable = &mdns_query_txt_args
  242. };
  243. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  244. }
  245. static struct {
  246. struct arg_str *service;
  247. struct arg_str *proto;
  248. struct arg_int *timeout;
  249. struct arg_int *max_results;
  250. struct arg_end *end;
  251. } mdns_query_ptr_args;
  252. static int cmd_mdns_query_ptr(int argc, char** argv)
  253. {
  254. int nerrors = arg_parse(argc, argv, (void**) &mdns_query_ptr_args);
  255. if (nerrors != 0) {
  256. arg_print_errors(stderr, mdns_query_ptr_args.end, argv[0]);
  257. return 1;
  258. }
  259. const char * service = mdns_query_ptr_args.service->sval[0];
  260. const char * proto = mdns_query_ptr_args.proto->sval[0];
  261. int timeout = mdns_query_ptr_args.timeout->ival[0];
  262. int max_results = mdns_query_ptr_args.max_results->ival[0];
  263. if (timeout <= 0) {
  264. timeout = 5000;
  265. }
  266. if (max_results <= 0 || max_results > 255) {
  267. max_results = 255;
  268. }
  269. printf("Query PTR: %s.%s.local, Timeout: %d, Max Results: %d\n", service, proto, timeout, max_results);
  270. mdns_result_t * results = NULL;
  271. esp_err_t err = mdns_query_ptr(service, proto, timeout, max_results, &results);
  272. if (err) {
  273. printf("ERROR: Query Failed\n");
  274. return 1;
  275. }
  276. if (!results) {
  277. printf("No results found!\n");
  278. return 0;
  279. }
  280. mdns_print_results(results);
  281. mdns_query_results_free(results);
  282. return 0;
  283. }
  284. static void register_mdns_query_ptr(void)
  285. {
  286. mdns_query_ptr_args.service = arg_str1(NULL, NULL, "<service>", "Service to search for (ex. _http, _smb, etc.)");
  287. mdns_query_ptr_args.proto = arg_str1(NULL, NULL, "<proto>", "Protocol to search for (_tcp, _udp, etc.)");
  288. mdns_query_ptr_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  289. mdns_query_ptr_args.max_results = arg_int0("m", "max_results", "<max_results>", "Maximum results returned");
  290. mdns_query_ptr_args.end = arg_end(2);
  291. const esp_console_cmd_t cmd_init = {
  292. .command = "mdns_query_ptr",
  293. .help = "Query MDNS for Service",
  294. .hint = NULL,
  295. .func = &cmd_mdns_query_ptr,
  296. .argtable = &mdns_query_ptr_args
  297. };
  298. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  299. }
  300. static struct {
  301. struct arg_str *hostname;
  302. struct arg_int *timeout;
  303. struct arg_int *max_results;
  304. struct arg_end *end;
  305. } mdns_query_ip_args;
  306. static int cmd_mdns_query_ip(int argc, char** argv)
  307. {
  308. int nerrors = arg_parse(argc, argv, (void**) &mdns_query_ip_args);
  309. if (nerrors != 0) {
  310. arg_print_errors(stderr, mdns_query_ip_args.end, argv[0]);
  311. return 1;
  312. }
  313. const char * hostname = mdns_query_ip_args.hostname->sval[0];
  314. int timeout = mdns_query_ip_args.timeout->ival[0];
  315. int max_results = mdns_query_ip_args.max_results->ival[0];
  316. if (!hostname || !hostname[0]) {
  317. printf("ERROR: Hostname not supplied\n");
  318. return 1;
  319. }
  320. if (timeout <= 0) {
  321. timeout = 1000;
  322. }
  323. if (max_results < 0 || max_results > 255) {
  324. max_results = 255;
  325. }
  326. printf("Query IP: %s.local, Timeout: %d, Max Results: %d\n", hostname, timeout, max_results);
  327. mdns_result_t * results = NULL;
  328. esp_err_t err = mdns_query(hostname, NULL, NULL, MDNS_TYPE_ANY, timeout, max_results, &results);
  329. if (err) {
  330. printf("ERROR: Query Failed\n");
  331. return 1;
  332. }
  333. if (!results) {
  334. printf("No results found!\n");
  335. return 0;
  336. }
  337. mdns_print_results(results);
  338. mdns_query_results_free(results);
  339. return 0;
  340. }
  341. static void register_mdns_query_ip(void)
  342. {
  343. mdns_query_ip_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Hostname that is searched for");
  344. mdns_query_ip_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  345. mdns_query_ip_args.max_results = arg_int0("m", "max_results", "<max_results>", "Maximum results returned");
  346. mdns_query_ip_args.end = arg_end(2);
  347. const esp_console_cmd_t cmd_init = {
  348. .command = "mdns_query_ip",
  349. .help = "Query MDNS for IP",
  350. .hint = NULL,
  351. .func = &cmd_mdns_query_ip,
  352. .argtable = &mdns_query_ip_args
  353. };
  354. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  355. }
  356. static struct {
  357. struct arg_str *instance;
  358. struct arg_str *service;
  359. struct arg_str *proto;
  360. struct arg_int *timeout;
  361. struct arg_int *max_results;
  362. struct arg_end *end;
  363. } mdns_query_svc_args;
  364. static int cmd_mdns_query_svc(int argc, char** argv)
  365. {
  366. int nerrors = arg_parse(argc, argv, (void**) &mdns_query_svc_args);
  367. if (nerrors != 0) {
  368. arg_print_errors(stderr, mdns_query_svc_args.end, argv[0]);
  369. return 1;
  370. }
  371. const char * instance = mdns_query_svc_args.instance->sval[0];
  372. const char * service = mdns_query_svc_args.service->sval[0];
  373. const char * proto = mdns_query_svc_args.proto->sval[0];
  374. int timeout = mdns_query_svc_args.timeout->ival[0];
  375. int max_results = mdns_query_svc_args.max_results->ival[0];
  376. if (timeout <= 0) {
  377. timeout = 5000;
  378. }
  379. if (max_results < 0 || max_results > 255) {
  380. max_results = 255;
  381. }
  382. printf("Query SVC: %s.%s.%s.local, Timeout: %d, Max Results: %d\n", instance, service, proto, timeout, max_results);
  383. mdns_result_t * results = NULL;
  384. esp_err_t err = mdns_query(instance, service, proto, MDNS_TYPE_ANY, timeout, max_results, &results);
  385. if (err) {
  386. printf("ERROR: Query Failed\n");
  387. return 1;
  388. }
  389. if (!results) {
  390. printf("No results found!\n");
  391. return 0;
  392. }
  393. mdns_print_results(results);
  394. mdns_query_results_free(results);
  395. return 0;
  396. }
  397. static void register_mdns_query_svc(void)
  398. {
  399. mdns_query_svc_args.instance = arg_str1(NULL, NULL, "<instance>", "Instance to search for");
  400. mdns_query_svc_args.service = arg_str1(NULL, NULL, "<service>", "Service to search for (ex. _http, _smb, etc.)");
  401. mdns_query_svc_args.proto = arg_str1(NULL, NULL, "<proto>", "Protocol to search for (_tcp, _udp, etc.)");
  402. mdns_query_svc_args.timeout = arg_int0("t", "timeout", "<timeout>", "Timeout for this query");
  403. mdns_query_svc_args.max_results = arg_int0("m", "max_results", "<max_results>", "Maximum results returned");
  404. mdns_query_svc_args.end = arg_end(2);
  405. const esp_console_cmd_t cmd_init = {
  406. .command = "mdns_query_svc",
  407. .help = "Query MDNS for Service TXT & SRV",
  408. .hint = NULL,
  409. .func = &cmd_mdns_query_svc,
  410. .argtable = &mdns_query_svc_args
  411. };
  412. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  413. }
  414. static struct {
  415. struct arg_str *hostname;
  416. struct arg_str *instance;
  417. struct arg_end *end;
  418. } mdns_init_args;
  419. static int cmd_mdns_init(int argc, char** argv)
  420. {
  421. int nerrors = arg_parse(argc, argv, (void**) &mdns_init_args);
  422. if (nerrors != 0) {
  423. arg_print_errors(stderr, mdns_init_args.end, argv[0]);
  424. return 1;
  425. }
  426. ESP_ERROR_CHECK( mdns_init() );
  427. if (mdns_init_args.hostname->sval[0]) {
  428. ESP_ERROR_CHECK( mdns_hostname_set(mdns_init_args.hostname->sval[0]) );
  429. printf("MDNS: Hostname: %s\n", mdns_init_args.hostname->sval[0]);
  430. }
  431. if (mdns_init_args.instance->sval[0]) {
  432. ESP_ERROR_CHECK( mdns_instance_name_set(mdns_init_args.instance->sval[0]) );
  433. printf("MDNS: Instance: %s\n", mdns_init_args.instance->sval[0]);
  434. }
  435. return 0;
  436. }
  437. static void register_mdns_init(void)
  438. {
  439. mdns_init_args.hostname = arg_str0("h", "hostname", "<hostname>", "Hostname that the server will advertise");
  440. mdns_init_args.instance = arg_str0("i", "instance", "<instance>", "Default instance name for services");
  441. mdns_init_args.end = arg_end(2);
  442. const esp_console_cmd_t cmd_init = {
  443. .command = "mdns_init",
  444. .help = "Start MDNS Server",
  445. .hint = NULL,
  446. .func = &cmd_mdns_init,
  447. .argtable = &mdns_init_args
  448. };
  449. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_init) );
  450. }
  451. static int cmd_mdns_free(int argc, char** argv)
  452. {
  453. mdns_free();
  454. return 0;
  455. }
  456. static void register_mdns_free(void)
  457. {
  458. const esp_console_cmd_t cmd_free = {
  459. .command = "mdns_free",
  460. .help = "Stop MDNS Server",
  461. .hint = NULL,
  462. .func = &cmd_mdns_free,
  463. .argtable = NULL
  464. };
  465. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_free) );
  466. }
  467. static struct {
  468. struct arg_str *hostname;
  469. struct arg_end *end;
  470. } mdns_set_hostname_args;
  471. static int cmd_mdns_set_hostname(int argc, char** argv)
  472. {
  473. int nerrors = arg_parse(argc, argv, (void**) &mdns_set_hostname_args);
  474. if (nerrors != 0) {
  475. arg_print_errors(stderr, mdns_set_hostname_args.end, argv[0]);
  476. return 1;
  477. }
  478. if (mdns_set_hostname_args.hostname->sval[0] == NULL) {
  479. printf("ERROR: Bad arguments!\n");
  480. return 1;
  481. }
  482. ESP_ERROR_CHECK( mdns_hostname_set(mdns_set_hostname_args.hostname->sval[0]) );
  483. return 0;
  484. }
  485. static void register_mdns_set_hostname(void)
  486. {
  487. mdns_set_hostname_args.hostname = arg_str1(NULL, NULL, "<hostname>", "Hostname that the server will advertise");
  488. mdns_set_hostname_args.end = arg_end(2);
  489. const esp_console_cmd_t cmd_set_hostname = {
  490. .command = "mdns_set_hostname",
  491. .help = "Set MDNS Server hostname",
  492. .hint = NULL,
  493. .func = &cmd_mdns_set_hostname,
  494. .argtable = &mdns_set_hostname_args
  495. };
  496. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_set_hostname) );
  497. }
  498. static struct {
  499. struct arg_str *instance;
  500. struct arg_end *end;
  501. } mdns_set_instance_args;
  502. static int cmd_mdns_set_instance(int argc, char** argv)
  503. {
  504. int nerrors = arg_parse(argc, argv, (void**) &mdns_set_instance_args);
  505. if (nerrors != 0) {
  506. arg_print_errors(stderr, mdns_set_instance_args.end, argv[0]);
  507. return 1;
  508. }
  509. if (mdns_set_instance_args.instance->sval[0] == NULL) {
  510. printf("ERROR: Bad arguments!\n");
  511. return 1;
  512. }
  513. ESP_ERROR_CHECK( mdns_instance_name_set(mdns_set_instance_args.instance->sval[0]) );
  514. return 0;
  515. }
  516. static void register_mdns_set_instance(void)
  517. {
  518. mdns_set_instance_args.instance = arg_str1(NULL, NULL, "<instance>", "Default instance name for services");
  519. mdns_set_instance_args.end = arg_end(2);
  520. const esp_console_cmd_t cmd_set_instance = {
  521. .command = "mdns_set_instance",
  522. .help = "Set MDNS Server Istance Name",
  523. .hint = NULL,
  524. .func = &cmd_mdns_set_instance,
  525. .argtable = &mdns_set_instance_args
  526. };
  527. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_set_instance) );
  528. }
  529. static mdns_txt_item_t * _convert_items(const char **values, int count)
  530. {
  531. int i=0,e;
  532. const char * value = NULL;
  533. mdns_txt_item_t * items = (mdns_txt_item_t*) malloc(sizeof(mdns_txt_item_t) * count);
  534. if (!items) {
  535. printf("ERROR: No Memory!\n");
  536. goto fail;
  537. }
  538. memset(items, 0, sizeof(mdns_txt_item_t) * count);
  539. for (i=0; i<count; i++) {
  540. value = values[i];
  541. char * esign = strchr(value, '=');
  542. if (!esign) {
  543. printf("ERROR: Equal sign not found in '%s'!\n", value);
  544. goto fail;
  545. }
  546. int var_len = esign - value;
  547. int val_len = strlen(value) - var_len - 1;
  548. char * var = (char*)malloc(var_len+1);
  549. if (var == NULL) {
  550. printf("ERROR: No Memory!\n");
  551. goto fail;
  552. }
  553. char * val = (char*)malloc(val_len+1);
  554. if (val == NULL) {
  555. printf("ERROR: No Memory!\n");
  556. free(var);
  557. goto fail;
  558. }
  559. memcpy(var, value, var_len);
  560. var[var_len] = 0;
  561. memcpy(val, esign+1, val_len);
  562. val[val_len] = 0;
  563. items[i].key = var;
  564. items[i].value = val;
  565. }
  566. return items;
  567. fail:
  568. for (e=0;e<i;e++) {
  569. free((char *)items[e].key);
  570. free((char *)items[e].value);
  571. }
  572. free(items);
  573. return NULL;
  574. }
  575. static struct {
  576. struct arg_str *service;
  577. struct arg_str *proto;
  578. struct arg_int *port;
  579. struct arg_str *instance;
  580. struct arg_str *txt;
  581. struct arg_end *end;
  582. } mdns_add_args;
  583. static int cmd_mdns_service_add(int argc, char** argv)
  584. {
  585. int nerrors = arg_parse(argc, argv, (void**) &mdns_add_args);
  586. if (nerrors != 0) {
  587. arg_print_errors(stderr, mdns_add_args.end, argv[0]);
  588. return 1;
  589. }
  590. if (!mdns_add_args.service->sval[0] || !mdns_add_args.proto->sval[0] || !mdns_add_args.port->ival[0]) {
  591. printf("ERROR: Bad arguments!\n");
  592. return 1;
  593. }
  594. const char * instance = NULL;
  595. if (mdns_add_args.instance->sval[0] && mdns_add_args.instance->sval[0][0]) {
  596. instance = mdns_add_args.instance->sval[0];
  597. printf("MDNS: Service Instance: %s\n", instance);
  598. }
  599. mdns_txt_item_t * items = NULL;
  600. if (mdns_add_args.txt->count) {
  601. items = _convert_items(mdns_add_args.txt->sval, mdns_add_args.txt->count);
  602. if (!items) {
  603. printf("ERROR: No Memory!\n");
  604. return 1;
  605. }
  606. }
  607. ESP_ERROR_CHECK( mdns_service_add(instance, mdns_add_args.service->sval[0], mdns_add_args.proto->sval[0], mdns_add_args.port->ival[0], items, mdns_add_args.txt->count) );
  608. free(items);
  609. return 0;
  610. }
  611. static void register_mdns_service_add(void)
  612. {
  613. mdns_add_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  614. mdns_add_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  615. mdns_add_args.port = arg_int1(NULL, NULL, "<port>", "Service Port");
  616. mdns_add_args.instance = arg_str0("i", "instance", "<instance>", "Instance name");
  617. mdns_add_args.txt = arg_strn(NULL, NULL, "item", 0, 30, "TXT Items (name=value)");
  618. mdns_add_args.end = arg_end(2);
  619. const esp_console_cmd_t cmd_add = {
  620. .command = "mdns_service_add",
  621. .help = "Add service to MDNS",
  622. .hint = NULL,
  623. .func = &cmd_mdns_service_add,
  624. .argtable = &mdns_add_args
  625. };
  626. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) );
  627. }
  628. static struct {
  629. struct arg_str *service;
  630. struct arg_str *proto;
  631. struct arg_end *end;
  632. } mdns_remove_args;
  633. static int cmd_mdns_service_remove(int argc, char** argv)
  634. {
  635. int nerrors = arg_parse(argc, argv, (void**) &mdns_remove_args);
  636. if (nerrors != 0) {
  637. arg_print_errors(stderr, mdns_remove_args.end, argv[0]);
  638. return 1;
  639. }
  640. if (!mdns_remove_args.service->sval[0] || !mdns_remove_args.proto->sval[0]) {
  641. printf("ERROR: Bad arguments!\n");
  642. return 1;
  643. }
  644. ESP_ERROR_CHECK( mdns_service_remove(mdns_remove_args.service->sval[0], mdns_remove_args.proto->sval[0]) );
  645. return 0;
  646. }
  647. static void register_mdns_service_remove(void)
  648. {
  649. mdns_remove_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  650. mdns_remove_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  651. mdns_remove_args.end = arg_end(2);
  652. const esp_console_cmd_t cmd_remove = {
  653. .command = "mdns_service_remove",
  654. .help = "Remove service from MDNS",
  655. .hint = NULL,
  656. .func = &cmd_mdns_service_remove,
  657. .argtable = &mdns_remove_args
  658. };
  659. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_remove) );
  660. }
  661. static struct {
  662. struct arg_str *service;
  663. struct arg_str *proto;
  664. struct arg_str *instance;
  665. struct arg_end *end;
  666. } mdns_service_instance_set_args;
  667. static int cmd_mdns_service_instance_set(int argc, char** argv)
  668. {
  669. int nerrors = arg_parse(argc, argv, (void**) &mdns_service_instance_set_args);
  670. if (nerrors != 0) {
  671. arg_print_errors(stderr, mdns_service_instance_set_args.end, argv[0]);
  672. return 1;
  673. }
  674. 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]) {
  675. printf("ERROR: Bad arguments!\n");
  676. return 1;
  677. }
  678. ESP_ERROR_CHECK( mdns_service_instance_name_set(mdns_service_instance_set_args.service->sval[0], mdns_service_instance_set_args.proto->sval[0], mdns_service_instance_set_args.instance->sval[0]) );
  679. return 0;
  680. }
  681. static void register_mdns_service_instance_set(void)
  682. {
  683. mdns_service_instance_set_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  684. mdns_service_instance_set_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  685. mdns_service_instance_set_args.instance = arg_str1(NULL, NULL, "<instance>", "Instance name");
  686. mdns_service_instance_set_args.end = arg_end(2);
  687. const esp_console_cmd_t cmd_add = {
  688. .command = "mdns_service_instance_set",
  689. .help = "Set MDNS Service Instance Name",
  690. .hint = NULL,
  691. .func = &cmd_mdns_service_instance_set,
  692. .argtable = &mdns_service_instance_set_args
  693. };
  694. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) );
  695. }
  696. static struct {
  697. struct arg_str *service;
  698. struct arg_str *proto;
  699. struct arg_int *port;
  700. struct arg_end *end;
  701. } mdns_service_port_set_args;
  702. static int cmd_mdns_service_port_set(int argc, char** argv) {
  703. int nerrors = arg_parse(argc, argv, (void**) &mdns_service_port_set_args);
  704. if (nerrors != 0) {
  705. arg_print_errors(stderr, mdns_service_port_set_args.end, argv[0]);
  706. return 1;
  707. }
  708. 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]) {
  709. printf("ERROR: Bad arguments!\n");
  710. return 1;
  711. }
  712. ESP_ERROR_CHECK( mdns_service_port_set(mdns_service_port_set_args.service->sval[0], mdns_service_port_set_args.proto->sval[0], mdns_service_port_set_args.port->ival[0]) );
  713. return 0;
  714. }
  715. static void register_mdns_service_port_set(void)
  716. {
  717. mdns_service_port_set_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  718. mdns_service_port_set_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  719. mdns_service_port_set_args.port = arg_int1(NULL, NULL, "<port>", "Service Port");
  720. mdns_service_port_set_args.end = arg_end(2);
  721. const esp_console_cmd_t cmd_add = {
  722. .command = "mdns_service_port_set",
  723. .help = "Set MDNS Service port",
  724. .hint = NULL,
  725. .func = &cmd_mdns_service_port_set,
  726. .argtable = &mdns_service_port_set_args
  727. };
  728. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_add) );
  729. }
  730. static struct {
  731. struct arg_str *service;
  732. struct arg_str *proto;
  733. struct arg_str *txt;
  734. struct arg_end *end;
  735. } mdns_txt_replace_args;
  736. static int cmd_mdns_service_txt_replace(int argc, char** argv)
  737. {
  738. mdns_txt_item_t * items = NULL;
  739. int nerrors = arg_parse(argc, argv, (void**) &mdns_txt_replace_args);
  740. if (nerrors != 0) {
  741. arg_print_errors(stderr, mdns_txt_replace_args.end, argv[0]);
  742. return 1;
  743. }
  744. if (!mdns_txt_replace_args.service->sval[0] || !mdns_txt_replace_args.proto->sval[0]) {
  745. printf("ERROR: Bad arguments!\n");
  746. return 1;
  747. }
  748. if (mdns_txt_replace_args.txt->count) {
  749. items = _convert_items(mdns_txt_replace_args.txt->sval, mdns_txt_replace_args.txt->count);
  750. if (!items) {
  751. printf("ERROR: No Memory!\n");
  752. return 1;
  753. }
  754. }
  755. ESP_ERROR_CHECK( mdns_service_txt_set(mdns_txt_replace_args.service->sval[0], mdns_txt_replace_args.proto->sval[0], items, mdns_txt_replace_args.txt->count) );
  756. free(items);
  757. return 0;
  758. }
  759. static void register_mdns_service_txt_replace(void)
  760. {
  761. mdns_txt_replace_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  762. mdns_txt_replace_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  763. mdns_txt_replace_args.txt = arg_strn(NULL, NULL, "item", 0, 30, "TXT Items (name=value)");
  764. mdns_txt_replace_args.end = arg_end(2);
  765. const esp_console_cmd_t cmd_txt_set = {
  766. .command = "mdns_service_txt_replace",
  767. .help = "Replace MDNS service TXT items",
  768. .hint = NULL,
  769. .func = &cmd_mdns_service_txt_replace,
  770. .argtable = &mdns_txt_replace_args
  771. };
  772. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_set) );
  773. }
  774. static struct {
  775. struct arg_str *service;
  776. struct arg_str *proto;
  777. struct arg_str *var;
  778. struct arg_str *value;
  779. struct arg_end *end;
  780. } mdns_txt_set_args;
  781. static int cmd_mdns_service_txt_set(int argc, char** argv)
  782. {
  783. int nerrors = arg_parse(argc, argv, (void**) &mdns_txt_set_args);
  784. if (nerrors != 0) {
  785. arg_print_errors(stderr, mdns_txt_set_args.end, argv[0]);
  786. return 1;
  787. }
  788. if (!mdns_txt_set_args.service->sval[0] || !mdns_txt_set_args.proto->sval[0] || !mdns_txt_set_args.var->sval[0]) {
  789. printf("ERROR: Bad arguments!\n");
  790. return 1;
  791. }
  792. ESP_ERROR_CHECK( mdns_service_txt_item_set(mdns_txt_set_args.service->sval[0], mdns_txt_set_args.proto->sval[0], mdns_txt_set_args.var->sval[0], mdns_txt_set_args.value->sval[0]) );
  793. return 0;
  794. }
  795. static void register_mdns_service_txt_set(void)
  796. {
  797. mdns_txt_set_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  798. mdns_txt_set_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  799. mdns_txt_set_args.var = arg_str1(NULL, NULL, "<var>", "Item Name");
  800. mdns_txt_set_args.value = arg_str1(NULL, NULL, "<value>", "Item Value");
  801. mdns_txt_set_args.end = arg_end(2);
  802. const esp_console_cmd_t cmd_txt_set = {
  803. .command = "mdns_service_txt_set",
  804. .help = "Add/Set MDNS service TXT item",
  805. .hint = NULL,
  806. .func = &cmd_mdns_service_txt_set,
  807. .argtable = &mdns_txt_set_args
  808. };
  809. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_set) );
  810. }
  811. static struct {
  812. struct arg_str *service;
  813. struct arg_str *proto;
  814. struct arg_str *var;
  815. struct arg_end *end;
  816. } mdns_txt_remove_args;
  817. static int cmd_mdns_service_txt_remove(int argc, char** argv)
  818. {
  819. int nerrors = arg_parse(argc, argv, (void**) &mdns_txt_remove_args);
  820. if (nerrors != 0) {
  821. arg_print_errors(stderr, mdns_txt_remove_args.end, argv[0]);
  822. return 1;
  823. }
  824. if (!mdns_txt_remove_args.service->sval[0] || !mdns_txt_remove_args.proto->sval[0] || !mdns_txt_remove_args.var->sval[0]) {
  825. printf("ERROR: Bad arguments!\n");
  826. return 1;
  827. }
  828. ESP_ERROR_CHECK( mdns_service_txt_item_remove(mdns_txt_remove_args.service->sval[0], mdns_txt_remove_args.proto->sval[0], mdns_txt_remove_args.var->sval[0]) );
  829. return 0;
  830. }
  831. static void register_mdns_service_txt_remove(void)
  832. {
  833. mdns_txt_remove_args.service = arg_str1(NULL, NULL, "<service>", "MDNS Service");
  834. mdns_txt_remove_args.proto = arg_str1(NULL, NULL, "<proto>", "IP Protocol");
  835. mdns_txt_remove_args.var = arg_str1(NULL, NULL, "<var>", "Item Name");
  836. mdns_txt_remove_args.end = arg_end(2);
  837. const esp_console_cmd_t cmd_txt_remove = {
  838. .command = "mdns_service_txt_remove",
  839. .help = "Remove MDNS service TXT item",
  840. .hint = NULL,
  841. .func = &cmd_mdns_service_txt_remove,
  842. .argtable = &mdns_txt_remove_args
  843. };
  844. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_txt_remove) );
  845. }
  846. static int cmd_mdns_service_remove_all(int argc, char** argv)
  847. {
  848. mdns_service_remove_all();
  849. return 0;
  850. }
  851. static void register_mdns_service_remove_all(void)
  852. {
  853. const esp_console_cmd_t cmd_free = {
  854. .command = "mdns_service_remove_all",
  855. .help = "Remove all MDNS services",
  856. .hint = NULL,
  857. .func = &cmd_mdns_service_remove_all,
  858. .argtable = NULL
  859. };
  860. ESP_ERROR_CHECK( esp_console_cmd_register(&cmd_free) );
  861. }
  862. void mdns_console_register(void)
  863. {
  864. register_mdns_init();
  865. register_mdns_free();
  866. register_mdns_set_hostname();
  867. register_mdns_set_instance();
  868. register_mdns_service_add();
  869. register_mdns_service_remove();
  870. register_mdns_service_instance_set();
  871. register_mdns_service_port_set();
  872. register_mdns_service_txt_replace();
  873. register_mdns_service_txt_set();
  874. register_mdns_service_txt_remove();
  875. register_mdns_service_remove_all();
  876. register_mdns_query_a();
  877. #if CONFIG_LWIP_IPV6
  878. register_mdns_query_aaaa();
  879. #endif
  880. register_mdns_query_txt();
  881. register_mdns_query_srv();
  882. register_mdns_query_ptr();
  883. register_mdns_query_ip();
  884. register_mdns_query_svc();
  885. }