modules/server/server.c File Reference

#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 []


Function Documentation

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(&current_server.server_host, serv->host);
00054   str_redup(&current_server.server_self, serv->host);
00055   str_redup(&current_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(&current_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(&current_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  ) 


Variable Documentation

Definition at line 26 of file server.c.

int cycle_delay = 0

Definition at line 34 of file server.c.

const char rcsid[] = "$Id: server.c,v 1.68 2007-09-13 22:20:57 sven Exp $" [static]

Definition at line 21 of file server.c.

Definition at line 27 of file server.c.

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 203 of file server.c.

Initial value:

 {
  "server", 0,
  0, 0,
  0
}

Definition at line 28 of file server.c.

Definition at line 532 of file party_commands.c.

Definition at line 562 of file input.c.


Generated on Sun Nov 30 18:43:36 2008 for eggdrop1.9 by  doxygen 1.5.6