Fixed founder mode chaning in JOIN and CUMODE_CHANGE notifys.
[silc.git] / apps / silcd / server_internal.h
index 7a6a9253c6bcb7b02b23a03696bdea81cc64ef09..f0984f40b7606ce638cc359bcdfb49e2e867e50a 100644 (file)
@@ -29,8 +29,9 @@ typedef struct {
   SilcUInt32 my_servers;                 /* Locally connected servers */
   SilcUInt32 my_routers;                 /* Locally connected routers */
   SilcUInt32 my_channels;                /* Locally created channels */
-  SilcUInt32 my_chanclients;     /* Local clients on local channels */
-  SilcUInt32 my_aways;           /* Local clients away (XXX) */
+  SilcUInt32 my_chanclients;             /* Local clients on local channels */
+  SilcUInt32 my_aways;                   /* Local clients away (gone) */
+  SilcUInt32 my_detached;                /* Local clients detached */
   SilcUInt32 my_server_ops;              /* Local server operators */
   SilcUInt32 my_router_ops;              /* Local router operators */
 
@@ -38,12 +39,14 @@ typedef struct {
   SilcUInt32 cell_clients;               /* All clients in cell */
   SilcUInt32 cell_servers;               /* All servers in cell */
   SilcUInt32 cell_channels;              /* All channels in cell */
-  SilcUInt32 cell_chanclients;   /* All clients on cell's channels */
-  SilcUInt32 clients;            /* All clients */
-  SilcUInt32 servers;            /* All servers */
-  SilcUInt32 routers;            /* All routers */
-  SilcUInt32 channels;           /* All channels */
+  SilcUInt32 cell_chanclients;           /* All clients on cell's channels */
+  SilcUInt32 clients;                    /* All clients */
+  SilcUInt32 servers;                    /* All servers */
+  SilcUInt32 routers;                    /* All routers */
+  SilcUInt32 channels;                   /* All channels */
   SilcUInt32 chanclients;                /* All clients on channels */
+  SilcUInt32 aways;                      /* All clients away (gone) */
+  SilcUInt32 detached;                   /* All clients detached */
   SilcUInt32 server_ops;                 /* All server operators */
   SilcUInt32 router_ops;                 /* All router operators */
 
@@ -53,7 +56,7 @@ typedef struct {
   SilcUInt32 auth_attempts;              /* Authentication attempts */
   SilcUInt32 auth_failures;              /* Authentication failures */
   SilcUInt32 packets_sent;               /* Sent packets */
-  SilcUInt32 packets_received;   /* Received packets */
+  SilcUInt32 packets_received;           /* Received packets */
 } SilcServerStatistics;
 
 /*
@@ -62,28 +65,28 @@ typedef struct {
 */
 struct SilcServerStruct {
   char *server_name;
-  int server_type;
   int sock;
+  SilcServerEntry id_entry;
   SilcServerID *id;
   unsigned char *id_string;
   SilcUInt32 id_string_len;
-  SilcIdType id_type;
-
   SilcUInt32 starttime;
-  bool standalone;                  /* TRUE if server is standalone, and
+
+  unsigned int server_type    : 2;   /* Server type (server.h) */
+  unsigned int standalone     : 1;   /* Set if server is standalone, and
                                        does not have connection to network. */
-  bool listenning;                  /* TRUE if server is listenning for
+  unsigned int listenning     : 1;   /* Set if server is listenning for
                                        incoming connections. */
-  bool background;
-  SilcServerEntry id_entry;         /* Server's own ID entry */
+  unsigned int background     : 1;   /* Set when server is on background */
+  unsigned int backup_router  : 1;   /* Set if this is backup router */
+  unsigned int backup_primary : 1;   /* Set if we've switched our primary
+                                       router to a backup router. */
+
   SilcServerEntry router;           /* Pointer to the primary router */
   unsigned long router_connect;             /* Time when router was connected */
+  SilcServerConnection router_conn;  /* non-NULL when connecting to the
+                                       primary router, and NULL otherwise. */
   SilcServerBackup backup;          /* Backup routers */
-  bool backup_router;               /* TRUE if this is backup router */
-  bool backup_primary;              /* TRUE if we've switched our primary
-                                       router to a backup router. */
-  SilcServerConnection router_conn; /* non-NULL when connecting to the
-                                      primary router, and NULL otherwise. */
 
   /* Current command identifier, 0 not used */
   SilcUInt16 cmd_ident;
@@ -94,6 +97,7 @@ struct SilcServerStruct {
   /* ID lists. */
   SilcIDList local_list;
   SilcIDList global_list;
+  SilcHashTable watcher_list;
 
   /* Table of connected sockets */
   SilcSocketConnection *sockets;
@@ -125,6 +129,10 @@ struct SilcServerStruct {
   /* Pending command queue */
   SilcDList pending_commands;
 
+  /* Purge context for disconnected clients */
+  SilcIDListPurge purge_i;
+  SilcIDListPurge purge_g;
+
 #ifdef SILC_SIM
   /* SIM (SILC Module) list */
   SilcDList sim;
@@ -176,6 +184,7 @@ do {                                                \
       server->stat.my_ ## type ## _ops--;      \
     if (server->server_type == SILC_ROUTER)    \
       server->stat. type ## _ops--;            \
+    (c)->mode &= ~(mod);                       \
   }                                            \
 } while(0)
 
@@ -208,5 +217,7 @@ do {                                                \
 
 /* Prototypes */
 SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final);
+void silc_server_watcher_list_destroy(void *key, void *context,
+                                     void *user_context);
 
 #endif