Introduce session IDs and associated tree linkage

This commit is contained in:
Mike Belopuhov 2014-03-04 11:34:15 +01:00
parent a202ff1e88
commit fa271b86eb
3 changed files with 43 additions and 2 deletions

9
icb.h
View File

@ -15,6 +15,7 @@
*/
#include <sys/queue.h>
#include <sys/tree.h>
#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 {

33
icbd.c
View File

@ -19,6 +19,7 @@
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/tree.h>
#include <netinet/in_systm.h>
#include <netinet/in.h>
#include <netinet/ip.h>
@ -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);
}

1
icbd.h
View File

@ -23,6 +23,7 @@
extern int verbose;
/* icbd.c */
inline struct icb_session *icbd_session_lookup(uint64_t);
time_t getmonotime(void);
/* dns.c */