]> source.dussan.org Git - rspamd.git/commitdiff
* Make librspamdclient thread-safe
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 10 Aug 2011 14:00:16 +0000 (18:00 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 10 Aug 2011 14:00:16 +0000 (18:00 +0400)
lib/librspamdclient.c
lib/librspamdclient.h
src/client/rspamc.c

index 69c6edca8dbd031f335c69ae5c0ca2bb6f0a9cd5..3fd021c11412c1f6dcabf3eabee8aed5f2927b62 100644 (file)
@@ -53,6 +53,7 @@ struct rspamd_client {
 
 struct rspamd_connection {
        struct rspamd_server *server;
+       struct rspamd_client *client;
        time_t connection_time;
        gint socket;
        struct rspamd_result *result;
@@ -61,8 +62,6 @@ struct rspamd_connection {
        gint version;
 };
 
-static struct rspamd_client *client = NULL;
-
 /** Util functions **/
 gint
 make_socket_nonblocking (gint fd)
@@ -232,7 +231,7 @@ symbol_free_func (gpointer arg)
 }
 
 static struct rspamd_connection *
-rspamd_connect_random_server (gboolean is_control, GError **err)
+rspamd_connect_random_server (struct rspamd_client *client, gboolean is_control, GError **err)
 {
        struct rspamd_server            *selected = NULL;
        struct rspamd_connection        *new;
@@ -261,6 +260,7 @@ rspamd_connect_random_server (gboolean is_control, GError **err)
        new = g_malloc (sizeof (struct rspamd_connection));
        new->server = selected;
        new->connection_time = now;
+       new->client = client;
        /* Create socket */
        new->socket = make_tcp_socket (&selected->addr,
                                                                is_control ? selected->controller_port : selected->client_port,
@@ -899,7 +899,7 @@ read_rspamd_reply_line (struct rspamd_connection *c, GError **err)
                }
        }
        /* Poll socket */
-       if ((r = poll_sync_socket (c->socket, client->read_timeout, POLL_IN)) <= 0) {
+       if ((r = poll_sync_socket (c->socket, c->client->read_timeout, POLL_IN)) <= 0) {
                if (*err == NULL) {
                        if (r == 0) {
                                errno = ETIMEDOUT;
@@ -1103,7 +1103,7 @@ rspamd_send_controller_command (struct rspamd_connection *c, const gchar *line,
        make_socket_nonblocking (c->socket);
        /* Poll socket */
        do {
-               if ((r = poll_sync_socket (c->socket, client->read_timeout, POLL_IN)) <= 0) {
+               if ((r = poll_sync_socket (c->socket, c->client->read_timeout, POLL_IN)) <= 0) {
                        if (*err == NULL) {
                                if (r == 0) {
                                        errno = ETIMEDOUT;
@@ -1192,7 +1192,7 @@ rspamd_read_controller_greeting (struct rspamd_connection *c, GError **err)
        gint                            r;
        static const gchar              greeting_str[] = "Rspamd";
 
-       if ((r = poll_sync_socket (c->socket, client->read_timeout, POLL_IN)) <= 0) {
+       if ((r = poll_sync_socket (c->socket, c->client->read_timeout, POLL_IN)) <= 0) {
                if (*err == NULL) {
                        if (r == 0) {
                                errno = ETIMEDOUT;
@@ -1226,22 +1226,24 @@ rspamd_read_controller_greeting (struct rspamd_connection *c, GError **err)
 /*
  * Init rspamd client library
  */
-void
+struct rspamd_client*
 rspamd_client_init (void)
 {
-       if (client != NULL) {
-               rspamd_client_close ();
-       }
+       struct rspamd_client           *client;
+
        client = g_malloc0 (sizeof (struct rspamd_client));
        client->read_timeout = DEFAULT_READ_TIMEOUT;
        client->connect_timeout = DEFAULT_CONNECT_TIMEOUT;
+
+       return client;
 }
 
 /*
  * Add rspamd server
  */
 gboolean
-rspamd_add_server (const gchar *host, guint16 port, guint16 controller_port, GError **err)
+rspamd_add_server (struct rspamd_client *client, const gchar *host, guint16 port,
+               guint16 controller_port, GError **err)
 {
        struct rspamd_server           *new;
        struct hostent                 *hent;
@@ -1280,7 +1282,7 @@ rspamd_add_server (const gchar *host, guint16 port, guint16 controller_port, GEr
  * Set timeouts (values in milliseconds)
  */
 void
-rspamd_set_timeout (guint connect_timeout, guint read_timeout)
+rspamd_set_timeout (struct rspamd_client *client, guint connect_timeout, guint read_timeout)
 {
        g_assert (client != NULL);
 
@@ -1296,7 +1298,7 @@ rspamd_set_timeout (guint connect_timeout, guint read_timeout)
  * Scan message from memory
  */
 struct rspamd_result *
-rspamd_scan_memory (const guchar *message, gsize length, GHashTable *headers, GError **err)
+rspamd_scan_memory (struct rspamd_client *client, const guchar *message, gsize length, GHashTable *headers, GError **err)
 {
        struct rspamd_connection             *c;
        struct rspamd_result                 *res = NULL;
@@ -1305,7 +1307,7 @@ rspamd_scan_memory (const guchar *message, gsize length, GHashTable *headers, GE
        g_assert (length > 0);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (FALSE, err);
+       c = rspamd_connect_random_server (client, FALSE, err);
 
        if (c == NULL) {
                return NULL;
@@ -1344,7 +1346,7 @@ rspamd_scan_memory (const guchar *message, gsize length, GHashTable *headers, GE
  * Scan message from file
  */
 struct rspamd_result *
-rspamd_scan_file (const guchar *filename, GHashTable *headers, GError **err)
+rspamd_scan_file (struct rspamd_client *client, const guchar *filename, GHashTable *headers, GError **err)
 {
        gint                                 fd;
        g_assert (client != NULL);
@@ -1358,14 +1360,14 @@ rspamd_scan_file (const guchar *filename, GHashTable *headers, GError **err)
                return NULL;
        }
 
-       return rspamd_scan_fd (fd, headers, err);
+       return rspamd_scan_fd (client, fd, headers, err);
 }
 
 /*
  * Scan message from fd
  */
 struct rspamd_result *
-rspamd_scan_fd (int fd, GHashTable *headers, GError **err)
+rspamd_scan_fd (struct rspamd_client *client, int fd, GHashTable *headers, GError **err)
 {
        struct rspamd_connection             *c;
        struct rspamd_result                 *res = NULL;
@@ -1374,7 +1376,7 @@ rspamd_scan_fd (int fd, GHashTable *headers, GError **err)
        g_assert (client != NULL);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (FALSE, err);
+       c = rspamd_connect_random_server (client, FALSE, err);
 
        if (c == NULL) {
                return NULL;
@@ -1423,7 +1425,7 @@ rspamd_scan_fd (int fd, GHashTable *headers, GError **err)
  * Learn message from memory
  */
 gboolean
-rspamd_learn_memory (const guchar *message, gsize length, const gchar *symbol, const gchar *password, GError **err)
+rspamd_learn_memory (struct rspamd_client *client, const guchar *message, gsize length, const gchar *symbol, const gchar *password, GError **err)
 {
        struct rspamd_connection             *c;
        GString                              *in;
@@ -1435,7 +1437,7 @@ rspamd_learn_memory (const guchar *message, gsize length, const gchar *symbol, c
        g_assert (length > 0);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (TRUE, err);
+       c = rspamd_connect_random_server (client, TRUE, err);
 
        if (c == NULL) {
                return FALSE;
@@ -1482,7 +1484,7 @@ rspamd_learn_memory (const guchar *message, gsize length, const gchar *symbol, c
  * Learn message from file
  */
 gboolean
-rspamd_learn_file (const guchar *filename, const gchar *symbol, const gchar *password, GError **err)
+rspamd_learn_file (struct rspamd_client *client, const guchar *filename, const gchar *symbol, const gchar *password, GError **err)
 {
        gint                                 fd;
        g_assert (client != NULL);
@@ -1496,14 +1498,14 @@ rspamd_learn_file (const guchar *filename, const gchar *symbol, const gchar *pas
                return FALSE;
        }
 
-       return rspamd_learn_fd (fd, symbol, password, err);
+       return rspamd_learn_fd (client, fd, symbol, password, err);
 }
 
 /*
  * Learn message from fd
  */
 gboolean
-rspamd_learn_fd (int fd, const gchar *symbol, const gchar *password, GError **err)
+rspamd_learn_fd (struct rspamd_client *client, int fd, const gchar *symbol, const gchar *password, GError **err)
 {
        struct rspamd_connection             *c;
        GString                              *in;
@@ -1515,7 +1517,7 @@ rspamd_learn_fd (int fd, const gchar *symbol, const gchar *password, GError **er
        g_assert (client != NULL);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (TRUE, err);
+       c = rspamd_connect_random_server (client, TRUE, err);
 
        if (c == NULL) {
                return FALSE;
@@ -1577,7 +1579,7 @@ rspamd_learn_fd (int fd, const gchar *symbol, const gchar *password, GError **er
  * Learn message from memory
  */
 gboolean
-rspamd_learn_spam_memory (const guchar *message, gsize length, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err)
+rspamd_learn_spam_memory (struct rspamd_client *client, const guchar *message, gsize length, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err)
 {
        struct rspamd_connection             *c;
        GString                              *in;
@@ -1589,7 +1591,7 @@ rspamd_learn_spam_memory (const guchar *message, gsize length, const gchar *clas
        g_assert (length > 0);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (TRUE, err);
+       c = rspamd_connect_random_server (client, TRUE, err);
 
        if (c == NULL) {
                return FALSE;
@@ -1637,7 +1639,7 @@ rspamd_learn_spam_memory (const guchar *message, gsize length, const gchar *clas
  * Learn message from file
  */
 gboolean
-rspamd_learn_spam_file (const guchar *filename, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err)
+rspamd_learn_spam_file (struct rspamd_client *client, const guchar *filename, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err)
 {
        gint                                 fd;
        g_assert (client != NULL);
@@ -1651,14 +1653,14 @@ rspamd_learn_spam_file (const guchar *filename, const gchar *classifier, gboolea
                return FALSE;
        }
 
-       return rspamd_learn_spam_fd (fd, classifier, is_spam, password, err);
+       return rspamd_learn_spam_fd (client, fd, classifier, is_spam, password, err);
 }
 
 /*
  * Learn message from fd
  */
 gboolean
-rspamd_learn_spam_fd (int fd, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err)
+rspamd_learn_spam_fd (struct rspamd_client *client, int fd, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err)
 {
        struct rspamd_connection             *c;
        GString                              *in;
@@ -1670,7 +1672,7 @@ rspamd_learn_spam_fd (int fd, const gchar *classifier, gboolean is_spam, const g
        g_assert (client != NULL);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (TRUE, err);
+       c = rspamd_connect_random_server (client, TRUE, err);
 
        if (c == NULL) {
                return FALSE;
@@ -1734,7 +1736,7 @@ rspamd_learn_spam_fd (int fd, const gchar *classifier, gboolean is_spam, const g
  * Learn message fuzzy from memory
  */
 gboolean
-rspamd_fuzzy_memory (const guchar *message, gsize length, const gchar *password, gint weight, gint flag, gboolean delete, GError **err)
+rspamd_fuzzy_memory (struct rspamd_client *client, const guchar *message, gsize length, const gchar *password, gint weight, gint flag, gboolean delete, GError **err)
 {
        struct rspamd_connection             *c;
        GString                              *in;
@@ -1746,7 +1748,7 @@ rspamd_fuzzy_memory (const guchar *message, gsize length, const gchar *password,
        g_assert (length > 0);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (TRUE, err);
+       c = rspamd_connect_random_server (client, TRUE, err);
 
        if (c == NULL) {
                return FALSE;
@@ -1798,7 +1800,7 @@ rspamd_fuzzy_memory (const guchar *message, gsize length, const gchar *password,
  * Learn message fuzzy from file
  */
 gboolean
-rspamd_fuzzy_file (const guchar *filename, const gchar *password, gint weight, gint flag, gboolean delete, GError **err)
+rspamd_fuzzy_file (struct rspamd_client *client, const guchar *filename, const gchar *password, gint weight, gint flag, gboolean delete, GError **err)
 {
        gint                                 fd;
        g_assert (client != NULL);
@@ -1812,14 +1814,14 @@ rspamd_fuzzy_file (const guchar *filename, const gchar *password, gint weight, g
                return FALSE;
        }
 
-       return rspamd_fuzzy_fd (fd, password, weight, flag, delete, err);
+       return rspamd_fuzzy_fd (client, fd, password, weight, flag, delete, err);
 }
 
 /*
  * Learn message fuzzy from fd
  */
 gboolean
-rspamd_fuzzy_fd (int fd, const gchar *password, gint weight, gint flag, gboolean delete, GError **err)
+rspamd_fuzzy_fd (struct rspamd_client *client, int fd, const gchar *password, gint weight, gint flag, gboolean delete, GError **err)
 {
        struct rspamd_connection             *c;
        GString                              *in;
@@ -1831,7 +1833,7 @@ rspamd_fuzzy_fd (int fd, const gchar *password, gint weight, gint flag, gboolean
        g_assert (client != NULL);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (TRUE, err);
+       c = rspamd_connect_random_server (client, TRUE, err);
 
        if (c == NULL) {
                return FALSE;
@@ -1894,7 +1896,7 @@ rspamd_fuzzy_fd (int fd, const gchar *password, gint weight, gint flag, gboolean
 }
 
 GString *
-rspamd_get_stat (GError **err)
+rspamd_get_stat (struct rspamd_client *client, GError **err)
 {
        struct rspamd_connection             *c;
        GString                              *res;
@@ -1903,7 +1905,7 @@ rspamd_get_stat (GError **err)
        g_assert (client != NULL);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (TRUE, err);
+       c = rspamd_connect_random_server (client, TRUE, err);
 
        if (c == NULL) {
                return NULL;
@@ -1915,7 +1917,7 @@ rspamd_get_stat (GError **err)
 }
 
 GString *
-rspamd_get_uptime (GError **err)
+rspamd_get_uptime (struct rspamd_client *client, GError **err)
 {
        struct rspamd_connection             *c;
        GString                              *res;
@@ -1924,7 +1926,7 @@ rspamd_get_uptime (GError **err)
        g_assert (client != NULL);
 
        /* Connect to server */
-       c = rspamd_connect_random_server (TRUE, err);
+       c = rspamd_connect_random_server (client, TRUE, err);
 
        if (c == NULL) {
                return NULL;
@@ -1941,7 +1943,6 @@ rspamd_get_uptime (GError **err)
 void
 rspamd_free_result (struct rspamd_result *result)
 {
-       g_assert (client != NULL);
        g_assert (result != NULL);
 
        g_hash_table_destroy (result->headers);
@@ -1953,10 +1954,7 @@ rspamd_free_result (struct rspamd_result *result)
  * Close library and free associated resources
  */
 void
-rspamd_client_close (void)
+rspamd_client_close (struct rspamd_client *client)
 {
-       g_assert (client != NULL);
-
        g_free (client);
-       client = NULL;
 }
index 180566fe5502dc64132ee4e8a8af4f9450a1cf25..54695a34d35d19eaf7a2f87afaab1628ff6b7e15 100644 (file)
@@ -27,6 +27,7 @@ struct rspamd_metric {
 };
 
 struct rspamd_connection;
+struct rspamd_client;
 /**
  * Result of scan
  */
@@ -40,87 +41,88 @@ struct rspamd_result {
 /*
  * Init rspamd client library
  */
-void rspamd_client_init (void);
+struct rspamd_client* rspamd_client_init (void);
 
 /*
  * Add rspamd server
  */
-gboolean rspamd_add_server (const gchar *host, guint16 port, guint16 controller_port, GError **err);
+gboolean rspamd_add_server (struct rspamd_client* client, const gchar *host,
+               guint16 port, guint16 controller_port, GError **err);
 
 /*
  * Set timeouts (values in milliseconds)
  */
-void rspamd_set_timeout (guint connect_timeout, guint read_timeout);
+void rspamd_set_timeout (struct rspamd_client* client, guint connect_timeout, guint read_timeout);
 
 /*
  * Scan message from memory
  */
-struct rspamd_result * rspamd_scan_memory (const guchar *message, gsize length, GHashTable *headers, GError **err);
+struct rspamd_result * rspamd_scan_memory (struct rspamd_client* client, const guchar *message, gsize length, GHashTable *headers, GError **err);
 
 /*
  * Scan message from file
  */
-struct rspamd_result * rspamd_scan_file (const guchar *filename, GHashTable *headers, GError **err);
+struct rspamd_result * rspamd_scan_file (struct rspamd_client* client, const guchar *filename, GHashTable *headers, GError **err);
 
 /*
  * Scan message from fd
  */
-struct rspamd_result * rspamd_scan_fd (int fd, GHashTable *headers, GError **err);
+struct rspamd_result * rspamd_scan_fd (struct rspamd_client* client, int fd, GHashTable *headers, GError **err);
 
 /*
  * Learn message from memory
  */
-gboolean rspamd_learn_spam_memory (const guchar *message, gsize length, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err);
+gboolean rspamd_learn_spam_memory (struct rspamd_client* client, const guchar *message, gsize length, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err);
 
 /*
  * Learn message from file
  */
-gboolean rspamd_learn_spam_file (const guchar *filename, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err);
+gboolean rspamd_learn_spam_file (struct rspamd_client* client, const guchar *filename, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err);
 
 /*
  * Learn message from fd
  */
-gboolean rspamd_learn_spam_fd (int fd, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err);
+gboolean rspamd_learn_spam_fd (struct rspamd_client* client, int fd, const gchar *classifier, gboolean is_spam, const gchar *password, GError **err);
 
 /*
  * Learn message from memory
  */
-gboolean rspamd_learn_memory (const guchar *message, gsize length, const gchar *symbol, const gchar *password, GError **err);
+gboolean rspamd_learn_memory (struct rspamd_client* client, const guchar *message, gsize length, const gchar *symbol, const gchar *password, GError **err);
 
 /*
  * Learn message from file
  */
-gboolean rspamd_learn_file (const guchar *filename, const gchar *symbol, const gchar *password, GError **err);
+gboolean rspamd_learn_file (struct rspamd_client* client, const guchar *filename, const gchar *symbol, const gchar *password, GError **err);
 
 /*
  * Learn message from fd
  */
-gboolean rspamd_learn_fd (int fd, const gchar *symbol, const gchar *password, GError **err);
+gboolean rspamd_learn_fd (struct rspamd_client* client, int fd, const gchar *symbol, const gchar *password, GError **err);
 
 /*
  * Learn message fuzzy from memory
  */
-gboolean rspamd_fuzzy_memory (const guchar *message, gsize length, const gchar *password, gint weight, gint flag, gboolean delete, GError **err);
+gboolean rspamd_fuzzy_memory (struct rspamd_client* client, const guchar *message, gsize length, const gchar *password, gint weight, gint flag, gboolean delete, GError **err);
 
 /*
  * Learn message fuzzy from file
  */
-gboolean rspamd_fuzzy_file (const guchar *filename, const gchar *password, gint weight, gint flag, gboolean delete, GError **err);
+gboolean rspamd_fuzzy_file (struct rspamd_client* client, const guchar *filename, const gchar *password, gint weight, gint flag, gboolean delete, GError **err);
 
 /*
  * Learn message fuzzy from fd
  */
-gboolean rspamd_fuzzy_fd (int fd, const gchar *password, gint weight, gint flag, gboolean delete, GError **err);
+gboolean rspamd_fuzzy_fd (struct rspamd_client* client, int fd, const gchar *password, gint weight, gint flag, gboolean delete, GError **err);
 
 /*
  * Get statistic from server
  */
-GString *rspamd_get_stat (GError **err);
+GString *rspamd_get_stat (struct rspamd_client* client, GError **err);
 
 /*
  * Get uptime from server
  */
-GString *rspamd_get_uptime (GError **err);
+GString *rspamd_get_uptime (struct rspamd_client* client, GError **err);
 
 /*
  * Free results
@@ -130,6 +132,6 @@ void rspamd_free_result (struct rspamd_result *result);
 /*
  * Close library and free associated resources
  */
-void rspamd_client_close (void);
+void rspamd_client_close (struct rspamd_client *client);
 
 #endif
index 4f65c6d8f5e4c2ea04f49e8aea4c24715863f69d..8970d4d8f97907a3f58b552e9c5d6b4e9aebc437 100644 (file)
@@ -45,6 +45,7 @@ static gint                     timeout = 5;
 static gboolean                 pass_all;
 static gboolean                 tty = FALSE;
 static gboolean                 verbose = FALSE;
+static struct rspamd_client    *client = NULL;
 
 static GOptionEntry entries[] =
 {
@@ -168,7 +169,7 @@ add_rspamd_server (gboolean is_control)
                }
        }
 
-       if (! rspamd_add_server (vec[0], port, port, &err)) {
+       if (! rspamd_add_server (client, vec[0], port, port, &err)) {
                fprintf (stderr, "cannot connect to rspamd server: %s, error: %s\n", connect_str, err->message);
                exit (EXIT_FAILURE);
        }
@@ -355,7 +356,7 @@ scan_rspamd_stdin ()
                        in_buf = g_realloc (in_buf, len);
                }
        }
-       res = rspamd_scan_memory (in_buf, r, opts, &err);
+       res = rspamd_scan_memory (client, in_buf, r, opts, &err);
        g_hash_table_destroy (opts);
        if (err != NULL) {
                fprintf (stderr, "cannot scan message: %s\n", err->message);
@@ -375,7 +376,7 @@ scan_rspamd_file (const gchar *file)
        /* Init options hash */
        opts = g_hash_table_new (g_str_hash, g_str_equal);
        add_options (opts);
-       res = rspamd_scan_file (file, opts, &err);
+       res = rspamd_scan_file (client, file, opts, &err);
        g_hash_table_destroy (opts);
        if (err != NULL) {
                fprintf (stderr, "cannot scan message: %s\n", err->message);
@@ -415,7 +416,7 @@ learn_rspamd_stdin (gboolean is_spam)
                }
        }
        if (statfile != NULL) {
-               if (!rspamd_learn_memory (in_buf, r, statfile, password, &err)) {
+               if (!rspamd_learn_memory (client, in_buf, r, statfile, password, &err)) {
                        if (err != NULL) {
                                fprintf (stderr, "cannot learn message: %s\n", err->message);
                        }
@@ -435,7 +436,7 @@ learn_rspamd_stdin (gboolean is_spam)
                }
        }
        else if (classifier != NULL) {
-               if (!rspamd_learn_spam_memory (in_buf, r, classifier, is_spam, password, &err)) {
+               if (!rspamd_learn_spam_memory (client, in_buf, r, classifier, is_spam, password, &err)) {
                        if (err != NULL) {
                                fprintf (stderr, "cannot learn message: %s\n", err->message);
                        }
@@ -467,7 +468,7 @@ learn_rspamd_file (gboolean is_spam, const gchar *file)
        }
 
        if (statfile != NULL) {
-               if (!rspamd_learn_file (file, statfile, password, &err)) {
+               if (!rspamd_learn_file (client, file, statfile, password, &err)) {
                        if (err != NULL) {
                                fprintf (stderr, "cannot learn message: %s\n", err->message);
                        }
@@ -486,7 +487,7 @@ learn_rspamd_file (gboolean is_spam, const gchar *file)
                }
        }
        else if (classifier != NULL) {
-               if (!rspamd_learn_spam_file (file, classifier, is_spam, password, &err)) {
+               if (!rspamd_learn_spam_file (client, file, classifier, is_spam, password, &err)) {
                        if (err != NULL) {
                                fprintf (stderr, "cannot learn message: %s\n", err->message);
                        }
@@ -533,7 +534,7 @@ fuzzy_rspamd_stdin (gboolean delete)
                        in_buf = g_realloc (in_buf, len);
                }
        }
-       if (!rspamd_fuzzy_memory (in_buf, r, password, weight, flag, delete, &err)) {
+       if (!rspamd_fuzzy_memory (client, in_buf, r, password, weight, flag, delete, &err)) {
                if (err != NULL) {
                        fprintf (stderr, "cannot learn message: %s\n", err->message);
                }
@@ -563,7 +564,7 @@ fuzzy_rspamd_file (const gchar *file, gboolean delete)
                exit (EXIT_FAILURE);
        }
 
-       if (!rspamd_fuzzy_file (file, password, weight, flag, delete, &err)) {
+       if (!rspamd_fuzzy_file (client, file, password, weight, flag, delete, &err)) {
                if (err != NULL) {
                        fprintf (stderr, "cannot learn message: %s\n", err->message);
                }
@@ -591,7 +592,7 @@ rspamd_do_stat ()
        /* Add server */
        add_rspamd_server (TRUE);
 
-       res = rspamd_get_stat (&err);
+       res = rspamd_get_stat (client, &err);
        if (res == NULL) {
                if (err != NULL) {
                        fprintf (stderr, "cannot stat: %s\n", err->message);
@@ -621,7 +622,7 @@ rspamd_do_uptime ()
        /* Add server */
        add_rspamd_server (TRUE);
 
-       res = rspamd_get_uptime (&err);
+       res = rspamd_get_uptime (client, &err);
        if (res == NULL) {
                if (err != NULL) {
                        fprintf (stderr, "cannot uptime: %s\n", err->message);
@@ -648,10 +649,10 @@ main (gint argc, gchar **argv, gchar **env)
        enum rspamc_command             cmd;
        gint                            i;
 
-       rspamd_client_init ();
+       client = rspamd_client_init ();
 
        read_cmd_line (&argc, &argv);
-       rspamd_set_timeout (1000, timeout * 1000);
+       rspamd_set_timeout (client, 1000, timeout * 1000);
        tty = isatty (STDOUT_FILENO);
        /* Now read other args from argc and argv */
        if (argc == 1) {
@@ -773,7 +774,7 @@ main (gint argc, gchar **argv, gchar **env)
                }
        }
 
-       rspamd_client_close ();
+       rspamd_client_close (client);
 
        return 0;
 }