wmii

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

commit 5bcdd8c93813bee97492c723c108aa59840238e4
parent 512e1c824b3c4d24b6fe0836a411eb31f3805d30
Author: Kris Maglione <bsdaemon@wmii.de>
Date:   Sat, 10 Jun 2006 02:18:32 -0400

Fixed message.c size calculation brokenness. This is better, not ideal; to be cleaned up.


Diffstat:
cmd/wm/fs.c | 50++++++++++++++++++++++++++------------------------
libixp/convert.c | 128+++++++++++++++++++++++++++++++++++++++++--------------------------------------
libixp/ixp.h | 18+++++++++---------
libixp/message.c | 176++++++++++++++++++++++++-------------------------------------------------------
libixp/socket.c | 2+-
5 files changed, 156 insertions(+), 218 deletions(-)

diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -613,7 +613,7 @@ stat_of_name(Stat *stat, char *name, PackedQid wqid[IXP_MAX_WELEM], unsigned sho } static unsigned int -stat_of_names(unsigned char **p, PackedQid wqid[IXP_MAX_WELEM], unsigned short qsel, ...) +stat_of_names(unsigned char **p, int *iounit, PackedQid wqid[IXP_MAX_WELEM], unsigned short qsel, ...) { va_list ap; char *str; @@ -624,7 +624,7 @@ stat_of_names(unsigned char **p, PackedQid wqid[IXP_MAX_WELEM], unsigned short q while((str = va_arg(ap, char *))) { n += stat_of_name(&stat, str, wqid, qsel); - *p = ixp_pack_stat(*p, &stat); + ixp_pack_stat(p, iounit, &stat); } va_end(ap); @@ -817,6 +817,7 @@ xread(IXPConn *c, Fcall *fcall) Bar *b; void *i1, *i2, *i3; unsigned int i, len; + int iounit; unsigned char dir_type, type, *p = fcall->data; char buf[256]; XRectangle fr; @@ -828,6 +829,7 @@ xread(IXPConn *c, Fcall *fcall) dir_type = dir_of_qid(pwqid, m->sel); fcall->count = 0; + iounit = fcall->iounit; if(fcall->offset) { switch (type) { case FsDtag: @@ -847,7 +849,7 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } break; case FsDclients: @@ -867,7 +869,7 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } break; case FsDbars: @@ -885,7 +887,7 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } break; case FsDview: @@ -910,7 +912,7 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } } break; @@ -936,7 +938,7 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } break; case FsFevent: @@ -993,24 +995,24 @@ xread(IXPConn *c, Fcall *fcall) else { switch (type) { case FsDroot: - fcall->count = stat_of_names(&p, pwqid, m->sel, "ctl", "event", "def", "bar", nil); + fcall->count = stat_of_names(&p, &iounit, pwqid, m->sel, "ctl", "event", "def", "bar", nil); if(view) { - fcall->count += stat_of_names(&p, pwqid, m->sel, "tag", nil); + fcall->count += stat_of_names(&p, &iounit, pwqid, m->sel, "tag", nil); } if(client) { - fcall->count += stat_of_names(&p, pwqid, m->sel, "client", nil); + fcall->count += stat_of_names(&p, &iounit, pwqid, m->sel, "client", nil); } break; case FsDtag: if(view) { - fcall->count += stat_of_names(&p, pwqid, m->sel, "sel", nil); + fcall->count += stat_of_names(&p, &iounit, pwqid, m->sel, "sel", nil); } for(v=view; v; v=v->next) { len = stat_of_name(&stat, v->name, pwqid, m->sel); if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } break; case FsDclients: @@ -1020,7 +1022,7 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } break; case FsDbars: @@ -1029,23 +1031,23 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } break; case FsDbar: if(!i1) return Enofile; - fcall->count = stat_of_names(&p, pwqid, m->sel, "colors", "data", nil); + fcall->count = stat_of_names(&p, &iounit, pwqid, m->sel, "colors", "data", nil); break; case FsDdef: - fcall->count = stat_of_names(&p, pwqid, m->sel, "border", "selcolors", + fcall->count = stat_of_names(&p, &iounit, pwqid, m->sel, "border", "selcolors", "normcolors", "font", "keys", "tagrules", "grabmod", "colrules", nil); break; case FsDview: if(view) { - fcall->count = stat_of_names(&p, pwqid, m->sel, "name", "ctl", nil); + fcall->count = stat_of_names(&p, &iounit, pwqid, m->sel, "name", "ctl", nil); if(VIEW(i1)->area) { - fcall->count += stat_of_names(&p, pwqid, m->sel, "sel", nil); + fcall->count += stat_of_names(&p, &iounit, pwqid, m->sel, "sel", nil); } for(a=VIEW(i1)->area, i=0; a; a=a->next, i++) { snprintf(buf, sizeof(buf), "%u", i); @@ -1053,17 +1055,17 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } } break; case FsDarea: - fcall->count = stat_of_names(&p, pwqid, m->sel, "ctl", "index", nil); + fcall->count = stat_of_names(&p, &iounit, pwqid, m->sel, "ctl", "index", nil); if(i2) { - fcall->count += stat_of_names(&p, pwqid, m->sel, "mode", nil); + fcall->count += stat_of_names(&p, &iounit, pwqid, m->sel, "mode", nil); } if(AREA(i2)->frame) { - fcall->count += stat_of_names(&p, pwqid, m->sel, "sel", nil); + fcall->count += stat_of_names(&p, &iounit, pwqid, m->sel, "sel", nil); } for(f=AREA(i2)->frame, i=0; f; f=f->anext, i++) { snprintf(buf, sizeof(buf), "%u", i); @@ -1071,12 +1073,12 @@ xread(IXPConn *c, Fcall *fcall) if(fcall->count + len > fcall->iounit) break; fcall->count += len; - p = ixp_pack_stat(p, &stat); + ixp_pack_stat(&p, &iounit, &stat); } break; case FsDGclient: case FsDclient: - fcall->count = stat_of_names(&p, pwqid, m->sel, "props", "name", + fcall->count = stat_of_names(&p, &iounit, pwqid, m->sel, "props", "name", "index", "tags", "geom", "ctl", nil); break; case FsFctl: diff --git a/libixp/convert.c b/libixp/convert.c @@ -9,11 +9,11 @@ /* packode/unpackode stuff */ -void * -ixp_pack_u8(unsigned char *msg, unsigned char val) +void +ixp_pack_u8(unsigned char **msg, int *msize, unsigned char val) { - msg[0] = val; - return &msg[1]; + if((*msize -= 1) >= 0) + *(*msg)++ = val; } void * @@ -23,12 +23,13 @@ ixp_unpack_u8(unsigned char *msg, unsigned char *val) return &msg[1]; } -void * -ixp_pack_u16(unsigned char *msg, unsigned short val) +void +ixp_pack_u16(unsigned char **msg, int *msize, unsigned short val) { - msg[0] = val; - msg[1] = val >> 8; - return &msg[2]; + if((*msize -= 2) >= 0) { + *(*msg)++ = val; + *(*msg)++ = val >> 8; + } } void * @@ -38,14 +39,15 @@ ixp_unpack_u16(unsigned char *msg, unsigned short *val) return &msg[2]; } -void * -ixp_pack_u32(unsigned char *msg, unsigned int val) +void +ixp_pack_u32(unsigned char **msg, int *msize, unsigned int val) { - msg[0] = val; - msg[1] = val >> 8; - msg[2] = val >> 16; - msg[3] = val >> 24; - return &msg[4]; + if((*msize -= 4) >= 0) { + *(*msg)++ = val; + *(*msg)++ = val >> 8; + *(*msg)++ = val >> 16; + *(*msg)++ = val >> 24; + } } void * @@ -55,18 +57,19 @@ ixp_unpack_u32(unsigned char *msg, unsigned int *val) return &msg[4]; } -void * -ixp_pack_u64(unsigned char *msg, unsigned long long val) -{ - msg[0] = val; - msg[1] = val >> 8; - msg[2] = val >> 16; - msg[3] = val >> 24; - msg[4] = val >> 32; - msg[5] = val >> 40; - msg[6] = val >> 48; - msg[7] = val >> 56; - return &msg[8]; +void +ixp_pack_u64(unsigned char **msg, int *msize, unsigned long long val) +{ + if((*msize -= 8) >= 0) { + *(*msg)++ = val; + *(*msg)++ = val >> 8; + *(*msg)++ = val >> 16; + *(*msg)++ = val >> 24; + *(*msg)++ = val >> 32; + *(*msg)++ = val >> 40; + *(*msg)++ = val >> 48; + *(*msg)++ = val >> 56; + } } void * @@ -83,14 +86,13 @@ ixp_unpack_u64(unsigned char *msg, unsigned long long *val) return &msg[8]; } -void * -ixp_pack_string(unsigned char *msg, const char *s) +void +ixp_pack_string(unsigned char **msg, int *msize, const char *s) { unsigned short len = s ? strlen(s) : 0; - msg = ixp_pack_u16(msg, len); + ixp_pack_u16(msg, msize, len); if(s) - memcpy(msg, s, len); - return &msg[len]; + ixp_pack_data(msg, msize, (void *)s, len); } void * @@ -110,11 +112,13 @@ ixp_unpack_string(unsigned char *msg, char *string, unsigned short stringlen, return &msg[*len]; } -void * -ixp_pack_data(unsigned char *msg, unsigned char *data, unsigned int datalen) +void +ixp_pack_data(unsigned char **msg, int *msize, unsigned char *data, unsigned int datalen) { - memcpy(msg, data, datalen); - return &msg[datalen]; + if((*msize -= datalen) >= 0) { + memcpy(*msg, data, datalen); + *msg += datalen; + } } void * @@ -124,13 +128,15 @@ ixp_unpack_data(unsigned char *msg, unsigned char *data, unsigned int datalen) return &msg[datalen]; } -void * +void ixp_pack_prefix(unsigned char *msg, unsigned int size, unsigned char id, unsigned short tag) { - msg = ixp_pack_u32(msg, size); - msg = ixp_pack_u8(msg, id); - return ixp_pack_u16(msg, tag); + unsigned int dummy = sizeof(unsigned char) + + sizeof(unsigned short) + sizeof(unsigned int); + ixp_pack_u32(&msg, &dummy, size); + ixp_pack_u8(&msg, &dummy, id); + ixp_pack_u16(&msg, &dummy, tag); } void * @@ -142,12 +148,12 @@ ixp_unpack_prefix(unsigned char *msg, unsigned int *size, unsigned char *id, return ixp_unpack_u16(msg, tag); } -void * -ixp_pack_qid(unsigned char *msg, Qid * qid) +void +ixp_pack_qid(unsigned char **msg, int *msize, Qid * qid) { - msg = ixp_pack_u8(msg, qid->type); - msg = ixp_pack_u32(msg, qid->version); - return ixp_pack_u64(msg, qid->path); + ixp_pack_u8(msg, msize, qid->type); + ixp_pack_u32(msg, msize, qid->version); + ixp_pack_u64(msg, msize, qid->path); } void * @@ -158,21 +164,21 @@ ixp_unpack_qid(unsigned char *msg, Qid * qid) return ixp_unpack_u64(msg, &qid->path); } -void * -ixp_pack_stat(unsigned char *msg, Stat * stat) -{ - msg = ixp_pack_u16(msg, ixp_sizeof_stat(stat) - sizeof(unsigned short)); - msg = ixp_pack_u16(msg, stat->type); - msg = ixp_pack_u32(msg, stat->dev); - msg = ixp_pack_qid(msg, &stat->qid); - msg = ixp_pack_u32(msg, stat->mode); - msg = ixp_pack_u32(msg, stat->atime); - msg = ixp_pack_u32(msg, stat->mtime); - msg = ixp_pack_u64(msg, stat->length); - msg = ixp_pack_string(msg, stat->name); - msg = ixp_pack_string(msg, stat->uid); - msg = ixp_pack_string(msg, stat->gid); - return ixp_pack_string(msg, stat->muid); +void +ixp_pack_stat(unsigned char **msg, int *msize, Stat * stat) +{ + ixp_pack_u16(msg, msize, ixp_sizeof_stat(stat) - sizeof(unsigned short)); + ixp_pack_u16(msg, msize, stat->type); + ixp_pack_u32(msg, msize, stat->dev); + ixp_pack_qid(msg, msize, &stat->qid); + ixp_pack_u32(msg, msize, stat->mode); + ixp_pack_u32(msg, msize, stat->atime); + ixp_pack_u32(msg, msize, stat->mtime); + ixp_pack_u64(msg, msize, stat->length); + ixp_pack_string(msg, msize, stat->name); + ixp_pack_string(msg, msize, stat->uid); + ixp_pack_string(msg, msize, stat->gid); + ixp_pack_string(msg, msize, stat->muid); } void * diff --git a/libixp/ixp.h b/libixp/ixp.h @@ -201,28 +201,28 @@ int ixp_client_close(IXPClient *c, unsigned int fid); int ixp_client_do_fcall(IXPClient * c); /* convert.c */ -void *ixp_pack_u8(unsigned char *msg, unsigned char val); +void ixp_pack_u8(unsigned char **msg, int *msize, unsigned char val); void *ixp_unpack_u8(unsigned char *msg, unsigned char *val); -void *ixp_pack_u16(unsigned char *msg, unsigned short val); +void ixp_pack_u16(unsigned char **msg, int *msize, unsigned short val); void *ixp_unpack_u16(unsigned char *msg, unsigned short *val); -void *ixp_pack_u32(unsigned char *msg, unsigned int val); +void ixp_pack_u32(unsigned char **msg, int *msize, unsigned int val); void *ixp_unpack_u32(unsigned char *msg, unsigned int *val); -void *ixp_pack_u64(unsigned char *msg, unsigned long long val); +void ixp_pack_u64(unsigned char **msg, int *msize, unsigned long long val); void *ixp_unpack_u64(unsigned char *msg, unsigned long long *val); -void *ixp_pack_string(unsigned char *msg, const char *s); +void ixp_pack_string(unsigned char **msg, int *msize, const char *s); void *ixp_unpack_string(unsigned char *msg, char *string, unsigned short stringlen, unsigned short *len); -void *ixp_pack_data(unsigned char *msg, unsigned char *data, +void ixp_pack_data(unsigned char **msg, int *msize, unsigned char *data, unsigned int datalen); void *ixp_unpack_data(unsigned char *msg, unsigned char *data, unsigned int datalen); -void *ixp_pack_prefix(unsigned char *msg, unsigned int size, +void ixp_pack_prefix(unsigned char *msg, unsigned int size, unsigned char id, unsigned short tag); void *ixp_unpack_prefix(unsigned char *msg, unsigned int *size, unsigned char *id, unsigned short *tag); -void *ixp_pack_qid(unsigned char *msg, Qid *qid); +void ixp_pack_qid(unsigned char **msg, int *msize, Qid *qid); void *ixp_unpack_qid(unsigned char *msg, Qid *qid); -void *ixp_pack_stat(unsigned char *msg, Stat *stat); +void ixp_pack_stat(unsigned char **msg, int *msize, Stat *stat); void *ixp_unpack_stat(unsigned char *msg, Stat *stat); /* message.c */ diff --git a/libixp/message.c b/libixp/message.c @@ -33,177 +33,107 @@ ixp_sizeof_stat(Stat * stat) unsigned int ixp_fcall2msg(void *msg, Fcall *fcall, unsigned int msglen) { - unsigned int i, msize = - sizeof(unsigned char) + sizeof(unsigned short) + - sizeof(unsigned int); - void *p = msg; + unsigned int i = sizeof(unsigned char) + + sizeof(unsigned short) + sizeof(unsigned int); + int msize = msglen - i; + unsigned char *p = msg + i; switch (fcall->id) { case TVERSION: case RVERSION: - msize += sizeof(unsigned int) + sizeof_string(fcall->version); + ixp_pack_u32(&p, &msize, fcall->maxmsg); + ixp_pack_string(&p, &msize, fcall->version); break; case TAUTH: - msize += sizeof(unsigned int) + sizeof_string(fcall->uname) - + sizeof_string(fcall->aname); + ixp_pack_u32(&p, &msize, fcall->afid); + ixp_pack_string(&p, &msize, fcall->uname); + ixp_pack_string(&p, &msize, fcall->aname); break; case RAUTH: - case RATTACH: - msize += IXP_QIDSZ; - break; - case TATTACH: - msize += 2 * sizeof(unsigned int) + sizeof_string(fcall->uname) - + sizeof_string(fcall->aname); - break; - case RERROR: - msize += sizeof_string(fcall->errstr); - break; - case RWRITE: - case TCLUNK: - case TREMOVE: - case TSTAT: - msize += sizeof(unsigned int); - break; - case TWALK: - msize += sizeof(unsigned short) + 2 * sizeof(unsigned int); - for(i = 0; i < fcall->nwname; i++) - msize += sizeof_string(fcall->wname[i]); - break; - case TFLUSH: - msize += sizeof(unsigned short); - break; - case RWALK: - msize += sizeof(unsigned short) + fcall->nwqid * IXP_QIDSZ; - break; - case TOPEN: - msize += sizeof(unsigned int) + sizeof(unsigned char); - break; - case ROPEN: - case RCREATE: - msize += IXP_QIDSZ + sizeof(unsigned int); - break; - case TCREATE: - msize += sizeof(unsigned char) + 2 * sizeof(unsigned int) - + sizeof_string(fcall->name); - break; - case TREAD: - msize += 2 * sizeof(unsigned int) + sizeof(unsigned long long); - break; - case RREAD: - msize += sizeof(unsigned int) + fcall->count; - break; - case TWRITE: - msize += 2 * sizeof(unsigned int) + sizeof(unsigned long long) - + fcall->count; - break; - case RSTAT: - msize += sizeof(unsigned short) + ixp_sizeof_stat(&fcall->stat); - break; - case TWSTAT: - msize += sizeof(unsigned int) + sizeof(unsigned short) - + ixp_sizeof_stat(&fcall->stat); - break; - default: - break; - } - - if(msize > msglen) - return 0; - p = ixp_pack_prefix(p, msize, fcall->id, fcall->tag); - - switch (fcall->id) { - case TVERSION: - case RVERSION: - p = ixp_pack_u32(p, fcall->maxmsg); - p = ixp_pack_string(p, fcall->version); - break; - case TAUTH: - p = ixp_pack_u32(p, fcall->afid); - p = ixp_pack_string(p, fcall->uname); - p = ixp_pack_string(p, fcall->aname); - break; - case RAUTH: - p = ixp_pack_qid(p, &fcall->aqid); + ixp_pack_qid(&p, &msize, &fcall->aqid); break; case RATTACH: - p = ixp_pack_qid(p, &fcall->qid); + ixp_pack_qid(&p, &msize, &fcall->qid); break; case TATTACH: - p = ixp_pack_u32(p, fcall->fid); - p = ixp_pack_u32(p, fcall->afid); - p = ixp_pack_string(p, fcall->uname); - p = ixp_pack_string(p, fcall->aname); + ixp_pack_u32(&p, &msize, fcall->fid); + ixp_pack_u32(&p, &msize, fcall->afid); + ixp_pack_string(&p, &msize, fcall->uname); + ixp_pack_string(&p, &msize, fcall->aname); break; case RERROR: - p = ixp_pack_string(p, fcall->errstr); + ixp_pack_string(&p, &msize, fcall->errstr); break; case TFLUSH: - p = ixp_pack_u16(p, fcall->oldtag); + ixp_pack_u16(&p, &msize, fcall->oldtag); break; case TWALK: - p = ixp_pack_u32(p, fcall->fid); - p = ixp_pack_u32(p, fcall->newfid); - p = ixp_pack_u16(p, fcall->nwname); + ixp_pack_u32(&p, &msize, fcall->fid); + ixp_pack_u32(&p, &msize, fcall->newfid); + ixp_pack_u16(&p, &msize, fcall->nwname); for(i = 0; i < fcall->nwname; i++) - p = ixp_pack_string(p, fcall->wname[i]); + ixp_pack_string(&p, &msize, fcall->wname[i]); break; case RWALK: - p = ixp_pack_u16(p, fcall->nwqid); + ixp_pack_u16(&p, &msize, fcall->nwqid); for(i = 0; i < fcall->nwqid; i++) - p = ixp_pack_qid(p, &fcall->wqid[i]); + ixp_pack_qid(&p, &msize, &fcall->wqid[i]); break; case TOPEN: - p = ixp_pack_u32(p, fcall->fid); - p = ixp_pack_u8(p, fcall->mode); + ixp_pack_u32(&p, &msize, fcall->fid); + ixp_pack_u8(&p, &msize, fcall->mode); break; case ROPEN: case RCREATE: - p = ixp_pack_qid(p, &fcall->qid); - p = ixp_pack_u32(p, fcall->iounit); + ixp_pack_qid(&p, &msize, &fcall->qid); + ixp_pack_u32(&p, &msize, fcall->iounit); break; case TCREATE: - p = ixp_pack_u32(p, fcall->fid); - p = ixp_pack_string(p, fcall->name); - p = ixp_pack_u32(p, fcall->perm); - p = ixp_pack_u8(p, fcall->mode); + ixp_pack_u32(&p, &msize, fcall->fid); + ixp_pack_string(&p, &msize, fcall->name); + ixp_pack_u32(&p, &msize, fcall->perm); + ixp_pack_u8(&p, &msize, fcall->mode); break; case TREAD: - p = ixp_pack_u32(p, fcall->fid); - p = ixp_pack_u64(p, fcall->offset); - p = ixp_pack_u32(p, fcall->count); + ixp_pack_u32(&p, &msize, fcall->fid); + ixp_pack_u64(&p, &msize, fcall->offset); + ixp_pack_u32(&p, &msize, fcall->count); break; case RREAD: - p = ixp_pack_u32(p, fcall->count); - p = ixp_pack_data(p, fcall->data, fcall->count); + ixp_pack_u32(&p, &msize, fcall->count); + ixp_pack_data(&p, &msize, fcall->data, fcall->count); break; case TWRITE: - p = ixp_pack_u32(p, fcall->fid); - p = ixp_pack_u64(p, fcall->offset); - p = ixp_pack_u32(p, fcall->count); - p = ixp_pack_data(p, fcall->data, fcall->count); + ixp_pack_u32(&p, &msize, fcall->fid); + ixp_pack_u64(&p, &msize, fcall->offset); + ixp_pack_u32(&p, &msize, fcall->count); + ixp_pack_data(&p, &msize, fcall->data, fcall->count); break; case RWRITE: - p = ixp_pack_u32(p, fcall->count); + ixp_pack_u32(&p, &msize, fcall->count); break; case TCLUNK: case TREMOVE: case TSTAT: - p = ixp_pack_u32(p, fcall->fid); + ixp_pack_u32(&p, &msize, fcall->fid); break; case RSTAT: - p = ixp_pack_u16(p, ixp_sizeof_stat(&fcall->stat)); - p = ixp_pack_stat(p, &fcall->stat); + ixp_pack_u16(&p, &msize, ixp_sizeof_stat(&fcall->stat)); + ixp_pack_stat(&p, &msize, &fcall->stat); break; case TWSTAT: - p = ixp_pack_u32(p, fcall->fid); - p = ixp_pack_u16(p, ixp_sizeof_stat(&fcall->stat)); - p = ixp_pack_stat(p, &fcall->stat); + ixp_pack_u32(&p, &msize, fcall->fid); + ixp_pack_u16(&p, &msize, ixp_sizeof_stat(&fcall->stat)); + ixp_pack_stat(&p, &msize, &fcall->stat); break; } - if(msg + msize == p) - return msize; - return 0; + if(msize < 0) + return 0; + + msize = msglen - msize; + ixp_pack_prefix(msg, msize, fcall->id, fcall->tag); + return msize; } unsigned int diff --git a/libixp/socket.c b/libixp/socket.c @@ -74,7 +74,7 @@ ixp_connect_sock(char *address) { char *p; - if(p = strchr(address, '!')) { + if((p = strchr(address, '!'))) { *p = 0; p++;