00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef lint
00021 static const char rcsid[] = "$Id: servsock.c,v 1.26 2007-09-13 22:20:58 sven Exp $";
00022 #endif
00023
00024 #include "server.h"
00025
00026
00027 extern int cycle_delay;
00028
00029 static void disconnect_server();
00030 static int server_on_connect(void *client_data, int idx, const char *peer_ip, int peer_port);
00031 static int server_on_eof(void *client_data, int idx, int err, const char *errmsg);
00032 static int server_on_read(void *client_data, int idx, char *text, int len);
00033
00034 static sockbuf_handler_t server_handler = {
00035 "server",
00036 server_on_connect, server_on_eof, NULL,
00037 server_on_read, NULL
00038 };
00039
00040
00041
00042
00043
00044 void connect_to_next_server() {
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 }
00069
00070
00071 void kill_server(const char *reason)
00072 {
00073 if (reason && (current_server.idx > -1)) printserv(SERVER_NOQUEUE, "QUIT :%s\r\n", reason);
00074 disconnect_server();
00075 }
00076
00077
00078 static void disconnect_server()
00079 {
00080 int connected = current_server.connected;
00081 int i, idx = current_server.idx;
00082
00083 cycle_delay = server_config.cycle_delay;
00084
00085 channel_reset();
00086 if (current_server.server_host) free(current_server.server_host);
00087 if (current_server.server_self) free(current_server.server_self);
00088 if (current_server.nick) free(current_server.nick);
00089 if (current_server.user) free(current_server.user);
00090 if (current_server.host) free(current_server.host);
00091 if (current_server.real_name) free(current_server.real_name);
00092 if (current_server.pass) free(current_server.pass);
00093 for (i = 0; i < current_server.nsupport; i++) {
00094 free(current_server.support[i].name);
00095 free(current_server.support[i].value);
00096 }
00097 if (current_server.support) free(current_server.support);
00098 memset(¤t_server, 0, sizeof(current_server));
00099 current_server.idx = -1;
00100 current_server.time_to_ping = -1;
00101
00102 if (idx != -1) sockbuf_delete(idx);
00103 if (connected) eggdrop_event("disconnect-server");
00104 }
00105
00106
00107
00108
00109
00110
00111
00112 static int server_on_eof(void *client_data, int idx, int err, const char *errmsg)
00113 {
00114 putlog(LOG_SERV, "*", "Disconnected from %s", current_server.server_self);
00115 if (err && errmsg) putlog(LOG_SERV, "*", "Network error %d: %s", err, errmsg);
00116 disconnect_server();
00117 return(0);
00118 }
00119
00120 static int server_on_connect(void *client_data, int idx, const char *peer_ip, int peer_port)
00121 {
00122
00123
00124 if (server_config.ip_lookup == 0) {
00125 int sock;
00126 char *ip;
00127
00128 sock = sockbuf_get_sock(idx);
00129 socket_get_name(sock, &ip, NULL);
00130 dcc_dns_set(ip);
00131 free(ip);
00132 }
00133
00134 linemode_on(current_server.idx);
00135
00136 current_server.connected = 1;
00137 current_server.time_to_ping = random() % 30 + 30;
00138 current_server.npings = 0;
00139
00140 nick_list_on_connect();
00141 putlog(LOG_SERV, "*", _("Connected to %s, logging in."), current_server.server_host);
00142 eggdrop_event("connect-server");
00143 if (!current_server.connected) return(0);
00144
00145 printserv(SERVER_NOQUEUE, "USER %s localhost %s :%s\r\n", server_config.user, current_server.server_host, server_config.realname);
00146 if (current_server.pass) printserv(SERVER_NOQUEUE, "PASS %s\r\n", current_server.pass);
00147 try_next_nick();
00148 return(0);
00149 }
00150
00151 static int server_on_read(void *client_data, int idx, char *text, int len)
00152 {
00153 if (!len) return(0);
00154 server_parse_input(text);
00155 return(0);
00156 }