#ifndef QEMU_9P_MARSHAL_H
#define QEMU_9P_MARSHAL_H

#include "p9array.h"

typedef struct V9fsString {
    uint16_t size;
    char *data;
} V9fsString;
P9ARRAY_DECLARE_TYPE(V9fsString);

typedef struct V9fsQID {
    uint8_t type;
    uint32_t version;
    uint64_t path;
} V9fsQID;

typedef struct V9fsStat {
    int16_t size;
    int16_t type;
    int32_t dev;
    V9fsQID qid;
    int32_t mode;
    int32_t atime;
    int32_t mtime;
    int64_t length;
    V9fsString name;
    V9fsString uid;
    V9fsString gid;
    V9fsString muid;
    /* 9p2000.u */
    V9fsString extension;
    int32_t n_uid;
    int32_t n_gid;
    int32_t n_muid;
} V9fsStat;

typedef struct V9fsIattr {
    int32_t valid;
    int32_t mode;
    int32_t uid;
    int32_t gid;
    int64_t size;
    int64_t atime_sec;
    int64_t atime_nsec;
    int64_t mtime_sec;
    int64_t mtime_nsec;
} V9fsIattr;

typedef struct V9fsStatDotl {
    uint64_t st_result_mask;
    V9fsQID qid;
    uint32_t st_mode;
    uint32_t st_uid;
    uint32_t st_gid;
    uint64_t st_nlink;
    uint64_t st_rdev;
    uint64_t st_size;
    uint64_t st_blksize;
    uint64_t st_blocks;
    uint64_t st_atime_sec;
    uint64_t st_atime_nsec;
    uint64_t st_mtime_sec;
    uint64_t st_mtime_nsec;
    uint64_t st_ctime_sec;
    uint64_t st_ctime_nsec;
    uint64_t st_btime_sec;
    uint64_t st_btime_nsec;
    uint64_t st_gen;
    uint64_t st_data_version;
} V9fsStatDotl;

static inline void v9fs_string_init(V9fsString *str)
{
    str->data = NULL;
    str->size = 0;
}
void v9fs_string_free(V9fsString *str);
void v9fs_string_sprintf(V9fsString *str, const char *fmt, ...);
void v9fs_string_copy(V9fsString *lhs, V9fsString *rhs);

#endif
