X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/13ae2f4b6904ebf7b8160902f9ffeb80f7585ed2..b869e117f01851f05ff6d02b65b2719e829057a7:/src/send.c diff --git a/src/send.c b/src/send.c index a3154c3..e5d71f2 100644 --- a/src/send.c +++ b/src/send.c @@ -49,6 +49,8 @@ static void send_queued_write(rb_fde_t *F, void *data); unsigned long current_serial = 0L; +struct Client *remote_rehash_oper_p; + /* send_linebuf() * * inputs - client to send to, linebuf to attach @@ -73,7 +75,7 @@ _send_linebuf(struct Client *to, buf_head_t *linebuf) { sendto_realops_snomask(SNO_GENERAL, L_ALL, "Max SendQ limit exceeded for %s: %u > %lu", - get_server_name(to, HIDE_IP), + to->name, rb_linebuf_len(&to->localClient->buf_sendq), get_sendq(to)); @@ -83,10 +85,7 @@ _send_linebuf(struct Client *to, buf_head_t *linebuf) get_sendq(to)); } - if(IsClient(to)) - to->flags |= FLAGS_SENDQEX; - - dead_link(to); + dead_link(to, 1); return -1; } else @@ -198,7 +197,7 @@ send_queued(struct Client *to) if(retlen == 0 || (retlen < 0 && !rb_ignore_errno(errno))) { - dead_link(to); + dead_link(to, 0); return; } } @@ -467,7 +466,6 @@ sendto_channel_flags(struct Client *one, int type, struct Client *source_p, static char buf[BUFSIZE]; va_list args; buf_head_t rb_linebuf_local; - buf_head_t rb_linebuf_name; buf_head_t rb_linebuf_id; struct Client *target_p; struct membership *msptr; @@ -475,7 +473,6 @@ sendto_channel_flags(struct Client *one, int type, struct Client *source_p, rb_dlink_node *next_ptr; rb_linebuf_newbuf(&rb_linebuf_local); - rb_linebuf_newbuf(&rb_linebuf_name); rb_linebuf_newbuf(&rb_linebuf_id); current_serial++; @@ -493,7 +490,6 @@ sendto_channel_flags(struct Client *one, int type, struct Client *source_p, source_p->name, source_p->username, source_p->host, buf); - rb_linebuf_putmsg(&rb_linebuf_name, NULL, NULL, ":%s %s", source_p->name, buf); rb_linebuf_putmsg(&rb_linebuf_id, NULL, NULL, ":%s %s", use_id(source_p), buf); RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->members.head) @@ -520,11 +516,7 @@ sendto_channel_flags(struct Client *one, int type, struct Client *source_p, if(target_p->from->serial != current_serial) { - if(has_id(target_p->from)) - send_linebuf_remote(target_p, source_p, &rb_linebuf_id); - else - send_linebuf_remote(target_p, source_p, &rb_linebuf_name); - + send_linebuf_remote(target_p, source_p, &rb_linebuf_id); target_p->from->serial = current_serial; } } @@ -533,10 +525,96 @@ sendto_channel_flags(struct Client *one, int type, struct Client *source_p, } rb_linebuf_donebuf(&rb_linebuf_local); - rb_linebuf_donebuf(&rb_linebuf_name); rb_linebuf_donebuf(&rb_linebuf_id); } +/* sendto_channel_flags() + * + * inputs - server not to send to, flags needed, source, channel, va_args + * outputs - message is sent to channel members + * side effects - + */ +void +sendto_channel_opmod(struct Client *one, struct Client *source_p, + struct Channel *chptr, const char *command, + const char *text) +{ + buf_head_t rb_linebuf_local; + buf_head_t rb_linebuf_old; + buf_head_t rb_linebuf_new; + struct Client *target_p; + struct membership *msptr; + rb_dlink_node *ptr; + rb_dlink_node *next_ptr; + + rb_linebuf_newbuf(&rb_linebuf_local); + rb_linebuf_newbuf(&rb_linebuf_old); + rb_linebuf_newbuf(&rb_linebuf_new); + + current_serial++; + + if(IsServer(source_p)) + rb_linebuf_putmsg(&rb_linebuf_local, NULL, NULL, + ":%s %s %s :%s", + source_p->name, command, chptr->chname, text); + else + rb_linebuf_putmsg(&rb_linebuf_local, NULL, NULL, + ":%s!%s@%s %s %s :%s", + source_p->name, source_p->username, + source_p->host, command, chptr->chname, text); + + if (chptr->mode.mode & MODE_MODERATED) + rb_linebuf_putmsg(&rb_linebuf_old, NULL, NULL, + ":%s %s %s :%s", + use_id(source_p), command, chptr->chname, text); + else + rb_linebuf_putmsg(&rb_linebuf_old, NULL, NULL, + ":%s NOTICE @%s :<%s:%s> %s", + use_id(source_p->servptr), chptr->chname, + source_p->name, chptr->chname, text); + rb_linebuf_putmsg(&rb_linebuf_new, NULL, NULL, + ":%s %s =%s :%s", + use_id(source_p), command, chptr->chname, text); + + RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->members.head) + { + msptr = ptr->data; + target_p = msptr->client_p; + + if(IsIOError(target_p->from) || target_p->from == one) + continue; + + if(!is_any_op(msptr)) + continue; + + if(IsDeaf(target_p)) + continue; + + if(!MyClient(target_p)) + { + /* if we've got a specific type, target must support + * CHW.. --fl + */ + if(NotCapable(target_p->from, CAP_CHW)) + continue; + + if(target_p->from->serial != current_serial) + { + if (IsCapable(target_p->from, CAP_EOPMOD)) + send_linebuf_remote(target_p, source_p, &rb_linebuf_new); + else + send_linebuf_remote(target_p, source_p, &rb_linebuf_old); + target_p->from->serial = current_serial; + } + } + else + _send_linebuf(target_p, &rb_linebuf_local); + } + + rb_linebuf_donebuf(&rb_linebuf_local); + rb_linebuf_donebuf(&rb_linebuf_old); + rb_linebuf_donebuf(&rb_linebuf_new); +} /* sendto_channel_local() * @@ -749,11 +827,9 @@ sendto_match_butone(struct Client *one, struct Client *source_p, rb_dlink_node *ptr; rb_dlink_node *next_ptr; buf_head_t rb_linebuf_local; - buf_head_t rb_linebuf_name; buf_head_t rb_linebuf_id; rb_linebuf_newbuf(&rb_linebuf_local); - rb_linebuf_newbuf(&rb_linebuf_name); rb_linebuf_newbuf(&rb_linebuf_id); va_start(args, pattern); @@ -769,7 +845,6 @@ sendto_match_butone(struct Client *one, struct Client *source_p, source_p->name, source_p->username, source_p->host, buf); - rb_linebuf_putmsg(&rb_linebuf_name, NULL, NULL, ":%s %s", source_p->name, buf); rb_linebuf_putmsg(&rb_linebuf_id, NULL, NULL, ":%s %s", use_id(source_p), buf); if(what == MATCH_HOST) @@ -799,15 +874,11 @@ sendto_match_butone(struct Client *one, struct Client *source_p, if(target_p == one) continue; - if(has_id(target_p)) - send_linebuf_remote(target_p, source_p, &rb_linebuf_id); - else - send_linebuf_remote(target_p, source_p, &rb_linebuf_name); + send_linebuf_remote(target_p, source_p, &rb_linebuf_id); } rb_linebuf_donebuf(&rb_linebuf_local); rb_linebuf_donebuf(&rb_linebuf_id); - rb_linebuf_donebuf(&rb_linebuf_name); } /* sendto_match_servs() @@ -825,13 +896,11 @@ sendto_match_servs(struct Client *source_p, const char *mask, int cap, rb_dlink_node *ptr; struct Client *target_p; buf_head_t rb_linebuf_id; - buf_head_t rb_linebuf_name; if(EmptyString(mask)) return; rb_linebuf_newbuf(&rb_linebuf_id); - rb_linebuf_newbuf(&rb_linebuf_name); va_start(args, pattern); rb_vsnprintf(buf, sizeof(buf), pattern, args); @@ -839,8 +908,6 @@ sendto_match_servs(struct Client *source_p, const char *mask, int cap, rb_linebuf_putmsg(&rb_linebuf_id, NULL, NULL, ":%s %s", use_id(source_p), buf); - rb_linebuf_putmsg(&rb_linebuf_name, NULL, NULL, - ":%s %s", source_p->name, buf); current_serial++; @@ -868,15 +935,11 @@ sendto_match_servs(struct Client *source_p, const char *mask, int cap, if(nocap && !NotCapable(target_p->from, nocap)) continue; - if(has_id(target_p->from)) - _send_linebuf(target_p->from, &rb_linebuf_id); - else - _send_linebuf(target_p->from, &rb_linebuf_name); + _send_linebuf(target_p->from, &rb_linebuf_id); } } rb_linebuf_donebuf(&rb_linebuf_id); - rb_linebuf_donebuf(&rb_linebuf_name); } /* sendto_monitor() @@ -988,14 +1051,19 @@ sendto_realops_snomask(int flags, int level, const char *pattern, ...) ":%s NOTICE * :*** Notice -- %s", me.name, buf); snobuf = construct_snobuf(flags); if (snobuf[1] != '\0') - { sendto_server(NULL, NULL, CAP_ENCAP|CAP_TS6, NOCAPS, ":%s ENCAP * SNOTE %c :%s", me.id, snobuf[1], buf); - sendto_server(NULL, NULL, CAP_ENCAP, CAP_TS6, - ":%s ENCAP * SNOTE %c :%s", - me.name, snobuf[1], buf); - } + } + else if (remote_rehash_oper_p != NULL) + { + /* rather a lot of copying around, oh well -- jilles */ + va_start(args, pattern); + rb_vsnprintf(buf, sizeof(buf), pattern, args); + va_end(args); + rb_linebuf_putmsg(&linebuf, pattern, NULL, + ":%s NOTICE * :*** Notice -- %s", me.name, buf); + sendto_one_notice(remote_rehash_oper_p, ":*** Notice -- %s", buf); } else { @@ -1150,17 +1218,13 @@ kill_client_serv_butone(struct Client *one, struct Client *target_p, const char rb_dlink_node *ptr; rb_dlink_node *next_ptr; buf_head_t rb_linebuf_id; - buf_head_t rb_linebuf_name; - rb_linebuf_newbuf(&rb_linebuf_name); rb_linebuf_newbuf(&rb_linebuf_id); va_start(args, pattern); rb_vsnprintf(buf, sizeof(buf), pattern, args); va_end(args); - rb_linebuf_putmsg(&rb_linebuf_name, NULL, NULL, ":%s KILL %s :%s", - me.name, target_p->name, buf); rb_linebuf_putmsg(&rb_linebuf_id, NULL, NULL, ":%s KILL %s :%s", use_id(&me), use_id(target_p), buf); @@ -1175,12 +1239,8 @@ kill_client_serv_butone(struct Client *one, struct Client *target_p, const char (!has_id(client_p) || !has_id(target_p))) continue; - if(has_id(client_p)) - _send_linebuf(client_p, &rb_linebuf_id); - else - _send_linebuf(client_p, &rb_linebuf_name); + _send_linebuf(client_p, &rb_linebuf_id); } rb_linebuf_donebuf(&rb_linebuf_id); - rb_linebuf_donebuf(&rb_linebuf_name); }