--- libaitio/src/Attic/vars.c 2012/02/02 21:32:42 1.4 +++ libaitio/src/Attic/vars.c 2012/03/29 01:31:34 1.5 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: vars.c,v 1.4 2012/02/02 21:32:42 misho Exp $ +* $Id: vars.c,v 1.5 2012/03/29 01:31:34 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -48,6 +48,7 @@ SUCH DAMAGE. /* * io_vars2buffer() Marshaling data from array with variables to buffer + * * @buf = Buffer * @buflen = Size of buffer * @vars = Variable array @@ -59,7 +60,7 @@ io_vars2buffer(u_char *buf, int buflen, array_t *vars) int Limit = 0; register int i; ait_val_t *v, *val; - u_char *data; + u_char *dat; assert(buf); assert(vars); @@ -77,7 +78,7 @@ io_vars2buffer(u_char *buf, int buflen, array_t *vars) memset(buf, 0, buflen); v = (ait_val_t*) buf; - data = buf + Limit; + dat = buf + Limit; } /* marshaling */ @@ -85,6 +86,7 @@ io_vars2buffer(u_char *buf, int buflen, array_t *vars) val = io_array(vars, i, ait_val_t*); v[i].val_type = val->val_type; + AIT_HASH(&v[i]) = htobe16(AIT_HASH(val)); AIT_LEN(&v[i]) = htobe32(AIT_LEN(val)); switch (AIT_TYPE(val)) { @@ -101,6 +103,19 @@ io_vars2buffer(u_char *buf, int buflen, array_t *vars) case u64: v[i].val.net = htobe64(val->val.net); break; + case data: + if (AIT_LEN(val) > buflen - Limit) { + io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d " + "needed min %d ...\n", buflen, Limit + AIT_LEN(val)); + return -1; + } else + Limit += AIT_LEN(val); + + memcpy(dat, val->val_data, AIT_LEN(val)); + /* Debug:: data offset in packet, not matter for anything! */ + v[i].val.net = dat - buf; + dat += AIT_LEN(val); + break; case buffer: case string: if (AIT_LEN(val) > buflen - Limit) { @@ -110,10 +125,10 @@ io_vars2buffer(u_char *buf, int buflen, array_t *vars) } else Limit += AIT_LEN(val); - memcpy(data, val->val.buffer, AIT_LEN(val)); + memcpy(dat, val->val.buffer, AIT_LEN(val)); /* Debug:: data offset in packet, not matter for anything! */ - v[i].val.net = data - buf; - data += AIT_LEN(val); + v[i].val.net = dat - buf; + dat += AIT_LEN(val); break; default: io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n", @@ -127,6 +142,7 @@ io_vars2buffer(u_char *buf, int buflen, array_t *vars) /* * io_buffer2vars() De-marshaling data from buffer to array with variables + * * @buf = Buffer * @buflen = Size of buffer * @vnum = Number of variables into buffer @@ -141,7 +157,7 @@ io_buffer2vars(u_char *buf, int buflen, int vnum, int int Limit = 0; register int i; ait_val_t *v, *val; - u_char *data; + u_char *dat; assert(buf); if (!buf || !buflen || !vnum) @@ -157,7 +173,7 @@ io_buffer2vars(u_char *buf, int buflen, int vnum, int return NULL; v = (ait_val_t*) buf; - data = buf + Limit; + dat = buf + Limit; } /* de-marshaling */ @@ -177,8 +193,10 @@ io_buffer2vars(u_char *buf, int buflen, int vnum, int val->val_type = v[i].val_type; #if defined(__OpenBSD__) AIT_LEN(val) = betoh32(AIT_LEN(&v[i])); + AIT_HASH(val) = betoh16(AIT_HASH(&v[i])); #else AIT_LEN(val) = be32toh(AIT_LEN(&v[i])); + AIT_HASH(val) = be16toh(AIT_HASH(&v[i])); #endif switch (AIT_TYPE(val)) { @@ -199,6 +217,9 @@ io_buffer2vars(u_char *buf, int buflen, int vnum, int val->val.net = be64toh(v[i].val.net); #endif break; + case data: + /* WARNING:: remap data type to buffer */ + val->val_type = buffer; case buffer: case string: if (AIT_LEN(val) > buflen - Limit) { @@ -219,10 +240,10 @@ io_buffer2vars(u_char *buf, int buflen, int vnum, int io_arrayDestroy(&vars); return NULL; } else - memcpy(val->val.buffer, data, AIT_LEN(val)); + memcpy(val->val.buffer, dat, AIT_LEN(val)); } else - val->val.buffer = data; - data += AIT_LEN(val); + val->val.buffer = dat; + dat += AIT_LEN(val); break; default: io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n", @@ -241,6 +262,7 @@ io_buffer2vars(u_char *buf, int buflen, int vnum, int /* * io_vars2map() Marshaling data from array with variables to memory map + * * @buf = Buffer * @buflen = Size of buffer * @vars = Variable array @@ -252,7 +274,7 @@ io_vars2map(u_char *buf, int buflen, array_t *vars) int Limit = 0; register int i; ait_val_t *v, *val; - u_char *data; + u_char *dat; assert(buf); assert(vars); @@ -270,7 +292,7 @@ io_vars2map(u_char *buf, int buflen, array_t *vars) memset(buf, 0, buflen); v = (ait_val_t*) buf; - data = buf + Limit; + dat = buf + Limit; } /* marshaling */ @@ -278,6 +300,7 @@ io_vars2map(u_char *buf, int buflen, array_t *vars) val = io_array(vars, i, ait_val_t*); v[i].val_type = val->val_type; + AIT_HASH(&v[i]) = AIT_HASH(val); AIT_LEN(&v[i]) = AIT_LEN(val); switch (AIT_TYPE(val)) { @@ -294,6 +317,19 @@ io_vars2map(u_char *buf, int buflen, array_t *vars) case u64: v[i].val.net = val->val.net; break; + case data: + if (AIT_LEN(val) > buflen - Limit) { + io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d " + "needed min %d ...\n", buflen, Limit + AIT_LEN(val)); + return -1; + } else + Limit += AIT_LEN(val); + + memcpy(dat, val->val_data, AIT_LEN(val)); + /* Debug:: data offset in packet, not matter for anything! */ + v[i].val.net = dat - buf; + dat += AIT_LEN(val); + break; case buffer: case string: if (AIT_LEN(val) > buflen - Limit) { @@ -303,10 +339,10 @@ io_vars2map(u_char *buf, int buflen, array_t *vars) } else Limit += AIT_LEN(val); - memcpy(data, val->val.buffer, AIT_LEN(val)); + memcpy(dat, val->val.buffer, AIT_LEN(val)); /* Debug:: data offset in packet, not matter for anything! */ - v[i].val.net = data - buf; - data += AIT_LEN(val); + v[i].val.net = dat - buf; + dat += AIT_LEN(val); break; default: io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n", @@ -320,6 +356,7 @@ io_vars2map(u_char *buf, int buflen, array_t *vars) /* * io_map2vars() De-marshaling data from memory map to array with variables + * * @buf = Buffer * @buflen = Size of buffer * @vnum = Number of variables into buffer @@ -334,7 +371,7 @@ io_map2vars(u_char *buf, int buflen, int vnum, int zcp int Limit = 0; register int i; ait_val_t *v, *val; - u_char *data; + u_char *dat; assert(buf); if (!buf || !buflen || !vnum) @@ -350,7 +387,7 @@ io_map2vars(u_char *buf, int buflen, int vnum, int zcp return NULL; v = (ait_val_t*) buf; - data = buf + Limit; + dat = buf + Limit; } /* de-marshaling */ @@ -368,6 +405,7 @@ io_map2vars(u_char *buf, int buflen, int vnum, int zcp io_arraySet(vars, i, val); val->val_type = v[i].val_type; + AIT_HASH(val) = AIT_HASH(&v[i]); AIT_LEN(val) = AIT_LEN(&v[i]); switch (AIT_TYPE(val)) { @@ -384,6 +422,9 @@ io_map2vars(u_char *buf, int buflen, int vnum, int zcp case u64: val->val.net = v[i].val.net; break; + case data: + /* WARNING:: remap data type to buffer */ + val->val_type = buffer; case buffer: case string: if (AIT_LEN(val) > buflen - Limit) { @@ -404,10 +445,10 @@ io_map2vars(u_char *buf, int buflen, int vnum, int zcp io_arrayDestroy(&vars); return NULL; } else - memcpy(val->val.buffer, data, AIT_LEN(val)); + memcpy(val->val.buffer, dat, AIT_LEN(val)); } else - val->val.buffer = data; - data += AIT_LEN(val); + val->val.buffer = dat; + dat += AIT_LEN(val); break; default: io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n", @@ -425,6 +466,7 @@ io_map2vars(u_char *buf, int buflen, int vnum, int zcp /* * io_allocVars() Allocate ait_val_t array + * * @varnum = Number of variables * return: =NULL error or !=NULL allocated array */ @@ -455,6 +497,7 @@ io_allocVars(int varnum) /* * io_clrVars() Clear ait_val_t elements from array + * * @vars = Variable array * return: -1 error or size of array */ @@ -462,19 +505,21 @@ inline int io_clrVars(array_t * __restrict vars) { register int i; + ait_val_t *v; if (!vars) return -1; for (i = 0; i < io_arraySize(vars); i++) - if (io_arrayGet(vars, i)) - AIT_FREE_VAL(io_array(vars, i, ait_val_t*)); + if ((v = io_array(vars, i, ait_val_t*))) + AIT_FREE_VAL(v); return io_arraySize(vars); } /* * io_freeVars() Free ait_val_t array + * * @vars = Variable array * return: none */ @@ -491,6 +536,7 @@ io_freeVars(array_t ** __restrict vars) /* * io_allocVar() Allocate memory for variable + * * return: NULL error or new variable, after use free variable with io_freeVar() */ inline ait_val_t * @@ -511,6 +557,7 @@ io_allocVar(void) /* * io_freeVar() Free allocated memory for variable + * * @val = Variable * return: none */