17
#include "acpi-watch.h"
18
#include "acpi-queue.h"
20
#include <acpid/driver.h>
22
static DBusConnection *conn;
24
static void dispatch(lua_State *L)
26
struct acpi_channel_descriptor cds[12];
27
unsigned long num = 0;
30
while (lua_next(L, LUA_REGISTRYINDEX) != 0) {
31
struct acpi_channel *channel = lua_touserdata(L, -2);
32
num += (*channel->ops->setup)(channel, cds + num, 12 - num);
41
struct pollfd fds[num];
42
for (unsigned long i = 0; i < num; ++i) {
43
fds[i].fd = cds[i].fd;
44
fds[i].events = cds[i].events;
47
int ret = poll(fds, num, -1);
49
for (unsigned long i = 0; i < num; ++i) {
51
int ret = (*cds[i].channel->ops->handle)(cds[i].channel, L, fds[i].fd, fds[i].revents);
56
int acpi_dbus_event(const char *hid, unsigned long event, unsigned long data)
58
DBusMessage *msg = dbus_message_new_signal("/org/kernel/acpi", "org.kernel.acpi.Event", "Broadcast");
62
if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &hid, DBUS_TYPE_UINT32, &event, DBUS_TYPE_UINT32, &data, DBUS_TYPE_INVALID))
65
dbus_uint32_t serial = 0;
66
if (!dbus_connection_send(conn, msg, &serial))
69
dbus_connection_flush(conn);
70
dbus_message_unref(msg);
75
int main(int argc, char *argv[])
78
dbus_error_init(&err);
80
openlog("acpid-ng", 0, LOG_DAEMON);
81
syslog(LOG_INFO, "starting\n");
83
lua_State *L = luaL_newstate();
84
luaL_dofile(L, "config.lua");
86
lua_getfield(L, LUA_GLOBALSINDEX, "channels");
89
while (lua_next(L, -2) != 0) {
90
if (acpi_channel_create(L) == 0) {
92
lua_settable(L, LUA_REGISTRYINDEX);
94
fprintf(stderr, "failed to create channel\n");
101
/* Remove the channel table */
103
lua_setfield(L, LUA_GLOBALSINDEX, "channels");
105
lua_createtable(L, 99, 0);
106
lua_setfield(L, LUA_GLOBALSINDEX, "script");
107
luaL_dofile(L, "scripts.lua");
109
syslog(LOG_INFO, "loaded channels and scripts\n");
111
/* At this point the lua stack should be empty! */
112
assert(lua_gettop(L) == 0);
114
conn = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
116
fprintf(stderr, "Connection Error (%s)\n", err.message);
117
dbus_error_free(&err);
121
int ret = dbus_bus_request_name(conn, "org.kernel.acpi", DBUS_NAME_FLAG_REPLACE_EXISTING, &err);
122
if (dbus_error_is_set(&err)) {
123
fprintf(stderr, "Name Error (%s)\n", err.message);
124
dbus_error_free(&err);
132
struct acpi_queue queue = { 0 };
134
for (int i = 0; i < queue.num; ++i) {
135
printf("got an event from %s: %08x %08x %08x\n", queue.events[i].source, queue.events[i].type, queue.events[i].code, queue.events[i].value);
137
DBusMessage *msg = dbus_message_new_signal("/org/kernel/acpi", "org.kernel.acpi.Event", "Broadcast");
141
const char *source = queue.events[i].source;
142
if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &source, DBUS_TYPE_UINT32, &queue.events[i].type,
143
DBUS_TYPE_UINT32, &queue.events[i].code, DBUS_TYPE_UINT32, &queue.events[i].value, DBUS_TYPE_INVALID))
146
dbus_uint32_t serial = 0;
147
if (!dbus_connection_send(conn, msg, &serial))
150
dbus_connection_flush(conn);
151
dbus_message_unref(msg);