Path: blob/main/libexec/flua/libfreebsd/kenv/kenv.c
105663 views
/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2024, Baptiste Daroussin <[email protected]>4*/56#include <errno.h>7#include <kenv.h>8#include <stdio.h>9#include <stdlib.h>10#include <string.h>1112#include <lua.h>13#include <lualib.h>14#include <lauxlib.h>1516#include "bootstrap.h"1718int luaopen_freebsd_kenv(lua_State *L);1920static int21lua_kenv_get(lua_State *L)22{23const char *env;24int ret, n;25char value[1024];2627n = lua_gettop(L);28if (n == 0) {29char *buf, *bp, *cp;30int size;3132size = kenv(KENV_DUMP, NULL, NULL, 0);33if (size < 0) {34lua_pushnil(L);35lua_pushstring(L, strerror(errno));36lua_pushinteger(L, errno);37return (3);38}39size += 1;40buf = malloc(size);41if (buf == NULL) {42lua_pushnil(L);43lua_pushstring(L, strerror(errno));44lua_pushinteger(L, errno);45return (3);46}47if (kenv(KENV_DUMP, NULL, buf, size) < 0) {48free(buf);49lua_pushnil(L);50lua_pushstring(L, strerror(errno));51lua_pushinteger(L, errno);52return (3);53}5455lua_newtable(L);56for (bp = buf; *bp != '\0'; bp += strlen(bp) + 1) {57cp = strchr(bp, '=');58if (cp == NULL)59continue;60*cp++ = '\0';61lua_pushstring(L, cp);62lua_setfield(L, -2, bp);63bp = cp;64}65free(buf);66return (1);67}68env = luaL_checkstring(L, 1);69ret = kenv(KENV_GET, env, value, sizeof(value));70if (ret == -1) {71if (errno == ENOENT) {72lua_pushnil(L);73return (1);74}75lua_pushnil(L);76lua_pushstring(L, strerror(errno));77lua_pushinteger(L, errno);78return (3);79}80lua_pushstring(L, value);81return (1);82}8384#define REG_SIMPLE(n) { #n, lua_kenv_ ## n }85static const struct luaL_Reg freebsd_kenv[] = {86REG_SIMPLE(get),87{ NULL, NULL },88};89#undef REG_SIMPLE9091int92luaopen_freebsd_kenv(lua_State *L)93{94luaL_newlib(L, freebsd_kenv);9596return (1);97}9899FLUA_MODULE_NAMED(freebsd_kenv, "freebsd.kenv");100101102