Code auditing weekend results and fixes committing.
[silc.git] / apps / silcd / idlist.h
index aa444f46f59b78a92ad7f440f83780407bbf4ea2..6b865eb957a0dfd9d41711020683c836beab9c6a 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
 
-  Copyright (C) 1997 - 2000 Pekka Riikonen
+  Copyright (C) 1997 - 2001 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
@@ -26,6 +26,39 @@ typedef struct SilcServerEntryStruct *SilcServerEntry;
 typedef struct SilcClientEntryStruct *SilcClientEntry;
 typedef struct SilcChannelEntryStruct *SilcChannelEntry;
 
+/*
+   Generic ID list data structure.
+
+   This structure is included in all ID list entries and it includes data
+   pointers that are common to all ID entries.  This structure is always
+   defined to the first field in the ID entries and is used to explicitly
+   cast to this type without first explicitly casting to correct ID entry
+   type.  Hence, the ID list entry is casted to this type to get this data
+   from the ID entry (which is usually opaque pointer).
+
+   Note that some of the fields may be NULL.
+
+*/
+typedef struct {
+  /* Send and receive symmetric keys */
+  SilcCipher send_key;
+  SilcCipher receive_key;
+
+  /* HMAC and raw key data */
+  SilcHmac hmac;
+  unsigned char *hmac_key;
+  unsigned int hmac_key_len;
+
+  /* PKCS and public key */
+  SilcPKCS pkcs;
+  SilcPublicKey public_key;
+
+  unsigned short cmd_ident;  /* Current command identifier, 0 not used */
+  long last_receive;         /* Time last received data */
+  long last_sent;           /* Time last sent data */
+  unsigned char registered;  /* Boolean whether connection is registered */
+} *SilcIDListData, SilcIDListDataStruct;
+
 /* 
    SILC Server entry object.
 
@@ -45,6 +78,10 @@ typedef struct SilcChannelEntryStruct *SilcChannelEntry;
 
    Following short description of the fields:
 
+   SilcIDListDataStruct data
+
+       Generic data structure to hold data common to all ID entries.
+
    char *server_name
 
        Logical name of the server. There is no limit of the length of the
@@ -61,10 +98,6 @@ typedef struct SilcChannelEntryStruct *SilcChannelEntry;
        the server SILC will ever need. These are also the informations
        that is broadcasted between servers and routers in the SILC network.
 
-   long last_receive
-
-       Time when data was received from the server last time.
-
    SilcServerEntry router
 
        This is a pointer back to the server list. This is the router server 
@@ -85,30 +118,58 @@ typedef struct SilcChannelEntryStruct *SilcChannelEntry;
    
 */
 struct SilcServerEntryStruct {
+  /* Generic data structure. DO NOT add anything before this! */
+  SilcIDListDataStruct data;
+
   char *server_name;
   int server_type;
   SilcServerID *id;
-  long last_receive;
-
-  /* TRUE when server is registered to server */
-  int registered;
 
   /* Pointer to the router */
   SilcServerEntry router;
 
-  /* Keys */
-  SilcCipher send_key;
-  SilcCipher receive_key;
-  SilcPKCS pkcs;
-  SilcPublicKey public_key;
-  SilcHmac hmac;
-  unsigned char *hmac_key;
-  unsigned int hmac_key_len;
-
   /* Connection data */
   void *connection;
 };
 
+/* 
+   SILC Channel Client entry structure.
+
+   This entry used only by the SilcChannelEntry object and it holds
+   information about current clients (ie. users) on channel. Following
+   short description  of the fields:
+
+   SilcClientEntry client
+
+       Pointer to the client list. This is the client currently on channel.
+
+   unsigned int mode
+
+       Client's current mode on the channel.
+
+   SilcChannelEntry channel
+
+       Back pointer back to channel. As this structure is also used by
+       SilcClientEntry we have this here for fast access to the channel when
+       used by SilcClientEntry.
+
+  struct SilcChannelClientEntryStruct *client_list
+  struct SilcChannelClientEntryStruct *channel_list
+
+       List member pointers. This structure is used by channel entry and
+       client entry thus we must have separate list member pointers for
+       them since we are using same entry for both lists (the entry is not
+       duplicated). SilcList requires this.
+
+*/
+typedef struct SilcChannelClientEntryStruct {
+  SilcClientEntry client;
+  unsigned int mode;
+  SilcChannelEntry channel;
+  struct SilcChannelClientEntryStruct *client_list;
+  struct SilcChannelClientEntryStruct *channel_list;
+} *SilcChannelClientEntry;
+
 /* 
    SILC Client entry object.
 
@@ -127,6 +188,10 @@ struct SilcServerEntryStruct {
 
    Following short description of the fields:
 
+   SilcIDListDataStruct data
+
+       Generic data structure to hold data common to all ID entries.
+
    char username
 
        Client's (meaning user's) real name. This is defined in following 
@@ -171,23 +236,12 @@ struct SilcServerEntryStruct {
        Client's mode.  Client maybe for example server operator or
        router operator (SILC operator).
 
-   long last_receive
-
-       Time of last time data was received from the client. This is
-       result of normal time().
-
    long last_command
 
        Time of last time client executed command. We are strict and will
        not allow any command to be exeucted more than once in about
        2 seconds. This is result of normal time().
 
-   int registered
-
-       Boolean value to indicate whether this client has registered itself
-       to the server. After KE and authentication protocols has been
-       successfully completed will client become registered.
-
    SilcServerEntry router
 
        This is a pointer to the server list. This is the router server whose 
@@ -216,59 +270,27 @@ struct SilcServerEntryStruct {
 
 */
 struct SilcClientEntryStruct {
-  char *nickname;
+  /* Generic data structure. DO NOT add anything before this! */
+  SilcIDListDataStruct data;
+
+  unsigned char *nickname;
   char *username;
   char *userinfo;
   SilcClientID *id;
   int mode;
 
-  /* Time of last accesses of the client */
-  long last_receive;
   long last_command;
 
-  /* TRUE when client is registered to server */
-  int registered;
-
   /* Pointer to the router */
   SilcServerEntry router;
 
   /* List of channels client has joined to */
-  SilcChannelEntry *channel;
-  unsigned int channel_count;
-
-  /* Keys */
-  SilcCipher send_key;
-  SilcCipher receive_key;
-  SilcPKCS pkcs;
-  SilcHmac hmac;
-  SilcPublicKey public_key;
+  SilcList channels;
 
   /* Connection data */
   void *connection;
 };
 
-/* 
-   SILC Channel Client entry structure.
-
-   This entry used only by the SilcChannelEntry object and it holds
-   information about current clients (ie. users) on channel. Following
-   short description  of the fields:
-
-   SilcClientEntry client
-
-       Pointer to the client list. This is the client currently on channel.
-
-   unsigned int mode
-
-       Client's current mode on the channel.
-
-*/
-typedef struct SilcChannelClientEntryStruct {
-  SilcClientEntry client;
-  unsigned int mode;
-  struct SilcChannelClientEntryStruct *next;
-} *SilcChannelClientEntry;
-
 /* 
    SILC Channel entry object.
 
@@ -415,7 +437,7 @@ typedef struct SilcIDListStruct {
 } *SilcIDList;
 
 /*
-   Temporary ID Entry object.
+   ID Entry for Unknown connections.
 
    This is used during authentication phases where we still don't know 
    what kind of connection remote connection is, hence, we will use this
@@ -426,50 +448,47 @@ typedef struct SilcIDListStruct {
 
 */
 typedef struct {
-  SilcCipher send_key;
-  SilcCipher receive_key;
-  SilcPKCS pkcs;
-  SilcPublicKey public_key;
-
-  SilcHmac hmac;
-  unsigned char *hmac_key;
-  unsigned int hmac_key_len;
-
-  /* SilcComp comp */
+  /* Generic data structure. DO NOT add anything before this! */
+  SilcIDListDataStruct data;
 } *SilcUnknownEntry;
 
 /* Prototypes */
+void silc_idlist_add_data(void *entry, SilcIDListData idata);
+void silc_idlist_del_data(void *entry);
 SilcServerEntry 
 silc_idlist_add_server(SilcIDList id_list, 
                       char *server_name, int server_type,
                       SilcServerID *id, SilcServerEntry router,
-                      SilcCipher send_key, SilcCipher receive_key,
-                      SilcPKCS pkcs, SilcHmac hmac, 
-                      SilcPublicKey public_key, void *connection);
+                      void *connection);
 SilcServerEntry
-silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id);
+silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id,
+                             SilcIDCacheEntry *ret_entry);
 SilcServerEntry
 silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
                              SilcServerID *new_id);
+void silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
 SilcClientEntry
-silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username,
-                      char *userinfo, SilcClientID *id, 
-                      SilcServerEntry router,
-                      SilcCipher send_key, SilcCipher receive_key,
-                      SilcPKCS pkcs, SilcHmac hmac, 
-                      SilcPublicKey public_key, void *connection);
+silc_idlist_add_client(SilcIDList id_list, unsigned char *nickname, 
+                      char *username, char *userinfo, SilcClientID *id, 
+                      SilcServerEntry router, void *connection);
 void silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
 SilcClientEntry *
 silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
                                    char *server, unsigned int *clients_count);
+SilcClientEntry *
+silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
+                               SilcHash md5hash,
+                               unsigned int *clients_count);
 SilcClientEntry
 silc_idlist_find_client_by_nickname(SilcIDList id_list, char *nickname,
-                                   char *server);
+                                   char *server,
+                                   SilcIDCacheEntry *ret_entry);
 SilcClientEntry
 silc_idlist_find_client_by_hash(SilcIDList id_list, char *nickname,
-                               SilcHash md5hash);
+                               SilcHash md5hash, SilcIDCacheEntry *ret_entry);
 SilcClientEntry
-silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id);
+silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id,
+                             SilcIDCacheEntry *ret_entry);
 SilcClientEntry
 silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id,
                              SilcClientID *new_id);
@@ -479,8 +498,10 @@ silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
                        SilcCipher channel_key);
 void silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry);
 SilcChannelEntry
-silc_idlist_find_channel_by_name(SilcIDList id_list, char *name);
+silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
+                                SilcIDCacheEntry *ret_entry);
 SilcChannelEntry
-silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id);
+silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id,
+                              SilcIDCacheEntry *ret_entry);
 
 #endif