ohmu
·
2026-10-15
1#include "common/printing.h"
2#include "common/jsonconfig.h"
3#include "common/size.h"
4#include "common/strutil.h"
5#include "modules/kernel/kernel.h"
6
7bool ffPrintKernel(FFKernelOptions* options) {
8 const FFPlatformSysinfo* info = &instance.state.platform.sysinfo;
9 if (options->moduleArgs.outputFormat.length == 0) {
10 ffPrintLogoAndKey(FF_MODULE_GET_DISPLAY_NAME(Kernel), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT);
11 printf("%s %s\n", info->name.chars, info->release.chars);
12 } else {
13 FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate();
14 ffSizeAppendNum((uint64_t) 1 << info->pageSizeShift, &str);
15 FF_PRINT_FORMAT_CHECKED(FF_MODULE_GET_DISPLAY_NAME(Kernel), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, ((FFformatarg[]) {
16 FF_ARG(info->name, "sysname"),
17 FF_ARG(info->release, "release"),
18 FF_ARG(info->version, "version"),
19 FF_ARG(info->architecture, "arch"),
20 FF_ARG(str, "page-size"),
21 }));
22 }
23
24 return true;
25}
26
27void ffParseKernelJsonObject(FFKernelOptions* options, yyjson_val* module) {
28 yyjson_val *key, *val;
29 size_t idx, max;
30 yyjson_obj_foreach (module, idx, max, key, val) {
31 if (ffJsonConfigParseModuleArgs(key, val, &options->moduleArgs)) {
32 continue;
33 }
34
35 ffPrintError(FF_MODULE_GET_DISPLAY_NAME(Kernel), 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", unsafe_yyjson_get_str(key));
36 }
37}
38
39[[gnu::cold]]
40void ffGenerateKernelJsonConfig(FFKernelOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
41 ffJsonConfigGenerateModuleArgsConfig(doc, module, &options->moduleArgs);
42}
43
44bool ffGenerateKernelJsonResult([[maybe_unused]] FFKernelOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) {
45 const FFPlatformSysinfo* info = &instance.state.platform.sysinfo;
46
47 yyjson_mut_val* obj = yyjson_mut_obj_add_obj(doc, module, "result");
48 yyjson_mut_obj_add_strbuf(doc, obj, "architecture", &info->architecture);
49 yyjson_mut_obj_add_strbuf(doc, obj, "name", &info->name);
50 yyjson_mut_obj_add_strbuf(doc, obj, "release", &info->release);
51 yyjson_mut_obj_add_strbuf(doc, obj, "version", &info->version);
52 yyjson_mut_obj_add_uint(doc, obj, "pageSize", (uint64_t) 1 << info->pageSizeShift);
53
54 return true;
55}
56
57void ffInitKernelOptions(FFKernelOptions* options) {
58 ffOptionInitModuleArg(&options->moduleArgs, "");
59}
60
61void ffDestroyKernelOptions(FFKernelOptions* options) {
62 ffOptionDestroyModuleArg(&options->moduleArgs);
63}
64
65FFModuleBaseInfo ffKernelModuleInfo = {
66 .name = "Kernel",
67 .description = "Print system kernel version",
68 .displayName = {
69 .en = "Kernel",
70 .ar = "النواة",
71 .cs = "Jádro",
72 .de = "Kernel",
73 .es = "Kernel",
74 .fi = "Ydin",
75 .fr = "Kernel",
76 .gl = "Kernel",
77 .he = "ליבה",
78 .id = "Kernel",
79 .it = "Kernel",
80 .ja = "カーネル",
81 .ko = "커널",
82 .pl = "Jądro",
83 .pt = "Kernel",
84 .ru = "Ядро",
85 .tr = "Çekirdek",
86 .uk = "Ядро",
87 .vi = "Nhân",
88 .zh_CN = "内核",
89 .zh_TW = "核心",
90 },
91 .initOptions = (void*) ffInitKernelOptions,
92 .destroyOptions = (void*) ffDestroyKernelOptions,
93 .parseJsonObject = (void*) ffParseKernelJsonObject,
94 .printModule = (void*) ffPrintKernel,
95 .generateJsonResult = (void*) ffGenerateKernelJsonResult,
96 .generateJsonConfig = (void*) ffGenerateKernelJsonConfig,
97 .formatArgs = FF_FORMAT_ARG_LIST(((FFModuleFormatArg[]) {
98 { "Sysname", "sysname" },
99 { "Release", "release" },
100 { "Version", "version" },
101 { "Architecture", "arch" },
102 { "Page size", "page-size" },
103 })),
104 .defaultOrder = 9,
105};