Introduce session IDs and associated tree linkage
This commit is contained in:
parent
a202ff1e88
commit
fa271b86eb
9
icb.h
9
icb.h
@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/queue.h>
|
#include <sys/queue.h>
|
||||||
|
#include <sys/tree.h>
|
||||||
|
|
||||||
#define ICB_MSGSIZE 256
|
#define ICB_MSGSIZE 256
|
||||||
|
|
||||||
@ -65,12 +66,12 @@ enum {
|
|||||||
struct icb_group;
|
struct icb_group;
|
||||||
|
|
||||||
struct icb_session {
|
struct icb_session {
|
||||||
|
uint64_t id;
|
||||||
char nick[ICB_MAXNICKLEN];
|
char nick[ICB_MAXNICKLEN];
|
||||||
char client[ICB_MAXNICKLEN];
|
char client[ICB_MAXNICKLEN];
|
||||||
char host[MAXHOSTNAMELEN];
|
char host[MAXHOSTNAMELEN];
|
||||||
char buffer[ICB_MSGSIZE+1];
|
char buffer[ICB_MSGSIZE+1];
|
||||||
struct event ev;
|
struct event ev;
|
||||||
LIST_ENTRY(icb_session) entry;
|
|
||||||
struct bufferevent *bev;
|
struct bufferevent *bev;
|
||||||
struct icb_group *group;
|
struct icb_group *group;
|
||||||
size_t length;
|
size_t length;
|
||||||
@ -86,6 +87,12 @@ struct icb_session {
|
|||||||
#define ICB_SF_NOGROUP 0x08
|
#define ICB_SF_NOGROUP 0x08
|
||||||
#define ICB_SF_NOBEEP 0x10
|
#define ICB_SF_NOBEEP 0x10
|
||||||
#define ICB_SF_NOBEEP2 0x20
|
#define ICB_SF_NOBEEP2 0x20
|
||||||
|
|
||||||
|
/* session tree */
|
||||||
|
RB_ENTRY(icb_session) node;
|
||||||
|
|
||||||
|
/* in-group linkage */
|
||||||
|
LIST_ENTRY(icb_session) entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct icb_group {
|
struct icb_group {
|
||||||
|
33
icbd.c
33
icbd.c
@ -19,6 +19,7 @@
|
|||||||
#include <sys/queue.h>
|
#include <sys/queue.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <sys/tree.h>
|
||||||
#include <netinet/in_systm.h>
|
#include <netinet/in_systm.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <netinet/ip.h>
|
#include <netinet/ip.h>
|
||||||
@ -43,6 +44,7 @@
|
|||||||
|
|
||||||
extern char *__progname;
|
extern char *__progname;
|
||||||
|
|
||||||
|
uint64_t sessionid;
|
||||||
char modtab[ICB_MTABLEN][ICB_MAXNICKLEN];
|
char modtab[ICB_MTABLEN][ICB_MAXNICKLEN];
|
||||||
int modtabcnt;
|
int modtabcnt;
|
||||||
char srvname[MAXHOSTNAMELEN];
|
char srvname[MAXHOSTNAMELEN];
|
||||||
@ -62,6 +64,12 @@ void icbd_modtab(char *);
|
|||||||
void icbd_restrict(void);
|
void icbd_restrict(void);
|
||||||
void icbd_write(struct icb_session *, char *, ssize_t);
|
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
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@ -70,6 +78,8 @@ main(int argc, char *argv[])
|
|||||||
int ch, nsocks = 0, save_errno = 0;
|
int ch, nsocks = 0, save_errno = 0;
|
||||||
int inet4 = 0, inet6 = 0;
|
int inet4 = 0, inet6 = 0;
|
||||||
|
|
||||||
|
RB_INIT(&icbd_sessions);
|
||||||
|
|
||||||
/* init group lists before calling icb_addgroup */
|
/* init group lists before calling icb_addgroup */
|
||||||
icb_init(&ic);
|
icb_init(&ic);
|
||||||
|
|
||||||
@ -233,6 +243,25 @@ icbd_dns(int fd, short event, void *arg)
|
|||||||
syslog(LOG_DEBUG, "icbd_dns: resolved %s", is->host);
|
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
|
void
|
||||||
icbd_accept(int fd, short event __attribute__((__unused__)),
|
icbd_accept(int fd, short event __attribute__((__unused__)),
|
||||||
void *arg __attribute__((__unused__)))
|
void *arg __attribute__((__unused__)))
|
||||||
@ -270,6 +299,9 @@ icbd_accept(int fd, short event __attribute__((__unused__)),
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is->id = sessionid++;
|
||||||
|
RB_INSERT(icbd_sessions, &icbd_sessions, is);
|
||||||
|
|
||||||
/* save host information */
|
/* save host information */
|
||||||
getpeerinfo(is);
|
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)evbuffer_write(EVBUFFER_OUTPUT(is->bev), EVBUFFER_FD(is->bev));
|
||||||
(void)close(EVBUFFER_FD(is->bev));
|
(void)close(EVBUFFER_FD(is->bev));
|
||||||
bufferevent_free(is->bev);
|
bufferevent_free(is->bev);
|
||||||
|
RB_REMOVE(icbd_sessions, &icbd_sessions, is);
|
||||||
free(is);
|
free(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user