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