#include "server.h"
Go to the source code of this file.
Functions | |
int | server_script_init () |
int | server_script_destroy () |
void | connect_to_next_server () |
void | dequeue_messages () |
int | server_support (const char *name, const char **value) |
static int | server_secondly () |
static int | server_status (partymember_t *p, const char *text) |
static int | server_config_save (const char *handle) |
static int | server_close (int why) |
static void | server_config_init () |
EXPORT_SCOPE int | start (egg_module_t *modinfo) |
Variables | |
static const char | rcsid [] = "$Id: server.c,v 1.68 2007-09-13 22:20:57 sven Exp $" |
current_server_t | current_server = {0} |
server_config_t | server_config = {0} |
event_owner_t | server_owner |
int | cycle_delay = 0 |
bind_list_t | server_raw_binds [] |
bind_list_t | server_party_commands [] |
static config_var_t | server_config_vars [] |
void connect_to_next_server | ( | ) |
Definition at line 44 of file servsock.c.
00044 { 00045 server_t *serv; 00046 00047 serv = server_get_next(); 00048 if (!serv) { 00049 putlog(LOG_MISC, "*", _("Error connecting to next server: no servers are defined!")); 00050 return; 00051 } 00052 00053 str_redup(¤t_server.server_host, serv->host); 00054 str_redup(¤t_server.server_self, serv->host); 00055 str_redup(¤t_server.pass, serv->pass); 00056 current_server.strcmp = strcasecmp; 00057 if (!server_config.fake005) server_config.fake005 = strdup(":fakeserver 005 fakenick MODES=3 MAXCHANNELS=10 MAXBANS=100 NICKLEN=9 TOPICLEN=307 KICKLEN=307 CHANTYPES=#& PREFIX=(ov)@+ NETWORK=fakenetwork CASEMAPPING=rfc1459 CHANMODES=b,k,l,imnprst :are available on this server"); 00058 00059 if (serv->port) current_server.port = serv->port; 00060 else current_server.port = server_config.default_port; 00061 00062 putlog(LOG_SERV, "*", _("Connecting to %s (%d)."), current_server.server_host, current_server.port); 00063 current_server.idx = egg_connect(current_server.server_host, current_server.port, server_config.connect_timeout); 00064 if (current_server.idx < 0) { 00065 putlog(LOG_SERV, "*", _("Error connecting to server.")); 00066 } 00067 sockbuf_set_handler(current_server.idx, &server_handler, NULL, NULL); 00068 }
void dequeue_messages | ( | ) |
Definition at line 213 of file output.c.
References do_output(), NULL, queue_append, queue_entry_cleanup, queue_entry_to_text, queue_t::queue_head, and queue_unlink.
00214 { 00215 queue_entry_t *q; 00216 queue_t *queue = NULL; 00217 int i, remaining, len; 00218 char *text, buf[1024]; 00219 00220 /* Choose which queue to select from. */ 00221 for (i = 0; i < 3; i++) { 00222 if (output_queues[i+3].queue_head) { 00223 queue = output_queues+i+3; 00224 break; 00225 } 00226 if (output_queues[i].queue_head) { 00227 queue = output_queues+i; 00228 break; 00229 } 00230 } 00231 00232 /* No messages to dequeue? */ 00233 if (!queue) return; 00234 00235 q = queue->queue_head; 00236 00237 /* Remove it from the queue. */ 00238 queue_unlink(queue, q); 00239 00240 /* Construct an irc message out of it. */ 00241 text = buf; 00242 remaining = sizeof(buf); 00243 queue_entry_to_text(q, text, &remaining); 00244 00245 /* Now we're done with q, so free anything we need to free and store it 00246 * in the unused queue. */ 00247 queue_entry_cleanup(q); 00248 queue_append(&unused_queue, q); 00249 00250 /* Make sure last 2 chars are \r\n and there's a space left for \0. */ 00251 if (remaining < 3) remaining = 3; 00252 len = sizeof(buf) - remaining; 00253 buf[len++] = '\r'; 00254 buf[len++] = '\n'; 00255 buf[len] = 0; 00256 00257 do_output(buf, len); 00258 }
static int server_close | ( | int | why | ) | [static] |
Definition at line 230 of file server.c.
References _, bind_rem_list(), bind_rem_simple(), channel_destroy, channel_events_destroy, config_get_root(), config_root, config_unlink_table(), cycle_delay, kill_server, nick_clear, NULL, server_binds_destroy, server_clear, server_config_save(), server_script_destroy, server_secondly(), server_status(), and uhost_cache_destroy.
00231 { 00232 void *config_root; 00233 00234 kill_server(_("server module unloading")); 00235 cycle_delay = 100; 00236 00237 config_root = config_get_root("eggdrop"); 00238 config_unlink_table(server_config_vars, config_root, "server", 0, NULL); 00239 00240 bind_rem_list("raw", server_raw_binds); 00241 //bind_rem_list("party", server_party_commands); 00242 bind_rem_simple("secondly", NULL, NULL, server_secondly); 00243 bind_rem_simple("status", NULL, NULL, server_status); 00244 bind_rem_simple("config_save", NULL, "eggdrop", server_config_save); 00245 00246 /* Clear the server and nick lists. */ 00247 server_clear(); 00248 nick_clear(); 00249 00250 server_binds_destroy(); 00251 00252 channel_destroy(); 00253 channel_events_destroy(); 00254 uhost_cache_destroy(); 00255 00256 server_script_destroy(); 00257 00258 return(0); 00259 }
static void server_config_init | ( | ) | [static] |
Definition at line 261 of file server.c.
References server_config_t::chanfile, server_config_t::chaninfo_items, config_exists(), config_get_int(), config_get_root(), config_get_str(), config_link_table(), config_root, config_update_table(), server_config_t::connect_timeout, server_config_t::cycle_delay, server_config_t::dcc_timeout, server_config_t::default_port, server_config_t::fake005, server_config_t::keepnick, server_config_t::max_line_len, nick_add, NULL, server_config_t::ping_timeout, server_config_t::realname, server_add, server_config_t::trigger_on_ignore, and server_config_t::user.
00262 { 00263 int i; 00264 char *host, *pass, *nickstr; 00265 int port; 00266 void *config_root, *server, *nick, *list; 00267 00268 /* Set default values. */ 00269 server_config.chanfile = strdup("channels.xml"); 00270 server_config.user = strdup("user"); 00271 server_config.realname = strdup("real name"); 00272 server_config.connect_timeout = 30; 00273 server_config.ping_timeout = 30; 00274 server_config.dcc_timeout = 30; 00275 server_config.trigger_on_ignore = 0; 00276 server_config.keepnick = 0; 00277 server_config.cycle_delay = 10; 00278 server_config.default_port = 6667; 00279 server_config.fake005 = NULL; 00280 server_config.max_line_len = 510; 00281 server_config.chaninfo_items = strdup("Inactive"); 00282 00283 /* Link our config vars. */ 00284 config_root = config_get_root("eggdrop"); 00285 config_link_table(server_config_vars, config_root, "server", 0, NULL); 00286 config_update_table(server_config_vars, config_root, "server", 0, NULL); 00287 00288 /* Get the server list. */ 00289 list = config_exists(config_root, "server", 0, "serverlist", 0, NULL); 00290 for (i = 0; (server = config_exists(list, "server", i, NULL)); i++) { 00291 host = pass = NULL; 00292 port = 0; 00293 config_get_str(&host, server, "host", 0, NULL); 00294 config_get_str(&pass, server, "pass", 0, NULL); 00295 config_get_int(&port, server, "port", 0, NULL); 00296 if (host) server_add(host, port, pass); 00297 } 00298 00299 /* And the nick list. */ 00300 list = config_exists(config_root, "server", 0, "nicklist", 0, NULL); 00301 for (i = 0; (nick = config_exists(list, "nick", i, NULL)); i++) { 00302 nickstr = NULL; 00303 config_get_str(&nickstr, nick, NULL); 00304 if (nickstr) nick_add(nickstr); 00305 } 00306 }
static int server_config_save | ( | const char * | handle | ) | [static] |
Definition at line 163 of file server.c.
References server_config_t::chanfile, channel_save, config_destroy(), config_exists(), config_get_root(), config_lookup_section(), config_set_int(), config_set_str(), server::host, LOG_MISC, server::next, nick_list, nick_list_len, NULL, server::pass, server::port, putlog(), and server_list.
Referenced by server_close().
00164 { 00165 server_t *server; 00166 void *root, *list, *node; 00167 int i; 00168 00169 putlog(LOG_MISC, "*", "Saving server config..."); 00170 root = config_get_root("eggdrop"); 00171 00172 /* Erase the server list. */ 00173 list = config_exists(root, "server.serverlist", 0, NULL); 00174 if (list) config_destroy(list); 00175 00176 /* Save the server list. */ 00177 list = config_lookup_section(root, "server.serverlist", 0, NULL); 00178 i = 0; 00179 for (server = server_list; server; server = server->next) { 00180 node = config_lookup_section(list, "server", i, NULL); 00181 config_set_str(server->host, node, "host", 0, NULL); 00182 config_set_str(server->pass, node, "pass", 0, NULL); 00183 config_set_int(server->port, node, "port", 0, NULL); 00184 i++; 00185 } 00186 00187 /* Erase the nick list. */ 00188 list = config_exists(root, "server.nicklist", 0, NULL); 00189 if (list) config_destroy(list); 00190 00191 /* Save the nick list. */ 00192 list = config_lookup_section(root, "server.nicklist", 0, NULL); 00193 for (i = 0; i < nick_list_len; i++) { 00194 config_set_str(nick_list[i], list, "nick", i, NULL); 00195 } 00196 00197 /* Save the channel file. */ 00198 putlog(LOG_MISC, "*", "Saving channels file..."); 00199 channel_save(server_config.chanfile); 00200 return(0); 00201 }
int server_script_destroy | ( | ) |
Definition at line 456 of file scriptcmds.c.
References script_delete_commands(), and script_unlink_vars().
00457 { 00458 script_delete_commands(server_script_cmds); 00459 script_unlink_vars(server_script_vars); 00460 return(0); 00461 }
int server_script_init | ( | ) |
Definition at line 449 of file scriptcmds.c.
References script_create_commands(), and script_link_vars().
00450 { 00451 script_create_commands(server_script_cmds); 00452 script_link_vars(server_script_vars); 00453 return(0); 00454 }
static int server_secondly | ( | ) | [static] |
Definition at line 71 of file server.c.
References connect_to_next_server, cycle_delay, dequeue_messages, current_server_t::idx, kill_server, current_server_t::last_ping_sent, current_server_t::last_ping_time, now, current_server_t::ping_id, server_config_t::ping_timeout, printserv, egg_timeval::sec, SERVER_NOQUEUE, current_server_t::time_to_ping, timer_diff(), timer_get_time(), and egg_timeval::usec.
Referenced by server_close().
00072 { 00073 if (current_server.idx < 0 && cycle_delay >= 0) { 00074 /* If there's no idx, see if it's time to jump to the next 00075 * server. */ 00076 cycle_delay--; 00077 if (cycle_delay <= 0) { 00078 cycle_delay = -1; 00079 connect_to_next_server(); 00080 } 00081 return(0); 00082 } 00083 00084 /* Try to dequeue some stuff. */ 00085 dequeue_messages(); 00086 00087 /* Check to see if we're pinged out once in a while. */ 00088 if (current_server.idx >= 0) { 00089 if (current_server.time_to_ping == 0) { 00090 egg_timeval_t now, diff; 00091 00092 timer_get_time(&now); 00093 timer_diff(¤t_server.last_ping_sent, &now, &diff); 00094 00095 /* Update ping time if it surpasses the old one, even 00096 * though we haven't received the actual ping reply. */ 00097 if (diff.sec > current_server.last_ping_time.sec || (diff.sec <= current_server.last_ping_time.sec && diff.usec > current_server.last_ping_time.usec)) { 00098 current_server.last_ping_time = diff; 00099 } 00100 if (diff.sec >= server_config.ping_timeout) { 00101 kill_server("ping timeout"); 00102 } 00103 } 00104 else if (current_server.time_to_ping > 0) { 00105 current_server.time_to_ping--; 00106 if (current_server.time_to_ping == 0) { 00107 current_server.ping_id = random(); 00108 timer_get_time(¤t_server.last_ping_sent); 00109 printserv(SERVER_NOQUEUE, "PING :%d", current_server.ping_id); 00110 } 00111 } 00112 } 00113 return(0); 00114 }
static int server_status | ( | partymember_t * | p, | |
const char * | text | |||
) | [static] |
Definition at line 116 of file server.c.
References _, sockbuf_stats_t::bytes_in, sockbuf_stats_t::bytes_out, channel_head, current_server_t::connected, cycle_delay, current_server_t::host, current_server_t::idx, current_server_t::last_ping_time, channel::name, channel::next, current_server_t::nick, channel::nmembers, current_server_t::npings, partymember_printf(), current_server_t::port, sockbuf_stats_t::raw_bytes_in, sockbuf_stats_t::raw_bytes_out, current_server_t::real_name, current_server_t::registered, egg_timeval::sec, current_server_t::server_host, current_server_t::server_self, sockbuf_get_stats(), current_server_t::time_to_ping, egg_timeval::usec, and current_server_t::user.
Referenced by server_close().
00117 { 00118 int details = 0; 00119 channel_t *chan; 00120 00121 if (text) { 00122 if (!strcasecmp(text, "all") || !strcasecmp(text, "server")) details = 1; 00123 else if (*text) return(0); 00124 } 00125 00126 partymember_printf(p, "Server module:"); 00127 if (!current_server.connected) { 00128 if (current_server.idx >= 0) partymember_printf(p, _(" Connecting to server %s/%d."), current_server.server_host, current_server.port); 00129 else partymember_printf(p, _(" Connecting to next server in %d seconds."), cycle_delay); 00130 return(0); 00131 } 00132 00133 /* First line, who we've connected to. */ 00134 partymember_printf(p, _(" Connected to %s/%d."), current_server.server_self ? current_server.server_self : current_server.server_host, current_server.port); 00135 00136 /* Second line, who we're connected as. */ 00137 if (current_server.registered) { 00138 if (current_server.user) partymember_printf(p, _(" Online as %s!%s@%s (%s)."), current_server.nick, current_server.user, current_server.host, current_server.real_name); 00139 else partymember_printf(p, _(" Online as %s (still waiting for WHOIS result)."), current_server.nick); 00140 } 00141 else partymember_printf(p, _(" Still logging in.")); 00142 00143 /* Third line, ping time. */ 00144 if (current_server.time_to_ping >= 0 && current_server.npings > 0) { 00145 partymember_printf(p, _(" Last server ping %d.%03d seconds"), current_server.last_ping_time.sec, current_server.last_ping_time.usec / 1000); 00146 } 00147 00148 /* Print the channel list if we have one. */ 00149 for (chan = channel_head; chan; chan = chan->next) { 00150 partymember_printf(p, " %s : %d member%s", chan->name, chan->nmembers, chan->nmembers == 1 ? "" : "s"); 00151 } 00152 00153 /* Some traffic stats. */ 00154 if (details) { 00155 sockbuf_stats_t *stats; 00156 00157 sockbuf_get_stats(current_server.idx, &stats); 00158 partymember_printf(p, " Server traffic: %lld in / %lld out (raw), %lld in / %lld out (filtered)", stats->raw_bytes_in, stats->raw_bytes_out, stats->bytes_in, stats->bytes_out); 00159 } 00160 return(0); 00161 }
int server_support | ( | const char * | name, | |
const char ** | value | |||
) |
Definition at line 53 of file server.c.
References current_server_t::name, current_server_t::nsupport, NULL, current_server_t::support, and current_server_t::value.
00054 { 00055 int i; 00056 00057 for (i = 0; i < current_server.nsupport; i++) { 00058 if (!strcasecmp(name, current_server.support[i].name)) { 00059 *value = current_server.support[i].value; 00060 return(0); 00061 } 00062 } 00063 *value = NULL; 00064 return(-1); 00065 }
EXPORT_SCOPE int start | ( | egg_module_t * | modinfo | ) |
int cycle_delay = 0 |
const char rcsid[] = "$Id: server.c,v 1.68 2007-09-13 22:20:57 sven Exp $" [static] |
server_config_t server_config = {0} |
config_var_t server_config_vars[] [static] |
Initial value:
{ {"chanfile", &server_config.chanfile, CONFIG_STRING}, {"user", &server_config.user, CONFIG_STRING}, {"realname", &server_config.realname, CONFIG_STRING}, {"connect_timeout", &server_config.connect_timeout, CONFIG_INT}, {"ping_timeout", &server_config.ping_timeout, CONFIG_INT}, {"dcc_timeout", &server_config.dcc_timeout, CONFIG_INT}, {"trigger_on_ignore", &server_config.trigger_on_ignore, CONFIG_INT}, {"keepnick", &server_config.keepnick, CONFIG_INT}, {"cycle_delay", &server_config.cycle_delay, CONFIG_INT}, {"default_port", &server_config.default_port, CONFIG_INT}, {"max_line_len", &server_config.max_line_len, CONFIG_INT}, {"chaninfo_items", &server_config.chaninfo_items, CONFIG_STRING}, {"fake005", &server_config.fake005, CONFIG_STRING}, {"raw_log", &server_config.raw_log, CONFIG_INT}, {"ip_lookup", &server_config.ip_lookup, CONFIG_INT}, {0} }
Definition at line 532 of file party_commands.c.