1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
/* lib9p/tests/test_server/fs_shutdown.c - /shutdown API endpoint
*
* Copyright (C) 2024-2025 Luke T. Shumaker <lukeshu@lukeshu.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#include "fs_shutdown.h"
LO_IMPLEMENTATION_C(lib9p_srv_file, struct shutdown_file, shutdown_file, static);
LO_IMPLEMENTATION_H(lib9p_srv_fio, struct shutdown_file, shutdown_file);
LO_IMPLEMENTATION_C(lib9p_srv_fio, struct shutdown_file, shutdown_file, 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,
.vers = 1,
.path = self->pathnum,
};
}
static struct lib9p_stat shutdown_file_stat(struct shutdown_file *self, struct lib9p_srv_ctx *ctx) {
assert(self);
assert(ctx);
return (struct lib9p_stat){
.kern_type = 0,
.kern_dev = 0,
.file_qid = shutdown_file_qid(self),
.file_mode = 0222,
.file_atime = UTIL9P_ATIME,
.file_mtime = UTIL9P_MTIME,
.file_size = 0,
.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 shutdown_file_wstat(struct shutdown_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 shutdown_file_remove(struct shutdown_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 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);
return lo_box_shutdown_file_as_lib9p_srv_fio(self);
}
/* srv_fio ********************************************************************/
static void shutdown_file_iofree(struct shutdown_file *self) {
assert(self);
}
static uint32_t shutdown_file_iounit(struct shutdown_file *self) {
assert(self);
return 0;
}
static uint32_t shutdown_file_pwrite(struct shutdown_file *self, struct lib9p_srv_ctx *ctx, void *buf, uint32_t byte_count, uint64_t LM_UNUSED(offset)) {
assert(self);
assert(ctx);
assert(buf);
if (byte_count == 0)
return 0;
for (size_t i = 0; i < self->nlisteners; i++)
LO_CALL(lo_box_hostnet_tcplist_as_net_stream_listener(&self->listeners[i]), close);
return byte_count;
}
static void shutdown_file_pread(struct shutdown_file *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");
}
|