2025-08-10 01:34:16 +02:00

86 lines
2.6 KiB
C

#include <common/toolkit/Serialization.h>
#include <common/storage/EntryInfo.h>
#include <os/OsDeps.h>
#define MIN_ENTRY_ID_LEN 1 // usually A-B-C, but also "root" and "disposal"
/**
* Serialize into outBuf, 4-byte aligned
*/
void EntryInfo_serialize(SerializeCtx* ctx, const EntryInfo* this)
{
// DirEntryType
Serialization_serializeUInt(ctx, this->entryType);
// featureFlags
Serialization_serializeInt(ctx, this->featureFlags);
// parentEntryID
Serialization_serializeStrAlign4(ctx, strlen(this->parentEntryID), this->parentEntryID);
if (unlikely(strlen(this->entryID) < MIN_ENTRY_ID_LEN) )
{
printk_fhgfs(KERN_WARNING, "EntryID too small!\n"); // server side deserialization will fail
dump_stack();
}
// entryID
Serialization_serializeStrAlign4(ctx, strlen(this->entryID), this->entryID);
// fileName
Serialization_serializeStrAlign4(ctx, strlen(this->fileName), this->fileName);
// ownerNodeID
// also serializes owner.group, if buddymirrored. both MUST have the same size and underlying
// type!
BUILD_BUG_ON(
sizeof(this->owner.node) != sizeof(this->owner.group)
|| !__builtin_types_compatible_p(
__typeof(this->owner.node.value), __typeof(this->owner.group)));
NumNodeID_serialize(ctx, &this->owner.node);
// padding for 4-byte alignment
Serialization_serializeUShort(ctx, 0);
}
/**
* deserialize the given buffer
*/
bool EntryInfo_deserialize(DeserializeCtx* ctx, EntryInfo* outThis)
{
unsigned parentEntryIDLen;
unsigned entryIDLen;
unsigned fileNameLen;
unsigned entryType;
unsigned short padding;
if (!Serialization_deserializeUInt(ctx, &entryType))
return false;
outThis->entryType = (DirEntryType) entryType;
if (!Serialization_deserializeInt(ctx, &outThis->featureFlags)
|| !Serialization_deserializeStrAlign4(ctx, &parentEntryIDLen, &outThis->parentEntryID)
|| !Serialization_deserializeStrAlign4(ctx, &entryIDLen, &outThis->entryID)
|| !Serialization_deserializeStrAlign4(ctx, &fileNameLen, &outThis->fileName))
return false;
outThis->owner.isGroup = outThis->featureFlags & ENTRYINFO_FEATURE_BUDDYMIRRORED;
// also deserializes owner.group, if buddy mirrored.
if (!NumNodeID_deserialize(ctx, &outThis->owner.node))
return false;
// padding for 4-byte alignment
if(!Serialization_deserializeUShort(ctx, &padding))
return false;
// Note: the root ("/") has parentEntryID = ""
if (unlikely((parentEntryIDLen < MIN_ENTRY_ID_LEN) && (parentEntryIDLen > 0)))
return false;
if (unlikely(entryIDLen < MIN_ENTRY_ID_LEN))
return false;
return true;
}