/* proto-common.c - common IRC protocol parsing/sending support
- * Copyright 2000-2004 srvx Development Team
+ * Copyright 2000-2006 srvx Development Team
*
* This file is part of srvx.
*
void
socket_destroyed(struct io_fd *fd)
{
- if (fd && fd->eof)
+ if (fd && fd->state != IO_CONNECTED)
log_module(MAIN_LOG, LOG_ERROR, "Connection to server lost.");
socket_io_fd = NULL;
cManager.uplink->state = DISCONNECTED;
socket_io_fd->readable_cb = uplink_readable;
socket_io_fd->destroy_cb = socket_destroyed;
socket_io_fd->line_reads = 1;
- socket_io_fd->wants_reads = 1;
log_module(MAIN_LOG, LOG_INFO, "Connection to server established.");
cManager.uplink = target;
target->state = AUTHENTICATING;
replay_connected = 0;
socket_destroyed(socket_io_fd);
} else {
- ioset_close(socket_io_fd->fd, 1);
+ ioset_close(socket_io_fd, 3);
+ socket_io_fd = NULL;
}
}
return 0;
true_pass = cManager.uplink->their_password;
if (true_pass && strcmp(true_pass, argv[1])) {
- /* It might be good to mark the uplink as unavailable when
- this happens, though there should be a way of resetting
- the flag. */
- irc_squit(self, "Incorrect password received.", NULL);
- return 1;
+ /* It might be good to mark the uplink as unavailable when
+ this happens, though there should be a way of resetting
+ the flag. */
+ irc_squit(self, "Incorrect password received.", NULL);
+ return 1;
}
cManager.uplink->state = BURSTING;
static CMD_FUNC(cmd_error)
{
- if (argv[1]) log_module(MAIN_LOG, LOG_ERROR, "Error: %s", argv[1]);
+ if (argv[1]) log_module(MAIN_LOG, LOG_ERROR, "Error from ircd: %s", argv[1]);
log_module(MAIN_LOG, LOG_ERROR, "Error received from uplink, squitting.");
if (cManager.uplink->state != CONNECTED) {
- /* Error messages while connected should be fine. */
- cManager.uplink->flags |= UPLINK_UNAVAILABLE;
- log_module(MAIN_LOG, LOG_ERROR, "Disabling uplink.");
+ /* Error messages while connected should be fine. */
+ cManager.uplink->flags |= UPLINK_UNAVAILABLE;
+ log_module(MAIN_LOG, LOG_ERROR, "Disabling uplink.");
}
close_socket();
/* Never send a NOTICE to a channel to one of the services */
if (!pd->is_notice && cf->func
&& ((cn->modes & MODE_REGISTERED) || GetUserMode(cn, cf->service)))
- cf->func(pd->user, cn, pd->text+1, cf->service);
/* This catches *all* text sent to the channel that the services server sees */
for (x = 0; x < ALLCHANMSG_FUNCS_MAX; x++) {
reg_chanmsg_func(unsigned char prefix, struct userNode *service, chanmsg_func_t handler)
{
if (chanmsg_funcs[prefix].func)
- log_module(MAIN_LOG, LOG_WARNING, "Re-registering new chanmsg handler for character `%c'.", prefix);
+ log_module(MAIN_LOG, LOG_WARNING, "Re-registering new chanmsg handler for character `%c'.", prefix);
chanmsg_funcs[prefix].func = handler;
chanmsg_funcs[prefix].service = service;
}
reg_mode_change_func(mode_change_func_t handler)
{
if (mcf_used == mcf_size) {
- if (mcf_size) {
- mcf_size <<= 1;
- mcf_list = realloc(mcf_list, mcf_size*sizeof(mode_change_func_t));
- } else {
- mcf_size = 8;
- mcf_list = malloc(mcf_size*sizeof(mode_change_func_t));
- }
+ if (mcf_size) {
+ mcf_size <<= 1;
+ mcf_list = realloc(mcf_list, mcf_size*sizeof(mode_change_func_t));
+ } else {
+ mcf_size = 8;
+ mcf_list = malloc(mcf_size*sizeof(mode_change_func_t));
+ }
}
mcf_list[mcf_used++] = handler;
}
for (ii=cnt=0; hostname[ii]; ii++)
if (hostname[ii] == '.')
cnt++;
- if (cnt == 1) {
- /* only a two-level domain name; leave hostname */
+ if (cnt == 0 || cnt == 1) {
+ /* only a one- or two-level domain name; leave hostname */
} else if (cnt == 2) {
for (ii=0; user->hostname[ii] != '.'; ii++) ;
/* Add 3 to account for the *. and \0. */