+bool send_id(connection_t *c) {
+ gettimeofday(&c->start, NULL);
+
+ int minor = 0;
+
+ if(experimental) {
+ if(c->outgoing && !read_ecdsa_public_key(c))
+ minor = 1;
+ else
+ minor = myself->connection->protocol_minor;
+ }
+
+ if(proxytype && c->outgoing)
+ if(!send_proxyrequest(c))
+ return false;
+
+ return send_request(c, "%d %s %d.%d", ID, myself->connection->name, myself->connection->protocol_major, minor);
+}
+
+static bool finalize_invitation(connection_t *c, const char *data, uint16_t len) {
+ if(strchr(data, '\n')) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Received invalid key from invited node %s (%s)!\n", c->name, c->hostname);
+ return false;
+ }
+
+ // Create a new host config file
+ char filename[PATH_MAX];
+ snprintf(filename, sizeof filename, "%s" SLASH "hosts" SLASH "%s", confbase, c->name);
+ if(!access(filename, F_OK)) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Host config file for %s (%s) already exists!\n", c->name, c->hostname);
+ return false;
+ }
+
+ FILE *f = fopen(filename, "w");
+ if(!f) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Error trying to create %s: %s\n", filename, strerror(errno));
+ return false;
+ }
+
+ fprintf(f, "Ed25519PublicKey = %s\n", data);
+ fclose(f);
+
+ logger(DEBUG_CONNECTIONS, LOG_INFO, "Key succesfully received from %s (%s)", c->name, c->hostname);
+
+ // Call invitation-accepted script
+ environment_t env;
+ char *address, *port;
+
+ environment_init(&env);
+ environment_add(&env, "NODE=%s", c->name);
+ sockaddr2str(&c->address, &address, &port);
+ environment_add(&env, "REMOTEADDRESS=%s", address);
+ environment_add(&env, "NAME=%s", myself->name);
+
+ execute_script("invitation-accepted", &env);
+
+ environment_exit(&env);
+
+ sptps_send_record(&c->sptps, 2, data, 0);
+ return true;
+}
+
+static bool receive_invitation_sptps(void *handle, uint8_t type, const void *data, uint16_t len) {
+ connection_t *c = handle;
+
+ if(type == 128)
+ return true;
+
+ if(type == 1 && c->status.invitation_used)
+ return finalize_invitation(c, data, len);