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:
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++;