Added SilcIDListData structure and added it to ClientEntry and
[silc.git] / apps / silcd / server.h
1 /*
2
3   server.h
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 1997 - 2000 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13   
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20
21 #ifndef SERVER_H
22 #define SERVER_H
23
24 /* Forward declaration for SILC Server object. The actual object is
25    defined in internal header file for server routines. I want to keep
26    the object private hence this declaration. */
27 typedef struct SilcServerStruct *SilcServer;
28
29 #define SILC_SERVER_MAX_CONNECTIONS 10000
30
31 /* General definitions */
32
33 /* Server and router. Used internally by the code. */
34 #define SILC_SERVER 0
35 #define SILC_ROUTER 1
36
37 /* Connection retry timeout. We implement exponential backoff algorithm
38    in connection retry. The interval of timeuot grows when retry count
39    grows. */
40 #define SILC_SERVER_RETRY_COUNT        4         /* Max retry count */
41 #define SILC_SERVER_RETRY_MULTIPLIER   7 / 4     /* Interval growth */
42 #define SILC_SERVER_RETRY_RANDOMIZER   2         /* timeout += rnd % 2 */
43 #define SILC_SERVER_RETRY_INTERVAL_MIN 10        /* Min retry timeout */
44 #define SILC_SERVER_RETRY_INTERVAL_MAX 600       /* Max generated timeout */
45
46 /* 
47    Silc Server Params.
48
49    Structure to hold various default parameters for server that can be
50    given before running the server. 
51
52 */
53 typedef struct {
54   unsigned int retry_count;
55   unsigned long retry_interval_min;
56   unsigned long retry_interval_min_usec;
57   unsigned long retry_interval_max;
58   unsigned int retry_keep_trying;
59
60   unsigned long protocol_timeout;
61   unsigned long protocol_timeout_usec;
62 } *SilcServerParams;
63
64 /* Macros */
65
66 /* This macro is used to send notify messages with formatted string. The
67    string is formatted with arguments and the formatted string is sent as
68    argument. */
69 #define SILC_SERVER_SEND_NOTIFY(server, sock, type, fmt)                    \
70 do {                                                                        \
71   char *__fmt__ = silc_format fmt;                                          \
72   silc_server_send_notify(server, sock, type, 1, __fmt__, strlen(__fmt__)); \
73   silc_free(__fmt__);                                                       \
74 } while(0);
75
76 /* Prototypes */
77 int silc_server_alloc(SilcServer *new_server);
78 void silc_server_free(SilcServer server);
79 int silc_server_init(SilcServer server);
80 void silc_server_run(SilcServer server);
81 void silc_server_stop(SilcServer server);
82 void silc_server_packet_parse(SilcPacketParserContext *parser_context);
83 void silc_server_packet_parse_type(SilcServer server, 
84                                    SilcSocketConnection sock,
85                                    SilcPacketContext *packet);
86 void silc_server_packet_send(SilcServer server,
87                              SilcSocketConnection sock, 
88                              SilcPacketType type, 
89                              SilcPacketFlags flags,
90                              unsigned char *data, 
91                              unsigned int data_len,
92                              int force_send);
93 void silc_server_packet_send_dest(SilcServer server,
94                                   SilcSocketConnection sock, 
95                                   SilcPacketType type, 
96                                   SilcPacketFlags flags,
97                                   void *dst_id,
98                                   SilcIdType dst_id_type,
99                                   unsigned char *data, 
100                                   unsigned int data_len,
101                                   int force_send);
102 void silc_server_packet_forward(SilcServer server,
103                                 SilcSocketConnection sock,
104                                 unsigned char *data, unsigned int data_len,
105                                 int force_send);
106 void silc_server_packet_send_to_channel(SilcServer server,
107                                         SilcChannelEntry channel,
108                                         SilcPacketType type,
109                                         unsigned char *data,
110                                         unsigned int data_len,
111                                         int force_send);
112 void silc_server_packet_relay_to_channel(SilcServer server,
113                                          SilcSocketConnection sender_sock,
114                                          SilcChannelEntry channel,
115                                          void *sender, 
116                                          SilcIdType sender_type,
117                                          unsigned char *data,
118                                          unsigned int data_len,
119                                          int force_send);
120 void silc_server_packet_send_local_channel(SilcServer server,
121                                            SilcChannelEntry channel,
122                                            SilcPacketType type,
123                                            SilcPacketFlags flags,
124                                            unsigned char *data,
125                                            unsigned int data_len,
126                                            int force_send);
127 void silc_server_packet_relay_command_reply(SilcServer server,
128                                             SilcSocketConnection sock,
129                                             SilcPacketContext *packet);
130 void silc_server_close_connection(SilcServer server,
131                                   SilcSocketConnection sock);
132 void silc_server_free_sock_user_data(SilcServer server, 
133                                      SilcSocketConnection sock);
134 void silc_server_remove_from_channels(SilcServer server, 
135                                       SilcSocketConnection sock,
136                                       SilcClientEntry client);
137 int silc_server_remove_from_one_channel(SilcServer server, 
138                                         SilcSocketConnection sock,
139                                         SilcChannelEntry channel,
140                                         SilcClientEntry client,
141                                         int notify);
142 int silc_server_client_on_channel(SilcClientEntry client,
143                                   SilcChannelEntry channel);
144 void silc_server_disconnect_remote(SilcServer server,
145                                    SilcSocketConnection sock,
146                                    const char *fmt, ...);
147 void silc_server_private_message(SilcServer server,
148                                  SilcSocketConnection sock,
149                                  SilcPacketContext *packet);
150 void silc_server_channel_message(SilcServer server,
151                                  SilcSocketConnection sock,
152                                  SilcPacketContext *packet);
153 void silc_server_channel_key(SilcServer server,
154                              SilcSocketConnection sock,
155                              SilcPacketContext *packet);
156 void silc_server_send_motd(SilcServer server,
157                            SilcSocketConnection sock);
158 void silc_server_send_error(SilcServer server,
159                             SilcSocketConnection sock,
160                             const char *fmt, ...);
161 void silc_server_send_notify(SilcServer server,
162                              SilcSocketConnection sock,
163                              SilcNotifyType type,
164                              unsigned int argc, ...);
165 void silc_server_send_notify_dest(SilcServer server,
166                                   SilcSocketConnection sock,
167                                   void *dest_id,
168                                   SilcIdType dest_id_type,
169                                   SilcNotifyType type,
170                                   unsigned int argc, ...);
171 void silc_server_send_notify_to_channel(SilcServer server,
172                                         SilcChannelEntry channel,
173                                         SilcNotifyType type,
174                                         unsigned int argc, ...);
175 void silc_server_send_notify_on_channels(SilcServer server,
176                                          SilcClientEntry client,
177                                          SilcNotifyType type,
178                                          unsigned int argc, ...);
179 void silc_server_send_new_id(SilcServer server,
180                              SilcSocketConnection sock,
181                              int broadcast,
182                              void *id, SilcIdType id_type, 
183                              unsigned int id_len);
184 void silc_server_send_replace_id(SilcServer server,
185                                  SilcSocketConnection sock,
186                                  int broadcast,
187                                  void *old_id, SilcIdType old_id_type,
188                                  unsigned int old_id_len,
189                                  void *new_id, SilcIdType new_id_type,
190                                  unsigned int new_id_len);
191 void silc_server_send_remove_channel_user(SilcServer server,
192                                           SilcSocketConnection sock,
193                                           int broadcast,
194                                           void *client_id, void *channel_id);
195 void silc_server_replace_id(SilcServer server,
196                             SilcSocketConnection sock,
197                             SilcPacketContext *packet);
198 SilcChannelEntry silc_server_new_channel(SilcServer server, 
199                                          SilcServerID *router_id,
200                                          char *cipher, char *channel_name);
201 SilcClientEntry silc_server_new_client(SilcServer server,
202                                        SilcSocketConnection sock,
203                                        SilcPacketContext *packet);
204 SilcServerEntry silc_server_new_server(SilcServer server,
205                                        SilcSocketConnection sock,
206                                        SilcPacketContext *packet);
207 void silc_server_new_id(SilcServer server, SilcSocketConnection sock,
208                         SilcPacketContext *packet);
209 void silc_server_remove_channel_user(SilcServer server,
210                                      SilcSocketConnection sock,
211                                      SilcPacketContext *packet);
212
213 #endif