Added preliminary Symbian support.
[silc.git] / lib / silcserver / server_st_accept.c
index 38e4acdcc6b1063f92c30d76f4bb976fe53cdf2d..7ad789a9554dd2e4a71a31190edc254d5b4b743c 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2005 Pekka Riikonen
+  Copyright (C) 1997 - 2006 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -27,9 +27,8 @@
 
 static void
 silc_server_accept_verify_key(SilcSKE ske,
-                             const unsigned char *pk_data,
-                             SilcUInt32 pk_len,
                              SilcSKEPKType pk_type,
+                             SilcPublicKey public_key,
                              void *context,
                              SilcSKEVerifyCbCompletion completion,
                              void *completion_context)
@@ -67,7 +66,7 @@ silc_server_accept_completed(SilcSKE ske, SilcSKEStatus status,
   ac->rekey = rekey;
 
   /* Continue synchronously to take keys into use immediately */
-  SILC_FSM_CALL_CONTINUE_SYNC(ac->t);
+  SILC_FSM_CALL_CONTINUE_SYNC(&ac->t);
 }
 
 /* Authentication data callback */
@@ -130,7 +129,7 @@ silc_server_accept_auth_compl(SilcConnAuth connauth, SilcBool success,
 {
   SilcServerAccept ac = context;
   ac->auth_success = success;
-  SILC_FSM_CALL_CONTINUE(ac->t);
+  SILC_FSM_CALL_CONTINUE(&ac->t);
 }
 
 /* Free context */
@@ -147,7 +146,6 @@ void silc_server_accept_connection_dest(SilcFSM fsm, void *fsm_context,
                                        void *destructor_context)
 {
   SilcServerAccept ac = fsm_context;
-  silc_fsm_free(fsm);
   silc_server_accept_free(ac);
 }
 
@@ -171,7 +169,7 @@ SILC_FSM_STATE(silc_server_st_accept_connection)
     /** Cannot create packet stream */
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   silc_packet_set_context(ac->packet_stream, ac);
@@ -182,7 +180,7 @@ SILC_FSM_STATE(silc_server_st_accept_connection)
     /** Out of memory */
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   if (!silc_socket_stream_get_info(ac->stream, NULL, &ac->hostname,
@@ -190,7 +188,7 @@ SILC_FSM_STATE(silc_server_st_accept_connection)
     /** Bad socket stream */
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Check whether this connection is denied to connect to us. */
@@ -200,7 +198,7 @@ SILC_FSM_STATE(silc_server_st_accept_connection)
     SILC_LOG_INFO(("Connection %s (%s) is denied", ac->hostname, ac->ip));
     ac->error = SILC_STATUS_ERR_BANNED_FROM_SERVER;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   server->params->refcnt++;
@@ -219,7 +217,7 @@ SILC_FSM_STATE(silc_server_st_accept_connection)
                   ac->ip));
     ac->error = SILC_STATUS_ERR_BANNED_FROM_SERVER;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   SILC_LOG_INFO(("Incoming connection %s (%s)", ac->hostname, ac->ip));
@@ -243,7 +241,7 @@ SILC_FSM_STATE(silc_server_st_accept_connection)
     /** Out of memory */
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
   silc_ske_set_callbacks(ac->data.ske, silc_server_accept_verify_key,
                         silc_server_accept_completed, ac);
@@ -267,7 +265,7 @@ SILC_FSM_STATE(silc_server_st_accept_set_keys)
                    silc_ske_map_status(ac->status), ac->hostname, ac->ip));
     ac->error = SILC_STATUS_ERR_KEY_EXCHANGE_FAILED;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   SILC_LOG_DEBUG(("Setting keys into use"));
@@ -279,7 +277,7 @@ SILC_FSM_STATE(silc_server_st_accept_set_keys)
     /** Error setting keys */
     ac->error = SILC_STATUS_ERR_KEY_EXCHANGE_FAILED;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
   silc_packet_set_ciphers(ac->packet_stream, send_key, receive_key);
   silc_packet_set_hmacs(ac->packet_stream, hmac_send, hmac_receive);
@@ -293,7 +291,7 @@ SILC_FSM_STATE(silc_server_st_accept_set_keys)
     /** Error allocating auth protocol */
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /** Waiting authentication completion */
@@ -323,7 +321,7 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
                   SILC_CONNTYPE_STRING(ac->data.type)));
     ac->error = SILC_STATUS_ERR_AUTH_FAILED;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   SILC_LOG_DEBUG(("Checking whether connection is allowed"));
@@ -349,7 +347,7 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
     conn_number = server->stat.my_routers;
   }
 
-  silc_fsm_sema_init(&ac->wait_register, silc_fsm_get_machine(fsm), 0);
+  silc_fsm_event_init(&ac->wait_register, silc_fsm_get_machine(fsm), 0);
 
   /* Check version */
   l_protocol_version = silc_version_to_num(params && params->version_protocol ?
@@ -374,7 +372,7 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
     ac->error = SILC_STATUS_ERR_BAD_VERSION;
     ac->error_string = strdup("You support too old protocol version");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Match software version */
@@ -386,7 +384,7 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
     ac->error = SILC_STATUS_ERR_BAD_VERSION;
     ac->error_string = strdup("You support too old software version");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Regex match vendor version */
@@ -398,7 +396,7 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
     ac->error = SILC_STATUS_ERR_BAD_VERSION;
     ac->error_string = strdup("Your software is not supported");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
   silc_free(r_vendor_version);
 
@@ -415,7 +413,7 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     ac->error_string = strdup("Server is full, try again later");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* XXX */
@@ -427,7 +425,7 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     ac->error_string = strdup("Too many connections from your host");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* If we are waiting backup router connection, do not accept any other
@@ -440,7 +438,7 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
     ac->error_string = strdup("We do not have connection to backup router "
                              "established, try later");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* If we are backup router and this is incoming server connection
@@ -456,10 +454,10 @@ SILC_FSM_STATE(silc_server_st_accept_authenticated)
     ac->error_string = strdup("We do not have connection to primary router "
                              "established, try later");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
-  return SILC_FSM_CONTINUE;
+  SILC_FSM_CONTINUE;
 }
 
 SILC_FSM_STATE(silc_server_st_accept_client)
@@ -478,7 +476,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
   int ret;
 
   /* Wait here for the NEW_CLIENT or RESUME_CLIENT packet */
-  SILC_FSM_SEMA_TIMEDWAIT(&ac->wait_register, 20, 0, &timedout);
+  SILC_FSM_EVENT_TIMEDWAIT(&ac->wait_register, 20, 0, &timedout);
 
   if (!ac->register_packet || timedout) {
     /** Client did not register */
@@ -486,7 +484,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
                   ac->hostname, ac->ip));
     ac->error = SILC_STATUS_ERR_NOT_REGISTERED;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   SILC_LOG_DEBUG(("Connection %s (%s) is client", ac->hostname, ac->ip));
@@ -496,7 +494,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
   if (ac->register_packet->type == SILC_PACKET_RESUME_CLIENT) {
     /** Resume client connection */
     silc_fsm_next(fsm, silc_server_st_accept_resume_client);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Get connection parameters */
@@ -532,7 +530,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
     ac->error = SILC_STATUS_ERR_INCOMPLETE_INFORMATION;
     ac->error_string = strdup("Bad NEW_CLIENT packet");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   if (!username) {
@@ -542,7 +540,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
     ac->error = SILC_STATUS_ERR_INCOMPLETE_INFORMATION;
     ac->error_string = strdup("You did not send username");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   if (username_len > 128) {
@@ -557,8 +555,8 @@ SILC_FSM_STATE(silc_server_st_accept_client)
   ret = silc_parse_userfqdn(username, u, 128, h, sizeof(h));
   if (ret < 2) {
     /* Hostname not present, add it */
-    snprintf(n, sizeof(n), "%s", u);
-    snprintf(u, sizeof(u) - 1, "%s@%s", n, ac->hostname);
+    silc_snprintf(n, sizeof(n), "%s", u);
+    silc_snprintf(u, sizeof(u) - 1, "%s@%s", n, ac->hostname);
   } else {
     /* Verify that hostname is same than resolved hostname */
     if (strcmp(ac->hostname, h)) {
@@ -568,10 +566,10 @@ SILC_FSM_STATE(silc_server_st_accept_client)
       ac->error = SILC_STATUS_ERR_INCOMPLETE_INFORMATION;
       ac->error_string = strdup("You sent wrong hostname string");
       silc_fsm_next(fsm, silc_server_st_accept_error);
-      return SILC_FSM_CONTINUE;
+      SILC_FSM_CONTINUE;
     }
-    snprintf(n, sizeof(n), "%s", u);
-    snprintf(u, sizeof(u) - 1, "%s@%s", n, h);
+    silc_snprintf(n, sizeof(n), "%s", u);
+    silc_snprintf(u, sizeof(u) - 1, "%s@%s", n, h);
   }
 
   /* If configured as anonymous, scramble the username and hostname */
@@ -588,7 +586,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
       /** Out of memory */
       ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
       silc_fsm_next(fsm, silc_server_st_accept_error);
-      return SILC_FSM_CONTINUE;
+      SILC_FSM_CONTINUE;
     }
 
     username_len = strlen(scramble);
@@ -612,7 +610,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
     ac->error = SILC_STATUS_ERR_BAD_NICKNAME;
     ac->error_string = strdup("Bad nickname");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Create client entry */
@@ -623,7 +621,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
     SILC_LOG_ERROR(("Could not create new client entry"));
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Save entry data */
@@ -638,7 +636,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
     /** Out of memory */
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Send the new client ID to the client. */
@@ -673,7 +671,7 @@ SILC_FSM_STATE(silc_server_st_accept_client)
 
   /** Connection accepted */
   silc_fsm_next(fsm, silc_server_st_accept_finish);
-  return SILC_FSM_CONTINUE;
+  SILC_FSM_CONTINUE;
 }
 
 SILC_FSM_STATE(silc_server_st_accept_resume_client)
@@ -681,7 +679,7 @@ SILC_FSM_STATE(silc_server_st_accept_resume_client)
 
   /** Connection accepted */
   silc_fsm_next(fsm, silc_server_st_accept_finish);
-  return SILC_FSM_CONTINUE;
+  SILC_FSM_CONTINUE;
 }
 
 SILC_FSM_STATE(silc_server_st_accept_server)
@@ -705,7 +703,7 @@ SILC_FSM_STATE(silc_server_st_accept_server)
 #if 0
 
   /* Wait here for the NEW_SERVER packet */
-  SILC_FSM_SEMA_TIMEDWAIT(&ac->wait_register, 20, 0, &timedout);
+  SILC_FSM_EVENT_TIMEDWAIT(&ac->wait_register, 20, 0, &timedout);
 
   if (!ac->register_packet || timedout) {
     /** Server did not register */
@@ -714,7 +712,7 @@ SILC_FSM_STATE(silc_server_st_accept_server)
                   ac->hostname, ac->ip));
     ac->error = SILC_STATUS_ERR_NOT_REGISTERED;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Get connection parameters */
@@ -782,7 +780,7 @@ SILC_FSM_STATE(silc_server_st_accept_server)
     ac->error = SILC_STATUS_ERR_INCOMPLETE_INFORMATION;
     ac->error_string = strdup("Bad NEW_SERVER packet");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   if (name_len > 256) {
@@ -800,7 +798,7 @@ SILC_FSM_STATE(silc_server_st_accept_server)
     ac->error = SILC_STATUS_ERR_INCOMPLETE_INFORMATION;
     ac->error_string = strdup("Bad Server ID");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Check for valid server ID */
@@ -813,7 +811,7 @@ SILC_FSM_STATE(silc_server_st_accept_server)
     ac->error_string = strdup("Your Server ID is not based on your real "
                              "IP address.  Check your configuration.");
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Create server entry */
@@ -827,7 +825,7 @@ SILC_FSM_STATE(silc_server_st_accept_server)
     SILC_LOG_ERROR(("Could not create new server entry"));
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* Save entry data */
@@ -842,7 +840,7 @@ SILC_FSM_STATE(silc_server_st_accept_server)
     /** Out of memory */
     ac->error = SILC_STATUS_ERR_RESOURCE_LIMIT;
     silc_fsm_next(fsm, silc_server_st_accept_error);
-    return SILC_FSM_CONTINUE;
+    SILC_FSM_CONTINUE;
   }
 
   /* If the incoming connection is router and marked as backup router
@@ -955,7 +953,7 @@ SILC_FSM_STATE(silc_server_st_accept_server)
 
   /** Connection accepted */
   silc_fsm_next(fsm, silc_server_st_accept_finish);
-  return SILC_FSM_CONTINUE;
+  SILC_FSM_CONTINUE;
 }
 
 SILC_FSM_STATE(silc_server_st_accept_finish)
@@ -965,7 +963,7 @@ SILC_FSM_STATE(silc_server_st_accept_finish)
 
   SILC_LOG_DEBUG(("New connection accepted"));
 
-  return SILC_FSM_FINISH;
+  SILC_FSM_FINISH;
 }
 
 SILC_FSM_STATE(silc_server_st_accept_error)
@@ -987,5 +985,5 @@ SILC_FSM_STATE(silc_server_st_accept_error)
   if (ac->connauth)
     server->stat.auth_failures++;
 
-  return SILC_FSM_FINISH;
+  SILC_FSM_FINISH;
 }