xref: /netbsd-src/sys/modules/luasystm/luasystm.c (revision a7992fb1dea34f346ad155b8a11f2e1b2e82c745)
1*a7992fb1Sgutteridge /*	$NetBSD: luasystm.c,v 1.6 2022/08/11 23:53:04 gutteridge Exp $ */
2ae5a3d71Slneto 
3ae5a3d71Slneto /*
4ae5a3d71Slneto  * Copyright (c) 2011, 2013 Marc Balmer <mbalmer@NetBSD.org>.
5ae5a3d71Slneto  * All rights reserved.
6ae5a3d71Slneto  *
7ae5a3d71Slneto  * Redistribution and use in source and binary forms, with or without
8ae5a3d71Slneto  * modification, are permitted provided that the following conditions
9ae5a3d71Slneto  * are met:
10ae5a3d71Slneto  * 1. Redistributions of source code must retain the above copyright
11ae5a3d71Slneto  *    notice, this list of conditions and the following disclaimer.
12ae5a3d71Slneto  * 2. Redistributions in binary form must reproduce the above copyright
13ae5a3d71Slneto  *    notice, this list of conditions and the following disclaimer in the
14ae5a3d71Slneto  *    documentation and/or other materials provided with the distribution.
15ae5a3d71Slneto  * 3. The name of the Author may not be used to endorse or promote products
16ae5a3d71Slneto  *    derived from this software without specific prior written permission.
17ae5a3d71Slneto  *
18ae5a3d71Slneto  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19ae5a3d71Slneto  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20ae5a3d71Slneto  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21ae5a3d71Slneto  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22ae5a3d71Slneto  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23ae5a3d71Slneto  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24ae5a3d71Slneto  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25ae5a3d71Slneto  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26ae5a3d71Slneto  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27ae5a3d71Slneto  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28ae5a3d71Slneto  * SUCH DAMAGE.
29ae5a3d71Slneto  */
30ae5a3d71Slneto 
31ae5a3d71Slneto /* Lua systm module */
32ae5a3d71Slneto 
33ae5a3d71Slneto #include <sys/param.h>
34ae5a3d71Slneto #include <sys/lua.h>
35ae5a3d71Slneto #include <sys/callout.h>
36fc1afab1Schristos #include <sys/cpu.h>
37ae5a3d71Slneto #ifdef _MODULE
38ae5a3d71Slneto #include <sys/module.h>
39ae5a3d71Slneto #endif
40ae5a3d71Slneto #include <sys/systm.h>
41ae5a3d71Slneto 
42ae5a3d71Slneto #include <lua.h>
43ae5a3d71Slneto #include <lauxlib.h>
44ae5a3d71Slneto 
45ae5a3d71Slneto #ifdef _MODULE
46ae5a3d71Slneto MODULE(MODULE_CLASS_MISC, luasystm, "lua");
47ae5a3d71Slneto 
48ae5a3d71Slneto /* Various printing functions */
49ae5a3d71Slneto static int
print(lua_State * L)50ae5a3d71Slneto print(lua_State *L)
51ae5a3d71Slneto {
52ae5a3d71Slneto 	const char *s;
53ae5a3d71Slneto 
54ae5a3d71Slneto 	s = lua_tostring(L, -1);
55ae5a3d71Slneto 	if (s)
56ae5a3d71Slneto 		printf("%s", s);
57ae5a3d71Slneto 	return 0;
58ae5a3d71Slneto }
59ae5a3d71Slneto 
60ae5a3d71Slneto static int
print_nolog(lua_State * L)61ae5a3d71Slneto print_nolog(lua_State *L)
62ae5a3d71Slneto {
63ae5a3d71Slneto 	const char *s;
64ae5a3d71Slneto 
65ae5a3d71Slneto 	s = lua_tostring(L, -1);
66ae5a3d71Slneto 	if (s)
67ae5a3d71Slneto 		printf_nolog("%s", s);
68ae5a3d71Slneto 	return 0;
69ae5a3d71Slneto }
70ae5a3d71Slneto 
71ae5a3d71Slneto static int
uprint(lua_State * L)72ae5a3d71Slneto uprint(lua_State *L)
73ae5a3d71Slneto {
74ae5a3d71Slneto 	const char *s;
75ae5a3d71Slneto 
76ae5a3d71Slneto 	s = lua_tostring(L, -1);
77ae5a3d71Slneto 	if (s)
78ae5a3d71Slneto 		uprintf("%s", s);
79ae5a3d71Slneto 	return 0;
80ae5a3d71Slneto }
81ae5a3d71Slneto 
82ae5a3d71Slneto static int
systm_aprint_normal(lua_State * L)83ae5a3d71Slneto systm_aprint_normal(lua_State *L)
84ae5a3d71Slneto {
85ae5a3d71Slneto 	const char *s;
86ae5a3d71Slneto 
87ae5a3d71Slneto 	s = lua_tostring(L, -1);
88ae5a3d71Slneto 	if (s)
89ae5a3d71Slneto 		aprint_normal("%s", s);
90ae5a3d71Slneto 	return 0;
91ae5a3d71Slneto }
92ae5a3d71Slneto 
93ae5a3d71Slneto static int
systm_aprint_naive(lua_State * L)94ae5a3d71Slneto systm_aprint_naive(lua_State *L)
95ae5a3d71Slneto {
96ae5a3d71Slneto 	const char *s;
97ae5a3d71Slneto 
98ae5a3d71Slneto 	s = lua_tostring(L, -1);
99ae5a3d71Slneto 	if (s)
100ae5a3d71Slneto 		aprint_naive("%s", s);
101ae5a3d71Slneto 	return 0;
102ae5a3d71Slneto }
103ae5a3d71Slneto 
104ae5a3d71Slneto static int
systm_aprint_verbose(lua_State * L)105ae5a3d71Slneto systm_aprint_verbose(lua_State *L)
106ae5a3d71Slneto {
107ae5a3d71Slneto 	const char *s;
108ae5a3d71Slneto 
109ae5a3d71Slneto 	s = lua_tostring(L, -1);
110ae5a3d71Slneto 	if (s)
111ae5a3d71Slneto 		aprint_verbose("%s", s);
112ae5a3d71Slneto 	return 0;
113ae5a3d71Slneto }
114ae5a3d71Slneto 
115ae5a3d71Slneto static int
systm_aprint_debug(lua_State * L)116ae5a3d71Slneto systm_aprint_debug(lua_State *L)
117ae5a3d71Slneto {
118ae5a3d71Slneto 	const char *s;
119ae5a3d71Slneto 
120ae5a3d71Slneto 	s = lua_tostring(L, -1);
121ae5a3d71Slneto 	if (s)
122ae5a3d71Slneto 		aprint_debug("%s", s);
123ae5a3d71Slneto 	return 0;
124ae5a3d71Slneto }
125ae5a3d71Slneto 
126ae5a3d71Slneto static int
systm_aprint_error(lua_State * L)127ae5a3d71Slneto systm_aprint_error(lua_State *L)
128ae5a3d71Slneto {
129ae5a3d71Slneto 	const char *s;
130ae5a3d71Slneto 
131ae5a3d71Slneto 	s = lua_tostring(L, -1);
132ae5a3d71Slneto 	if (s)
133ae5a3d71Slneto 		aprint_error("%s", s);
134ae5a3d71Slneto 	return 0;
135ae5a3d71Slneto }
136ae5a3d71Slneto 
137ae5a3d71Slneto static int
systm_aprint_get_error_count(lua_State * L)138ae5a3d71Slneto systm_aprint_get_error_count(lua_State *L)
139ae5a3d71Slneto {
140ae5a3d71Slneto 	lua_pushinteger(L, aprint_get_error_count());
141ae5a3d71Slneto 	return 1;
142ae5a3d71Slneto }
143ae5a3d71Slneto 
144*a7992fb1Sgutteridge /* panicking */
145ae5a3d71Slneto 
146ae5a3d71Slneto static int
systm_panic(lua_State * L)147ae5a3d71Slneto systm_panic(lua_State *L)
148ae5a3d71Slneto {
149ae5a3d71Slneto 	const char *s;
150ae5a3d71Slneto 
151ae5a3d71Slneto 	s = lua_tostring(L, -1);
152ae5a3d71Slneto 	if (s)
153ae5a3d71Slneto 		panic("%s", s);
154ae5a3d71Slneto 	return 0;
155ae5a3d71Slneto }
156ae5a3d71Slneto 
157ae5a3d71Slneto /* callouts */
158ae5a3d71Slneto 
159ae5a3d71Slneto /* mutexes */
160ae5a3d71Slneto 
161ae5a3d71Slneto static int
luaopen_systm(lua_State * L)162094cf69fSlneto luaopen_systm(lua_State *L)
163ae5a3d71Slneto {
164ae5a3d71Slneto 	const luaL_Reg systm_lib[ ] = {
165ae5a3d71Slneto 		{ "print",			print },
166ae5a3d71Slneto 		{ "print_nolog",		print_nolog },
167ae5a3d71Slneto 		{ "uprint",			uprint },
168ae5a3d71Slneto 		{ "aprint_normal",		systm_aprint_normal },
169ae5a3d71Slneto 		{ "aprint_naive",		systm_aprint_naive },
170ae5a3d71Slneto 		{ "aprint_verbose",		systm_aprint_verbose },
171ae5a3d71Slneto 		{ "aprint_debug",		systm_aprint_debug },
172ae5a3d71Slneto 		{ "aprint_error",		systm_aprint_error },
173ae5a3d71Slneto 		{ "aprint_get_error_count",	systm_aprint_get_error_count },
174ae5a3d71Slneto 
175*a7992fb1Sgutteridge 		/* panicking */
176ae5a3d71Slneto 		{ "panic",			systm_panic },
177ae5a3d71Slneto 
178ae5a3d71Slneto 		/* callouts */
179ae5a3d71Slneto 
180ae5a3d71Slneto 		/* mutexes */
181ae5a3d71Slneto 
182ae5a3d71Slneto 		{NULL, NULL}
183ae5a3d71Slneto 	};
184ae5a3d71Slneto 
1854ab4902eSlneto 	luaL_newlib(L, systm_lib);
186ae5a3d71Slneto 
187ae5a3d71Slneto 	/* some string values */
188ae5a3d71Slneto 	lua_pushstring(L, copyright);
189ae5a3d71Slneto 	lua_setfield(L, -2, "copyright");
190fc1afab1Schristos 	lua_pushstring(L, cpu_getmodel());
191ae5a3d71Slneto 	lua_setfield(L, -2, "cpu_model");
192ae5a3d71Slneto 	lua_pushstring(L, machine);
193ae5a3d71Slneto 	lua_setfield(L, -2, "machine");
194ae5a3d71Slneto 	lua_pushstring(L, machine_arch);
195ae5a3d71Slneto 	lua_setfield(L, -2, "machine_arch");
196ae5a3d71Slneto 	lua_pushstring(L, osrelease);
197ae5a3d71Slneto 	lua_setfield(L, -2, "osrelease");
198ae5a3d71Slneto 	lua_pushstring(L, ostype);
199ae5a3d71Slneto 	lua_setfield(L, -2, "ostype");
200ae5a3d71Slneto 	lua_pushstring(L, kernel_ident);
201ae5a3d71Slneto 	lua_setfield(L, -2, "kernel_ident");
202ae5a3d71Slneto 	lua_pushstring(L, version);
203ae5a3d71Slneto 	lua_setfield(L, -2, "version");
204ae5a3d71Slneto 
205ae5a3d71Slneto 	/* some integer values */
206ae5a3d71Slneto 	lua_pushinteger(L, ncpu);
207ae5a3d71Slneto 	lua_setfield(L, -2, "ncpu");
208ae5a3d71Slneto 
209ae5a3d71Slneto 	return 1;
210ae5a3d71Slneto }
211ae5a3d71Slneto 
212ae5a3d71Slneto static int
luasystm_modcmd(modcmd_t cmd,void * opaque)213ae5a3d71Slneto luasystm_modcmd(modcmd_t cmd, void *opaque)
214ae5a3d71Slneto {
215ae5a3d71Slneto 	int error;
216ae5a3d71Slneto 
217ae5a3d71Slneto 	switch (cmd) {
218ae5a3d71Slneto 	case MODULE_CMD_INIT:
2194e28dab9Slneto 		error = klua_mod_register("systm", luaopen_systm);
220ae5a3d71Slneto 		break;
221ae5a3d71Slneto 	case MODULE_CMD_FINI:
2224e28dab9Slneto 		error = klua_mod_unregister("systm");
223ae5a3d71Slneto 		break;
224ae5a3d71Slneto 	default:
225ae5a3d71Slneto 		error = ENOTTY;
226ae5a3d71Slneto 	}
227ae5a3d71Slneto 	return error;
228ae5a3d71Slneto }
229ae5a3d71Slneto #endif
230