init with uname
This commit is contained in:
commit
818a9f4254
4 changed files with 113 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*.so
|
15
Makefile
Normal file
15
Makefile
Normal file
|
@ -0,0 +1,15 @@
|
|||
cc = gcc
|
||||
CFLAGS := $(CFLAGS) -Wall -Wextra -D_GNU_SOURCE
|
||||
|
||||
LIBFLAGS = $(pkg-config --libs --cflags lua)
|
||||
|
||||
objs = uname.so
|
||||
|
||||
all : $(objs)
|
||||
|
||||
%.so : %.c %.h
|
||||
$(cc) -o $@ $(CFLAGS) $(LIBFLAGS) -fPIC -shared $<
|
||||
|
||||
.PHONY : clean
|
||||
clean :
|
||||
-rm $(objs)
|
81
uname.c
Normal file
81
uname.c
Normal file
|
@ -0,0 +1,81 @@
|
|||
#define _GNU_SOURCE 1
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include "uname.h"
|
||||
#include <lauxlib.h>
|
||||
#include <lua.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#define ERRBUF_SIZE 1024
|
||||
|
||||
static int l_numid(lua_State *L) {
|
||||
lua_Number x = luaL_checknumber(L, 1);
|
||||
printf("%f\n", x);
|
||||
|
||||
lua_pushnumber(L, x);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add one
|
||||
*/
|
||||
long long plus_one(int x) {
|
||||
return x + 1;
|
||||
}
|
||||
|
||||
static int l_plus_one(lua_State *L) {
|
||||
// argument number check is not conventional in lua?
|
||||
int argc = lua_gettop(L);
|
||||
if (argc != 1)
|
||||
return luaL_error(L, "Invalid number of argument");
|
||||
|
||||
// Type check and get
|
||||
lua_Integer x = luaL_checkinteger(L, 1);
|
||||
|
||||
lua_Integer result = plus_one(x);
|
||||
|
||||
// Push the result
|
||||
lua_pushinteger(L, result);
|
||||
// How many elements from the top is return value
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int l_uname(lua_State *L) {
|
||||
struct utsname name;
|
||||
if (uname(&name)) {
|
||||
char errbuf[ERRBUF_SIZE];
|
||||
if (strerror_r(errno, errbuf, ERRBUF_SIZE))
|
||||
perror("Error while making error msg");
|
||||
return luaL_error(L, errbuf);
|
||||
}
|
||||
lua_newtable(L);
|
||||
lua_pushstring(L, "sysname");
|
||||
lua_pushstring(L, name.sysname);
|
||||
lua_settable(L, -3);
|
||||
lua_pushstring(L, "machine");
|
||||
lua_pushstring(L, name.machine);
|
||||
lua_settable(L, -3);
|
||||
lua_pushstring(L, "release");
|
||||
lua_pushstring(L, name.release);
|
||||
lua_settable(L, -3);
|
||||
lua_pushstring(L, "version");
|
||||
lua_pushstring(L, name.version);
|
||||
lua_settable(L, -3);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const struct luaL_Reg llib_uname [] = {
|
||||
{"uname", l_uname},
|
||||
{"numid", l_numid},
|
||||
{"plusone", l_plus_one},
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
// for `require`
|
||||
int luaopen_uname(lua_State *L) {
|
||||
luaL_newlib(L, llib_uname);
|
||||
return 1;
|
||||
}
|
16
uname.h
Normal file
16
uname.h
Normal file
|
@ -0,0 +1,16 @@
|
|||
#ifndef L_UNAME_H
|
||||
#define L_UNAME_H
|
||||
#include <sys/utsname.h>
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
long long plus_one(int x);
|
||||
|
||||
static int l_numid(lua_State *L);
|
||||
static int l_plus_one(lua_State *L);
|
||||
static int l_uname(lua_State *L);
|
||||
|
||||
int luaopen_uname(lua_State *L);
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue