unsigned int dynamic_prim : 1; /* Dynamic connection attempt to primary */
unsigned int dynamic_retry : 1; /* Primary returned error, send to
nick@serv server. */
+ unsigned int parsed : 1; /* Set when query is parsed */
} *SilcServerQuery;
void *id, SilcIdType id_type);
void silc_server_query_send_router(SilcServer server, SilcServerQuery query);
void silc_server_query_send_router_reply(void *context, void *reply);
-void silc_server_query_parse(SilcServer server, SilcServerQuery query);
+SilcBool silc_server_query_parse(SilcServer server, SilcServerQuery query,
+ SilcBool parse_only);
void silc_server_query_process(SilcServer server, SilcServerQuery query,
SilcBool resolve);
void silc_server_query_resolve(SilcServer server, SilcServerQuery query,
(!silc_argument_get_arg_type(cmd->args, 1, NULL) &&
!silc_argument_get_arg_type(cmd->args, 4, NULL) &&
silc_argument_get_arg_type(cmd->args, 3, NULL)))) {
+ if (!silc_server_query_parse(server, query, TRUE))
+ return FALSE;
silc_server_query_send_router(server, query);
return TRUE;
}
if (server->server_type == SILC_SERVER && !server->standalone &&
cmd->sock != SILC_PRIMARY_ROUTE(server) &&
!silc_argument_get_arg_type(cmd->args, 5, NULL)) {
+ if (!silc_server_query_parse(server, query, TRUE))
+ return FALSE;
silc_server_query_send_router(server, query);
return TRUE;
}
}
/* Now parse the request */
- silc_server_query_parse(server, query);
+ silc_server_query_parse(server, query, FALSE);
return TRUE;
}
returned error. */
if (query->nick_server[0] && !query->dynamic_retry &&
!silc_server_num_sockets_by_remote(server, query->nick_server,
- query->nick_server, 706)) {
+ query->nick_server, 1334)) {
SILC_LOG_DEBUG(("Retry query by connecting to %s:%d",
query->nick_server, 706));
silc_server_create_connection(server, FALSE, TRUE, query->nick_server,
- 706, silc_server_query_connected,
+ 1334, silc_server_query_connected,
query);
query->dynamic_retry = TRUE;
query->resolved = FALSE;
}
/* Continue with parsing */
- silc_server_query_parse(server, query);
+ silc_server_query_parse(server, query, FALSE);
}
/* Parse the command query and start processing the queries in detail. */
-void silc_server_query_parse(SilcServer server, SilcServerQuery query)
+SilcBool silc_server_query_parse(SilcServer server, SilcServerQuery query,
+ SilcBool parse_only)
{
SilcServerCommandContext cmd = query->cmd;
SilcIDListData idata = silc_packet_get_context(cmd->sock);
SILC_LOG_DEBUG(("Parsing %s query",
silc_get_command_name(query->querycmd)));
+ if (query->parsed)
+ goto parsed;
+
switch (query->querycmd) {
case SILC_COMMAND_WHOIS:
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
/* Get the nickname@server string and parse it */
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_BAD_NICKNAME, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
/* Check nickname */
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_BAD_NICKNAME, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
memset(query->nickname, 0, sizeof(query->nickname));
silc_snprintf(query->nickname, sizeof(query->nickname), "%s", tmp);
silc_free(tmp);
}
- /* Check server name. If we are open server and don't yet have
- connection to remote router, create it now. */
- if (query->nick_server[0] && server->config->open_server &&
- !query->resolved) {
- /* If primary router is specified, use that. Otherwise connect
- to the server in nick@server string. */
- SilcServerConfigRouter *router;
-
- router = silc_server_config_get_primary_router(server);
- if (router && server->standalone) {
- /* Create connection to primary router */
- SILC_LOG_DEBUG(("Create dynamic connection to primary router %s:%d",
- router->host, router->port));
- query->dynamic_prim = TRUE;
- silc_server_create_connection(server, FALSE, TRUE,
- router->host, router->port,
- silc_server_query_connected, query);
- return;
- } else if (!silc_server_num_sockets_by_remote(server,
- query->nick_server,
- query->nick_server,
- 706)) {
- /* Create connection and handle the query after connection */
- SILC_LOG_DEBUG(("Create dynamic connection to %s:%d",
- query->nick_server, 706));
- silc_server_create_connection(server, FALSE, TRUE,
- query->nick_server, 706,
- silc_server_query_connected, query);
- return;
- }
- }
-
} else {
/* Parse the IDs included in the query */
query->ids = silc_calloc(argc, sizeof(*query->ids));
silc_free(query->ids);
query->ids = NULL;
query->ids_count = 0;
- return;
+ return FALSE;
}
}
}
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
/* Get the nickname@server string and parse it */
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_BAD_NICKNAME, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
/* Check nickname */
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_BAD_NICKNAME, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
memset(query->nickname, 0, sizeof(query->nickname));
silc_snprintf(query->nickname, sizeof(query->nickname), "%s", tmp);
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_BAD_NICKNAME, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
memset(query->nickname, 0, sizeof(query->nickname));
silc_snprintf(query->nickname, sizeof(query->nickname), "%s", tmp);
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_BAD_SERVER, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
query->server_name = tmp;
}
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_BAD_CHANNEL, 0);
silc_server_query_free(query);
- return;
+ return FALSE;
}
query->channel_name = tmp;
}
silc_server_query_send_error(server, query,
SILC_STATUS_ERR_NOT_ENOUGH_PARAMS, 0);
silc_server_query_free(query);
- return;
- }
-
- /* Check server name. If we are open server and don't yet have
- connection to remote router, create it now. */
- if (query->nick_server[0] && server->config->open_server &&
- !query->resolved) {
- /* If primary router is specified, use that. Otherwise connect
- to the server in nick@server string. */
- SilcServerConfigRouter *router;
-
- router = silc_server_config_get_primary_router(server);
- if (router && server->standalone) {
- /* Create connection to primary router */
- SILC_LOG_DEBUG(("Create dynamic connection to primary router %s:%d",
- router->host, router->port));
- query->dynamic_prim = TRUE;
- silc_server_create_connection(server, FALSE, TRUE,
- router->host, router->port,
- silc_server_query_connected, query);
- return;
- } else if (!silc_server_num_sockets_by_remote(server,
- query->nick_server,
- query->nick_server,
- 706)) {
- /* Create connection and handle the query after connection */
- SILC_LOG_DEBUG(("Create dynamic connection to %s:%d",
- query->nick_server, 706));
- silc_server_create_connection(server, FALSE, TRUE,
- query->nick_server, 706,
- silc_server_query_connected, query);
- return;
- }
+ return FALSE;
}
} else {
silc_free(query->ids);
query->ids = NULL;
query->ids_count = 0;
- return;
+ return FALSE;
}
}
} else {
silc_free(query->ids);
query->ids = NULL;
query->ids_count = 0;
- return;
+ return FALSE;
}
}
break;
}
+ query->parsed = TRUE;
+
+ parsed:
+ if (!parse_only && query->nickname) {
+ switch (query->querycmd) {
+ case SILC_COMMAND_WHOIS:
+ case SILC_COMMAND_IDENTIFY:
+ /* Check server name. If we are open server and don't yet have
+ connection to remote router, create it now. */
+ if (query->nick_server[0] && server->config->dynamic_server &&
+ !query->resolved) {
+ /* If primary router is specified, use that. Otherwise connect
+ to the server in nick@server string. */
+ SilcServerConfigRouter *router;
+
+ router = silc_server_config_get_primary_router(server);
+ if (router && server->standalone) {
+ /* Create connection to primary router */
+ SILC_LOG_DEBUG(("Create dynamic connection to primary router %s:%d",
+ router->host, router->port));
+ query->dynamic_prim = TRUE;
+ silc_server_create_connection(server, FALSE, TRUE,
+ router->host, router->port,
+ silc_server_query_connected, query);
+ return FALSE;
+ } else if (!silc_server_num_sockets_by_remote(server,
+ query->nick_server,
+ query->nick_server,
+ 706)) {
+ /* Create connection and handle the query after connection */
+ SILC_LOG_DEBUG(("Create dynamic connection to %s:%d",
+ query->nick_server, 706));
+ silc_server_create_connection(server, FALSE, TRUE,
+ query->nick_server, 706,
+ silc_server_query_connected, query);
+ return FALSE;
+ }
+ }
+ }
+ }
+
/* Start processing the query information */
- silc_server_query_process(server, query, TRUE);
+ if (!parse_only)
+ silc_server_query_process(server, query, TRUE);
+
+ return TRUE;
}
/* Context for holding clients searched by public key. */