commit 917bbfd: [Minor] Rspamadm: Allow `-` as filename to read from stdin
Vsevolod Stakhov
vsevolod at highsecure.ru
Thu Jan 24 14:56:05 UTC 2019
Author: Vsevolod Stakhov
Date: 2019-01-24 14:54:13 +0000
URL: https://github.com/rspamd/rspamd/commit/917bbfd3a390bcb1142b41216d540313c8c5d2bd (HEAD -> master)
[Minor] Rspamadm: Allow `-` as filename to read from stdin
---
lualib/rspamadm/mime.lua | 2 +-
src/lua/lua_task.c | 49 +++++++++++++++++++++++++++++++++++++++---------
2 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/lualib/rspamadm/mime.lua b/lualib/rspamadm/mime.lua
index 96bdfd72c..7b633b75d 100644
--- a/lualib/rspamadm/mime.lua
+++ b/lualib/rspamadm/mime.lua
@@ -170,7 +170,7 @@ end
local function load_task(opts, fname)
if not fname then
- parser:error('no file specified')
+ fname = '-'
end
local res,task = rspamd_task.load_from_file(fname, rspamd_config)
diff --git a/src/lua/lua_task.c b/src/lua/lua_task.c
index 2606478d1..f8c624e60 100644
--- a/src/lua/lua_task.c
+++ b/src/lua/lua_task.c
@@ -1369,18 +1369,49 @@ lua_task_load_from_file (lua_State * L)
}
}
- map = rspamd_file_xmap (fname, PROT_READ, &sz, TRUE);
+ if (strcmp (fname, "-") == 0) {
+ /* Read from stdin */
+ gint fd = STDIN_FILENO;
+ GString *data = g_string_sized_new (BUFSIZ);
+ gchar buf[BUFSIZ];
+ gssize r;
+
+ for (;;) {
+ r = read (fd, buf, sizeof (buf));
+
+ if (r == -1) {
+ err = strerror (errno);
+ break;
+ }
+ else if (r == 0) {
+ break;
+ }
+ else {
+ g_string_append_len (data, buf, r);
+ }
- if (!map) {
- err = strerror (errno);
+ task = rspamd_task_new (NULL, cfg, NULL, NULL, NULL);
+ task->msg.begin = data->str;
+ task->msg.len = data->len;
+ rspamd_mempool_add_destructor (task->task_pool,
+ lua_task_free_dtor, task);
+ res = TRUE;
+ g_string_free (data, FALSE); /* Buffer is still valid */
+ }
}
else {
- task = rspamd_task_new (NULL, cfg, NULL, NULL, NULL);
- task->msg.begin = map;
- task->msg.len = sz;
- rspamd_mempool_add_destructor (task->task_pool,
- lua_task_unmap_dtor, task);
- res = TRUE;
+ map = rspamd_file_xmap (fname, PROT_READ, &sz, TRUE);
+
+ if (!map) {
+ err = strerror (errno);
+ } else {
+ task = rspamd_task_new (NULL, cfg, NULL, NULL, NULL);
+ task->msg.begin = map;
+ task->msg.len = sz;
+ rspamd_mempool_add_destructor (task->task_pool,
+ lua_task_unmap_dtor, task);
+ res = TRUE;
+ }
}
}
else {
More information about the Commits
mailing list