// While we are at it, read known address information
if(!n->canonical_address) {
n->canonical_address = packmsg_get_str_dup(&in);
+
+ if(!*n->canonical_address) {
+ free(n->canonical_address);
+ n->canonical_address = NULL;
+ }
} else {
packmsg_skip_element(&in);
}
}
n->canonical_address = packmsg_get_str_dup(&in);
+
+ if(!*n->canonical_address) {
+ free(n->canonical_address);
+ n->canonical_address = NULL;
+ }
+
uint32_t count = packmsg_get_array(&in);
for(uint32_t i = 0; i < count; i++) {
(void)priv;
if(!check_id(name)) {
+ // Check if this is a temporary file, if so remove it
+ const char *suffix = strstr(name, ".tmp");
+
+ if(suffix && !suffix[4]) {
+ char filename[PATH_MAX];
+ snprintf(filename, sizeof(filename), "%s" SLASH "current" SLASH "hosts", mesh->confbase);
+ unlink(filename);
+ }
+
return true;
}
return true;
}
-static int setup_tcp_listen_socket(meshlink_handle_t *mesh, const struct addrinfo *aip) {
+int setup_tcp_listen_socket(meshlink_handle_t *mesh, const struct addrinfo *aip) {
int nfd = socket(aip->ai_family, SOCK_STREAM, IPPROTO_TCP);
if(nfd == -1) {
return nfd;
}
-static int setup_udp_socket(meshlink_handle_t *mesh, const struct addrinfo *aip) {
+int setup_udp_listen_socket(meshlink_handle_t *mesh, const struct addrinfo *aip) {
int nfd = socket(aip->ai_family, SOCK_DGRAM, IPPROTO_UDP);
if(nfd == -1) {
.ai_family = AF_UNSPEC,
.ai_socktype = SOCK_STREAM,
.ai_protocol = IPPROTO_TCP,
- .ai_flags = AI_PASSIVE,
+ .ai_flags = AI_PASSIVE | AI_NUMERICSERV,
};
int err = getaddrinfo(NULL, mesh->myport, &hint, &ai);
/* If TCP worked, then we require that UDP works as well. */
- int udp_fd = setup_udp_socket(mesh, aip);
+ int udp_fd = setup_udp_listen_socket(mesh, aip);
if(udp_fd == -1) {
closesocket(tcp_fd);
/*
Configure node_t mesh->self and set up the local sockets (listen only)
*/
-bool setup_myself(meshlink_handle_t *mesh) {
- /* Set some defaults */
-
- mesh->maxtimeout = 900;
-
- /* Done */
-
+static bool setup_myself(meshlink_handle_t *mesh) {
mesh->self->nexthop = mesh->self;
node_add(mesh, mesh->self);
/* Done. */
- mesh->last_config_check = mesh->loop.now.tv_sec;
mesh->last_unreachable = mesh->loop.now.tv_sec;
return true;