diff -ru libixp.org/client.c libixp.u/client.c
--- libixp.org/client.c	2006-10-12 17:00:02.000000000 +0200
+++ libixp.u/client.c	2006-11-22 22:35:16.019835250 +0100
@@ -24,7 +24,7 @@
 		return -1;
 	}
 	if(c->ofcall.type == RERROR) {
-		c->errstr = c->ofcall.ename;
+		c->errstr = c->ofcall.data.rerror.ename;
 		return -1;
 	}
 	return 0;
@@ -38,33 +38,33 @@
 	}
 	c->ifcall.type = TVERSION;
 	c->ifcall.tag = IXP_NOTAG;
-	c->ifcall.msize = IXP_MAX_MSG;
-	c->ifcall.version = IXP_VERSION;
+	c->ifcall.data.tversion.msize = IXP_MAX_MSG;
+	c->ifcall.data.tversion.version = IXP_VERSION;
 	if(ixp_client_do_fcall(c) == -1) {
 		fprintf(stderr, "error: %s\n", c->errstr);
 		ixp_client_hangup(c);
 		return -1;
 	}
-	if(strncmp(c->ofcall.version, IXP_VERSION, strlen(IXP_VERSION))) {
+	if(strncmp(c->ofcall.data.rversion.version, IXP_VERSION, strlen(IXP_VERSION))) {
 		fprintf(stderr, "error: %s\n", c->errstr);
 		c->errstr = "9P versions differ";
 		ixp_client_hangup(c);
 		return -1;	/* we cannot handle this version */
 	}
-	free(c->ofcall.version);
+	free(c->ofcall.data.rversion.version);
 	c->root_fid = rootfid;
 	c->ifcall.type = TATTACH;
 	c->ifcall.tag = IXP_NOTAG;
 	c->ifcall.fid = c->root_fid;
-	c->ifcall.afid = IXP_NOFID;
-	c->ifcall.uname = getenv("USER");
-	c->ifcall.aname = "";
+	c->ifcall.data.tauth.afid = IXP_NOFID;
+	c->ifcall.data.tauth.uname = getenv("USER");
+	c->ifcall.data.tauth.aname = "";
 	if(ixp_client_do_fcall(c) == -1) {
 		fprintf(stderr, "error: %s\n", c->errstr);
 		ixp_client_hangup(c);
 		return -1;
 	}
-	c->root_qid = c->ofcall.qid;
+	c->root_qid = c->ofcall.data.rattach.qid;
 	return 0;
 }
 
@@ -85,9 +85,9 @@
 	c->ifcall.type = TCREATE;
 	c->ifcall.tag = IXP_NOTAG;
 	c->ifcall.fid = dirfid;
-	c->ifcall.name = name;
-	c->ifcall.perm = perm;
-	c->ifcall.mode = mode;
+	c->ifcall.data.tcreate.name = name;
+	c->ifcall.data.tcreate.perm = perm;
+	c->ifcall.data.tcreate.mode = mode;
 	return ixp_client_do_fcall(c);
 }
 
@@ -98,12 +98,12 @@
 
 	c->ifcall.type = TWALK;
 	c->ifcall.fid = c->root_fid;
-	c->ifcall.newfid = newfid;
+	c->ifcall.data.twalk.newfid = newfid;
 	if(filepath) {
-		c->ifcall.name = filepath;
-		c->ifcall.nwname = ixp_tokenize(wname, IXP_MAX_WELEM, c->ifcall.name, '/');
-		for(i = 0; i < c->ifcall.nwname; i++)
-			c->ifcall.wname[i] = wname[i];
+		// c->ifcall.name = filepath; // tcreate overlaps with twalk !!!
+		c->ifcall.data.twalk.nwname = ixp_tokenize(wname, IXP_MAX_WELEM, filepath, '/'); // was "c->ifcall.name"
+		for(i = 0; i < c->ifcall.data.twalk.nwname; i++)
+			c->ifcall.data.twalk.wname[i] = wname[i];
 	}
 	return ixp_client_do_fcall(c);
 }
@@ -123,7 +123,7 @@
 	c->ifcall.type = TOPEN;
 	c->ifcall.tag = IXP_NOTAG;
 	c->ifcall.fid = newfid;
-	c->ifcall.mode = mode;
+	c->ifcall.data.topen.mode = mode;
 	return ixp_client_do_fcall(c);
 }
 
@@ -140,18 +140,18 @@
 ixp_client_read(IXPClient *c, unsigned int fid, unsigned long long offset,
 		void *result, unsigned int res_len)
 {
-	unsigned int bytes = c->ofcall.iounit;
+	unsigned int bytes = c->ofcall.data.rattach.iounit;
 
 	c->ifcall.type = TREAD;
 	c->ifcall.tag = IXP_NOTAG;
 	c->ifcall.fid = fid;
-	c->ifcall.offset = offset;
-	c->ifcall.count = res_len < bytes ? res_len : bytes;
+	c->ifcall.data.tread.offset = offset;
+	c->ifcall.data.tread.count = res_len < bytes ? res_len : bytes;
 	if(ixp_client_do_fcall(c) == -1)
 		return -1;
-	memcpy(result, c->ofcall.data, c->ofcall.count);
-	free(c->ofcall.data);
-	return c->ofcall.count;
+	memcpy(result, c->ofcall.data.rread.data, c->ofcall.data.rread.count);
+	free(c->ofcall.data.rread.data);
+	return c->ofcall.data.rread.count;
 }
 
 int
@@ -159,19 +159,19 @@
 		unsigned long long offset, unsigned int count,
 		unsigned char *data)
 {
-	if(count > c->ofcall.iounit) {
+	if(count > c->ofcall.data.rattach.iounit) {
 		c->errstr = "iounit exceeded";
 		return -1;
 	}
 	c->ifcall.type = TWRITE;
 	c->ifcall.tag = IXP_NOTAG;
 	c->ifcall.fid = fid;
-	c->ifcall.offset = offset;
-	c->ifcall.count = count;
-	c->ifcall.data = (void *)data;
+	c->ifcall.data.twrite.offset = offset;
+	c->ifcall.data.twrite.count = count;
+	c->ifcall.data.twrite.data = (void *)data;
 	if(ixp_client_do_fcall(c) == -1)
 		return -1;
-	return c->ofcall.count;
+	return c->ofcall.data.rwrite.count;
 }
 
 int
diff -ru libixp.org/ixpc.c libixp.u/ixpc.c
--- libixp.org/ixpc.c	2006-10-13 10:00:02.000000000 +0200
+++ libixp.u/ixpc.c	2006-11-22 23:04:18.984763750 +0100
@@ -13,11 +13,11 @@
 
 static void
 write_data(unsigned int fid) {
-	void *data = ixp_emallocz(c.ofcall.iounit);
+	void *data = ixp_emallocz(c.ofcall.data.ropen.iounit);
 	unsigned long long offset = 0;
 	unsigned int len = 0;
 
-	while((len = read(0, data, c.ofcall.iounit)) > 0) {
+	while((len = read(0, data, c.ofcall.data.ropen.iounit)) > 0) {
 		if(ixp_client_write(&c, fid, offset, len, data) != len) {
 			fprintf(stderr, "ixpc: cannot write file: %s\n", c.errstr);
 			break;
@@ -49,7 +49,7 @@
 		fprintf(stderr, "ixpc: cannot create file '%s': %s\n", p, c.errstr);
 		return -1;
 	}
-	if(!(c.ofcall.qid.type&P9DMDIR))
+	if(!(c.ofcall.data.rcreate.qid.type&P9DMDIR))
 		write_data(fid);
 	return ixp_client_close(&c, fid);
 }
@@ -168,7 +168,7 @@
 		fprintf(stderr, "ixpc: cannot stat file '%s': %s\n", file, c.errstr);
 		return -1;
 	}
-	buf = c.ofcall.stat;
+	buf = c.ofcall.data.rstat.stat;
 	ixp_unpack_stat(&buf, NULL, s);
 	if(!(s->mode & IXP_DMDIR)) {
 		print_stat(s, details);
diff -ru libixp.org/ixp.h libixp.u/ixp.h
--- libixp.org/ixp.h	2006-10-30 10:00:03.000000000 +0100
+++ libixp.u/ixp.h	2006-11-22 22:35:13.815697500 +0100
@@ -159,54 +159,54 @@
 	unsigned char type;
 	unsigned short tag;
 	unsigned int fid;
-//	union {
-//		struct { /* Tversion, Rversion */
+	union {
+		struct { /* Tversion, Rversion */
 			unsigned int msize;
 			char	*version;
-//		};
-//		struct { /* Tflush */
+		} tversion, rversion;
+		struct { /* Tflush */
 			unsigned short oldtag;
-//		};
-//		struct { /* Rerror */
+		} tflush;
+		struct { /* Rerror */
 			char *ename;
-//		};
-//		struct { /* Ropen, Rcreate */
+		} rerror;
+		struct { /* Ropen, Rcreate */
 			Qid qid; /* +Rattach */
 			unsigned int iounit;
-//		};
-//		struct { /* Rauth */
+		} ropen, rcreate, rattach;
+		struct { /* Rauth */
 			Qid aqid;
-//		};
-//		struct { /* Tauth, Tattach */
+		} rauth;
+		struct { /* Tauth, Tattach */
 			unsigned int	afid;
 			char		*uname;
 			char		*aname;
-//		};
-//		struct { /* Tcreate */
+		} tauth, tattach;
+		struct { /* Tcreate */
 			unsigned int	perm;
 			char		*name;
 			unsigned char	mode; /* +Topen */
-//		};
-//		struct { /* Twalk */
+		} tcreate, topen;
+		struct { /* Twalk */
 			unsigned int	newfid;
 			unsigned short	nwname;
 			char	*wname[IXP_MAX_WELEM];
-//		};
-//		struct { /* Rwalk */
+		} twalk;
+		struct { /* Rwalk */
 			unsigned short	nwqid;
 			Qid	wqid[IXP_MAX_WELEM];
-//		};
-//		struct { /* Twrite */
+		} rwalk;
+		struct { /* Twrite */
 			unsigned long long	offset; /* +Tread */
 			/* +Rread */
 			unsigned int	count; /* +Tread */
 			char		*data;
-//		};
-//		struct { /* Twstat, Rstat */
+		} twrite, tread, rread, rwrite;
+		struct { /* Twstat, Rstat */
 			unsigned short	nstat;
 			unsigned char	*stat;
-//		};
-//	};
+		} twstat, rstat;
+	} data;
 } Fcall;
 
 typedef struct IXPServer IXPServer;
diff -ru libixp.org/message.c libixp.u/message.c
--- libixp.org/message.c	2006-10-12 14:00:02.000000000 +0200
+++ libixp.u/message.c	2006-11-22 22:47:34.077961000 +0100
@@ -36,76 +36,76 @@
 	switch (fcall->type) {
 	case TVERSION:
 	case RVERSION:
-		ixp_pack_u32(&p, &msize, fcall->msize);
-		ixp_pack_string(&p, &msize, fcall->version);
+		ixp_pack_u32(&p, &msize, fcall->data.rversion.msize);
+		ixp_pack_string(&p, &msize, fcall->data.rversion.version);
 		break;
 	case TAUTH:
-		ixp_pack_u32(&p, &msize, fcall->afid);
-		ixp_pack_string(&p, &msize, fcall->uname);
-		ixp_pack_string(&p, &msize, fcall->aname);
+		ixp_pack_u32(&p, &msize, fcall->data.tauth.afid);
+		ixp_pack_string(&p, &msize, fcall->data.tauth.uname);
+		ixp_pack_string(&p, &msize, fcall->data.tauth.aname);
 		break;
 	case RAUTH:
-		ixp_pack_qid(&p, &msize, &fcall->aqid);
+		ixp_pack_qid(&p, &msize, &fcall->data.rauth.aqid);
 		break;
 	case RATTACH:
-		ixp_pack_qid(&p, &msize, &fcall->qid);
+		ixp_pack_qid(&p, &msize, &fcall->data.rattach.qid);
 		break;
 	case TATTACH:
 		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);
+		ixp_pack_u32(&p, &msize, fcall->data.tattach.afid);
+		ixp_pack_string(&p, &msize, fcall->data.tattach.uname);
+		ixp_pack_string(&p, &msize, fcall->data.tattach.aname);
 		break;
 	case RERROR:
-		ixp_pack_string(&p, &msize, fcall->ename);
+		ixp_pack_string(&p, &msize, fcall->data.rerror.ename);
 		break;
 	case TFLUSH:
-		ixp_pack_u16(&p, &msize, fcall->oldtag);
+		ixp_pack_u16(&p, &msize, fcall->data.tflush.oldtag);
 		break;
 	case TWALK:
 		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++)
-			ixp_pack_string(&p, &msize, fcall->wname[i]);
+		ixp_pack_u32(&p, &msize, fcall->data.twalk.newfid);
+		ixp_pack_u16(&p, &msize, fcall->data.twalk.nwname);
+		for(i = 0; i < fcall->data.twalk.nwname; i++)
+			ixp_pack_string(&p, &msize, fcall->data.twalk.wname[i]);
 		break;
 	case RWALK:
-		ixp_pack_u16(&p, &msize, fcall->nwqid);
-		for(i = 0; i < fcall->nwqid; i++)
-			ixp_pack_qid(&p, &msize, &fcall->wqid[i]);
+		ixp_pack_u16(&p, &msize, fcall->data.rwalk.nwqid);
+		for(i = 0; i < fcall->data.rwalk.nwqid; i++)
+			ixp_pack_qid(&p, &msize, &fcall->data.rwalk.wqid[i]);
 		break;
 	case TOPEN:
 		ixp_pack_u32(&p, &msize, fcall->fid);
-		ixp_pack_u8(&p, &msize, fcall->mode);
+		ixp_pack_u8(&p, &msize, fcall->data.topen.mode);
 		break;
 	case ROPEN:
 	case RCREATE:
-		ixp_pack_qid(&p, &msize, &fcall->qid);
-		ixp_pack_u32(&p, &msize, fcall->iounit);
+		ixp_pack_qid(&p, &msize, &fcall->data.rcreate.qid);
+		ixp_pack_u32(&p, &msize, fcall->data.rcreate.iounit);
 		break;
 	case TCREATE:
 		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);
+		ixp_pack_string(&p, &msize, fcall->data.tcreate.name);
+		ixp_pack_u32(&p, &msize, fcall->data.tcreate.perm);
+		ixp_pack_u8(&p, &msize, fcall->data.tcreate.mode);
 		break;
 	case TREAD:
 		ixp_pack_u32(&p, &msize, fcall->fid);
-		ixp_pack_u64(&p, &msize, fcall->offset);
-		ixp_pack_u32(&p, &msize, fcall->count);
+		ixp_pack_u64(&p, &msize, fcall->data.tread.offset);
+		ixp_pack_u32(&p, &msize, fcall->data.tread.count);
 		break;
 	case RREAD:
-		ixp_pack_u32(&p, &msize, fcall->count);
-		ixp_pack_data(&p, &msize, (unsigned char *)fcall->data, fcall->count);
+		ixp_pack_u32(&p, &msize, fcall->data.rread.count);
+		ixp_pack_data(&p, &msize, (unsigned char *)fcall->data.rread.data, fcall->data.rread.count);
 		break;
 	case TWRITE:
 		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, (unsigned char *)fcall->data, fcall->count);
+		ixp_pack_u64(&p, &msize, fcall->data.twrite.offset);
+		ixp_pack_u32(&p, &msize, fcall->data.twrite.count);
+		ixp_pack_data(&p, &msize, (unsigned char *)fcall->data.twrite.data, fcall->data.twrite.count);
 		break;
 	case RWRITE:
-		ixp_pack_u32(&p, &msize, fcall->count);
+		ixp_pack_u32(&p, &msize, fcall->data.rwrite.count);
 		break;
 	case TCLUNK:
 	case TREMOVE:
@@ -113,13 +113,13 @@
 		ixp_pack_u32(&p, &msize, fcall->fid);
 		break;
 	case RSTAT:
-		ixp_pack_u16(&p, &msize, fcall->nstat);
-		ixp_pack_data(&p, &msize, fcall->stat, fcall->nstat);
+		ixp_pack_u16(&p, &msize, fcall->data.rstat.nstat);
+		ixp_pack_data(&p, &msize, fcall->data.rstat.stat, fcall->data.rstat.nstat);
 		break;
 	case TWSTAT:
 		ixp_pack_u32(&p, &msize, fcall->fid);
-		ixp_pack_u16(&p, &msize, fcall->nstat);
-		ixp_pack_data(&p, &msize, fcall->stat, fcall->nstat);
+		ixp_pack_u16(&p, &msize, fcall->data.twstat.nstat);
+		ixp_pack_data(&p, &msize, fcall->data.twstat.stat, fcall->data.twstat.nstat);
 		break;
 	}
 	if(msize < 0)
@@ -143,75 +143,75 @@
 	switch (fcall->type) {
 	case TVERSION:
 	case RVERSION:
-		ixp_unpack_u32(&p, &msize, &fcall->msize);
-		ixp_unpack_string(&p, &msize, &fcall->version, &len);
+		ixp_unpack_u32(&p, &msize, &fcall->data.rversion.msize);
+		ixp_unpack_string(&p, &msize, &fcall->data.rversion.version, &len);
 		break;
 	case TAUTH:
-		ixp_unpack_u32(&p, &msize, &fcall->afid);
-		ixp_unpack_string(&p, &msize, &fcall->uname, &len);
-		ixp_unpack_string(&p, &msize, &fcall->aname, &len);
+		ixp_unpack_u32(&p, &msize, &fcall->data.tauth.afid);
+		ixp_unpack_string(&p, &msize, &fcall->data.tauth.uname, &len);
+		ixp_unpack_string(&p, &msize, &fcall->data.tauth.aname, &len);
 		break;
 	case RAUTH:
-		ixp_unpack_qid(&p, &msize, &fcall->aqid);
+		ixp_unpack_qid(&p, &msize, &fcall->data.rauth.aqid);
 		break;
 	case RATTACH:
-		ixp_unpack_qid(&p, &msize, &fcall->qid);
+		ixp_unpack_qid(&p, &msize, &fcall->data.rattach.qid);
 		break;
 	case TATTACH:
 		ixp_unpack_u32(&p, &msize, &fcall->fid);
-		ixp_unpack_u32(&p, &msize, &fcall->afid);
-		ixp_unpack_string(&p, &msize, &fcall->uname, &len);
-		ixp_unpack_string(&p, &msize, &fcall->aname, &len);
+		ixp_unpack_u32(&p, &msize, &fcall->data.tattach.afid);
+		ixp_unpack_string(&p, &msize, &fcall->data.tattach.uname, &len);
+		ixp_unpack_string(&p, &msize, &fcall->data.tattach.aname, &len);
 		break;
 	case RERROR:
-		ixp_unpack_string(&p, &msize, &fcall->ename, &len);
+		ixp_unpack_string(&p, &msize, &fcall->data.rerror.ename, &len);
 		break;
 	case TFLUSH:
-		ixp_unpack_u16(&p, &msize, &fcall->oldtag);
+		ixp_unpack_u16(&p, &msize, &fcall->data.tflush.oldtag);
 		break;
 	case TWALK:
 		ixp_unpack_u32(&p, &msize, &fcall->fid);
-		ixp_unpack_u32(&p, &msize, &fcall->newfid);
-		ixp_unpack_u16(&p, &msize, &fcall->nwname);
-		ixp_unpack_strings(&p, &msize, fcall->nwname, fcall->wname);
+		ixp_unpack_u32(&p, &msize, &fcall->data.twalk.newfid);
+		ixp_unpack_u16(&p, &msize, &fcall->data.twalk.nwname);
+		ixp_unpack_strings(&p, &msize, fcall->data.twalk.nwname, fcall->data.twalk.wname);
 		break;
 	case RWALK:
-		ixp_unpack_u16(&p, &msize, &fcall->nwqid);
-		for(i = 0; i < fcall->nwqid; i++)
-			ixp_unpack_qid(&p, &msize, &fcall->wqid[i]);
+		ixp_unpack_u16(&p, &msize, &fcall->data.rwalk.nwqid);
+		for(i = 0; i < fcall->data.rwalk.nwqid; i++)
+			ixp_unpack_qid(&p, &msize, &fcall->data.rwalk.wqid[i]);
 		break;
 	case TOPEN:
 		ixp_unpack_u32(&p, &msize, &fcall->fid);
-		ixp_unpack_u8(&p, &msize, &fcall->mode);
+		ixp_unpack_u8(&p, &msize, &fcall->data.topen.mode);
 		break;
 	case ROPEN:
 	case RCREATE:
-		ixp_unpack_qid(&p, &msize, &fcall->qid);
-		ixp_unpack_u32(&p, &msize, &fcall->iounit);
+		ixp_unpack_qid(&p, &msize, &fcall->data.rcreate.qid);
+		ixp_unpack_u32(&p, &msize, &fcall->data.rcreate.iounit);
 		break;
 	case TCREATE:
 		ixp_unpack_u32(&p, &msize, &fcall->fid);
-		ixp_unpack_string(&p, &msize, &fcall->name, &len);
-		ixp_unpack_u32(&p, &msize, &fcall->perm);
-		ixp_unpack_u8(&p, &msize, &fcall->mode);
+		ixp_unpack_string(&p, &msize, &fcall->data.tcreate.name, &len);
+		ixp_unpack_u32(&p, &msize, &fcall->data.tcreate.perm);
+		ixp_unpack_u8(&p, &msize, &fcall->data.tcreate.mode);
 		break;
 	case TREAD:
 		ixp_unpack_u32(&p, &msize, &fcall->fid);
-		ixp_unpack_u64(&p, &msize, &fcall->offset);
-		ixp_unpack_u32(&p, &msize, &fcall->count);
+		ixp_unpack_u64(&p, &msize, &fcall->data.tread.offset);
+		ixp_unpack_u32(&p, &msize, &fcall->data.tread.count);
 		break;
 	case RREAD:
-		ixp_unpack_u32(&p, &msize, &fcall->count);
-		ixp_unpack_data(&p, &msize, (void *)&fcall->data, fcall->count);
+		ixp_unpack_u32(&p, &msize, &fcall->data.rread.count);
+		ixp_unpack_data(&p, &msize, (void *)&fcall->data.rread.data, fcall->data.rread.count);
 		break;
 	case TWRITE:
 		ixp_unpack_u32(&p, &msize, &fcall->fid);
-		ixp_unpack_u64(&p, &msize, &fcall->offset);
-		ixp_unpack_u32(&p, &msize, &fcall->count);
-		ixp_unpack_data(&p, &msize, (void *)&fcall->data, fcall->count);
+		ixp_unpack_u64(&p, &msize, &fcall->data.twrite.offset);
+		ixp_unpack_u32(&p, &msize, &fcall->data.twrite.count);
+		ixp_unpack_data(&p, &msize, (void *)&fcall->data.twrite.data, fcall->data.twrite.count);
 		break;
 	case RWRITE:
-		ixp_unpack_u32(&p, &msize, &fcall->count);
+		ixp_unpack_u32(&p, &msize, &fcall->data.rwrite.count);
 		break;
 	case TCLUNK:
 	case TREMOVE:
@@ -220,12 +220,12 @@
 		break;
 	case RSTAT:
 		ixp_unpack_u16(&p, &msize, &len);
-		ixp_unpack_data(&p, &msize, &fcall->stat, len);
+		ixp_unpack_data(&p, &msize, &fcall->data.rstat.stat, len);
 		break;
 	case TWSTAT:
 		ixp_unpack_u32(&p, &msize, &fcall->fid);
 		ixp_unpack_u16(&p, &msize, &len);
-		ixp_unpack_data(&p, &msize, &fcall->stat, len);
+		ixp_unpack_data(&p, &msize, &fcall->data.twstat.stat, len);
 		break;
 	}
 	if(msize > 0)
diff -ru libixp.org/request.c libixp.u/request.c
--- libixp.org/request.c	2006-10-12 18:00:02.000000000 +0200
+++ libixp.u/request.c	2006-11-22 23:01:54.663744250 +0100
@@ -106,15 +106,15 @@
 		respond(r, Enofunc);
 		break;
 	case TVERSION:
-		if(!strncmp(r->ifcall.version, "9P", 3)) {
-			r->ofcall.version = "9P";
+		if(!strncmp(r->ifcall.data.tversion.version, "9P", 3)) {
+			r->ofcall.data.rversion.version = "9P";
 		}else
-		if(!strncmp(r->ifcall.version, "9P2000", 7)) {
-			r->ofcall.version = "9P2000";
+		if(!strncmp(r->ifcall.data.tversion.version, "9P2000", 7)) {
+			r->ofcall.data.rversion.version = "9P2000";
 		}else{
-			r->ofcall.version = "unknown";
+			r->ofcall.data.rversion.version = "unknown";
 		}
-		r->ofcall.msize = r->ifcall.msize;
+		r->ofcall.data.rversion.msize = r->ifcall.data.tversion.msize;
 		respond(r, NULL);
 		break;
 	case TATTACH:
@@ -137,7 +137,7 @@
 		srv->clunk(r);
 		break;
 	case TFLUSH:
-		if(!(r->oldreq = lookupkey(&pc->tagmap, r->ifcall.oldtag))) {
+		if(!(r->oldreq = lookupkey(&pc->tagmap, r->ifcall.data.tflush.oldtag))) {
 			respond(r, Enotag);
 			return;
 		}
@@ -171,11 +171,11 @@
 			respond(r, Enofid);
 			return;
 		}
-		if((r->fid->qid.type&P9QTDIR) && (r->ifcall.mode|P9ORCLOSE) != (P9OREAD|P9ORCLOSE)) {
+		if((r->fid->qid.type&P9QTDIR) && (r->ifcall.data.topen.mode|P9ORCLOSE) != (P9OREAD|P9ORCLOSE)) {
 			respond(r, Eisdir);
 			return;
 		}
-		r->ofcall.qid = r->fid->qid;
+		r->ofcall.data.ropen.qid = r->fid->qid;
 		if(!pc->srv->open) {
 			respond(r, Enofunc);
 			return;
@@ -228,12 +228,12 @@
 			respond(r, "cannot walk from an open fid");
 			return;
 		}
-		if(r->ifcall.nwname && !(r->fid->qid.type&P9QTDIR)) {
+		if(r->ifcall.data.twalk.nwname && !(r->fid->qid.type&P9QTDIR)) {
 			respond(r, Enotdir);
 			return;
 		}
-		if((r->ifcall.fid != r->ifcall.newfid)) {
-			if(!(r->newfid = createfid(&pc->fidmap, r->ifcall.newfid, pc))) {
+		if((r->ifcall.fid != r->ifcall.data.twalk.newfid)) {
+			if(!(r->newfid = createfid(&pc->fidmap, r->ifcall.data.twalk.newfid, pc))) {
 				respond(r, Edupfid);
 				return;
 			}
@@ -274,42 +274,42 @@
 		break;
 	case TVERSION:
 		assert(!error);
-		free(r->ifcall.version);
-		pc->msize = (r->ofcall.msize < IXP_MAX_MSG) ? r->ofcall.msize : IXP_MAX_MSG;
+		free(r->ifcall.data.tversion.version);
+		pc->msize = (r->ofcall.data.rversion.msize < IXP_MAX_MSG) ? r->ofcall.data.rversion.msize : IXP_MAX_MSG;
 		free(pc->buf);
-		pc->buf = ixp_emallocz(r->ofcall.msize);
+		pc->buf = ixp_emallocz(r->ofcall.data.rversion.msize);
 		break;
 	case TATTACH:
 		if(error)
 			destroyfid(pc, r->fid->fid);
-		free(r->ifcall.uname);
-		free(r->ifcall.aname);
+		free(r->ifcall.data.tattach.uname);
+		free(r->ifcall.data.tattach.aname);
 		break;
 	case TOPEN:
 	case TCREATE:
 		if(!error) {
-			r->fid->omode = r->ifcall.mode;
-			r->fid->qid = r->ofcall.qid;
+			r->fid->omode = r->ifcall.data.topen.mode;
+			r->fid->qid = r->ofcall.data.ropen.qid;
 		}
-		free(r->ifcall.name);
-		r->ofcall.iounit = pc->msize - sizeof(unsigned long);
+		free(r->ifcall.data.topen.name);
+		r->ofcall.data.ropen.iounit = pc->msize - sizeof(unsigned long);
 		break;
 	case TWALK:
-		if(error || r->ofcall.nwqid < r->ifcall.nwname) {
-			if(r->ifcall.fid != r->ifcall.newfid && r->newfid)
+		if(error || r->ofcall.data.rwalk.nwqid < r->ifcall.data.twalk.nwname) {
+			if(r->ifcall.fid != r->ifcall.data.twalk.newfid && r->newfid)
 				destroyfid(pc, r->newfid->fid);
-			if(!error && r->ofcall.nwqid == 0)
+			if(!error && r->ofcall.data.rwalk.nwqid == 0)
 				error = Enofile;
 		}else{
-			if(r->ofcall.nwqid == 0)
+			if(r->ofcall.data.rwalk.nwqid == 0)
 				r->newfid->qid = r->fid->qid;
 			else
-				r->newfid->qid = r->ofcall.wqid[r->ofcall.nwqid-1];
+				r->newfid->qid = r->ofcall.data.rwalk.wqid[r->ofcall.data.rwalk.nwqid-1];
 		}
-		free(*r->ifcall.wname);
+		free(*r->ifcall.data.twalk.wname);
 		break;
 	case TWRITE:
-		free(r->ifcall.data);
+		free(r->ifcall.data.twrite.data);
 		break;
 	case TREMOVE:
 		if(r->fid)
@@ -322,7 +322,7 @@
 			pc->ref--;
 		break;
 	case TFLUSH:
-		if((r->oldreq = lookupkey(&pc->tagmap, r->ifcall.oldtag)))
+		if((r->oldreq = lookupkey(&pc->tagmap, r->ifcall.data.tflush.oldtag)))
 			respond(r->oldreq, Einterrupted);
 		if(!pc->conn && r->ifcall.tag == IXP_NOTAG)
 			pc->ref--;
@@ -337,16 +337,16 @@
 		r->ofcall.type = r->ifcall.type + 1;
 	else {
 		r->ofcall.type = RERROR;
-		r->ofcall.ename = error;
+		r->ofcall.data.rerror.ename = error;
 	}
 	if(pc->conn)
 		ixp_server_respond_fcall(pc->conn, &r->ofcall);
 	switch(r->ofcall.type) {
 	case RSTAT:
-		free(r->ofcall.stat);
+		free(r->ofcall.data.rstat.stat);
 		break;
 	case RREAD:
-		free(r->ofcall.data);
+		free(r->ofcall.data.rread.data);
 		break;
 	}
 	deletekey(&pc->tagmap, r->ifcall.tag);;
@@ -367,7 +367,7 @@
 	tr->conn = pc;
 	tr->ifcall.type = TFLUSH;
 	tr->ifcall.tag = IXP_NOTAG;
-	tr->ifcall.oldtag = r->ifcall.tag;
+	tr->ifcall.data.tflush.oldtag = r->ifcall.tag;
 	ixp_handle_req(tr);
 }
 
