1 /* 2 * Copyright 2009 VMware, Inc. 3 * All Rights Reserved. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * on the rights to use, copy, modify, merge, publish, distribute, sub 9 * license, and/or sell copies of the Software, and to permit persons to whom 10 * the Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19 * VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 22 * USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 /* 26 * This file is internal to the rbug protocol code, and contains asorted 27 * features needed by the code. 28 */ 29 30 #ifndef _RBUG_INTERNAL_H_ 31 #define _RBUG_INTERNAL_H_ 32 33 #include "rbug_proto.h" 34 35 #include "util/u_memory.h" 36 #include "util/u_debug.h" 37 #include <errno.h> 38 39 int rbug_connection_send_start(struct rbug_connection *con, enum rbug_opcode opcode, uint32_t length); 40 int rbug_connection_write(struct rbug_connection *con, void *data, uint32_t size); 41 int rbug_connection_send_finish(struct rbug_connection *con, uint32_t *c); 42 43 /** 44 * Only works with multiples of 2 45 */ 46 #define PAD(from, to) \ 47 do { \ 48 from = (from + to - 1) & ~(to - 1); \ 49 } while(0) 50 51 #define LEN(size) \ 52 do { \ 53 PAD(__len, size); \ 54 __len += size; \ 55 } while(0) 56 57 #define LEN_ARRAY(size, name) \ 58 do { \ 59 LEN(4); \ 60 PAD(__len, size); \ 61 __len += size * name##_len; \ 62 } while(0) 63 64 #define WRITE(size, type, name) \ 65 do { \ 66 PAD(__pos, size); \ 67 *((type *)(&__data[__pos])) = name; \ 68 __pos += size; \ 69 } while(0) 70 71 #define WRITE_ARRAY(size, type, name) \ 72 do { \ 73 WRITE(4, uint32_t, name##_len); \ 74 PAD(__pos, size); \ 75 memcpy(&__data[__pos], name, size * name##_len); \ 76 __pos += size * name##_len; \ 77 } while(0) 78 79 #define READ(size, type, name) \ 80 do { \ 81 PAD(pos, size); \ 82 pos += size; \ 83 if (pos > len) \ 84 break; \ 85 ret->name = *((type *)(&data[pos - size])); \ 86 } while(0) 87 88 #define READ_ARRAY(size, type, name) \ 89 do { \ 90 READ(4, uint32_t, name##_len); \ 91 if (pos > len) \ 92 break; \ 93 PAD(pos, size); \ 94 pos += size * ret->name##_len; \ 95 if (pos > len) \ 96 break; \ 97 ret->name = (type *)&data[pos - size * ret->name##_len]; \ 98 } while(0) 99 100 #endif 101