/* lib9p/tests/test_server/fs_shutdown.c - /shutdown API endpoint * * Copyright (C) 2024-2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #include "fs_shutdown.h" LO_IMPLEMENTATION_C(lib9p_srv_file, struct shutdown_file, shutdown_file, static); struct shutdown_fio { struct shutdown_file *parent; }; LO_IMPLEMENTATION_H(lib9p_srv_fio, struct shutdown_fio, shutdown_fio); LO_IMPLEMENTATION_C(lib9p_srv_fio, struct shutdown_fio, shutdown_fio, static); /* srv_file *******************************************************************/ static void shutdown_file_free(struct shutdown_file *self) { assert(self); } static struct lib9p_qid shutdown_file_qid(struct shutdown_file *self) { assert(self); return (struct lib9p_qid){ .type = LIB9P_QT_FILE | LIB9P_QT_APPEND, .vers = 1, .path = self->pathnum, }; } static struct lib9p_srv_stat shutdown_file_stat(struct shutdown_file *self, struct lib9p_srv_ctx *ctx) { assert(self); assert(ctx); return (struct lib9p_srv_stat){ .qid = shutdown_file_qid(self), .mode = 0222 | LIB9P_DM_APPEND, .atime_sec = UTIL9P_ATIME, .mtime_sec = UTIL9P_MTIME, .size = 0, .name = lib9p_str(self->name), .owner_uid = { .name=lib9p_str("root"), .num=0 }, .owner_gid = { .name=lib9p_str("root"), .num=0 }, .last_modifier_uid = { .name=lib9p_str("root"), .num=0 }, .extension = lib9p_str(NULL), }; } static void shutdown_file_wstat(struct shutdown_file *self, struct lib9p_srv_ctx *ctx, struct lib9p_srv_stat) { assert(self); assert(ctx); lib9p_error(&ctx->basectx, LIB9P_ERRNO_L_EROFS, "cannot wstat API file"); } static void shutdown_file_remove(struct shutdown_file *self, struct lib9p_srv_ctx *ctx) { assert(self); assert(ctx); lib9p_error(&ctx->basectx, LIB9P_ERRNO_L_EROFS, "cannot remove API file"); } LIB9P_SRV_NOTDIR(struct shutdown_file, shutdown_file) static lo_interface lib9p_srv_fio shutdown_file_fopen(struct shutdown_file *self, struct lib9p_srv_ctx *ctx, bool, bool, bool) { assert(self); assert(ctx); struct shutdown_fio *ret = heap_alloc(1, struct shutdown_fio); ret->parent = self; return lo_box_shutdown_fio_as_lib9p_srv_fio(ret); } /* srv_fio ********************************************************************/ static void shutdown_fio_iofree(struct shutdown_fio *self) { assert(self); free(self); } static struct lib9p_qid shutdown_fio_qid(struct shutdown_fio *self) { assert(self); return shutdown_file_qid(self->parent); } static uint32_t shutdown_fio_iounit(struct shutdown_fio *self) { assert(self); return 0; } static uint32_t shutdown_fio_pwrite(struct shutdown_fio *self, struct lib9p_srv_ctx *ctx, void *buf, uint32_t byte_count, uint64_t offset) { assert(self); assert(ctx); assert(buf); assert(offset == 0); if (byte_count == 0) return 0; for (size_t i = 0; i < self->parent->nlisteners; i++) LO_CALL(lo_box_hostnet_tcplist_as_net_stream_listener(&self->parent->listeners[i]), close); return byte_count; } static void shutdown_fio_pread(struct shutdown_fio *LM_UNUSED(self), struct lib9p_srv_ctx *LM_UNUSED(ctx), uint32_t LM_UNUSED(byte_count), uint64_t LM_UNUSED(byte_offset), struct iovec *LM_UNUSED(ret)) { assert_notreached("not readable"); }