From fa271b86eb76966b56b1a9e7f9f8419eb1c228fd Mon Sep 17 00:00:00 2001 From: Mike Belopuhov Date: Tue, 4 Mar 2014 11:34:15 +0100 Subject: [PATCH] Introduce session IDs and associated tree linkage --- icb.h | 9 ++++++++- icbd.c | 33 +++++++++++++++++++++++++++++++++ icbd.h | 3 ++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/icb.h b/icb.h index 30dadc5..966b50c 100644 --- a/icb.h +++ b/icb.h @@ -15,6 +15,7 @@ */ #include +#include #define ICB_MSGSIZE 256 @@ -65,12 +66,12 @@ enum { struct icb_group; struct icb_session { + uint64_t id; char nick[ICB_MAXNICKLEN]; char client[ICB_MAXNICKLEN]; char host[MAXHOSTNAMELEN]; char buffer[ICB_MSGSIZE+1]; struct event ev; - LIST_ENTRY(icb_session) entry; struct bufferevent *bev; struct icb_group *group; size_t length; @@ -86,6 +87,12 @@ struct icb_session { #define ICB_SF_NOGROUP 0x08 #define ICB_SF_NOBEEP 0x10 #define ICB_SF_NOBEEP2 0x20 + + /* session tree */ + RB_ENTRY(icb_session) node; + + /* in-group linkage */ + LIST_ENTRY(icb_session) entry; }; struct icb_group { diff --git a/icbd.c b/icbd.c index 80783c2..765853d 100644 --- a/icbd.c +++ b/icbd.c @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,7 @@ extern char *__progname; +uint64_t sessionid; char modtab[ICB_MTABLEN][ICB_MAXNICKLEN]; int modtabcnt; char srvname[MAXHOSTNAMELEN]; @@ -62,6 +64,12 @@ void icbd_modtab(char *); void icbd_restrict(void); void icbd_write(struct icb_session *, char *, ssize_t); +static inline int icbd_session_cmp(struct icb_session *, struct icb_session *); + +RB_HEAD(icbd_sessions, icb_session) icbd_sessions; +RB_PROTOTYPE(icbd_sessions, icb_session, node, icbd_session_cmp); +RB_GENERATE(icbd_sessions, icb_session, node, icbd_session_cmp); + int main(int argc, char *argv[]) { @@ -70,6 +78,8 @@ main(int argc, char *argv[]) int ch, nsocks = 0, save_errno = 0; int inet4 = 0, inet6 = 0; + RB_INIT(&icbd_sessions); + /* init group lists before calling icb_addgroup */ icb_init(&ic); @@ -233,6 +243,25 @@ icbd_dns(int fd, short event, void *arg) syslog(LOG_DEBUG, "icbd_dns: resolved %s", is->host); } +static inline int +icbd_session_cmp(struct icb_session *a, struct icb_session *b) +{ + if (a->id > b->id) + return (1); + if (a->id < b->id) + return (-1); + return (0); +} + +inline struct icb_session * +icbd_session_lookup(uint64_t sid) +{ + struct icb_session key; + + key.id = sid; + return (RB_FIND(icbd_sessions, &icbd_sessions, &key)); +} + void icbd_accept(int fd, short event __attribute__((__unused__)), void *arg __attribute__((__unused__))) @@ -270,6 +299,9 @@ icbd_accept(int fd, short event __attribute__((__unused__)), return; } + is->id = sessionid++; + RB_INSERT(icbd_sessions, &icbd_sessions, is); + /* save host information */ getpeerinfo(is); @@ -353,6 +385,7 @@ icbd_drop(struct icb_session *is, char *reason) (void)evbuffer_write(EVBUFFER_OUTPUT(is->bev), EVBUFFER_FD(is->bev)); (void)close(EVBUFFER_FD(is->bev)); bufferevent_free(is->bev); + RB_REMOVE(icbd_sessions, &icbd_sessions, is); free(is); } diff --git a/icbd.h b/icbd.h index fe2c16c..c0d656d 100644 --- a/icbd.h +++ b/icbd.h @@ -23,7 +23,8 @@ extern int verbose; /* icbd.c */ -time_t getmonotime(void); +inline struct icb_session *icbd_session_lookup(uint64_t); +time_t getmonotime(void); /* dns.c */ struct sockaddr_storage;