Remove erroneous warning about SPTPS being disabled.
[tinc] / src / net_setup.c
index 6157993..858992c 100644 (file)
@@ -86,10 +86,8 @@ bool node_read_ecdsa_public_key(node_t *n) {
 
        fp = fopen(pubname, "r");
 
-       if(!fp) {
-               logger(DEBUG_ALWAYS, LOG_ERR, "Error reading ECDSA public key file `%s': %s", pubname, strerror(errno));
+       if(!fp)
                goto exit;
-       }
 
        n->ecdsa = ecdsa_read_pem_public_key(fp);
        fclose(fp);
@@ -649,6 +647,7 @@ bool setup_myself_reloadable(void) {
 static bool setup_myself(void) {
        char *name, *hostname, *cipher, *digest, *type;
        char *address = NULL;
+       bool port_specified = false;
 
        if(!(name = get_name())) {
                logger(DEBUG_ALWAYS, LOG_ERR, "Name for tinc daemon required!");
@@ -663,9 +662,8 @@ static bool setup_myself(void) {
 
        if(!get_config_string(lookup_config(config_tree, "Port"), &myport))
                myport = xstrdup("655");
-
-       xasprintf(&myself->hostname, "MYSELF port %s", myport);
-       myself->connection->hostname = xstrdup(myself->hostname);
+       else
+               port_specified = true;
 
        myself->connection->options = 0;
        myself->connection->protocol_major = PROT_MAJOR;
@@ -673,14 +671,20 @@ static bool setup_myself(void) {
 
        myself->options |= PROT_MINOR << 24;
 
-       get_config_bool(lookup_config(config_tree, "ExperimentalProtocol"), &experimental);
-
-       if(experimental && !read_ecdsa_private_key())
-               return false;
+       if(!get_config_bool(lookup_config(config_tree, "ExperimentalProtocol"), &experimental)) {
+               experimental = read_ecdsa_private_key();
+               if(!experimental)
+                       logger(DEBUG_ALWAYS, LOG_WARNING, "Support for SPTPS disabled.");
+       } else {
+               if(experimental && !read_ecdsa_private_key())
+                       return false;
+       }
 
        if(!read_rsa_private_key())
                return false;
 
+       /* Ensure myport is numeric */
+
        if(!atoi(myport)) {
                struct addrinfo *ai = str2addrinfo("localhost", myport, SOCK_DGRAM);
                sockaddr_t sa;
@@ -953,6 +957,24 @@ static bool setup_myself(void) {
                return false;
        }
 
+       /* If no Port option was specified, set myport to the port used by the first listening socket. */
+
+       if(!port_specified) {
+               sockaddr_t sa;
+               socklen_t salen = sizeof sa;
+               if(!getsockname(listen_socket[0].udp.fd, &sa.sa, &salen)) {
+                       free(myport);
+                       sockaddr2str(&sa, NULL, &myport);
+                       if(!myport)
+                               myport = xstrdup("655");
+               }
+       }
+
+       xasprintf(&myself->hostname, "MYSELF port %s", myport);
+       myself->connection->hostname = xstrdup(myself->hostname);
+
+       /* Done. */
+
        last_config_check = now.tv_sec;
 
        return true;