-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!");
- return false;
- }
-
- myself = new_node();
- myself->connection = new_connection();
- myself->name = name;
- myself->connection->name = xstrdup(name);
- read_host_config(config_tree, name);
-
- if(!get_config_string(lookup_config(config_tree, "Port"), &myport))
- myport = xstrdup("655");
- else
- port_specified = true;
-
- myself->connection->options = 0;
- myself->connection->protocol_major = PROT_MAJOR;
- myself->connection->protocol_minor = PROT_MINOR;
-
- myself->options |= PROT_MINOR << 24;
-
- 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;
- if(!ai || !ai->ai_addr)
- return false;
- free(myport);
- memcpy(&sa, ai->ai_addr, ai->ai_addrlen);
- sockaddr2str(&sa, NULL, &myport);
- }
-
- /* Read in all the subnets specified in the host configuration file */
-
- for(config_t *cfg = lookup_config(config_tree, "Subnet"); cfg; cfg = lookup_config_next(config_tree, cfg)) {
- subnet_t *subnet;
-
- if(!get_config_subnet(cfg, &subnet))
- return false;
-
- subnet_add(myself, subnet);
- }
-
- /* Check some options */
-
- if(!setup_myself_reloadable())
- return false;
-
- get_config_bool(lookup_config(config_tree, "StrictSubnets"), &strictsubnets);
- get_config_bool(lookup_config(config_tree, "TunnelServer"), &tunnelserver);
- strictsubnets |= tunnelserver;
-
- if(get_config_int(lookup_config(config_tree, "MaxConnectionBurst"), &max_connection_burst)) {
- if(max_connection_burst <= 0) {
- logger(DEBUG_ALWAYS, LOG_ERR, "MaxConnectionBurst cannot be negative!");
- return false;
- }
- }
-
- if(get_config_int(lookup_config(config_tree, "UDPRcvBuf"), &udp_rcvbuf)) {
- if(udp_rcvbuf <= 0) {
- logger(DEBUG_ALWAYS, LOG_ERR, "UDPRcvBuf cannot be negative!");
- return false;
- }
- }
-
- if(get_config_int(lookup_config(config_tree, "UDPSndBuf"), &udp_sndbuf)) {
- if(udp_sndbuf <= 0) {
- logger(DEBUG_ALWAYS, LOG_ERR, "UDPSndBuf cannot be negative!");
- return false;
- }
- }
-
- int replaywin_int;
- if(get_config_int(lookup_config(config_tree, "ReplayWindow"), &replaywin_int)) {
- if(replaywin_int < 0) {
- logger(DEBUG_ALWAYS, LOG_ERR, "ReplayWindow cannot be negative!");
- return false;
- }
- replaywin = (unsigned)replaywin_int;
- sptps_replaywin = replaywin;
- }
-
- /* Generate packet encryption key */
-
- if(!get_config_string(lookup_config(config_tree, "Cipher"), &cipher))
- cipher = xstrdup("blowfish");