send: implement partial support for outbound tags (enough for account-tag as a testcase)
This commit is contained in:
parent
4f8ababae0
commit
5559c3cf17
2 changed files with 49 additions and 16 deletions
|
@ -153,6 +153,9 @@ msgbuf_unparse_prefix(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned
|
||||||
msgbuf_unparse_tags(buf, buflen, msgbuf, capmask);
|
msgbuf_unparse_tags(buf, buflen, msgbuf, capmask);
|
||||||
|
|
||||||
rb_snprintf_append(buf, buflen, ":%s ", msgbuf->origin != NULL ? msgbuf->origin : me.name);
|
rb_snprintf_append(buf, buflen, ":%s ", msgbuf->origin != NULL ? msgbuf->origin : me.name);
|
||||||
|
|
||||||
|
if (msgbuf->cmd != NULL)
|
||||||
|
rb_snprintf_append(buf, buflen, "%s ", msgbuf->cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -168,7 +171,7 @@ msgbuf_unparse(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int cap
|
||||||
|
|
||||||
msgbuf_unparse_prefix(buf, buflen, msgbuf, capmask);
|
msgbuf_unparse_prefix(buf, buflen, msgbuf, capmask);
|
||||||
|
|
||||||
for (i = 0; i < msgbuf->n_para; i++)
|
for (i = msgbuf->cmd != NULL ? 0 : 1; i < msgbuf->n_para; i++)
|
||||||
{
|
{
|
||||||
if (i == (msgbuf->n_para - 1))
|
if (i == (msgbuf->n_para - 1))
|
||||||
{
|
{
|
||||||
|
|
60
ircd/send.c
60
ircd/send.c
|
@ -210,6 +210,23 @@ send_queued_write(rb_fde_t *F, void *data)
|
||||||
send_queued(to);
|
send_queued(to);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* linebuf_put_msgvbuf
|
||||||
|
*
|
||||||
|
* inputs - msgbuf header, linebuf object, capability mask, pattern, arguments
|
||||||
|
* outputs - none
|
||||||
|
* side effects - the linebuf object is cleared, then populated using rb_linebuf_putmsg().
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
linebuf_put_msgvbuf(struct MsgBuf *msgbuf, buf_head_t *linebuf, unsigned int capmask, const char *pattern, va_list *va)
|
||||||
|
{
|
||||||
|
char buf[IRCD_BUFSIZE];
|
||||||
|
|
||||||
|
rb_linebuf_newbuf(linebuf);
|
||||||
|
msgbuf_unparse_prefix(buf, sizeof buf, msgbuf, capmask);
|
||||||
|
rb_linebuf_putprefix(linebuf, pattern, va, buf);
|
||||||
|
}
|
||||||
|
|
||||||
/* linebuf_put_msgbuf
|
/* linebuf_put_msgbuf
|
||||||
*
|
*
|
||||||
* inputs - msgbuf header, linebuf object, capability mask, pattern, arguments
|
* inputs - msgbuf header, linebuf object, capability mask, pattern, arguments
|
||||||
|
@ -219,15 +236,10 @@ send_queued_write(rb_fde_t *F, void *data)
|
||||||
static void
|
static void
|
||||||
linebuf_put_msgbuf(struct MsgBuf *msgbuf, buf_head_t *linebuf, unsigned int capmask, const char *pattern, ...)
|
linebuf_put_msgbuf(struct MsgBuf *msgbuf, buf_head_t *linebuf, unsigned int capmask, const char *pattern, ...)
|
||||||
{
|
{
|
||||||
char buf[IRCD_BUFSIZE];
|
|
||||||
va_list va;
|
va_list va;
|
||||||
|
|
||||||
rb_linebuf_newbuf(linebuf);
|
|
||||||
|
|
||||||
msgbuf_unparse_prefix(buf, sizeof buf, msgbuf, capmask);
|
|
||||||
|
|
||||||
va_start(va, pattern);
|
va_start(va, pattern);
|
||||||
rb_linebuf_putprefix(linebuf, pattern, &va, buf);
|
linebuf_put_msgvbuf(msgbuf, linebuf, capmask, pattern, &va);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,7 +251,7 @@ linebuf_put_msgbuf(struct MsgBuf *msgbuf, buf_head_t *linebuf, unsigned int capm
|
||||||
* notes - to make this reentrant, find a solution for `buf` below
|
* notes - to make this reentrant, find a solution for `buf` below
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
build_msgbuf_from(struct MsgBuf *msgbuf, struct Client *from)
|
build_msgbuf_from(struct MsgBuf *msgbuf, struct Client *from, const char *cmd)
|
||||||
{
|
{
|
||||||
static char buf[BUFSIZE];
|
static char buf[BUFSIZE];
|
||||||
hook_data hdata;
|
hook_data hdata;
|
||||||
|
@ -247,6 +259,7 @@ build_msgbuf_from(struct MsgBuf *msgbuf, struct Client *from)
|
||||||
msgbuf_init(msgbuf);
|
msgbuf_init(msgbuf);
|
||||||
|
|
||||||
msgbuf->origin = buf;
|
msgbuf->origin = buf;
|
||||||
|
msgbuf->cmd = cmd;
|
||||||
|
|
||||||
if (IsPerson(from))
|
if (IsPerson(from))
|
||||||
snprintf(buf, sizeof buf, "%s!%s@%s", from->name, from->username, from->host);
|
snprintf(buf, sizeof buf, "%s!%s@%s", from->name, from->username, from->host);
|
||||||
|
@ -770,14 +783,17 @@ sendto_channel_local_butone(struct Client *one, int type, struct Channel *chptr,
|
||||||
buf_head_t linebuf;
|
buf_head_t linebuf;
|
||||||
struct membership *msptr;
|
struct membership *msptr;
|
||||||
struct Client *target_p;
|
struct Client *target_p;
|
||||||
|
struct MsgBuf msgbuf;
|
||||||
rb_dlink_node *ptr;
|
rb_dlink_node *ptr;
|
||||||
rb_dlink_node *next_ptr;
|
rb_dlink_node *next_ptr;
|
||||||
|
unsigned int current_capmask = 0;
|
||||||
|
|
||||||
rb_linebuf_newbuf(&linebuf);
|
rb_linebuf_newbuf(&linebuf);
|
||||||
|
|
||||||
|
build_msgbuf_from(&msgbuf, one, NULL);
|
||||||
|
|
||||||
va_start(args, pattern);
|
va_start(args, pattern);
|
||||||
rb_linebuf_putmsg(&linebuf, pattern, &args, NULL);
|
rb_linebuf_putmsg(&linebuf, pattern, &args, NULL);
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->locmembers.head)
|
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->locmembers.head)
|
||||||
{
|
{
|
||||||
|
@ -793,9 +809,23 @@ sendto_channel_local_butone(struct Client *one, int type, struct Channel *chptr,
|
||||||
if(type && ((msptr->flags & type) == 0))
|
if(type && ((msptr->flags & type) == 0))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (target_p->localClient->caps != current_capmask)
|
||||||
|
{
|
||||||
|
/* reset the linebuf */
|
||||||
|
rb_linebuf_donebuf(&linebuf);
|
||||||
|
rb_linebuf_newbuf(&linebuf);
|
||||||
|
|
||||||
|
/* render the new linebuf and attach it */
|
||||||
|
linebuf_put_msgvbuf(&msgbuf, &linebuf, target_p->localClient->caps, pattern, &args);
|
||||||
|
current_capmask = target_p->localClient->caps;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* attach the present linebuf to the target */
|
||||||
_send_linebuf(target_p, &linebuf);
|
_send_linebuf(target_p, &linebuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
rb_linebuf_donebuf(&linebuf);
|
rb_linebuf_donebuf(&linebuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -888,6 +918,7 @@ sendto_common_channels_local_butone(struct Client *user, int cap, int negcap, co
|
||||||
buf_head_t linebuf;
|
buf_head_t linebuf;
|
||||||
|
|
||||||
rb_linebuf_newbuf(&linebuf);
|
rb_linebuf_newbuf(&linebuf);
|
||||||
|
|
||||||
va_start(args, pattern);
|
va_start(args, pattern);
|
||||||
rb_linebuf_putmsg(&linebuf, pattern, &args, NULL);
|
rb_linebuf_putmsg(&linebuf, pattern, &args, NULL);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
@ -1131,8 +1162,6 @@ sendto_anywhere(struct Client *target_p, struct Client *source_p,
|
||||||
va_list args;
|
va_list args;
|
||||||
buf_head_t linebuf;
|
buf_head_t linebuf;
|
||||||
|
|
||||||
rb_linebuf_newbuf(&linebuf);
|
|
||||||
|
|
||||||
va_start(args, pattern);
|
va_start(args, pattern);
|
||||||
|
|
||||||
if(MyClient(target_p))
|
if(MyClient(target_p))
|
||||||
|
@ -1142,11 +1171,12 @@ sendto_anywhere(struct Client *target_p, struct Client *source_p,
|
||||||
source_p->name, command,
|
source_p->name, command,
|
||||||
target_p->name);
|
target_p->name);
|
||||||
else
|
else
|
||||||
rb_linebuf_putmsg(&linebuf, pattern, &args,
|
{
|
||||||
":%s!%s@%s %s %s ",
|
struct MsgBuf msgbuf;
|
||||||
source_p->name, source_p->username,
|
|
||||||
source_p->host, command,
|
build_msgbuf_from(&msgbuf, source_p, command);
|
||||||
target_p->name);
|
linebuf_put_msgvbuf(&msgbuf, &linebuf, target_p->localClient->caps, pattern, &args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
rb_linebuf_putmsg(&linebuf, pattern, &args, ":%s %s %s ",
|
rb_linebuf_putmsg(&linebuf, pattern, &args, ":%s %s %s ",
|
||||||
|
|
Loading…
Reference in a new issue