Merge intervals into one and improve ping/reconnect logic
This commit is contained in:
parent
32de8270f4
commit
c0eca28927
36
src/main.c
36
src/main.c
|
@ -92,7 +92,7 @@ int main(int argc, char* argv[])
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (cpid == 0) {
|
} else if (cpid == 0) {
|
||||||
return run_main(&cons[actcon], delay, 10, quitmsg, timeout);
|
return run_main(&cons[actcon], delay, quitmsg, timeout);
|
||||||
} else {
|
} else {
|
||||||
LOG(LOG_VERBOSE, "Successfully forked for connection " ADDRFMT ".", cons[actcon].data.addr, cons[actcon].data.port);
|
LOG(LOG_VERBOSE, "Successfully forked for connection " ADDRFMT ".", cons[actcon].data.addr, cons[actcon].data.port);
|
||||||
actcon++;
|
actcon++;
|
||||||
|
@ -106,15 +106,15 @@ int main(int argc, char* argv[])
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int run_main(Connection* conn, unsigned int recon_inter, unsigned int ping_inter, char* quitmsg, int timeout)
|
int run_main(Connection* conn, unsigned int recon_inter, char* quitmsg, int timeout)
|
||||||
{
|
{
|
||||||
IRC_Message buffer;
|
IRC_Message buffer;
|
||||||
char sendbuf[MAXLINE + 1], recvbuf[MAXLINE + 1], fifobuf[MAXLINE + 1], /* Buffers */
|
char sendbuf[MAXLINE + 1], recvbuf[MAXLINE + 1], fifobuf[MAXLINE + 1], /* Buffers */
|
||||||
connstr[100], *path[4] = {connstr, NULL, 0}; /* Path buffers */
|
connstr[100], *path[4] = {connstr, NULL, 0}; /* Path buffers */
|
||||||
size_t sendbufpos = 0, recvbufpos = 0, fifobufpos = 0; /* Positions */
|
size_t sendbufpos = 0, recvbufpos = 0, fifobufpos = 0; /* Positions */
|
||||||
signed int connstate = CONN_PENDING, fds[2] = {-1, -1}; /* Connection state and file descriptors */
|
signed int connstate = CONN_PENDING, fds[2] = {-1, -1}; /* Connection state and file descriptors */
|
||||||
unsigned int lastping = 0, lastconnect = 0, ctime = 0, lastpong = 0, /* Timestamps */
|
unsigned int lastping = 0, lastconnect = 0, ctime = 0, lastpong = 0, lastmesg = 0, /* Timestamps */
|
||||||
pinginter = (ping_inter) ? ping_inter : 10, reconinter = (recon_inter) ? recon_inter : 10; /* Intervals */
|
reconinter = (recon_inter) ? recon_inter : 10; /* Intervals */
|
||||||
|
|
||||||
get_connstr(connstr, sizeof(connstr), conn);
|
get_connstr(connstr, sizeof(connstr), conn);
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
|
@ -210,12 +210,12 @@ int run_main(Connection* conn, unsigned int recon_inter, unsigned int ping_inter
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (connstate == CONN_ACTIVE) {
|
} else if (connstate == CONN_ACTIVE) {
|
||||||
if (lastpong < lastping - timeout) {
|
if (lastmesg < ctime - timeout && lastpong < lastping - timeout) {
|
||||||
LOG(LOG_WARN, "Server " ADDRFMT " didn't respond to a PING in time.", conn->data.addr, conn->data.port);
|
LOG(LOG_WARN, "Server " ADDRFMT " didn't respond to a PING in time.", conn->data.addr, conn->data.port);
|
||||||
connstate = CONN_PENDING;
|
connstate = CONN_PENDING;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (ctime - lastping >= ping_inter) {
|
if (ctime - lastmesg >= timeout / 4 && ctime - lastping >= timeout / 4) {
|
||||||
char mesg[] = "uIRC PING -- XXXXXX";
|
char mesg[] = "uIRC PING -- XXXXXX";
|
||||||
snprintf(mesg + sizeof(mesg) - 7, 7, "%.7i", rand());
|
snprintf(mesg + sizeof(mesg) - 7, 7, "%.7i", rand());
|
||||||
if ((sendbufpos = Assm_mesg(sendbuf, Assm_cmd_PING(mesg, NULL), sizeof(sendbuf))) > 0) {
|
if ((sendbufpos = Assm_mesg(sendbuf, Assm_cmd_PING(mesg, NULL), sizeof(sendbuf))) > 0) {
|
||||||
|
@ -249,6 +249,7 @@ int run_main(Connection* conn, unsigned int recon_inter, unsigned int ping_inter
|
||||||
if (ppoi > recvbuf && *(ppoi - 1) == '\r')
|
if (ppoi > recvbuf && *(ppoi - 1) == '\r')
|
||||||
*(ppoi - 1) = '\0';
|
*(ppoi - 1) = '\0';
|
||||||
LOG(LOG_DEBUG, "Recieved line: %s", recvbuf);
|
LOG(LOG_DEBUG, "Recieved line: %s", recvbuf);
|
||||||
|
lastmesg = ctime;
|
||||||
memset((void*)&buffer, '\0', sizeof(IRC_Message));
|
memset((void*)&buffer, '\0', sizeof(IRC_Message));
|
||||||
if (Tok_mesg(recvbuf, &buffer) == 1) {
|
if (Tok_mesg(recvbuf, &buffer) == 1) {
|
||||||
char bufname[MAXPATH + 1], logpath[PATH_MAX], *bprint = "out";
|
char bufname[MAXPATH + 1], logpath[PATH_MAX], *bprint = "out";
|
||||||
|
@ -324,13 +325,16 @@ int run_main(Connection* conn, unsigned int recon_inter, unsigned int ping_inter
|
||||||
case (RPL_WELCOME): {
|
case (RPL_WELCOME): {
|
||||||
LOG(LOG_INFO, "Connection established to " ADDRFMT ".", conn->data.addr, conn->data.port);
|
LOG(LOG_INFO, "Connection established to " ADDRFMT ".", conn->data.addr, conn->data.port);
|
||||||
connstate = CONN_ACTIVE;
|
connstate = CONN_ACTIVE;
|
||||||
LOG(LOG_VERBOSE, "Auto-joining channels \"%s\" on " ADDRFMT ".", conn->data.chans, conn->data.addr, conn->data.port);
|
if (conn->data.chans != NULL) {
|
||||||
if ((sendbufpos = Assm_mesg(sendbuf, Assm_cmd_JOIN(conn->data.chans, NULL), sizeof(sendbuf))) > 0)
|
LOG(LOG_VERBOSE, "Auto-joining channels \"%s\" on " ADDRFMT ".", conn->data.chans, conn->data.addr, conn->data.port);
|
||||||
if (flush_buffer(sendbuf, sendbufpos, fds[0]) == -1) {
|
if ((sendbufpos = Assm_mesg(sendbuf, Assm_cmd_JOIN(conn->data.chans, NULL), sizeof(sendbuf))) > 0) {
|
||||||
LOG(LOG_WARN, "Couldn't auto-join channels \"%s\" " ADDRFMT ". " ERRNOFMT, conn->data.chans, conn->data.addr, conn->data.port, strerror(errno), errno);
|
if (flush_buffer(sendbuf, sendbufpos, fds[0]) == -1) {
|
||||||
connstate = CONN_PENDING;
|
LOG(LOG_WARN, "Couldn't auto-join channels \"%s\" " ADDRFMT ". " ERRNOFMT, conn->data.chans, conn->data.addr, conn->data.port, strerror(errno), errno);
|
||||||
continue;
|
connstate = CONN_PENDING;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case (ERROR): {
|
case (ERROR): {
|
||||||
|
|
|
@ -30,5 +30,5 @@
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#define VERSION "indev - testing"
|
#define VERSION "indev - testing"
|
||||||
int run_main(Connection* conn, unsigned int recon_inter, unsigned int ping_inter, char* quitmsg, int timeout);
|
int run_main(Connection* conn, unsigned int recon_inter, char* quitmsg, int timeout);
|
||||||
void print_help(void);
|
void print_help(void);
|
||||||
|
|
Reference in New Issue