/*
 * Copyright (C) 2015-2017 Alibaba Group Holding Limited
 */

#ifndef RAMFS_TYPES_H
#define RAMFS_TYPES_H

#include <stdint.h>
#include <unistd.h>

#define RAMFS_MAGIC  0x890910
#define RAMFS_LETTER 'U'

#define RAMFS_PATH_MAX       128
#define RAMFS_NAME_MAX       RAMFS_PATH_MAX
#define RAMFS_LINK_MAX       1024
#define RAMFS_ALLOC_SIZE_MIN 1

/* Description of a link name */
typedef struct link_name_s
{
    char  *name;
    struct link_name_s *next;
} link_name_t;

/* Description of a file entry */
typedef struct {
    char     *fn;
    void     *data;
    uint32_t  size;       /* Data length in bytes */
    uint16_t  refs;       /* Open count */
    uint8_t   const_data : 1;
    uint8_t   is_dir : 1;
    uint8_t   ar : 1;     /* 1: Access for read is enabled */
    uint8_t   aw : 1;     /* 1: Access for write is enabled */

    link_name_t *link;
    uint16_t     link_count;
} ramfs_entry_t;

/* Description of a file */
typedef struct {
    ramfs_entry_t *entry; /* Pointer to the file entry */
    uint32_t       rwp; /* Read write pointer */
} ramfs_file_t;

/* Description of a directory */
typedef struct {
    char          *dir_name;
    ramfs_entry_t *last_entry;
} ramfs_dir_t;

typedef uint8_t ramfs_ll_node_t;

/* Description of a linked list */
typedef struct {
    uint32_t         size;
    ramfs_ll_node_t *head;
    ramfs_ll_node_t *tail;
} ramfs_ll_t;

#endif /* RAMFS_TYPES_H */