};
/* functions */
-extern int ebuf_init();
+extern int ebuf_init(void);
extern eBuffer *ebuf_begin_share(const char *buffer, int len);
extern int ebuf_end_share(eBuffer *s);
extern int ebuf_put_share(eBuf *sb, eBuffer *s);
#ifndef MDF_H
#define MDF_H
-extern int mfd_add(SockEng *s, myfd *fd, void *owner, void (*cb)());
+extern int mfd_add(SockEng *s, myfd *fd, void *owner, void (*cb)(SockEng *, void *, int, int));
extern void mfd_del(SockEng *s, myfd *fd);
extern void mfd_read(SockEng *s, myfd *fd);
extern void mfd_unread(SockEng *s, myfd *fd);
#include <errno.h>
#include <unistd.h>
+#include "setup.h"
#include "ebuf.h"
-#define WRITEV_IOV 32 /* FIXME future configured value */
+#define MAX_FDS MAXCONNECTIONS
#define DEBUG
-#define MAX_FDS 1024 /* maximum supported file descriptors */
#define BUFSIZE 8192
/* threadsafe atomics for interacting with memory less than 8 bytes (long long) */
int fd;
int state;
void *owner;
- void (*cb)();
+ void (*cb)(SockEng *, void *, int, int);
void *internal;
};
SockEng *sockeng; /* socket engine for this client */
/* functions */
- int (*send)();
- int (*close)();
- int (*qopts)();
+ int (*send)(Client *, char *, int);
+ int (*close)(Client *);
+ int (*qopts)(Client *, int);
- int (*set_packeter)();
- int (*set_parser)();
- int (*set_onclose)();
+ int (*set_packeter)(Client *, int (*)(Client *, char *, int));
+ int (*set_parser)(Client *, int (*)(Client *, char *, int));
+ int (*set_onclose)(Client *, void (*)(Client *, int));
int (*packeter)(Client *, char *, int);
int (*parser)(Client *, char *, int);
- int (*onclose)(Client *c, int);
+ void (*onclose)(Client *, int);
};
/*
int flags; /* flags? */
- int (*qopts)(); /* function to set options */
- int (*set_packeter)(); /* function to set packeter */
- int (*set_parser)(); /* function to set parser */
- int (*set_onconnect)(); /* function to set the onconnect handler */
- int (*set_onclose)(); /* function to set the onclose hanlder */
+ /* function prototypes */
+ int (*qopts)(Listener *, int);
+ int (*set_packeter)(Listener *, int (*)(Client *, char *, int));
+ int (*set_parser)(Listener *, int (*)(Client *, char *, int));
+ int (*set_onconnect)(Listener *, int (*)(Client *));
+ int (*set_onclose)(Listener *, void (*)(Client *, int));
-
- int (*packeter)(Client *, char *, int); /* the packeter */
- int (*parser)(Client *, char *, int); /* the parser */
- int (*onconnect)(Client *c); /* on-connect client handler */
- void (*onclose)(Client *c, int err); /* on-close client handler */
+ int (*packeter)(Client *, char *, int);
+ int (*parser)(Client *, char *, int);
+ int (*onconnect)(Client *c);
+ void (*onclose)(Client *c, int err);
};
myfd *local[MAX_FDS];
/* functions */
- Listener *(*create_listener)();
- Group *(*create_group)();
- int (*poll)();
- int (*set_errorhandler)();
- void (*error)(int errno, char *msg);
+ Listener *(*create_listener)(SockEng *, unsigned short, ipvx *);
+ Group *(*create_group)(SockEng *);
+ int (*poll)(SockEng *, time_t);
+ int (*set_errorhandler)(SockEng *, int, void (*)(int, char *));
+ void (*error)(int, char *);
};
/* functions */
-extern SockEng *init_sockeng();
+extern SockEng *init_sockeng(void);
#endif
return 0;
}
-static void client_close(Client *c)
+static int client_close(Client *c)
{
/* clean up and close the client out */
ebuf_delete(&c->recvQ, eBufLength(&c->recvQ));
mfd_del(c->sockeng, &c->fdp);
close(c->fdp.fd);
free(c);
- return;
+ return 0;
}
static int client_qopts(Client *c, int qopts)
return 0;
}
-static int client_setparser(Client *c, int (*func)())
+static int client_setparser(Client *c, int (*func)(Client *, char *, int))
{
if(c) {
c->parser = func;
return -1;
}
-static int client_setpacketer(Client *c, char *(*func)())
+static int client_setpacketer(Client *c, int (*func)(Client *, char *, int))
{
if(c) {
c->packeter = func;
return -1;
}
-static int client_setonclose(Client *c, void (*func)())
+static int client_setonclose(Client *c, void (*func)(Client *, int))
{
if(c) {
c->onclose = func;
if(len == 0)
return;
if(eBufLength(&c->recvQ) > 0) {
- if(ebuf_put(&c->recvQ, &readbuf, len))
+ if(ebuf_put(&c->recvQ, readbuf, len))
return;
- len = ebuf_get(&c->recvQ, &readbuf, BUFSIZE);
- plen = c->packeter(c, &readbuf, len);
+ len = ebuf_get(&c->recvQ, readbuf, BUFSIZE);
+ plen = c->packeter(c, readbuf, len);
if(plen) {
- c->parser(c, &readbuf, plen);
+ c->parser(c, readbuf, plen);
ebuf_delete(&c->recvQ, plen);
}
} else {
- plen = c->packeter(c, &readbuf, len);
+ plen = c->packeter(c, readbuf, len);
if(plen)
- c->parser(c, &readbuf, plen);
- else if(ebuf_put(&c->recvQ, &readbuf, len))
+ c->parser(c, readbuf, plen);
+ else if(ebuf_put(&c->recvQ, readbuf, len))
return;
}
return;
return;
}
-void client_do_rw(SockEng *s, Client *c, int rr, int rw)
+void client_do_rw(SockEng *s, void *in, int rr, int rw)
{
+ Client *c = in;
if(rr)
client_doread(c);
if(rw)
return new;
}
-Client *create_client()
+Client *create_client(void)
{
return create_client_t(NULL);
}
}
}
-static eBufUser *ebuf_user_alloc()
+static eBufUser *ebuf_user_alloc(void)
{
eBufUser *user;
return user;
}
-static int ebuf_alloc_error()
+static int ebuf_alloc_error(void)
{
return -1;
}
/* Global functions */
-int ebuf_init()
+int ebuf_init(void)
{
memset(&sbc, 0, sizeof(eBufConfig));
ebuf_allocblock_small(INITIAL_EBUFS_SMALL);
*/
#include "sockeng.h"
+#include "mfd.h"
/* forward declarations */
Group *create_supergroup(SockEng *s);
}
/* iniitialize a group */
-static Group *create_group_t()
+static Group *create_group_t(void)
{
Group *new;
#include <sys/socket.h>
#include <netinet/in.h>
-extern void client_do_rw(SockEng *s, Client *c, int rr, int rw);
+extern void client_do_rw(SockEng *s, void *c, int rr, int rw);
+extern Client *create_client_t(Listener *);
static int listener_qopts(Listener *l, int opts)
{
return 0;
}
-static int listener_setpacketer(Listener *l, char *(*func)())
+static int listener_setpacketer(Listener *l, int (*func)(Client *, char *, int))
{
if(l) {
l->packeter = func;
return -1;
}
-static int listener_setparser(Listener *l, int (*func)())
+static int listener_setparser(Listener *l, int (*func)(Client *, char *, int))
{
if(l) {
l->parser = func;
return -1;
}
-static int listener_setonconnect(Listener *l, int (*func)())
+static int listener_setonconnect(Listener *l, int (*func)(Client *))
{
if(l) {
l->onconnect = func;
return -1;
}
-static int listener_setonclose(Listener *l, void (*func)())
+static int listener_setonclose(Listener *l, void (*func)(Client *, int))
{
if(l) {
l->onclose = func;
return 0;
}
-static void accept_tcp6_connect(SockEng *s, Listener *l, int rr, int rw)
+static void accept_tcp6_connect(SockEng *s, void *in, int rr, int rw)
{
+ Listener *l = in;
int i, newfd;
struct sockaddr_in6 addr;
unsigned int addrlen = sizeof(struct sockaddr_in6);
}
}
-static void accept_tcp4_connect(SockEng *s, Listener *l, int rr, int rw)
+static void accept_tcp4_connect(SockEng *s, void *in, int rr, int rw)
{
+ Listener *l = in;
int i, newfd;
struct sockaddr_in addr;
unsigned int addrlen = sizeof(struct sockaddr_in);
#endif
}
-int mfd_add(SockEng *s, myfd *fd, void *owner, void (*cb)())
+int mfd_add(SockEng *s, myfd *fd, void *owner, void (*cb)(SockEng *, void *, int, int))
{
if(s->local[fd->fd] != NULL)
return -1;
#include "sockeng.h"
#include "engine.h"
-extern Group *create_supergroup(SockEng *s);
-extern Listener *create_listener(SockEng *s);
+extern Group *create_supergroup(SockEng *);
+extern Listener *create_listener(SockEng *, unsigned short, ipvx *);
-static int set_errorhandler(SockEng *s, int level, void (*func)())
+static int set_errorhandler(SockEng *s, int level, void (*func)(int, char *))
{
if(!s)
return -1;