util.signal: Add support for signalfd(2) on Linux
signalfd allows handling signal events using the same method as sockets,
via file descriptors. Thus all signal dispatch can go through the same
main event loop as everything else, removing need for thread-scary
signal handling where execution would just jump to the signal handler
regardless of the state of Lua, and needing to keep track of Lua
states/threads.
-- Read an XML dataform and spit out a serialized Lua table of it
if not pcall(require, "prosody.loader") then
pcall(require, "loader");
end
local function from_stanza(stanza)
local layout = {
title = stanza:get_child_text("title");
instructions = stanza:get_child_text("instructions");
};
for tag in stanza:childtags("field") do
local field = {
name = tag.attr.var;
type = tag.attr.type;
label = tag.attr.label;
desc = tag:get_child_text("desc");
required = tag:get_child("required") and true or nil;
value = tag:get_child_text("value");
options = nil;
};
if field.type == "list-single" or field.type == "list-multi" then
local options = {};
for option in tag:childtags("option") do
options[#options+1] = { label = option.attr.label, value = option:get_child_text("value") };
end
field.options = options;
end
if field.type == "jid-multi" or field.type == "list-multi" or field.type == "text-multi" then
local values = {};
for value in tag:childtags("value") do
values[#values+1] = value:get_text();
end
if field.type == "text-multi" then
values = table.concat(values, "\n");
end
field.value = values;
end
if field.type == "boolean" then
field.value = field.value == "true" or field.value == "1";
end
layout[#layout+1] = field;
end
return layout;
end
print("dataforms.new " .. require"prosody.util.serialization".serialize(from_stanza(require"prosody.util.xml".parse(io.read("*a"))),
{ unquoted = true }))