Path: blob/main/libexec/flua/libfreebsd/kenv/kenv.c
34876 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>1516int luaopen_freebsd_kenv(lua_State *L);1718static int19lua_kenv_get(lua_State *L)20{21const char *env;22int ret, n;23char value[1024];2425n = lua_gettop(L);26if (n == 0) {27char *buf, *bp, *cp;28int size;2930size = kenv(KENV_DUMP, NULL, NULL, 0);31if (size < 0) {32lua_pushnil(L);33lua_pushstring(L, strerror(errno));34lua_pushinteger(L, errno);35return (3);36}37size += 1;38buf = malloc(size);39if (buf == NULL) {40lua_pushnil(L);41lua_pushstring(L, strerror(errno));42lua_pushinteger(L, errno);43return (3);44}45if (kenv(KENV_DUMP, NULL, buf, size) < 0) {46free(buf);47lua_pushnil(L);48lua_pushstring(L, strerror(errno));49lua_pushinteger(L, errno);50return (3);51}5253lua_newtable(L);54for (bp = buf; *bp != '\0'; bp += strlen(bp) + 1) {55cp = strchr(bp, '=');56if (cp == NULL)57continue;58*cp++ = '\0';59lua_pushstring(L, cp);60lua_setfield(L, -2, bp);61bp = cp;62}63free(buf);64return (1);65}66env = luaL_checkstring(L, 1);67ret = kenv(KENV_GET, env, value, sizeof(value));68if (ret == -1) {69if (errno == ENOENT) {70lua_pushnil(L);71return (1);72}73lua_pushnil(L);74lua_pushstring(L, strerror(errno));75lua_pushinteger(L, errno);76return (3);77}78lua_pushstring(L, value);79return (1);80}8182#define REG_SIMPLE(n) { #n, lua_kenv_ ## n }83static const struct luaL_Reg freebsd_kenv[] = {84REG_SIMPLE(get),85{ NULL, NULL },86};87#undef REG_SIMPLE8889int90luaopen_freebsd_kenv(lua_State *L)91{92luaL_newlib(L, freebsd_kenv);9394return (1);95}969798