ticl

tiny irc channel linker
git clone git://git.ircforever.org/ticl
Log | Files | Refs | Submodules | README | LICENSE

commit 58611c5389c4b4e820b61176617bc7ed1187f1a8
parent 49ca82832b3505a7ce86e96f11a90599219afaab
Author: libredev <libredev@ircforever.org>
Date:   Thu, 19 Jan 2023 16:36:21 +0530

fixed clone quit

Diffstat:
Mmain.c | 47+++++++++++++++++++++++++----------------------
Mutil.c | 33++++++++++++---------------------
2 files changed, 37 insertions(+), 43 deletions(-)

diff --git a/main.c b/main.c @@ -24,23 +24,21 @@ #include "htable.h" #include "util.c" -#define FALSE 0 -#define TRUE 1 - -#define EV_READ 1 -#define EV_WRITE 2 +#define CLONE_COOLDOWN 1 +#define CLONE_ADDEND 10 +/* #define PING_TIMEOUT 240 */ #define EVENT_ADDEND 100 #define NET_ADDEND 10 #define USER_ADDEND 100 -#define PING_TIMEOUT 240 -#define CLONE_COOLDOWN 1 -#define CLONE_ADDEND 10 #define BUFSIZE 1024 #define NICK_LEN 16 #define MAX_EVENTS 10 +#define EV_READ 1 +#define EV_WRITE 2 + enum { IDLE = 0, RESET, @@ -133,7 +131,7 @@ main(int argc, char *argv[]) struct kevent kevs [MAX_EVENTS]; /* maximum event to handle */ struct timespec tmsp; #endif - int i, fd, id, nev; + int i, r, fd, id, nev; time_t timeout; time_t ntime; /* next timeout time */ @@ -218,9 +216,12 @@ main(int argc, char *argv[]) #else } else if (kevs[i].filter == EVFILT_READ) { #endif - if (event_read(id)) { + r = event_read(id); + if (r == 1) { timeout_id = -1; ntime = 0; + } else if (r == -2) { + break; } } else { errx(1, "unknown event"); @@ -304,6 +305,9 @@ fifo_read(void) return; } + if (!*buffer) + return; + buf = buffer; cmd = split(&buf, ' '); if (strcmp(cmd, "netadd") == 0) { @@ -368,7 +372,6 @@ event_timeout(void) if (!n->ready || ids[i] != 0) continue; ids[i] = clone_add(nick, i); - printf("%d: %s\n", events[ids[i]].fd, nick); } if (++j >= CLONE_ADDEND) goto calculate; @@ -621,11 +624,9 @@ event_read(int id) || (strcmp(cmd, "PART") == 0)) { snprintf(msg, sizeof(msg), "QUIT :%s\r\n", buf); nick_add_symb(nick, netid); - if (htsearch(users, nick) != NULL) { - printf("userdel: %s\n", nick); + if (htsearch(users, nick) != NULL) user_del(nick, msg); - } - return 0; + return -2; } else if (strcmp(cmd, "NICK") == 0) { int *ids, i; char *newnick; @@ -693,6 +694,7 @@ event_read(int id) return 0; } printbuffer: + printf("%d: %s\n", fd, backup); return 0; } @@ -841,17 +843,14 @@ user_add(char *unick, int netid, int clone) sprintf(nick, "%s[%s]", unick, networks[netid].symb); ids[netid] = -1; - printf("useradd: %s\n", nick); + if (debug) + printf("useradd: %s\n", nick); if (clone) { /* clone the user on all other network */ for (i = 0; i < netlen; i++) { - if (networks[i].ready == FALSE) - continue; - if (i != netid) { + if (networks[i].ready && i != netid) ids[i] = clone_add(nick, i); - printf("%d: %s\n", events[ids[i]].fd, nick); - } } } @@ -871,7 +870,10 @@ user_del(char *nick, char *msg) for (i = 0; i < netlen; i++) { if (ids[i] <= 0) continue; - if (events[ids[i]].ready == TRUE) + printf("%d: del[%s]: %s\n", events[ids[i]].fd, + networks[i].symb, nick); + + if (events[ids[i]].ready) writeall(events[ids[i]].fd, msg); event_del(ids[i]); } @@ -913,6 +915,7 @@ clone_add(char *nick, int netid) warn("enable to connect to %s\n", n->host); return -1; } + printf("%d: add[%s]: %s\n", fd, n->symb, nick); return event_add(fd, netid, nick); } diff --git a/util.c b/util.c @@ -20,6 +20,9 @@ #include <err.h> #endif +#define FALSE 0 +#define TRUE 1 + /* * ecalloc - calloc with error handling */ @@ -142,34 +145,22 @@ dial(char *host, char *port) ssize_t readline(int fd, char *buffer, size_t size) { - static int left_fd; - static char left_buf[1024]; - size_t i = 0; char c; ssize_t l; - if (fd == left_fd && strlen(left_buf) > 0) { - strlcpy(buffer, left_buf, size); - *left_buf = '\0'; - i = strlen(buffer); - } - do { - if ((l = read(fd, &c, sizeof(char))) != sizeof(char)) { - if (l == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { - buffer[i] = '\0'; - left_fd = fd; - strlcpy(left_buf, buffer, size); - *buffer = '\0'; - return 1; - } - return l; - } - buffer[i++] = c; + l = read(fd, &c, sizeof(char)); + if (l > 0) + buffer[i++] = c; + else if (l == 0) + return 0; + else if (l == -1 && errno == EAGAIN) + continue; + else + return -1; } while ((i < size) && (c != '\r') && (c != '\n')); buffer[i-1] = '\0'; return (ssize_t)i; - }