1f4783a9fSFrançois Revol #include "XDROutPacket.h" 2f4783a9fSFrançois Revol 3f4783a9fSFrançois Revol #include <malloc.h> 4f4783a9fSFrançois Revol #include <string.h> 5*0c729c22SJérôme Duval 64b05e555SFrançois Revol #include <ByteOrder.h> 7*0c729c22SJérôme Duval #include <KernelExport.h> 8*0c729c22SJérôme Duval 9*0c729c22SJérôme Duval #include <kernel.h> 10*0c729c22SJérôme Duval 11f4783a9fSFrançois Revol 12f4783a9fSFrançois Revol extern const uint8 * 13f4783a9fSFrançois Revol XDROutPacketBuffer(struct XDROutPacket *packet) 14f4783a9fSFrançois Revol { 15f4783a9fSFrançois Revol return packet->fBuffer; 16f4783a9fSFrançois Revol } 17f4783a9fSFrançois Revol 18f4783a9fSFrançois Revol extern size_t 19f4783a9fSFrançois Revol XDROutPacketLength(struct XDROutPacket *packet) 20f4783a9fSFrançois Revol { 21f4783a9fSFrançois Revol return packet->fLength; 22f4783a9fSFrançois Revol } 23f4783a9fSFrançois Revol 24f4783a9fSFrançois Revol extern void 25f4783a9fSFrançois Revol XDROutPacketInit(struct XDROutPacket *packet) 26f4783a9fSFrançois Revol { 27f4783a9fSFrançois Revol packet->fBuffer=NULL; 28f4783a9fSFrançois Revol packet->fSize=packet->fLength=0; 29f4783a9fSFrançois Revol } 30f4783a9fSFrançois Revol 31f4783a9fSFrançois Revol extern void 32f4783a9fSFrançois Revol XDROutPacketDestroy(struct XDROutPacket *packet) 33f4783a9fSFrançois Revol { 34f4783a9fSFrançois Revol free (packet->fBuffer); 35f4783a9fSFrançois Revol } 36f4783a9fSFrançois Revol 37f4783a9fSFrançois Revol extern void 38f4783a9fSFrançois Revol XDROutPacketGrow(struct XDROutPacket *packet, size_t size) 39f4783a9fSFrançois Revol { 40f4783a9fSFrançois Revol if (packet->fLength+size>packet->fSize) 41f4783a9fSFrançois Revol { 42f4783a9fSFrançois Revol while (packet->fLength+size>packet->fSize) 43f4783a9fSFrançois Revol packet->fSize+=XDROUTPACKET_BUFFER_INCREMENT; 44f4783a9fSFrançois Revol 45f4783a9fSFrançois Revol packet->fBuffer=(uint8 *)realloc(packet->fBuffer,packet->fSize); 46f4783a9fSFrançois Revol } 47f4783a9fSFrançois Revol } 48f4783a9fSFrançois Revol 49f4783a9fSFrançois Revol extern void 50f4783a9fSFrançois Revol XDROutPacketAddInt32(struct XDROutPacket *packet, int32 val) 51f4783a9fSFrançois Revol { 52f4783a9fSFrançois Revol XDROutPacketGrow (packet,4); 53f4783a9fSFrançois Revol *(int32 *)(&packet->fBuffer[packet->fLength])=B_HOST_TO_BENDIAN_INT32(val); 54f4783a9fSFrançois Revol packet->fLength+=4; 55f4783a9fSFrançois Revol } 56f4783a9fSFrançois Revol 57*0c729c22SJérôme Duval 58*0c729c22SJérôme Duval status_t 59f4783a9fSFrançois Revol XDROutPacketAddDynamic(struct XDROutPacket *packet, const void *data, size_t size) 60f4783a9fSFrançois Revol { 61f4783a9fSFrançois Revol XDROutPacketAddInt32(packet, size); 62*0c729c22SJérôme Duval return XDROutPacketAddFixed(packet, data, size); 63f4783a9fSFrançois Revol } 64f4783a9fSFrançois Revol 65*0c729c22SJérôme Duval 66*0c729c22SJérôme Duval status_t 67f4783a9fSFrançois Revol XDROutPacketAddFixed(struct XDROutPacket *packet, const void *data, size_t size) 68f4783a9fSFrançois Revol { 69f4783a9fSFrançois Revol size_t roundedSize = (size + 3) & ~3; 70f4783a9fSFrançois Revol XDROutPacketGrow(packet, roundedSize); 71*0c729c22SJérôme Duval if (!IS_USER_ADDRESS(data)) 72f4783a9fSFrançois Revol memcpy(&packet->fBuffer[packet->fLength], data, size); 73*0c729c22SJérôme Duval else if (user_memcpy(&packet->fBuffer[packet->fLength], data, size) != B_OK) 74*0c729c22SJérôme Duval return B_BAD_ADDRESS; 75f4783a9fSFrançois Revol memset(&packet->fBuffer[packet->fLength + size], 0, roundedSize - size); 76f4783a9fSFrançois Revol packet->fLength += roundedSize; 77*0c729c22SJérôme Duval return B_OK; 78f4783a9fSFrançois Revol } 79f4783a9fSFrançois Revol 80*0c729c22SJérôme Duval 81*0c729c22SJérôme Duval status_t 82f4783a9fSFrançois Revol XDROutPacketAddString(struct XDROutPacket *packet, const char *string) 83f4783a9fSFrançois Revol { 84*0c729c22SJérôme Duval return XDROutPacketAddDynamic(packet, string, strlen(string)); 85f4783a9fSFrançois Revol } 86f4783a9fSFrançois Revol 87*0c729c22SJérôme Duval 88f4783a9fSFrançois Revol extern void 89f4783a9fSFrançois Revol XDROutPacketAppend(struct XDROutPacket *me, const struct XDROutPacket *packet) 90f4783a9fSFrançois Revol { 91f4783a9fSFrançois Revol XDROutPacketGrow (me,packet->fLength); 92f4783a9fSFrançois Revol memcpy (&me->fBuffer[me->fLength],packet->fBuffer,packet->fLength); 93f4783a9fSFrançois Revol me->fLength+=packet->fLength; 94f4783a9fSFrançois Revol } 95f4783a9fSFrançois Revol 96f4783a9fSFrançois Revol extern void 97f4783a9fSFrançois Revol XDROutPacketClear(struct XDROutPacket *packet) 98f4783a9fSFrançois Revol { 99f4783a9fSFrançois Revol packet->fLength=0; 100f4783a9fSFrançois Revol } 101f4783a9fSFrançois Revol 102