\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /usr/include/lve/

Viewing File: lvd-map.h

#ifndef _LVD_MAP_H_
#define _LVD_MAP_H_

#include <stdint.h>
#include <sys/types.h>

/*
 * LVD per-domain registry — single C implementation for liblve.so.
 *
 * Two file types live under LVD_MAP_DIR:
 *
 *   <uid>    Per-uid open-addressing hash table (docroot -> domain_id).
 *            The hot lookup path touches only this file — no locking,
 *            no .index access.
 *
 *   .index   Global next_id counter (12 bytes).  Touched only on writes
 *            (assign/remove), under flock().
 *
 * Per-uid on-disk format (version 2):
 *
 *   Header (16 bytes):
 *     magic[4]       = "LVDM"
 *     version(u16)   = 2
 *     count(u16)     — number of occupied slots
 *     str_offset(u32)— byte offset from file start to string pool
 *     capacity(u32)  — hash table slot count (power of 2)
 *
 *   Hash table (capacity * 16 bytes, starts at byte 16):
 *     Per slot (16 bytes):
 *       hash(u32)      — FNV-1a of docroot; 0 = empty slot
 *       key_offset(u32)— offset into string pool (from pool start)
 *       key_len(u32)   — docroot string length (excluding NUL)
 *       domain_id(u32) — assigned domain LVE ID
 *
 *   String pool (at str_offset):
 *     Packed null-terminated docroot strings
 *
 * Version 1 (legacy sorted-array format) is still accepted by
 * lvd_map_lookup() for transparent migration.
 */

#define LVD_MAP_MAGIC   "LVDM"
#define LVD_MAP_VERSION 2
#define LVD_MAP_DIR     "/etc/container/lvd_ids"

/* Legacy format version for backward-compatible reads */
#define LVD_MAP_VERSION_V1 1

struct lvd_map_header {
	char     magic[4];
	uint16_t version;
	uint16_t count;
	uint32_t str_offset;
	uint32_t capacity;	/* v2: hash table slot count; v1: reserved */
} __attribute__((packed));

struct lvd_map_slot {
	uint32_t hash;		/* FNV-1a of docroot; 0 = empty */
	uint32_t key_offset;	/* offset into string pool */
	uint32_t key_len;	/* docroot length (no NUL) */
	uint32_t domain_id;
} __attribute__((packed));

/* Legacy v1 entry (12 bytes, sorted by docroot) */
struct lvd_map_entry_v1 {
	uint32_t key_offset;
	uint32_t key_len;
	uint32_t domain_id;
} __attribute__((packed));

/* ------------------------------------------------------------------ */
/* Hash                                                               */
/* ------------------------------------------------------------------ */

uint32_t lvd_fnv1a(const char *docroot);

/* ------------------------------------------------------------------ */
/* Read-only (no locking, no .index access)                           */
/* ------------------------------------------------------------------ */

uint32_t lvd_map_lookup(uid_t uid, const char *docroot);

int lvd_map_verify_ownership(uid_t uid, uint32_t domain_id);

/* ------------------------------------------------------------------ */
/* Iteration (opendir/readdir style — zero-copy, mmap-backed)         */
/* ------------------------------------------------------------------ */

typedef struct lvd_iter lvd_iter_t;

lvd_iter_t *lvd_map_iter_open(uid_t uid);
int         lvd_map_iter_next(lvd_iter_t *it,
			      const char **docroot,
			      uint32_t *domain_id);
void        lvd_map_iter_close(lvd_iter_t *it);

/* ------------------------------------------------------------------ */
/* Read-write (acquires flock on .index)                              */
/* ------------------------------------------------------------------ */

int lvd_map_assign(uid_t uid, const char *docroot, uint32_t *out_id);
int lvd_map_remove(uid_t uid, const char *docroot, uint32_t *old_id);
int lvd_map_remove_all(uid_t uid);

/* ------------------------------------------------------------------ */
/* Index management                                                   */
/* ------------------------------------------------------------------ */

int lvd_index_rebuild(void);

/* ------------------------------------------------------------------ */
/* Domain ID threshold                                                */
/* ------------------------------------------------------------------ */

/*
 * Minimum domain LVE ID — reads UID_MAX from /etc/login.defs at runtime.
 * Returns max(UID_MAX, LVD_UID_MAX_DEFAULT) so domain IDs never go
 * below the compile-time floor (60000).
 */
uint32_t lvd_get_id_min(void);

#endif /* _LVD_MAP_H_ */