summaryrefslogtreecommitdiff
path: root/lib9p/tests/test_server/fs_slowread.c
blob: 520edd27a0ad46d77d3984f83dfa0a132d7b3c8c (plain)
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
94
95
96
97
98
99
100
101
/* lib9p/tests/test_server/fs_slowread.c - slowread API endpoint
 *
 * Copyright (C) 2024-2025  Luke T. Shumaker <lukeshu@lukeshu.com>
 * 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,
		};
}