/* lib9p/tests/test_server/fs_slowread.c - slowread API endpoint * * Copyright (C) 2024-2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include "fs_slowread.h" LO_IMPLEMENTATION_C(lib9p_srv_file, struct slowread_file, slowread_file, static); LO_IMPLEMENTATION_H(lib9p_srv_fio, struct slowread_file, slowread_file); LO_IMPLEMENTATION_C(lib9p_srv_fio, struct slowread_file, slowread_file, static); /* srv_file *******************************************************************/ static void slowread_file_free(struct slowread_file *self) { assert(self); } static struct lib9p_qid slowread_file_qid(struct slowread_file *self) { assert(self); return (struct lib9p_qid){ .type = LIB9P_QT_FILE, .vers = 1, .path = self->pathnum, }; } static struct lib9p_stat slowread_file_stat(struct slowread_file *self, struct lib9p_srv_ctx *ctx) { assert(self); assert(ctx); return (struct lib9p_stat){ .kern_type = 0, .kern_dev = 0, .file_qid = slowread_file_qid(self), .file_mode = 0444, .file_atime = UTIL9P_ATIME, .file_mtime = UTIL9P_MTIME, .file_size = 6, .file_name = lib9p_str(self->name), .file_owner_uid = lib9p_str("root"), .file_owner_gid = lib9p_str("root"), .file_last_modified_uid = lib9p_str("root"), .file_extension = lib9p_str(NULL), .file_owner_n_uid = 0, .file_owner_n_gid = 0, .file_last_modified_n_uid = 0, }; } static void slowread_file_wstat(struct slowread_file *self, struct lib9p_srv_ctx *ctx, struct lib9p_stat) { assert(self); assert(ctx); lib9p_error(&ctx->basectx, LINUX_EROFS, "cannot wstat API file"); } static void slowread_file_remove(struct slowread_file *self, struct lib9p_srv_ctx *ctx) { assert(self); assert(ctx); lib9p_error(&ctx->basectx, LINUX_EROFS, "cannot remove API file"); } LIB9P_SRV_NOTDIR(struct slowread_file, slowread_file) static lo_interface lib9p_srv_fio slowread_file_fopen(struct slowread_file *self, struct lib9p_srv_ctx *ctx, bool, bool, bool) { assert(self); assert(ctx); return lo_box_slowread_file_as_lib9p_srv_fio(self); } /* srv_fio ********************************************************************/ static void slowread_file_iofree(struct slowread_file *self) { assert(self); } static uint32_t slowread_file_iounit(struct slowread_file *self) { assert(self); return 0; } static uint32_t slowread_file_pwrite(struct slowread_file *LM_UNUSED(self), struct lib9p_srv_ctx *LM_UNUSED(ctx), void *LM_UNUSED(buf), uint32_t LM_UNUSED(byte_count), uint64_t LM_UNUSED(offset)) { assert_notreached("not writable"); } static void slowread_file_pread(struct slowread_file *self, struct lib9p_srv_ctx *ctx, uint32_t byte_count, uint64_t LM_UNUSED(byte_offset), struct iovec *ret) { assert(self); assert(ctx); assert(ret); while (!lib9p_srv_flush_requested(ctx)) cr_yield(); if (self->flushable) lib9p_srv_acknowledge_flush(ctx); else *ret = (struct iovec){ .iov_base = "Sloth\n", .iov_len = 6 < byte_count ? 6 : byte_count, }; }