xref: /freebsd/libexec/flua/libfreebsd/sys/linker/linker.c (revision fa4b5aa51f1b3971e92f831b8e67e83aaed3c212)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2024, Baptiste Daroussin <bapt@FreeBSD.org>
5  */
6 
7 #include <sys/param.h>
8 #include <sys/linker.h>
9 
10 #include <errno.h>
11 #include <stdio.h>
12 #include <string.h>
13 
14 #include <lua.h>
15 #include <lualib.h>
16 #include <lauxlib.h>
17 
18 int luaopen_freebsd_sys_linker(lua_State *L);
19 
20 static int
lua_kldload(lua_State * L)21 lua_kldload(lua_State *L)
22 {
23 	const char *name;
24 	int ret;
25 
26 	name = luaL_checkstring(L, 1);
27 	ret = kldload(name);
28 	if (ret == -1) {
29 		lua_pushnil(L);
30 		lua_pushstring(L, strerror(errno));
31 		lua_pushinteger(L, errno);
32 		return (3);
33 	}
34 	lua_pushinteger(L, ret);
35 	return (1);
36 }
37 
38 static int
lua_kldunload(lua_State * L)39 lua_kldunload(lua_State *L)
40 {
41 	const char *name;
42 	int ret, fileid;
43 
44 	if (lua_isinteger(L, 1)) {
45 		fileid = lua_tointeger(L, 1);
46 	} else {
47 		name = luaL_checkstring(L, 1);
48 		fileid = kldfind(name);
49 	}
50 	if (fileid == -1) {
51 		lua_pushnil(L);
52 		lua_pushstring(L, strerror(errno));
53 		lua_pushinteger(L, errno);
54 		return (3);
55 	}
56 	ret = kldunload(fileid);
57 	lua_pushinteger(L, ret);
58 	if (ret == -1) {
59 		lua_pushnil(L);
60 		lua_pushstring(L, strerror(errno));
61 		lua_pushinteger(L, errno);
62 		return (3);
63 	}
64 	lua_pushinteger(L, 0);
65 	return (1);
66 }
67 
68 #define REG_SIMPLE(n)	{ #n, lua_ ## n }
69 static const struct luaL_Reg freebsd_sys_linker[] = {
70 	REG_SIMPLE(kldload),
71 	REG_SIMPLE(kldunload),
72 	{ NULL, NULL },
73 };
74 #undef REG_SIMPLE
75 
76 int
luaopen_freebsd_sys_linker(lua_State * L)77 luaopen_freebsd_sys_linker(lua_State *L)
78 {
79 	luaL_newlib(L, freebsd_sys_linker);
80 
81 	return (1);
82 }
83