aboutsummaryrefslogtreecommitdiff
path: root/pack.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2021-07-25 20:59:58 +0000
committerrodri <rgl@antares-labs.eu>2021-07-25 20:59:58 +0000
commitbdaa63a1a4604ada3539aeb50e4af144da3ba6f0 (patch)
tree6aa3d68f94d7756d45f78cce10af1796bdb744d2 /pack.c
parentf54a8666413d80db3bda3de6e17f795faf7790eb (diff)
downloadmusw-bdaa63a1a4604ada3539aeb50e4af144da3ba6f0.tar.gz
musw-bdaa63a1a4604ada3539aeb50e4af144da3ba6f0.tar.bz2
musw-bdaa63a1a4604ada3539aeb50e4af144da3ba6f0.zip
implemented parties to hold PvP match info.
started serializing game state through the wire. made some major changes to the Lobby struct, plus the ability to check the health of every connection. added some more debug statements, did some cleanup and put more checks.
Diffstat (limited to 'pack.c')
-rw-r--r--pack.c114
1 files changed, 31 insertions, 83 deletions
diff --git a/pack.c b/pack.c
index 5899dbd..d60800d 100644
--- a/pack.c
+++ b/pack.c
@@ -3,58 +3,37 @@
#include "dat.h"
#include "fns.h"
-/*
- * these routines were taken directly from ssh(1).
- * they serve as a reference.
- */
+static ulong
+get4(uchar *p)
+{
+ return p[0]<<24 | p[1]<<16 | p[2]<<8 | p[3];
+}
+
+static void
+put4(uchar *p, ulong u)
+{
+ p[0] = u>>24, p[1] = u>>16, p[2] = u>>8, p[3] = u;
+}
static int
vpack(uchar *p, int n, char *fmt, va_list a)
{
uchar *p0 = p, *e = p+n;
- u32int u;
-// mpint *m;
- void *s;
- int c;
+ FPdbleword d;
for(;;){
- switch(c = *fmt++){
+ switch(*fmt++){
case '\0':
return p - p0;
- case '_':
- if(++p > e) goto err;
- break;
- case '.':
- *va_arg(a, void**) = p;
- break;
- case 'b':
- if(p >= e) goto err;
- *p++ = va_arg(a, int);
- break;
- case 'm':
-// m = va_arg(a, mpint*);
-// u = (mpsignif(m)+8)/8;
- if(p+4 > e) goto err;
-// PUT4(p, u), p += 4;
- if(u > e-p) goto err;
-// mptober(m, p, u), p += u;
- break;
- case '[':
- case 's':
- s = va_arg(a, void*);
- u = va_arg(a, int);
- if(c == 's'){
- if(p+4 > e) goto err;
-// PUT4(p, u), p += 4;
- }
- if(u > e-p) goto err;
- memmove(p, s, u);
- p += u;
- break;
- case 'u':
- u = va_arg(a, int);
- if(p+4 > e) goto err;
-// PUT4(p, u), p += 4;
+ case 'd':
+ d.x = va_arg(a, double);
+
+ if(p+8 > e)
+ goto err;
+
+ put4(p, d.hi), p += 4;
+ put4(p, d.lo), p += 4;
+
break;
}
}
@@ -66,51 +45,20 @@ static int
vunpack(uchar *p, int n, char *fmt, va_list a)
{
uchar *p0 = p, *e = p+n;
- u32int u;
-// mpint *m;
- void *s;
+ FPdbleword d;
for(;;){
switch(*fmt++){
case '\0':
return p - p0;
- case '_':
- if(++p > e) goto err;
- break;
- case '.':
- *va_arg(a, void**) = p;
- break;
- case 'b':
- if(p >= e) goto err;
- *va_arg(a, int*) = *p++;
- break;
- case 'm':
- if(p+4 > e) goto err;
-// u = GET4(p), p += 4;
- if(u > e-p) goto err;
-// m = va_arg(a, mpint*);
-// betomp(p, u, m), p += u;
- break;
- case 's':
- if(p+4 > e) goto err;
-// u = GET4(p), p += 4;
- if(u > e-p) goto err;
- *va_arg(a, void**) = p;
- *va_arg(a, int*) = u;
- p += u;
- break;
- case '[':
- s = va_arg(a, void*);
- u = va_arg(a, int);
- if(u > e-p) goto err;
- memmove(s, p, u);
- p += u;
- break;
- case 'u':
- if(p+4 > e) goto err;
-// u = GET4(p);
- *va_arg(a, int*) = u;
- p += 4;
+ case 'd':
+ if(p+8 > e)
+ goto err;
+
+ d.hi = get4(p), p += 4;
+ d.lo = get4(p), p += 4;
+ *va_arg(a, double*) = d.x;
+
break;
}
}