File

util-src/windows.c @ 13273:a1c927323f06

mod_tokenauth: Delete grants without tokens after period Generally it is expected that a grant would have at least one token as long as the grant is in active use. Refresh tokens issued by mod_http_oauth2 have a lifetime of one week by default, so the idea here is that if that refresh token expired and another week goes by without the grant being used, then the whole grant can be removed.
author Kim Alvefur <zash@zash.se>
date Mon, 16 Oct 2023 23:51:52 +0200
parent 12575:1f6f05a98fcd
line wrap: on
line source

/* Prosody IM
-- Copyright (C) 2008-2010 Matthew Wild
-- Copyright (C) 2008-2010 Waqas Hussain
--
-- This project is MIT/X11 licensed. Please see the
-- COPYING file in the source package for more information.
--
*/

/*
* windows.c
* Windows support functions for Lua
*/

#include <stdio.h>
#include <windows.h>
#include <windns.h>

#include "lua.h"
#include "lauxlib.h"

#if (LUA_VERSION_NUM < 504)
#define luaL_pushfail lua_pushnil
#endif

static int Lget_nameservers(lua_State *L) {
	char stack_buffer[1024]; // stack allocated buffer
	IP4_ARRAY *ips = (IP4_ARRAY *) stack_buffer;
	DWORD len = sizeof(stack_buffer);
	DNS_STATUS status;

	status = DnsQueryConfig(DnsConfigDnsServerList, FALSE, NULL, NULL, ips, &len);

	if(status == 0) {
		DWORD i;
		lua_createtable(L, ips->AddrCount, 0);

		for(i = 0; i < ips->AddrCount; i++) {
			DWORD ip = ips->AddrArray[i];
			char ip_str[16] = "";
			sprintf_s(ip_str, sizeof(ip_str), "%d.%d.%d.%d", (ip >> 0) & 255, (ip >> 8) & 255, (ip >> 16) & 255, (ip >> 24) & 255);
			lua_pushstring(L, ip_str);
			lua_rawseti(L, -2, i + 1);
		}

		return 1;
	} else {
		luaL_pushfail(L);
		lua_pushfstring(L, "DnsQueryConfig returned %d", status);
		return 2;
	}
}

static int lerror(lua_State *L, char *string) {
	luaL_pushfail(L);
	lua_pushfstring(L, "%s: %d", string, GetLastError());
	return 2;
}

static int Lget_consolecolor(lua_State *L) {
	HWND console = GetStdHandle(STD_OUTPUT_HANDLE);
	WORD color;
	DWORD read_len;

	CONSOLE_SCREEN_BUFFER_INFO info;

	if(console == INVALID_HANDLE_VALUE) {
		return lerror(L, "GetStdHandle");
	}

	if(!GetConsoleScreenBufferInfo(console, &info)) {
		return lerror(L, "GetConsoleScreenBufferInfo");
	}

	if(!ReadConsoleOutputAttribute(console, &color, 1, info.dwCursorPosition, &read_len)) {
		return lerror(L, "ReadConsoleOutputAttribute");
	}

	lua_pushnumber(L, color);
	return 1;
}
static int Lset_consolecolor(lua_State *L) {
	int color = luaL_checkint(L, 1);
	HWND console = GetStdHandle(STD_OUTPUT_HANDLE);

	if(console == INVALID_HANDLE_VALUE) {
		return lerror(L, "GetStdHandle");
	}

	if(!SetConsoleTextAttribute(console, color)) {
		return lerror(L, "SetConsoleTextAttribute");
	}

	lua_pushboolean(L, 1);
	return 1;
}

static const luaL_Reg Reg[] = {
	{ "get_nameservers",	Lget_nameservers	},
	{ "get_consolecolor",	Lget_consolecolor	},
	{ "set_consolecolor",	Lset_consolecolor	},
	{ NULL,		NULL	}
};

LUALIB_API int luaopen_util_windows(lua_State *L) {
	luaL_checkversion(L);
	lua_newtable(L);
	luaL_setfuncs(L, Reg, 0);
	lua_pushliteral(L, "-3.14");
	lua_setfield(L, -2, "version");
	return 1;
}