--- libaitio/src/Attic/vars.c 2012/03/27 22:31:37 1.4.4.3 +++ libaitio/src/Attic/vars.c 2012/03/27 23:06:37 1.4.4.4 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: vars.c,v 1.4.4.3 2012/03/27 22:31:37 misho Exp $ +* $Id: vars.c,v 1.4.4.4 2012/03/27 23:06:37 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -60,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); @@ -78,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 */ @@ -103,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) { @@ -112,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", @@ -144,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) @@ -160,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 */ @@ -204,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) { @@ -224,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", @@ -258,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); @@ -276,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 */ @@ -301,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) { @@ -310,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", @@ -342,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) @@ -358,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 */ @@ -393,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) { @@ -413,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",