wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

commit f821f0fcedddfff559ae3d0a57927f9dfff10ca3
parent 97032c01a8974c9996cd61869374f0851d811532
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Fri, 20 Jan 2006 16:13:07 +0200

allowing delaying Trequests in libixp2/server.c


Diffstat:
libixp2/ixp.h | 2++
libixp2/server.c | 34+++++++++++++++++++++++++---------
2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/libixp2/ixp.h b/libixp2/ixp.h @@ -190,6 +190,8 @@ typedef struct { struct IXPConn { int fd; int dont_close; + void *retry; + unsigned int size; void (*read) (IXPServer *, IXPConn *); void *aux; }; diff --git a/libixp2/server.c b/libixp2/server.c @@ -63,6 +63,7 @@ init_conn(IXPConn * c, int fd, int dont_close, { *c = zero_conn; c->fd = fd; + c->retry = nil; c->dont_close = dont_close; c->read = read; return c; @@ -84,7 +85,7 @@ handle_conns(IXPServer * s) int i; for(i = 0; i < IXP_MAX_CONN; i++) { if(s->conn[i].fd >= 0) { - if(FD_ISSET(s->conn[i].fd, &s->rd) && s->conn[i].read) + if((s->conn[i].retry || FD_ISSET(s->conn[i].fd, &s->rd)) && s->conn[i].read) /* call back read handler */ s->conn[i].read(s, &s->conn[i]); } @@ -95,21 +96,36 @@ static void server_client_read(IXPServer * s, IXPConn * c) { unsigned int i, msize; + int ret; s->errstr = 0; - if(!(msize = ixp_recv_message(c->fd, msg, IXP_MAX_MSG, &s->errstr))) { - ixp_server_rm_conn(s, c); - return; - } + if(!c->retry) { + if(!(msize = ixp_recv_message(c->fd, msg, IXP_MAX_MSG, &s->errstr))) { + ixp_server_rm_conn(s, c); + return; + } + } + else + memcpy(msg, c->retry, c->size); + fprintf(stderr, "msize=%d\n", msize); if((msize = ixp_msg_to_fcall(msg, IXP_MAX_MSG, &s->fcall))) { for(i = 0; s->funcs && s->funcs[i].id; i++) { if(s->funcs[i].id == s->fcall.id) { - if(s->funcs[i].tfunc(s, c) == -1) - break; + ret = s->funcs[i].tfunc(s, c); + if(ret == -1) + break; + else if(ret == -2) { + c->size = msize; + c->retry = cext_emallocz(msize); + memcpy(c->retry, msg, msize); + return; + } + if(c->retry) + free(c->retry); + c->retry = nil; msize = ixp_fcall_to_msg(&s->fcall, msg, s->fcall.maxmsg); fprintf(stderr, "msize=%d\n", msize); - if(ixp_send_message(c->fd, msg, msize, &s->errstr) != - msize) + if(ixp_send_message(c->fd, msg, msize, &s->errstr) != msize) break; return; }