nodemcu-firmware/app/modules/mdns.c

98 lines
2.2 KiB
C

// Module for access to the nodemcu_mdns functions
#include "module.h"
#include "lauxlib.h"
#include <string.h>
#include <stdlib.h>
#include <alloca.h>
#include <stdint.h>
#include "lwip/ip_addr.h"
#include "nodemcu_mdns.h"
#include "user_interface.h"
//
// mdns.close()
//
static int mdns_close(lua_State *L)
{
nodemcu_mdns_close();
return 0;
}
//
// mdns.register(hostname [, { attributes} ])
//
static int mdns_register(lua_State *L)
{
struct nodemcu_mdns_info info;
memset(&info, 0, sizeof(info));
info.host_name = luaL_checkstring(L, 1);
info.service_name = "http";
info.service_port = 80;
info.host_desc = info.host_name;
if (lua_gettop(L) >= 2) {
luaL_checktype(L, 2, LUA_TTABLE);
lua_pushnil(L); // first key
int slot = 0;
while (lua_next(L, 2) != 0 && slot < sizeof(info.txt_data) / sizeof(info.txt_data[0])) {
luaL_checktype(L, -2, LUA_TSTRING);
const char *key = luaL_checkstring(L, -2);
if (strcmp(key, "port") == 0) {
info.service_port = luaL_checknumber(L, -1);
} else if (strcmp(key, "service") == 0) {
info.service_name = luaL_checkstring(L, -1);
} else if (strcmp(key, "description") == 0) {
info.host_desc = luaL_checkstring(L, -1);
} else {
int len = strlen(key) + 1;
const char *value = luaL_checkstring(L, -1);
char *p = alloca(len + strlen(value) + 1);
strcpy(p, key);
strcat(p, "=");
strcat(p, value);
info.txt_data[slot++] = p;
}
lua_pop(L, 1);
}
}
struct ip_info ipconfig;
uint8_t mode = wifi_get_opmode();
if (!wifi_get_ip_info((mode == 2) ? SOFTAP_IF : STATION_IF, &ipconfig) || !ipconfig.ip.addr) {
return luaL_error(L, "No network connection");
}
// Close up the old session (if any). This cannot fail
// so no chance of losing the memory in 'result'
mdns_close(L);
// Save the result as it appears that nodemcu_mdns_init needs
// to have the data valid while it is running.
if (!nodemcu_mdns_init(&info)) {
mdns_close(L);
return luaL_error(L, "Unable to start mDns daemon");
}
return 0;
}
// Module function map
LROT_BEGIN(mdns, NULL, 0)
LROT_FUNCENTRY( register, mdns_register )
LROT_FUNCENTRY( close, mdns_close )
LROT_END(mdns, NULL, 0)
NODEMCU_MODULE(MDNS, "mdns", mdns, NULL);