#include "XDRInPacket.h"#include <malloc.h>#include <string.h>#include <ByteOrder.h>#include <KernelExport.h>#include <kernel.h>#include "nfs.h"extern voidXDRInPacketInit(struct XDRInPacket *packet){packet->fBuffer=NULL;packet->fOffset=0;}extern voidXDRInPacketDestroy(struct XDRInPacket *packet){free (packet->fBuffer);}extern int32XDRInPacketGetInt32(struct XDRInPacket *packet){int32 val=B_BENDIAN_TO_HOST_INT32(*((int32 *)&packet->fBuffer[packet->fOffset]));packet->fOffset+=4;return val;}status_tXDRInPacketGetFixed(struct XDRInPacket *packet, void *buffer, size_t len){if (!IS_USER_ADDRESS(buffer))memcpy(buffer, &packet->fBuffer[packet->fOffset], len);else if (user_memcpy(buffer, &packet->fBuffer[packet->fOffset], len) != B_OK)return B_BAD_ADDRESS;packet->fOffset += (len + 3) & ~3;return B_OK;}status_tXDRInPacketGetDynamic(struct XDRInPacket *packet, void *buffer, size_t *len){*len = XDRInPacketGetInt32(packet);return XDRInPacketGetFixed(packet, buffer, *len);}extern char *XDRInPacketGetString(struct XDRInPacket *packet){int32 size=XDRInPacketGetInt32(packet);char *string=(char *)malloc(size+1);string[size]=0;XDRInPacketGetFixed(packet,string,size);return string;}extern voidXDRInPacketSetTo(struct XDRInPacket *packet, uint8 *buffer, size_t offset){free (packet->fBuffer);packet->fBuffer=buffer;packet->fOffset=offset;}