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