| 81 |
|
{ |
| 82 |
|
node_t *node; |
| 83 |
|
|
| 84 |
< |
LIST_FOREACH(node, IRCItem->channels->head) |
| 84 |
> |
LIST_FOREACH(node, IRCItem.channels.head) |
| 85 |
|
{ |
| 86 |
|
struct ChannelConf *item = node->data; |
| 87 |
|
|
| 109 |
|
{ |
| 110 |
|
node_t *node; |
| 111 |
|
|
| 112 |
< |
log_printf("IRC -> Connected to %s/%d", IRCItem->server, IRCItem->port); |
| 112 |
> |
log_printf("IRC -> Connected to %s/%d", IRCItem.server, IRCItem.port); |
| 113 |
|
|
| 114 |
|
/* Identify to nickserv if needed */ |
| 115 |
< |
if (!EmptyString(IRCItem->nickserv)) |
| 116 |
< |
irc_send("%s", IRCItem->nickserv); |
| 115 |
> |
if (!EmptyString(IRCItem.nickserv)) |
| 116 |
> |
irc_send("%s", IRCItem.nickserv); |
| 117 |
|
|
| 118 |
|
/* Oper */ |
| 119 |
< |
irc_send("OPER %s", IRCItem->oper); |
| 119 |
> |
irc_send("OPER %s", IRCItem.oper); |
| 120 |
|
|
| 121 |
|
/* Set modes */ |
| 122 |
< |
irc_send("MODE %s %s", IRCItem->nick, IRCItem->mode); |
| 122 |
> |
irc_send("MODE %s %s", IRCItem.nick, IRCItem.mode); |
| 123 |
|
|
| 124 |
|
/* Set Away */ |
| 125 |
< |
if (!EmptyString(IRCItem->away)) |
| 126 |
< |
irc_send("AWAY :%s", IRCItem->away); |
| 125 |
> |
if (!EmptyString(IRCItem.away)) |
| 126 |
> |
irc_send("AWAY :%s", IRCItem.away); |
| 127 |
|
|
| 128 |
|
/* Perform */ |
| 129 |
< |
LIST_FOREACH(node, IRCItem->performs->head) |
| 129 |
> |
LIST_FOREACH(node, IRCItem.performs.head) |
| 130 |
|
irc_send("%s", node->data); |
| 131 |
|
|
| 132 |
|
/* Join all listed channels. */ |
| 133 |
< |
LIST_FOREACH(node, IRCItem->channels->head) |
| 133 |
> |
LIST_FOREACH(node, IRCItem.channels.head) |
| 134 |
|
{ |
| 135 |
|
const struct ChannelConf *channel = node->data; |
| 136 |
|
|
| 247 |
|
int hit = strncasecmp(parv[3], "!all ", 5) == 0; |
| 248 |
|
if (hit == 0) |
| 249 |
|
{ |
| 250 |
< |
size_t nick_len = strlen(IRCItem->nick); |
| 250 |
> |
size_t nick_len = strlen(IRCItem.nick); |
| 251 |
|
|
| 252 |
< |
if (strncasecmp(parv[3], IRCItem->nick, nick_len) == 0) |
| 252 |
> |
if (strncasecmp(parv[3], IRCItem.nick, nick_len) == 0) |
| 253 |
|
hit = *(parv[3] + nick_len) == ' ' || |
| 254 |
|
*(parv[3] + nick_len) == ',' || |
| 255 |
|
*(parv[3] + nick_len) == ':'; |
| 292 |
|
{ |
| 293 |
|
preg = xcalloc(sizeof(*preg)); |
| 294 |
|
|
| 295 |
< |
if ((errnum = regcomp(preg, IRCItem->connregex, REG_ICASE | REG_EXTENDED))) |
| 295 |
> |
if ((errnum = regcomp(preg, IRCItem.connregex, REG_ICASE | REG_EXTENDED))) |
| 296 |
|
{ |
| 297 |
|
char errmsg[256]; |
| 298 |
|
|
| 336 |
|
log_printf("IRC REGEX -> Parsed %s!%s@%s [%s] from connection notice.", |
| 337 |
|
user[0], user[1], user[2], user[3]); |
| 338 |
|
|
| 339 |
< |
LIST_FOREACH(node, IRCItem->notices->head) |
| 339 |
> |
LIST_FOREACH(node, IRCItem.notices.head) |
| 340 |
|
irc_send("NOTICE %s :%s", user[0], node->data); |
| 341 |
|
|
| 342 |
|
/* Pass this information off to scan.c */ |
| 468 |
|
memset(&IRC_SVR, 0, sizeof(IRC_SVR)); |
| 469 |
|
|
| 470 |
|
/* Resolve IRC host. */ |
| 471 |
< |
if ((address = firedns_resolveip6(IRCItem->server))) |
| 471 |
> |
if ((address = firedns_resolveip6(IRCItem.server))) |
| 472 |
|
{ |
| 473 |
|
struct sockaddr_in6 *in = (struct sockaddr_in6 *)&IRC_SVR; |
| 474 |
|
|
| 475 |
|
svr_addrlen = sizeof(*in); |
| 476 |
|
IRC_SVR.ss_family = AF_INET6; |
| 477 |
< |
in->sin6_port = htons(IRCItem->port); |
| 477 |
> |
in->sin6_port = htons(IRCItem.port); |
| 478 |
|
memcpy(&in->sin6_addr, address, sizeof(in->sin6_addr)); |
| 479 |
|
} |
| 480 |
< |
else if ((address = firedns_resolveip4(IRCItem->server))) |
| 480 |
> |
else if ((address = firedns_resolveip4(IRCItem.server))) |
| 481 |
|
{ |
| 482 |
|
struct sockaddr_in *in = (struct sockaddr_in *)&IRC_SVR; |
| 483 |
|
|
| 484 |
|
svr_addrlen = sizeof(*in); |
| 485 |
|
IRC_SVR.ss_family = AF_INET; |
| 486 |
< |
in->sin_port = htons(IRCItem->port); |
| 486 |
> |
in->sin_port = htons(IRCItem.port); |
| 487 |
|
memcpy(&in->sin_addr, address, sizeof(in->sin_addr)); |
| 488 |
|
} |
| 489 |
|
else |
| 490 |
|
{ |
| 491 |
< |
log_printf("IRC -> firedns_resolveip(\"%s\"): %s", IRCItem->server, |
| 491 |
> |
log_printf("IRC -> firedns_resolveip(\"%s\"): %s", IRCItem.server, |
| 492 |
|
firedns_strerror(firedns_errno)); |
| 493 |
|
exit(EXIT_FAILURE); |
| 494 |
|
} |
| 503 |
|
} |
| 504 |
|
|
| 505 |
|
/* Bind */ |
| 506 |
< |
if (!EmptyString(IRCItem->vhost)) |
| 506 |
> |
if (!EmptyString(IRCItem.vhost)) |
| 507 |
|
{ |
| 508 |
|
struct addrinfo hints, *res; |
| 509 |
|
int n; |
| 514 |
|
hints.ai_socktype = SOCK_STREAM; |
| 515 |
|
hints.ai_flags = AI_NUMERICHOST; |
| 516 |
|
|
| 517 |
< |
if ((n = getaddrinfo(IRCItem->vhost, NULL, &hints, &res))) |
| 517 |
> |
if ((n = getaddrinfo(IRCItem.vhost, NULL, &hints, &res))) |
| 518 |
|
{ |
| 519 |
< |
log_printf("IRC -> error binding to %s: %s", IRCItem->vhost, gai_strerror(n)); |
| 519 |
> |
log_printf("IRC -> error binding to %s: %s", IRCItem.vhost, gai_strerror(n)); |
| 520 |
|
exit(EXIT_FAILURE); |
| 521 |
|
} |
| 522 |
|
else if (bind(IRC_FD, res->ai_addr, res->ai_addrlen)) |
| 523 |
|
{ |
| 524 |
< |
log_printf("IRC -> error binding to %s: %s", IRCItem->vhost, strerror(errno)); |
| 524 |
> |
log_printf("IRC -> error binding to %s: %s", IRCItem.vhost, strerror(errno)); |
| 525 |
|
exit(EXIT_FAILURE); |
| 526 |
|
} |
| 527 |
|
|
| 544 |
|
|
| 545 |
|
time(&present); |
| 546 |
|
|
| 547 |
< |
/* Only try to reconnect every IRCItem->reconnectinterval seconds */ |
| 548 |
< |
if ((present - IRC_LASTRECONNECT) < IRCItem->reconnectinterval) |
| 547 |
> |
/* Only try to reconnect every IRCItem.reconnectinterval seconds */ |
| 548 |
> |
if ((present - IRC_LASTRECONNECT) < IRCItem.reconnectinterval) |
| 549 |
|
{ |
| 550 |
|
/* Sleep to avoid excessive CPU */ |
| 551 |
|
sleep(1); |
| 560 |
|
IRC_FD = -1; /* Set IRC_FD -1 for reconnection on next irc_cycle(). */ |
| 561 |
|
} |
| 562 |
|
|
| 563 |
< |
log_printf("IRC -> Connection to (%s) failed, reconnecting.", IRCItem->server); |
| 563 |
> |
log_printf("IRC -> Connection to (%s) failed, reconnecting.", IRCItem.server); |
| 564 |
|
} |
| 565 |
|
|
| 566 |
|
/* irc_connect |
| 578 |
|
if (connect(IRC_FD, (struct sockaddr *)&IRC_SVR, svr_addrlen) == -1) |
| 579 |
|
{ |
| 580 |
|
log_printf("IRC -> connect(): error connecting to %s: %s", |
| 581 |
< |
IRCItem->server, strerror(errno)); |
| 581 |
> |
IRCItem.server, strerror(errno)); |
| 582 |
|
|
| 583 |
|
if (errno == EISCONN /* Already connected */ || errno == EALREADY /* Previous attempt not complete */) |
| 584 |
|
return; |
| 588 |
|
return; |
| 589 |
|
} |
| 590 |
|
|
| 591 |
< |
irc_send("NICK %s", IRCItem->nick); |
| 591 |
> |
irc_send("NICK %s", IRCItem.nick); |
| 592 |
|
|
| 593 |
< |
if (!EmptyString(IRCItem->password)) |
| 594 |
< |
irc_send("PASS %s", IRCItem->password); |
| 593 |
> |
if (!EmptyString(IRCItem.password)) |
| 594 |
> |
irc_send("PASS %s", IRCItem.password); |
| 595 |
|
|
| 596 |
|
irc_send("USER %s %s %s :%s", |
| 597 |
< |
IRCItem->username, |
| 598 |
< |
IRCItem->username, |
| 599 |
< |
IRCItem->username, |
| 600 |
< |
IRCItem->realname); |
| 597 |
> |
IRCItem.username, |
| 598 |
> |
IRCItem.username, |
| 599 |
> |
IRCItem.username, |
| 600 |
> |
IRCItem.realname); |
| 601 |
|
time(&IRC_LAST); |
| 602 |
|
} |
| 603 |
|
|
| 667 |
|
parv[0] = IRC_RAW + 1; |
| 668 |
|
else |
| 669 |
|
{ |
| 670 |
< |
parv[0] = IRCItem->server; |
| 670 |
> |
parv[0] = IRCItem.server; |
| 671 |
|
parv[parc++] = IRC_RAW; |
| 672 |
|
} |
| 673 |
|
|
| 778 |
|
if (IRC_FD == -1) |
| 779 |
|
{ |
| 780 |
|
/* Initialize negative cache. */ |
| 781 |
< |
if (OptionsItem->negcache) |
| 781 |
> |
if (OptionsItem.negcache) |
| 782 |
|
negcache_init(); |
| 783 |
|
|
| 784 |
|
/* Resolve remote host. */ |
| 868 |
|
vsnprintf(buf, sizeof(buf), data, arglist); |
| 869 |
|
va_end(arglist); |
| 870 |
|
|
| 871 |
< |
LIST_FOREACH(node, IRCItem->channels->head) |
| 871 |
> |
LIST_FOREACH(node, IRCItem.channels.head) |
| 872 |
|
{ |
| 873 |
|
const struct ChannelConf *chan = node->data; |
| 874 |
|
|
| 892 |
|
|
| 893 |
|
delta = present - IRC_LAST; |
| 894 |
|
|
| 895 |
< |
/* No data in IRCItem->readtimeout seconds */ |
| 896 |
< |
if (delta >= IRCItem->readtimeout) |
| 895 |
> |
/* No data in IRCItem.readtimeout seconds */ |
| 896 |
> |
if (delta >= IRCItem.readtimeout) |
| 897 |
|
{ |
| 898 |
|
log_printf("IRC -> Timeout awaiting data from server."); |
| 899 |
|
irc_reconnect(); |
| 901 |
|
/* Make sure we don't do this again for a while */ |
| 902 |
|
time(&IRC_LAST); |
| 903 |
|
} |
| 904 |
< |
else if (delta >= IRCItem->readtimeout / 2) |
| 904 |
> |
else if (delta >= IRCItem.readtimeout / 2) |
| 905 |
|
{ |
| 906 |
|
/* |
| 907 |
|
* Generate some data so high ping times don't cause uneeded |