ottery_rand_bytes (buf, (size_t)len);
}
+void
+rspamd_random_hex (guchar *buf, guint64 len)
+{
+ static const gchar hexdigests[16] = "0123456789abcdef";
+ gint64 i;
+
+ g_assert (len > 0);
+
+ ottery_rand_bytes (buf, (len / 2.0 + 0.5));
+
+ for (i = (gint64)len - 1; i >= 0; i -= 2) {
+ buf[i] = hexdigests[buf[i / 2] & 0xf];
+
+ if (i > 0) {
+ buf[i - 1] = hexdigests[(buf[i / 2] >> 4) & 0xf];
+ }
+ }
+}
+
void
rspamd_ptr_array_free_hard (gpointer p)
*/
LUA_FUNCTION_DEF (util, close_file);
+/**
+ * @function util.random_hex(size)
+ * Returns random hex string of the specified size
+ *
+ * @param {number} len length of desired string in bytes
+ * @return {string} string with random hex digests
+ */
+LUA_FUNCTION_DEF (util, random_hex);
+
static const struct luaL_reg utillib_f[] = {
LUA_INTERFACE_DEF (util, create_event_base),
LUA_INTERFACE_DEF (util, load_rspamd_config),
LUA_INTERFACE_DEF (util, unlock_file),
LUA_INTERFACE_DEF (util, create_file),
LUA_INTERFACE_DEF (util, close_file),
+ LUA_INTERFACE_DEF (util, random_hex),
{NULL, NULL}
};
return 1;
}
+static gint
+lua_util_random_hex (lua_State *L)
+{
+ gchar *buf;
+ gint buflen;
+
+ buflen = lua_tonumber (L, 1);
+
+ if (buflen <= 0) {
+ return luaL_error (L, "invalid arguments");
+ }
+
+ buf = g_malloc (buflen);
+ rspamd_random_hex (buf, buflen);
+ lua_pushlstring (L, buf, buflen);
+ g_free (buf);
+
+ return 1;
+}
+
static gint
lua_load_util (lua_State * L)
{