X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/348683aa59f63ac110c129f808c91fc3156ee14f..ff3b058ac51e9caf5cf1fd310b8a401a97a85582:/src/proto-common.c diff --git a/src/proto-common.c b/src/proto-common.c index f9b30e7..785485b 100644 --- a/src/proto-common.c +++ b/src/proto-common.c @@ -95,7 +95,7 @@ uplink_readable(struct io_fd *fd) { 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; @@ -147,7 +147,6 @@ create_socket_client(struct uplinkNode *target) 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; @@ -278,7 +277,8 @@ close_socket(void) 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; } } @@ -333,7 +333,7 @@ static CMD_FUNC(cmd_dummy) 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) { @@ -443,9 +443,8 @@ privmsg_chan_helper(struct chanNode *cn, void *data) mn->idle_since = now; /* 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); + if (!pd->is_notice && cf->func && ((cn->modes & MODE_REGISTERED) || GetUserMode(cn, cf->service))) + cf->func(pd->user, cn, pd->text+1, cf->service); /* XXX- taken out in 1.4rc1 patchset but causes errors */ else spamserv_channel_message(cn, pd->user, pd->text); @@ -469,10 +468,30 @@ privmsg_invalid(char *name, void *data) irc_numeric(pd->user, ERR_NOSUCHNICK, "%s@%s :No such nick", name, self->name); } +struct part_desc { + struct userNode *user; + const char *text; +}; + static void part_helper(struct chanNode *cn, void *data) { - DelChannelUser(data, cn, false, 0); + struct part_desc *desc = data; + DelChannelUser(desc->user, cn, desc->text, false); +} + +static CMD_FUNC(cmd_part) +{ + struct part_desc desc; + + if (argc < 2) + return 0; + desc.user = GetUserH(origin); + if (!desc.user) + return 0; + desc.text = (argc > 2) ? argv[argc - 1] : NULL; + parse_foreach(argv[1], part_helper, NULL, NULL, NULL, &desc); + return 1; } void @@ -871,8 +890,8 @@ generate_hostmask(struct userNode *user, int options) 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. */