Annotation of libaitio/src/vars.c, revision 1.1.2.2
1.1.2.1 misho 1: /*************************************************************************
2: * (C) 2011 AITNET ltd - Sofia/Bulgaria - <misho@aitnet.org>
3: * by Michael Pounov <misho@elwix.org>
4: *
5: * $Author: misho $
1.1.2.2 ! misho 6: * $Id: vars.c,v 1.1.2.1 2011/08/29 14:58:50 misho Exp $
1.1.2.1 misho 7: *
8: **************************************************************************
9: The ELWIX and AITNET software is distributed under the following
10: terms:
11:
12: All of the documentation and software included in the ELWIX and AITNET
13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
14:
15: Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
16: by Michael Pounov <misho@elwix.org>. All rights reserved.
17:
18: Redistribution and use in source and binary forms, with or without
19: modification, are permitted provided that the following conditions
20: are met:
21: 1. Redistributions of source code must retain the above copyright
22: notice, this list of conditions and the following disclaimer.
23: 2. Redistributions in binary form must reproduce the above copyright
24: notice, this list of conditions and the following disclaimer in the
25: documentation and/or other materials provided with the distribution.
26: 3. All advertising materials mentioning features or use of this software
27: must display the following acknowledgement:
28: This product includes software developed by Michael Pounov <misho@elwix.org>
29: ELWIX - Embedded LightWeight unIX and its contributors.
30: 4. Neither the name of AITNET nor the names of its contributors
31: may be used to endorse or promote products derived from this software
32: without specific prior written permission.
33:
34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
37: ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44: SUCH DAMAGE.
45: */
46: #include "global.h"
47:
48:
1.1.2.2 ! misho 49: /*
! 50: * io_vals2buffer() Marshaling data from array with variables to buffer
! 51: * @buf = Buffer
! 52: * @buflen = Size of buffer
! 53: * @vars = Variable array
! 54: * return: -1 error, 0 nothing done or >0 size of marshaled data
! 55: */
! 56: int
! 57: io_vals2buffer(u_char **buf, int buflen, array_t *vars)
! 58: {
! 59: int Limit = 0;
! 60: register int i;
! 61: ait_val_t *v, *val;
! 62: u_char *data;
! 63:
! 64: assert(buf);
! 65: assert(vars);
! 66: if (!buf || !vars || !*buf)
! 67: return -1;
! 68: if (!buflen || !io_arraySize(vars))
! 69: return 0;
! 70:
! 71: Limit = sizeof(ait_val_t) * io_arraySize(vars);
! 72: if (Limit > buflen) {
! 73: io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d needed min %d ...\n",
! 74: buflen, Limit);
! 75: return -1;
! 76: } else {
! 77: memset(*buf, 0, buflen);
! 78:
! 79: v = (ait_val_t*) *buf;
! 80: data = *buf + Limit;
! 81: }
! 82:
! 83: /* marshaling */
! 84: for (i = 0; i < io_arraySize(vars); i++) {
! 85: val = io_array(vars, i, ait_val_t*);
! 86:
! 87: v[i].val_type = val->val_type;
! 88: AIT_LEN(&v[i]) = htobe32(AIT_LEN(val));
! 89:
! 90: switch (AIT_TYPE(val)) {
! 91: case blob:
! 92: case f32:
! 93: case f64:
! 94: case i8:
! 95: case i16:
! 96: case i32:
! 97: case i64:
! 98: case u8:
! 99: case u16:
! 100: case u32:
! 101: case u64:
! 102: v[i].val.net = htobe64(val->val.net);
! 103: break;
! 104: case buffer:
! 105: case string:
! 106: if (AIT_LEN(val) > buflen - Limit) {
! 107: io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d "
! 108: "needed min %d ...\n", buflen, Limit + AIT_LEN(val));
! 109: return -1;
! 110: } else
! 111: Limit += AIT_LEN(val);
! 112:
! 113: memcpy(data, val->val.buffer, AIT_LEN(val));
! 114: /* Debug:: data offset in packet, not matter for anything! */
! 115: v[i].val.net = data - *buf;
! 116: data += AIT_LEN(val);
! 117: break;
! 118: default:
! 119: io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n",
! 120: AIT_TYPE(val), i);
! 121: return -1;
! 122: }
! 123: }
! 124:
! 125: return Limit;
! 126: }
! 127:
! 128: /*
! 129: * io_buffer2vals() De-marshaling data from buffer to array with variables
! 130: * @buf = Buffer
! 131: * @buflen = Size of buffer
! 132: * @vnum = Number of variables into buffer
! 133: * @zcpy = Zero-copy for variables, if !=0 don't use io_arrayFree() for free variables and
! 134: *DON'T MODIFY OR DESTROY BUFFER*. =0 call io_arrayFree() before io_arrayDestroy()
! 135: * return: =NULL error, !=NULL allocated variable array, after use must free with io_arrayDestroy()
! 136: */
! 137: array_t *
! 138: io_buffer2vals(u_char *buf, int buflen, int vnum, int zcpy)
! 139: {
! 140: array_t *vars;
! 141: int Limit = 0;
! 142: register int i;
! 143: ait_val_t *v, *val;
! 144: u_char *data;
! 145:
! 146: assert(buf);
! 147: if (!buf || !buflen || !vnum)
! 148: return NULL;
! 149:
! 150: Limit = sizeof(ait_val_t) * vnum;
! 151: if (Limit > buflen) {
! 152: io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d needed min %d ...\n",
! 153: buflen, Limit);
! 154: return NULL;
! 155: } else {
! 156: if (!(vars = io_arrayInit(vnum)))
! 157: return NULL;
! 158:
! 159: v = (ait_val_t*) buf;
! 160: data = buf + Limit;
! 161: }
! 162:
! 163: /* de-marshaling */
! 164: for (i = 0; i < io_arraySize(vars); i++) {
! 165: if (!zcpy) {
! 166: val = malloc(sizeof(ait_val_t));
! 167: if (!val) {
! 168: LOGERR;
! 169: io_arrayFree(vars);
! 170: io_arrayDestroy(&vars);
! 171: return NULL;
! 172: }
! 173: } else
! 174: val = v + i;
! 175: io_arraySet(vars, i, val);
! 176:
! 177: val->val_type = v[i].val_type;
! 178: AIT_LEN(val) = betoh32(AIT_LEN(&v[i]));
! 179:
! 180: switch (AIT_TYPE(val)) {
! 181: case blob:
! 182: case f32:
! 183: case f64:
! 184: case i8:
! 185: case i16:
! 186: case i32:
! 187: case i64:
! 188: case u8:
! 189: case u16:
! 190: case u32:
! 191: case u64:
! 192: val->val.net = betoh64(v[i].val.net);
! 193: break;
! 194: case buffer:
! 195: case string:
! 196: if (AIT_LEN(val) > buflen - Limit) {
! 197: io_SetErr(EMSGSIZE, "Error:: too short buffer buflen=%d "
! 198: "needed min %d ...\n", buflen, Limit + AIT_LEN(val));
! 199: if (!zcpy)
! 200: io_arrayFree(vars);
! 201: io_arrayDestroy(&vars);
! 202: return NULL;
! 203: } else
! 204: Limit += AIT_LEN(val);
! 205:
! 206: if (!zcpy)
! 207: memcpy(val->val.buffer, data, AIT_LEN(val));
! 208: else
! 209: val->val.buffer = data;
! 210: data += AIT_LEN(val);
! 211: break;
! 212: default:
! 213: io_SetErr(EINVAL, "Error:: unsupported variable type=%d at element #%d ...\n",
! 214: AIT_TYPE(val), i);
! 215: if (!zcpy)
! 216: io_arrayFree(vars);
! 217: io_arrayDestroy(&vars);
! 218: return NULL;
! 219: }
! 220: }
! 221:
! 222: return vars;
! 223: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>