** modify it under the terms of GNU Lesser General Public License.
*/
+#include "config.h"
+#ifdef HAVE_GNUTLS
+#define _XOPEN_SOURCE 500
+#define _GNU_SOURCE
+#include <pthread.h>
+#endif
+
+
#include "common.h"
#include "iksemel.h"
};
#ifdef HAVE_GNUTLS
+static pthread_mutex_t tls_send_mutex;
+static pthread_mutex_t tls_recv_mutex;
static size_t
tls_push (iksparser *prs, const char *buffer, size_t len)
{
struct stream_data *data = iks_user_data (prs);
int ret;
-
+ pthread_mutex_lock(&tls_send_mutex);
ret = data->trans->send (data->sock, buffer, len);
+ pthread_mutex_unlock(&tls_send_mutex);
if (ret) return (size_t) -1;
return len;
}
{
struct stream_data *data = iks_user_data (prs);
int ret;
-
+ pthread_mutex_lock(&tls_recv_mutex);
ret = data->trans->recv (data->sock, buffer, len, -1);
+ pthread_mutex_unlock(&tls_recv_mutex);
if (ret == -1) return (size_t) -1;
return ret;
}
return 0;
#endif
}
+#ifdef HAVE_GNUTLS
+
+
+int
+iks_init(void)
+{
+ int ok = 0;
+ pthread_mutexattr_t attr;
+
+ if (pthread_mutexattr_init(&attr))
+ return -1;
+
+ if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE))
+ ok = -1;
+
+ if (ok == 0 && pthread_mutex_init(&tls_send_mutex, &attr))
+ ok = -1;
+
+ if (ok == 0 && pthread_mutex_init(&tls_recv_mutex, &attr)) {
+ pthread_mutex_destroy(&tls_send_mutex);
+ ok = -1;
+ }
+
+
+ pthread_mutexattr_destroy(&attr);
+
+ return ok;
+
+}
+#else
+int
+iks_init(void)
+{
+ return 0;
+}
+#endif
+
int
iks_start_tls (iksparser *prs)
}
from = ffrom;
}
-
-
- switch_core_chat_send(proto, MDL_CHAT_PROTO, from, to, subject, switch_str_nil(msg), NULL, hint);
+
+ if (strcasecmp(proto, MDL_CHAT_PROTO)) { /* yes no ! on purpose */
+ switch_core_chat_send(proto, MDL_CHAT_PROTO, from, to, subject, switch_str_nil(msg), NULL, hint);
+ }
switch_safe_free(pproto);
switch_safe_free(ffrom);