#include #include "static.h" #define UNUSED(name) /* name __attribute__((unused)) */ #define p9_str(cstr) ((struct lib9p_s){ .len = strlen(cstr), .utf8 = cstr }) #define p9_nulstr ((struct lib9p_s){ .len = 0, .utf8 = NULL }) /******************************************************************************/ static struct lib9p_srv_file *static_dir_clone(struct lib9p_srv_ctx *ctx, struct lib9p_srv_file *_file) { assert(ctx); struct static_dir *file = (struct static_dir *)_file; assert(file); return &file->header; } static void static_dir_free(struct lib9p_srv_ctx *ctx, struct lib9p_srv_file *_file) { assert(ctx); struct static_dir *file = (struct static_dir *)_file; assert(file); /* do nothing */ } static struct lib9p_srv_io *static_dir_io(struct lib9p_srv_ctx *ctx, struct lib9p_srv_file *_file, lib9p_o_t UNUSED(flags)) { assert(ctx); struct static_dir *file = (struct static_dir *)_file; assert(file); lib9p_error(&ctx->basectx, LINUX_EFAULT, "TODO: io"); return NULL; } static struct lib9p_stat static_dir_stat(struct lib9p_srv_ctx *ctx, struct lib9p_srv_file *_file) { assert(ctx); struct static_dir *file = (struct static_dir *)_file; assert(file); return (struct lib9p_stat){ .kern_type = 0, .kern_dev = 0, .file_qid = { .type = LIB9P_QT_DIR, .vers = 1, .path = file->pathnum, }, .file_mode = LIB9P_DM_DIR | (file->perm & 0555), .file_atime = file->atime, .file_mtime = file->mtime, .file_size = 0, .file_name = p9_str(file->name), .file_owner_uid = p9_str(file->u_name), .file_owner_gid = p9_str(file->g_name), .file_last_modified_uid = p9_str(file->m_name), .file_extension = p9_nulstr, .file_owner_n_uid = file->u_num, .file_owner_n_gid = file->g_num, .file_last_modified_n_uid = file->m_num, }; } static void static_dir_wstat(struct lib9p_srv_ctx *ctx, struct lib9p_srv_file *_file, struct lib9p_stat UNUSED(new)) { assert(ctx); struct static_dir *file = (struct static_dir *)_file; assert(file); lib9p_error(&ctx->basectx, LINUX_EROFS, "read-only part of filesystem"); } static void static_dir_remove(struct lib9p_srv_ctx *ctx, struct lib9p_srv_file *_file) { assert(ctx); struct static_dir *file = (struct static_dir *)_file; assert(file); lib9p_error(&ctx->basectx, LINUX_EROFS, "read-only part of filesystem"); } static struct lib9p_srv_file *static_dir_dopen(struct lib9p_srv_ctx *ctx, struct lib9p_srv_file *_dir, char *UNUSED(childname)) { assert(ctx); struct static_dir *dir = (struct static_dir *)_dir; assert(dir); lib9p_error(&ctx->basectx, LINUX_EFAULT, "TODO: dopen"); return NULL; } static struct lib9p_srv_file *static_dir_dcreate(struct lib9p_srv_ctx *ctx, struct lib9p_srv_file *_dir, char *UNUSED(childname), lib9p_dm_t UNUSED(perm), lib9p_o_t UNUSED(flags)) { assert(ctx); struct static_dir *dir = (struct static_dir *)_dir; assert(dir); lib9p_error(&ctx->basectx, LINUX_EROFS, "read-only part of filesystem"); return NULL; } struct lib9p_srv_file_vtable static_dir_vtable = { .clone = static_dir_clone, .free = static_dir_free, .io = static_dir_io, .stat = static_dir_stat, .wstat = static_dir_wstat, .remove = static_dir_remove, .dopen = static_dir_dopen, .dcreate = static_dir_dcreate, }; /* struct lib9p_srv_io_dir_vtable static_dir_io_vtable = { .readdir = TODO, }; */