From: Vsevolod Stakhov Date: Thu, 24 Jan 2019 14:54:13 +0000 (+0000) Subject: [Minor] Rspamadm: Allow `-` as filename to read from stdin X-Git-Tag: 1.9.0~256 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=917bbfd3a390bcb1142b41216d540313c8c5d2bd;p=thirdparty%2Frspamd.git [Minor] Rspamadm: Allow `-` as filename to read from stdin --- diff --git a/lualib/rspamadm/mime.lua b/lualib/rspamadm/mime.lua index 96bdfd72c0..7b633b75da 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 2606478d15..f8c624e600 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 {