Dolda2000 GitWeb
/
doldaconnect.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revert to previous socket scheme.
[doldaconnect.git]
/
daemon
/
net.c
diff --git
a/daemon/net.c
b/daemon/net.c
index
4054518
..
2a8fdef
100644
(file)
--- a/
daemon/net.c
+++ b/
daemon/net.c
@@
-174,11
+174,11
@@
static struct socket *newsock(int type)
new->inbuf.d.f = new->inbuf.d.l = NULL;
break;
}
new->inbuf.d.f = new->inbuf.d.l = NULL;
break;
}
-
CBCHAININIT(new, socket_conn)
;
-
CBCHAININIT(new, socket_err)
;
-
CBCHAININIT(new, socket_read)
;
-
CBCHAININIT(new, socket_write)
;
-
CBCHAININIT(new, socket_accept)
;
+
new->conncb = NULL
;
+
new->errcb = NULL
;
+
new->readcb = NULL
;
+
new->writecb = NULL
;
+
new->acceptcb = NULL
;
new->next = sockets;
new->prev = NULL;
if(sockets != NULL)
new->next = sockets;
new->prev = NULL;
if(sockets != NULL)
@@
-240,11
+240,6
@@
void putsock(struct socket *sk)
if(--(sk->refcount) == 0)
{
if(--(sk->refcount) == 0)
{
- CBCHAINFREE(sk, socket_conn);
- CBCHAINFREE(sk, socket_err);
- CBCHAINFREE(sk, socket_read);
- CBCHAINFREE(sk, socket_write);
- CBCHAINFREE(sk, socket_accept);
switch(sk->type)
{
case SOCK_STREAM:
switch(sk->type)
{
case SOCK_STREAM:
@@
-357,18
+352,21
@@
static void sockrecv(struct socket *sk)
{
if((errno == EINTR) || (errno == EAGAIN))
return;
{
if((errno == EINTR) || (errno == EAGAIN))
return;
- CBCHAINDOCB(sk, socket_err, sk, errno);
+ if(sk->errcb != NULL)
+ sk->errcb(sk, errno, sk->data);
closesock(sk);
return;
}
if(ret == 0)
{
closesock(sk);
return;
}
if(ret == 0)
{
- CBCHAINDOCB(sk, socket_err, sk, 0);
+ if(sk->errcb != NULL)
+ sk->errcb(sk, 0, sk->data);
closesock(sk);
return;
}
sk->inbuf.s.datasize += ret;
closesock(sk);
return;
}
sk->inbuf.s.datasize += ret;
- CBCHAINDOCB(sk, socket_read, sk);
+ if(sk->readcb != NULL)
+ sk->readcb(sk, sk->data);
break;
case SOCK_DGRAM:
if(ioctl(sk->fd, SIOCINQ, &inq))
break;
case SOCK_DGRAM:
if(ioctl(sk->fd, SIOCINQ, &inq))
@@
-389,7
+387,8
@@
static void sockrecv(struct socket *sk)
free(dbuf);
if((errno == EINTR) || (errno == EAGAIN))
return;
free(dbuf);
if((errno == EINTR) || (errno == EAGAIN))
return;
- CBCHAINDOCB(sk, socket_err, sk, errno);
+ if(sk->errcb != NULL)
+ sk->errcb(sk, errno, sk->data);
closesock(sk);
return;
}
closesock(sk);
return;
}
@@
-404,7
+403,8
@@
static void sockrecv(struct socket *sk)
free(dbuf);
if(!((sk->family == AF_INET) || (sk->family == AF_INET6)))
{
free(dbuf);
if(!((sk->family == AF_INET) || (sk->family == AF_INET6)))
{
- CBCHAINDOCB(sk, socket_err, sk, 0);
+ if(sk->errcb != NULL)
+ sk->errcb(sk, 0, sk->data);
closesock(sk);
}
return;
closesock(sk);
}
return;
@@
-417,7
+417,8
@@
static void sockrecv(struct socket *sk)
else
sk->inbuf.d.f = dbuf;
sk->inbuf.d.l = dbuf;
else
sk->inbuf.d.f = dbuf;
sk->inbuf.d.l = dbuf;
- CBCHAINDOCB(sk, socket_read, sk);
+ if(sk->readcb != NULL)
+ sk->readcb(sk, sk->data);
break;
}
}
break;
}
}
@@
-443,7
+444,8
@@
static void sockflush(struct socket *sk)
if(ret > 0)
{
memmove(sk->outbuf.s.buf, ((char *)sk->outbuf.s.buf) + ret, sk->outbuf.s.datasize -= ret);
if(ret > 0)
{
memmove(sk->outbuf.s.buf, ((char *)sk->outbuf.s.buf) + ret, sk->outbuf.s.datasize -= ret);
- CBCHAINDOCB(sk, socket_write, sk);
+ if(sk->writecb != NULL)
+ sk->writecb(sk, sk->data);
}
break;
case SOCK_DGRAM:
}
break;
case SOCK_DGRAM:
@@
-454,7
+456,8
@@
static void sockflush(struct socket *sk)
free(dbuf->data);
free(dbuf->addr);
free(dbuf);
free(dbuf->data);
free(dbuf->addr);
free(dbuf);
- CBCHAINDOCB(sk, socket_write, sk);
+ if(sk->writecb != NULL)
+ sk->writecb(sk, sk->data);
break;
}
}
break;
}
}
@@
-544,7
+547,7
@@
size_t sockqueuesize(struct socket *sk)
* netcslisten() instead.
*/
* netcslisten() instead.
*/
-struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen,
int
(*func)(struct socket *, struct socket *, void *), void *data)
+struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen,
void
(*func)(struct socket *, struct socket *, void *), void *data)
{
struct socket *sk;
int intbuf;
{
struct socket *sk;
int intbuf;
@@
-573,12
+576,12
@@
struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namel
putsock(sk);
return(NULL);
}
putsock(sk);
return(NULL);
}
- if(func != NULL)
-
CBREG(sk, socket_accept, func, NULL, data)
;
+ sk->acceptcb = func;
+
sk->data = data
;
return(sk);
}
return(sk);
}
-struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen,
int
(*func)(struct socket *, struct socket *, void *), void *data)
+struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen,
void
(*func)(struct socket *, struct socket *, void *), void *data)
{
if(confgetint("net", "mode") == 1)
{
{
if(confgetint("net", "mode") == 1)
{
@@
-591,13
+594,13
@@
struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, i
return(NULL);
}
return(NULL);
}
-struct socket *netcstcplisten(int port, int local,
int
(*func)(struct socket *, struct socket *, void *), void *data)
+struct socket *netcstcplisten(int port, int local,
void
(*func)(struct socket *, struct socket *, void *), void *data)
{
struct sockaddr_in addr;
#ifdef HAVE_IPV6
struct sockaddr_in6 addr6;
#endif
{
struct sockaddr_in addr;
#ifdef HAVE_IPV6
struct sockaddr_in6 addr6;
#endif
- struct socket *(*csfunc)(int, struct sockaddr *, socklen_t,
int
(*)(struct socket *, struct socket *, void *), void *);
+ struct socket *(*csfunc)(int, struct sockaddr *, socklen_t,
void
(*)(struct socket *, struct socket *, void *), void *);
struct socket *ret;
if(local)
struct socket *ret;
if(local)
@@
-668,7
+671,7
@@
void netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen)
sk->ignread = 1;
}
sk->ignread = 1;
}
-struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen,
int
(*func)(struct socket *, int, void *), void *data)
+struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen,
void
(*func)(struct socket *, int, void *), void *data)
{
struct socket *sk;
int mode;
{
struct socket *sk;
int mode;
@@
-688,8
+691,8
@@
struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, int (*func)(s
if(errno == EINPROGRESS)
{
sk->state = SOCK_SYN;
if(errno == EINPROGRESS)
{
sk->state = SOCK_SYN;
- if(func != NULL)
-
CBREG(sk, socket_conn, func, NULL, data)
;
+ sk->conncb = func;
+
sk->data = data
;
return(sk);
}
putsock(sk);
return(sk);
}
putsock(sk);
@@
-756,7
+759,10
@@
int pollsocks(int timeout)
{
sslen = sizeof(ss);
if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0)
{
sslen = sizeof(ss);
if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0)
- CBCHAINDOCB(sk, socket_err, sk, errno);
+ {
+ if(sk->errcb != NULL)
+ sk->errcb(sk, errno, sk->data);
+ }
newsk = newsock(sk->type);
newsk->fd = newfd;
newsk->family = sk->family;
newsk = newsock(sk->type);
newsk->fd = newfd;
newsk->family = sk->family;
@@
-764,13
+770,15
@@
int pollsocks(int timeout)
memcpy(newsk->remote = smalloc(sslen), &ss, sslen);
newsk->remotelen = sslen;
putsock(newsk);
memcpy(newsk->remote = smalloc(sslen), &ss, sslen);
newsk->remotelen = sslen;
putsock(newsk);
- CBCHAINDOCB(sk, socket_accept, sk, newsk);
+ if(sk->acceptcb != NULL)
+ sk->acceptcb(sk, newsk, sk->data);
}
if(pfds[i].revents & POLLERR)
{
retlen = sizeof(ret);
getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
}
if(pfds[i].revents & POLLERR)
{
retlen = sizeof(ret);
getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
- CBCHAINDOCB(sk, socket_err, sk, ret);
+ if(sk->errcb != NULL)
+ sk->errcb(sk, ret, sk->data);
continue;
}
break;
continue;
}
break;
@@
-779,14
+787,16
@@
int pollsocks(int timeout)
{
retlen = sizeof(ret);
getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
{
retlen = sizeof(ret);
getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
- CBCHAINDOCB(sk, socket_conn, sk, ret);
+ if(sk->conncb != NULL)
+ sk->conncb(sk, ret, sk->data);
closesock(sk);
continue;
}
if(pfds[i].revents & (POLLIN | POLLOUT))
{
sk->state = SOCK_EST;
closesock(sk);
continue;
}
if(pfds[i].revents & (POLLIN | POLLOUT))
{
sk->state = SOCK_EST;
- CBCHAINDOCB(sk, socket_conn, sk, 0);
+ if(sk->conncb != NULL)
+ sk->conncb(sk, 0, sk->data);
}
break;
case SOCK_EST:
}
break;
case SOCK_EST:
@@
-794,7
+804,8
@@
int pollsocks(int timeout)
{
retlen = sizeof(ret);
getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
{
retlen = sizeof(ret);
getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
- CBCHAINDOCB(sk, socket_err, sk, ret);
+ if(sk->errcb != NULL)
+ sk->errcb(sk, ret, sk->data);
closesock(sk);
continue;
}
closesock(sk);
continue;
}
@@
-816,7
+827,8
@@
int pollsocks(int timeout)
}
if(pfds[i].revents & POLLHUP)
{
}
if(pfds[i].revents & POLLHUP)
{
- CBCHAINDOCB(sk, socket_err, sk, 0);
+ if(sk->errcb != NULL)
+ sk->errcb(sk, 0, sk->data);
closesock(sk);
unlinksock(sk);
continue;
closesock(sk);
unlinksock(sk);
continue;