X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/1136f709ef8add5fa9ba8663db910003362e1bd2..a3da4b66b05fa77dec803e29b525c464cbd5d37c:/src/proto-common.c?ds=sidebyside diff --git a/src/proto-common.c b/src/proto-common.c index b7d8ee2..3505f5e 100644 --- a/src/proto-common.c +++ b/src/proto-common.c @@ -26,6 +26,7 @@ #include "spamserv.h" #include "shun.h" #include "timeq.h" +#include "version.h" #ifdef HAVE_SYS_SOCKET_H #include #endif @@ -53,12 +54,6 @@ extern struct cManagerNode cManager; extern unsigned long burst_length; extern struct cManagerNode cManager; extern struct policer_params *oper_policer_params, *luser_policer_params; -extern server_link_func_t *slf_list; -extern unsigned int slf_size, slf_used; -extern new_user_func_t *nuf_list; -extern unsigned int nuf_size, nuf_used; -extern del_user_func_t *duf_list; -extern unsigned int duf_size, duf_used; extern time_t boot_time; void received_ping(void); @@ -376,7 +371,7 @@ static CMD_FUNC(cmd_version) log_module(MAIN_LOG, LOG_ERROR, "Could not find VERSION origin user %s", origin); return 0; } - irc_numeric(user, 351, "%s %s %s", PACKAGE_TARNAME, PACKAGE_VERSION, self->name); + irc_numeric(user, 351, "%s %s+[%s] %s", PACKAGE_TARNAME, PACKAGE_VERSION, cvs_version, self->name); return 1; } @@ -415,6 +410,7 @@ recalc_bursts(struct server *eob_server) static struct chanmsg_func { chanmsg_func_t func; struct userNode *service; + void *extra; } chanmsg_funcs[256]; /* indexed by trigger character */ static struct allchanmsg_func { @@ -444,9 +440,8 @@ privmsg_chan_helper(struct chanNode *cn, void *data) /* Never send a NOTICE to a channel to one of the services */ cf = &chanmsg_funcs[(unsigned char)pd->text[0]]; - if (cf->func && !pd->is_notice - && GetUserMode(cn, cf->service) && !IsDeaf(cf->service)) - cf->func(pd->user, cn, pd->text+1, cf->service, pd->is_notice); + if (!pd->is_notice && cf->func) + cf->func(pd->user, cn, pd->text+1, cf->service, pd->is_notice, cf->extra); else spamserv_channel_message(cn, pd->user, pd->text); @@ -456,7 +451,7 @@ privmsg_chan_helper(struct chanNode *cn, void *data) if (!cf->func) break; /* end of list */ else - cf->func(pd->user, cn, pd->text, cf->service, pd->is_notice); + cf->func(pd->user, cn, pd->text, cf->service, pd->is_notice, cf->extra); } } @@ -497,12 +492,13 @@ static CMD_FUNC(cmd_part) } void -reg_chanmsg_func(unsigned char prefix, struct userNode *service, chanmsg_func_t handler) +reg_chanmsg_func(unsigned char prefix, struct userNode *service, chanmsg_func_t handler, void *extra) { if (chanmsg_funcs[prefix].func) 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; + chanmsg_funcs[prefix].extra = extra; } void @@ -525,40 +521,47 @@ get_chanmsg_bot(unsigned char prefix) } static mode_change_func_t *mcf_list; +static void **mcf_list_extra; static unsigned int mcf_size = 0, mcf_used = 0; void -reg_mode_change_func(mode_change_func_t handler) +reg_mode_change_func(mode_change_func_t handler, void *extra) { if (mcf_used == mcf_size) { if (mcf_size) { mcf_size <<= 1; mcf_list = realloc(mcf_list, mcf_size*sizeof(mode_change_func_t)); + mcf_list_extra = realloc(mcf_list_extra, mcf_size*sizeof(void*)); } else { mcf_size = 8; mcf_list = malloc(mcf_size*sizeof(mode_change_func_t)); + mcf_list_extra = malloc(mcf_size*sizeof(void*)); } } - mcf_list[mcf_used++] = handler; + mcf_list[mcf_used] = handler; + mcf_list_extra[mcf_used++] = extra; } static oper_func_t *of_list; - +static void **of_list_extra; static unsigned int of_size = 0, of_used = 0; void -reg_oper_func(oper_func_t handler) +reg_oper_func(oper_func_t handler, void *extra) { if (of_used == of_size) { if (of_size) { of_size <<= 1; of_list = realloc(of_list, of_size*sizeof(oper_func_t)); + of_list_extra = realloc(of_list_extra, of_size*sizeof(void*)); } else { of_size = 8; of_list = malloc(of_size*sizeof(oper_func_t)); + of_list_extra = malloc(of_size*sizeof(void*)); } } - of_list[of_used++] = handler; + of_list[of_used] = handler; + of_list_extra[of_used++] = extra; } static void @@ -569,7 +572,7 @@ call_oper_funcs(struct userNode *user) return; for (n=0; (ndead; n++) { - of_list[n](user); + of_list[n](user, of_list_extra[n]); } } @@ -751,7 +754,7 @@ mod_chanmode(struct userNode *who, struct chanNode *channel, char **modes, unsig mod_chanmode_apply(who, channel, change); if (flags & MC_NOTIFY) for (ii = 0; ii < mcf_used; ++ii) - mcf_list[ii](channel, who, change); + mcf_list[ii](channel, who, change, mcf_list_extra[ii]); mod_chanmode_free(change); return 1; } @@ -770,21 +773,25 @@ irc_make_chanmode(struct chanNode *chan, char *out) } static user_mode_func_t *um_list; +static void **um_list_extra; static unsigned int um_size = 0, um_used = 0; void -reg_user_mode_func(user_mode_func_t handler) +reg_user_mode_func(user_mode_func_t handler, void *extra) { if (um_used == um_size) { if (um_size) { um_size <<= 1; um_list = realloc(um_list, um_size*sizeof(user_mode_func_t)); + um_list_extra = realloc(um_list_extra, um_size*sizeof(void*)); } else { um_size = 8; um_list = malloc(um_size*sizeof(user_mode_func_t)); + um_list_extra = malloc(um_size*sizeof(void*)); } } - um_list[um_used++] = handler; + um_list[um_used] = handler; + um_list_extra[um_used++] = extra; } void @@ -804,26 +811,30 @@ call_user_mode_funcs(struct userNode *user, const char *mode_change) { unsigned int n; for (n=0; nhandle_info && hidden_host_suffix && !(options & GENMASK_NO_HIDING)) { + if (((style == 1) || (style == 3)) && user->handle_info && hidden_host_suffix && !(options & GENMASK_NO_HIDING)) { hostname = alloca(strlen(user->handle_info->handle) + strlen(hidden_host_suffix) + 2); sprintf(hostname, "%s.%s", user->handle_info->handle, hidden_host_suffix); - } else if ((style == 2) && !(options & GENMASK_NO_HIDING)) { + } else if (((style == 2) || (style == 3)) && !(options & GENMASK_NO_HIDING)) { hostname = alloca(strlen(user->crypthost)); sprintf(hostname, "%s", user->crypthost); } @@ -974,3 +985,22 @@ IsChannelName(const char *name) { } return 1; } + + +unsigned int +irc_user_modes(const struct userNode *user, char modes[], size_t length) +{ + unsigned int ii, jj; + + for (ii = jj = 0; (jj < length) && (irc_user_mode_chars[ii] != '\0'); ++ii) { + if ((user->modes & (1 << ii)) && (irc_user_mode_chars[ii] != ' ')) + modes[jj++] = irc_user_mode_chars[ii]; + } + + ii = jj; + while (jj < length) + modes[jj++] = '\0'; + + return ii; +} +