1#include "XDRInPacket.h" 2 3#include <malloc.h> 4#include <string.h> 5 6#include <ByteOrder.h> 7#include <KernelExport.h> 8 9#include <kernel.h> 10 11#include "nfs.h" 12 13extern void 14XDRInPacketInit(struct XDRInPacket *packet) 15{ 16 packet->fBuffer=NULL; 17 packet->fOffset=0; 18} 19 20extern void 21XDRInPacketDestroy(struct XDRInPacket *packet) 22{ 23 free (packet->fBuffer); 24} 25 26extern int32 27XDRInPacketGetInt32(struct XDRInPacket *packet) 28{ 29 int32 val=B_BENDIAN_TO_HOST_INT32(*((int32 *)&packet->fBuffer[packet->fOffset])); 30 31 packet->fOffset+=4; 32 33 return val; 34} 35 36 37status_t 38XDRInPacketGetFixed(struct XDRInPacket *packet, void *buffer, size_t len) 39{ 40 if (!IS_USER_ADDRESS(buffer)) 41 memcpy(buffer, &packet->fBuffer[packet->fOffset], len); 42 else if (user_memcpy(buffer, &packet->fBuffer[packet->fOffset], len) != B_OK) 43 return B_BAD_ADDRESS; 44 45 packet->fOffset += (len + 3) & ~3; 46 return B_OK; 47} 48 49 50status_t 51XDRInPacketGetDynamic(struct XDRInPacket *packet, void *buffer, size_t *len) 52{ 53 *len = XDRInPacketGetInt32(packet); 54 return XDRInPacketGetFixed(packet, buffer, *len); 55} 56 57 58extern char * 59XDRInPacketGetString(struct XDRInPacket *packet) 60{ 61 int32 size=XDRInPacketGetInt32(packet); 62 char *string=(char *)malloc(size+1); 63 string[size]=0; 64 XDRInPacketGetFixed(packet,string,size); 65 66 return string; 67} 68 69extern void 70XDRInPacketSetTo(struct XDRInPacket *packet, uint8 *buffer, size_t offset) 71{ 72 free (packet->fBuffer); 73 packet->fBuffer=buffer; 74 packet->fOffset=offset; 75} 76