static SilcServer silcd;
static void silc_usage(void);
-static char *silc_server_create_identifier(void);
-static int silc_server_create_key_pair(char *pkcs_name, int bits, char *path,
- char *identifier,
- SilcPublicKey *ret_pub_key,
- SilcPrivateKey *ret_prv_key);
/* Long command line options */
static struct option long_opts[] =
#undef STAT_OUTPUT
+#ifdef SILC_DEBUG
+ /* Dump lists */
+ {
+ SilcIDCacheList list = NULL;
+ SilcIDCacheEntry id_cache = NULL;
+ SilcServerEntry server_entry;
+ SilcClientEntry client_entry;
+ SilcChannelEntry channel_entry;
+ int c;
+
+ fprintf(fdd, "\nDumping databases\n");
+
+ if (silc_idcache_get_all(silcd->local_list->servers, &list)) {
+ if (silc_idcache_list_first(list, &id_cache)) {
+ fprintf(fdd, "\nServers in local-list:\n");
+ c = 1;
+ while (id_cache) {
+ server_entry = (SilcServerEntry)id_cache->context;
+ fprintf(fdd, " %d: name %s id %s status 0x%x\n", c,
+ server_entry->server_name ? server_entry->server_name :
+ "N/A", server_entry->id ?
+ silc_id_render(server_entry->id, SILC_ID_SERVER) : "N/A",
+ server_entry->data.status);
+ if (!silc_idcache_list_next(list, &id_cache))
+ break;
+ c++;
+ }
+ }
+ silc_idcache_list_free(list);
+ }
+ if (silc_idcache_get_all(silcd->global_list->servers, &list)) {
+ if (silc_idcache_list_first(list, &id_cache)) {
+ fprintf(fdd, "\nServers in global-list:\n");
+ c = 1;
+ while (id_cache) {
+ server_entry = (SilcServerEntry)id_cache->context;
+ fprintf(fdd, " %d: name %s id %s status 0x%x\n", c,
+ server_entry->server_name ? server_entry->server_name :
+ "N/A", server_entry->id ?
+ silc_id_render(server_entry->id, SILC_ID_SERVER) : "N/A",
+ server_entry->data.status);
+ if (!silc_idcache_list_next(list, &id_cache))
+ break;
+ c++;
+ }
+ }
+ silc_idcache_list_free(list);
+ }
+ if (silc_idcache_get_all(silcd->local_list->clients, &list)) {
+ if (silc_idcache_list_first(list, &id_cache)) {
+ fprintf(fdd, "\nClients in local-list:\n");
+ c = 1;
+ while (id_cache) {
+ client_entry = (SilcClientEntry)id_cache->context;
+ fprintf(fdd, " %d: name %s id %s status 0x%x\n", c,
+ client_entry->nickname ? client_entry->nickname :
+ (unsigned char *)"N/A", client_entry->id ?
+ silc_id_render(client_entry->id, SILC_ID_CLIENT) : "N/A",
+ client_entry->data.status);
+ if (!silc_idcache_list_next(list, &id_cache))
+ break;
+ c++;
+ }
+ }
+ silc_idcache_list_free(list);
+ }
+ if (silc_idcache_get_all(silcd->global_list->clients, &list)) {
+ if (silc_idcache_list_first(list, &id_cache)) {
+ fprintf(fdd, "\nClients in global-list:\n");
+ c = 1;
+ while (id_cache) {
+ client_entry = (SilcClientEntry)id_cache->context;
+ fprintf(fdd, " %d: name %s id %s status 0x%x\n", c,
+ client_entry->nickname ? client_entry->nickname :
+ (unsigned char *)"N/A", client_entry->id ?
+ silc_id_render(client_entry->id, SILC_ID_CLIENT) : "N/A",
+ client_entry->data.status);
+ if (!silc_idcache_list_next(list, &id_cache))
+ break;
+ c++;
+ }
+ }
+ silc_idcache_list_free(list);
+ }
+ if (silc_idcache_get_all(silcd->local_list->channels, &list)) {
+ if (silc_idcache_list_first(list, &id_cache)) {
+ fprintf(fdd, "\nChannels in local-list:\n");
+ c = 1;
+ while (id_cache) {
+ channel_entry = (SilcChannelEntry)id_cache->context;
+ fprintf(fdd, " %d: name %s id %s\n", c,
+ channel_entry->channel_name ? channel_entry->channel_name :
+ "N/A", channel_entry->id ?
+ silc_id_render(channel_entry->id, SILC_ID_CHANNEL) : "N/A");
+ if (!silc_idcache_list_next(list, &id_cache))
+ break;
+ c++;
+ }
+ }
+ silc_idcache_list_free(list);
+ }
+ if (silc_idcache_get_all(silcd->global_list->channels, &list)) {
+ if (silc_idcache_list_first(list, &id_cache)) {
+ fprintf(fdd, "\nChannels in global-list:\n");
+ c = 1;
+ while (id_cache) {
+ channel_entry = (SilcChannelEntry)id_cache->context;
+ fprintf(fdd, " %d: name %s id %s\n", c,
+ channel_entry->channel_name ? channel_entry->channel_name :
+ "N/A", channel_entry->id ?
+ silc_id_render(channel_entry->id, SILC_ID_CHANNEL) : "N/A");
+ if (!silc_idcache_list_next(list, &id_cache))
+ break;
+ c++;
+ }
+ }
+ silc_idcache_list_free(list);
+ }
+ }
+#endif
+
fflush(fdd);
fclose(fdd);
}
}
}
-/* This function should not be called directly but thru the wrapper
- macro SILC_SERVER_LOG_STDERR() */
+/* This function should not be called directly but through the appropriate
+ wrapper macro defined in server.h */
-void silc_server_stderr(char *message)
+void silc_server_stderr(SilcLogType type, char *message)
{
if (silcd->background) {
char *p, *n = message;
}
*n = 0;
- silc_log_output(SILC_LOG_ERROR, message);
+ /* the message is freed inside the logging function */
+ silc_log_output(type, message);
}
else {
fprintf(stderr, "%s\n", message);
if (opt_create_keypair == TRUE) {
/* Create new key pair and exit */
+ char pubfile[256], prvfile[256];
+
+ memset(pubfile, 0, sizeof(pubfile));
+ memset(prvfile, 0, sizeof(prvfile));
+ snprintf(pubfile, sizeof(pubfile) - 1, "%s/silcd.pub", opt_keypath);
+ snprintf(prvfile, sizeof(prvfile) - 1, "%s/silcd.prv", opt_keypath);
+
silc_cipher_register_default();
silc_pkcs_register_default();
silc_hash_register_default();
silc_hmac_register_default();
- silc_server_create_key_pair(opt_pkcs, opt_bits, opt_keypath,
- opt_identifier, NULL, NULL);
+ silc_create_key_pair(opt_pkcs, opt_bits, pubfile, prvfile,
+ opt_identifier, "", NULL, NULL, NULL, FALSE);
exit(0);
}
if (ret == FALSE)
goto fail;
+ /* Register default crypto stuff since we are going to need them
+ in the configuration file parsing phase */
+ silc_cipher_register_default();
+ silc_pkcs_register_default();
+ silc_hash_register_default();
+ silc_hmac_register_default();
+
/* Read configuration files */
silcd->config = silc_server_config_alloc(silcd_config_file);
if (silcd->config == NULL)
goto fail;
silcd->config_file = silcd_config_file;
+ /* Unregister the default crypto stuff so that configuration takes effect */
+ silc_cipher_unregister_all();
+ silc_pkcs_unregister_all();
+ silc_hash_unregister_all();
+ silc_hmac_unregister_all();
+
/* Check for another silcd running */
silc_server_checkpid(silcd);
silc_free(opt_keypath);
exit(1);
}
-
-/* Returns identifier string for public key generation. */
-
-static char *silc_server_create_identifier(void)
-{
- char *username = NULL, *realname = NULL;
- char hostname[256], email[256];
-
- /* Get realname */
- realname = silc_get_real_name();
-
- /* Get hostname */
- memset(hostname, 0, sizeof(hostname));
- gethostname(hostname, sizeof(hostname));
-
- /* Get username (mandatory) */
- username = silc_get_username();
- if (!username)
- return NULL;
-
- /* Create default email address, whether it is right or not */
- snprintf(email, sizeof(email), "%s@%s", username, hostname);
-
- return silc_pkcs_encode_identifier(username, hostname, realname, email,
- NULL, NULL);
-}
-
-/* Creates new public key and private key pair. This is used only
- when user wants to create new key pair from command line. */
-
-static int
-silc_server_create_key_pair(char *pkcs_name, int bits, char *path,
- char *identifier,
- SilcPublicKey *ret_pub_key,
- SilcPrivateKey *ret_prv_key)
-{
- SilcPKCS pkcs;
- SilcPublicKey pub_key;
- SilcPrivateKey prv_key;
- SilcRng rng;
- unsigned char *key;
- SilcUInt32 key_len;
- char pkfile[256], prvfile[256];
-
- if (!pkcs_name || !path)
- return FALSE;
-
- if (!silc_pkcs_is_supported(pkcs_name)) {
- fprintf(stderr, "Unsupported PKCS `%s'", pkcs_name);
- return FALSE;
- }
-
- if (!bits)
- bits = 2048;
-
- if (!identifier)
- identifier = silc_server_create_identifier();
-
- rng = silc_rng_alloc();
- silc_rng_init(rng);
- silc_rng_global_init(rng);
-
- snprintf(pkfile, sizeof(pkfile) - 1, "%s%s", path,
- SILC_SERVER_PUBLIC_KEY_NAME);
- snprintf(prvfile, sizeof(prvfile) - 1, "%s%s", path,
- SILC_SERVER_PRIVATE_KEY_NAME);
-
- /* Generate keys */
- silc_pkcs_alloc(pkcs_name, &pkcs);
- silc_pkcs_generate_key(pkcs, bits, rng);
-
- /* Save public key into file */
- key = silc_pkcs_get_public_key(pkcs, &key_len);
- pub_key = silc_pkcs_public_key_alloc(silc_pkcs_get_name(pkcs), identifier,
- key, key_len);
- silc_pkcs_save_public_key(pkfile, pub_key, SILC_PKCS_FILE_PEM);
- if (ret_pub_key)
- *ret_pub_key = pub_key;
- else
- silc_pkcs_public_key_free(pub_key);
-
- memset(key, 0, sizeof(key_len));
- silc_free(key);
-
- /* Save private key into file */
- key = silc_pkcs_get_private_key(pkcs, &key_len);
- prv_key = silc_pkcs_private_key_alloc(silc_pkcs_get_name(pkcs),
- key, key_len);
- silc_pkcs_save_private_key(prvfile, prv_key, NULL, SILC_PKCS_FILE_BIN);
- if (ret_prv_key)
- *ret_prv_key = prv_key;
- else
- silc_pkcs_private_key_free(prv_key);
-
- printf("Public key has been saved into `%s'\n", pkfile);
- printf("Private key has been saved into `%s'\n", prvfile);
-
- memset(key, 0, sizeof(key_len));
- silc_free(key);
-
- silc_rng_free(rng);
- silc_pkcs_free(pkcs);
-
- return TRUE;
-}