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

155 lines
4.7 KiB
C

/*
* class PathInfo - extra information how to find chunk files (or later on inode files)
*
* NOTE: If you change this file, do not forget to adjust commons PathInfo.h
*/
#ifndef PATHINFO_H_
#define PATHINFO_H_
#include <common/storage/PathInfo.h>
#include <common/storage/StorageDefinitions.h>
#include <common/toolkit/SerializationTypes.h>
#include <common/toolkit/StringTk.h>
#define PATHINFO_FEATURE_ORIG 1 /* inidicate chunks are stored with origParentUID and
* and origParentEntryID */
#define PATHINFO_FEATURE_ORIG_UNKNOWN 2 /* indicates FEATURE_ORIG is unknown and needs to be
* requested from the meta-inode */
#define PATHINFO_FEATURE_IS_STUB 4 /* indicates entry is a stub file.
* This flag not used in the client module but is added
* here for consistency with the C++ PathInfo implementation */
struct PathInfo;
typedef struct PathInfo PathInfo;
static inline void PathInfo_init(PathInfo *this,
unsigned origParentUID, const char* origParentEntryID, unsigned flags);
static inline void PathInfo_uninit(PathInfo* this);
static inline void PathInfo_dup(const PathInfo *inPathInfo, PathInfo *outPathInfo);
static inline void PathInfo_update(PathInfo* this, const PathInfo* newPathInfo);
static inline void PathInfo_setOrigUID(PathInfo* this, unsigned origParentUID);
static inline void PathInfo_setOrigParentEntryID(PathInfo* this, const char* origParentEntryID);
static inline void PathInfo_setFlags(PathInfo *this, unsigned flags);
extern void PathInfo_serialize(SerializeCtx* ctx, const PathInfo* this);
extern bool PathInfo_deserialize(DeserializeCtx* ctx, PathInfo* outThis);
/**
* minimal information about an entry (file/directory/...)
* note: In order to properly initialize this struct, PathInfo_init() has to be called. This
* is also the only function, which ever should write to the write-unprotected '_' functions.
* Other code is supposed to use the function without the underscore.
*/
struct PathInfo
{
union
{
const unsigned flags; // additional flags (e.g. PATHINFO_FEATURE_INLINED)
unsigned _flags;
};
union
{
const unsigned origParentUID; // UID who created the file, only set for FileInodes
unsigned _origParentUID;
};
union
{
// ID of the dir in which the file was created in. Only set for FileInodes
char const* const origParentEntryID;
char* _origParentEntryID;
};
};
/**
* Main initialization function for PathInfo, should typically be used
*
* @param origParentEntryID will be free'd on uninit
*/
void PathInfo_init(PathInfo* this, unsigned origParentUID, const char* origParentEntryID, unsigned flags)
{
PathInfo_setOrigUID(this, origParentUID);
PathInfo_setOrigParentEntryID(this, origParentEntryID);
PathInfo_setFlags(this, flags);
}
/**
* unitialize the object
*/
void PathInfo_uninit(PathInfo* this)
{
if (this->flags & PATHINFO_FEATURE_ORIG)
kfree(this->origParentEntryID);
}
/**
* Duplicate inPathInfo to outPathInfo, also allocate memory for strings
*/
void PathInfo_dup(const PathInfo* inPathInfo, PathInfo* outPathInfo)
{
int outFlags = inPathInfo->flags;
unsigned outOrigUID = inPathInfo->origParentUID;
const char* outOrigParentEntryID;
if (outFlags & PATHINFO_FEATURE_ORIG)
outOrigParentEntryID = StringTk_strDup(inPathInfo->origParentEntryID);
else
outOrigParentEntryID = NULL;
PathInfo_init(outPathInfo, outOrigUID, outOrigParentEntryID, outFlags);
}
/**
* Update an existing PathInfo
*/
void PathInfo_update(PathInfo* this, const PathInfo* newPathInfo)
{
bool needUpdate = false;
if (this->flags != newPathInfo->flags)
needUpdate = true;
else
if (this->origParentUID != newPathInfo->origParentUID)
needUpdate = true;
else
if ( (this->origParentEntryID && newPathInfo->origParentEntryID) &&
(strcmp(this->origParentEntryID, newPathInfo->origParentEntryID) != 0 ) )
{
// note: no need for other tests in the if-condition, as flags would be different then.
needUpdate = true;
}
if (needUpdate)
{
PathInfo_uninit(this);
PathInfo_dup(newPathInfo, this);
}
}
void PathInfo_setFlags(PathInfo* this, unsigned flags)
{
this->_flags = flags;
}
void PathInfo_setOrigUID(PathInfo* this, unsigned origParentUID)
{
this->_origParentUID = origParentUID;
}
void PathInfo_setOrigParentEntryID(PathInfo* this, const char* origParentEntryID)
{
this->_origParentEntryID = (char *) origParentEntryID;
}
#endif /* PATHINFO_H_ */