//TODO: this can go away completely
const var_t variables[] = {
/* Server configuration */
- {"AddressFamily", VAR_SERVER},
- {"AutoConnect", VAR_SERVER | VAR_SAFE},
- {"BindToAddress", VAR_SERVER | VAR_MULTIPLE},
- {"BindToInterface", VAR_SERVER},
- {"Broadcast", VAR_SERVER | VAR_SAFE},
{"ConnectTo", VAR_SERVER | VAR_MULTIPLE | VAR_SAFE},
- {"DecrementTTL", VAR_SERVER},
- {"Device", VAR_SERVER},
- {"DeviceType", VAR_SERVER},
- {"DirectOnly", VAR_SERVER},
- {"ECDSAPrivateKeyFile", VAR_SERVER},
- {"ExperimentalProtocol", VAR_SERVER},
- {"Forwarding", VAR_SERVER},
- {"GraphDumpFile", VAR_SERVER | VAR_OBSOLETE},
- {"Hostnames", VAR_SERVER},
- {"IffOneQueue", VAR_SERVER},
- {"Interface", VAR_SERVER},
- {"KeyExpire", VAR_SERVER},
- {"ListenAddress", VAR_SERVER | VAR_MULTIPLE},
- {"LocalDiscovery", VAR_SERVER},
- {"MACExpire", VAR_SERVER},
- {"MaxConnectionBurst", VAR_SERVER},
- {"MaxOutputBufferSize", VAR_SERVER},
- {"MaxTimeout", VAR_SERVER},
- {"Mode", VAR_SERVER | VAR_SAFE},
{"Name", VAR_SERVER},
- {"PingInterval", VAR_SERVER},
- {"PingTimeout", VAR_SERVER},
- {"PriorityInheritance", VAR_SERVER},
- {"PrivateKey", VAR_SERVER | VAR_OBSOLETE},
- {"PrivateKeyFile", VAR_SERVER},
- {"ProcessPriority", VAR_SERVER},
- {"Proxy", VAR_SERVER},
- {"ReplayWindow", VAR_SERVER},
- {"ScriptsExtension", VAR_SERVER},
- {"ScriptsInterpreter", VAR_SERVER},
- {"StrictSubnets", VAR_SERVER},
- {"TunnelServer", VAR_SERVER},
- {"VDEGroup", VAR_SERVER},
- {"VDEPort", VAR_SERVER},
/* Host configuration */
{"Address", VAR_HOST | VAR_MULTIPLE},
- {"Cipher", VAR_SERVER | VAR_HOST},
- {"ClampMSS", VAR_SERVER | VAR_HOST},
- {"Compression", VAR_SERVER | VAR_HOST},
- {"Digest", VAR_SERVER | VAR_HOST},
{"ECDSAPublicKey", VAR_HOST},
- {"ECDSAPublicKeyFile", VAR_SERVER | VAR_HOST},
- {"IndirectData", VAR_SERVER | VAR_HOST},
- {"MACLength", VAR_SERVER | VAR_HOST},
- {"PMTU", VAR_SERVER | VAR_HOST},
- {"PMTUDiscovery", VAR_SERVER | VAR_HOST},
{"Port", VAR_HOST},
- {"PublicKey", VAR_HOST | VAR_OBSOLETE},
- {"PublicKeyFile", VAR_SERVER | VAR_HOST | VAR_OBSOLETE},
- {"Subnet", VAR_HOST | VAR_MULTIPLE | VAR_SAFE},
- {"TCPOnly", VAR_SERVER | VAR_HOST},
- {"Weight", VAR_HOST | VAR_SAFE},
{NULL, 0}
};
return NULL;
}
- if(!strcmp(hostname[0], hostname[1])) {
+ if(hostname[0] && hostname[1] && !strcmp(hostname[0], hostname[1])) {
free(hostname[1]);
hostname[1] = NULL;
}
continue;
}
- // Check the list of known variables //TODO: most variables will not be available in meshlink, only name and key will be absolutely necessary
+ // Check the list of known variables
bool found = false;
int i;
mesh->confbase = xstrdup(confbase);
mesh->appname = xstrdup(appname);
mesh->devclass = devclass;
+ mesh->discovery = true;
if(usingname) {
mesh->name = xstrdup(name);
event_loop_stop(&mesh->loop);
// Send ourselves a UDP packet to kick the event loop
- listen_socket_t *s = &mesh->listen_socket[0];
+ for(int i = 0; i < mesh->listen_sockets; i++) {
+ sockaddr_t sa;
+ socklen_t salen = sizeof(sa.sa);
- if(sendto(s->udp.fd, "", 1, MSG_NOSIGNAL, &s->sa.sa, SALEN(s->sa.sa)) == -1) {
- logger(mesh, MESHLINK_ERROR, "Could not send a UDP packet to ourself");
+ if(getsockname(mesh->listen_socket[i].udp.fd, &sa.sa, &salen) == -1) {
+ logger(mesh, MESHLINK_ERROR, "System call `%s' failed: %s", "getsockname", sockstrerror(sockerrno));
+ continue;
+ }
+
+ if(sendto(mesh->listen_socket[i].udp.fd, "", 1, MSG_NOSIGNAL, &sa.sa, salen) == -1) {
+ logger(mesh, MESHLINK_ERROR, "Could not send a UDP packet to ourself: %s", sockstrerror(sockerrno));
+ }
}
// Wait for the main thread to finish
// Fill in the details.
fprintf(f, "Name = %s\n", name);
- //if(netname)
- // fprintf(f, "NetName = %s\n", netname);
fprintf(f, "ConnectTo = %s\n", mesh->self->name);
// Copy Broadcast and Mode