gaim/gaim

Make this sucker compile again!!
draft default tip
2022-03-31, Gary Kramlich
ea0a68c3b8a8
Make this sucker compile again!!
/**
* @file sslconn.c SSL API
* @ingroup core
*
* gaim
*
* Gaim is the legal property of its developers, whose names are too numerous
* to list here. Please refer to the COPYRIGHT file distributed with this
* source distribution.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "internal.h"
#include "debug.h"
#include "sslconn.h"
static gboolean _ssl_initialized = FALSE;
static GaimSslOps *_ssl_ops = NULL;
static gboolean
ssl_init(void)
{
GaimPlugin *plugin;
GaimSslOps *ops;
if (_ssl_initialized)
return FALSE;
plugin = gaim_plugins_find_with_id("core-ssl");
if (plugin != NULL && !gaim_plugin_is_loaded(plugin))
gaim_plugin_load(plugin);
ops = gaim_ssl_get_ops();
if (ops != NULL && ops->init != NULL)
return ops->init();
else
return FALSE;
}
gboolean
gaim_ssl_is_supported(void)
{
#ifdef HAVE_SSL
ssl_init();
return (gaim_ssl_get_ops() != NULL);
#else
return FALSE;
#endif
}
GaimSslConnection *
gaim_ssl_connect(GaimAccount *account, const char *host, int port,
GaimSslInputFunction func, GaimSslErrorFunction error_func,
void *data)
{
GaimSslConnection *gsc;
GaimSslOps *ops;
int i;
g_return_val_if_fail(host != NULL, NULL);
g_return_val_if_fail(port != 0 && port != -1, NULL);
g_return_val_if_fail(func != NULL, NULL);
g_return_val_if_fail(gaim_ssl_is_supported(), NULL);
ops = gaim_ssl_get_ops();
g_return_val_if_fail(ops != NULL, NULL);
g_return_val_if_fail(ops->connect_cb != NULL, NULL);
if (!_ssl_initialized)
{
if (!ssl_init())
return NULL;
}
gsc = g_new0(GaimSslConnection, 1);
gsc->host = g_strdup(host);
gsc->port = port;
gsc->connect_cb_data = data;
gsc->connect_cb = func;
gsc->error_cb = error_func;
i = gaim_proxy_connect(account, host, port, ops->connect_cb, gsc);
if (i < 0)
{
g_free(gsc->host);
g_free(gsc);
return NULL;
}
return (GaimSslConnection *)gsc;
}
static void
recv_cb(gpointer data, gint source, GaimInputCondition cond)
{
GaimSslConnection *gsc = data;
gsc->recv_cb(gsc->recv_cb_data, gsc, cond);
}
void
gaim_ssl_input_add(GaimSslConnection *gsc, GaimSslInputFunction func,
void *data)
{
GaimSslOps *ops;
g_return_if_fail(func != NULL);
g_return_if_fail(gaim_ssl_is_supported());
ops = gaim_ssl_get_ops();
gsc->recv_cb_data = data;
gsc->recv_cb = func;
gsc->inpa = gaim_input_add(gsc->fd, GAIM_INPUT_READ, recv_cb, gsc);
}
GaimSslConnection *
gaim_ssl_connect_fd(GaimAccount *account, int fd,
GaimSslInputFunction func,
GaimSslErrorFunction error_func, void *data)
{
GaimSslConnection *gsc;
GaimSslOps *ops;
g_return_val_if_fail(fd > 0, NULL);
g_return_val_if_fail(func != NULL, NULL);
g_return_val_if_fail(gaim_ssl_is_supported(), NULL);
ops = gaim_ssl_get_ops();
g_return_val_if_fail(ops != NULL, NULL);
g_return_val_if_fail(ops->connect_cb != NULL, NULL);
if (!_ssl_initialized)
{
if (!ssl_init())
return NULL;
}
gsc = g_new0(GaimSslConnection, 1);
gsc->connect_cb_data = data;
gsc->connect_cb = func;
gsc->error_cb = error_func;
ops->connect_cb(gsc, fd, GAIM_INPUT_READ);
return (GaimSslConnection *)gsc;
}
void
gaim_ssl_close(GaimSslConnection *gsc)
{
GaimSslOps *ops;
g_return_if_fail(gsc != NULL);
ops = gaim_ssl_get_ops();
if (gsc->inpa)
gaim_input_remove(gsc->inpa);
if (ops != NULL && ops->close != NULL)
(ops->close)(gsc);
if (gsc->fd)
close(gsc->fd);
if (gsc->host != NULL)
g_free(gsc->host);
g_free(gsc);
}
size_t
gaim_ssl_read(GaimSslConnection *gsc, void *data, size_t len)
{
GaimSslOps *ops;
g_return_val_if_fail(gsc != NULL, 0);
g_return_val_if_fail(data != NULL, 0);
g_return_val_if_fail(len > 0, 0);
ops = gaim_ssl_get_ops();
if (ops != NULL && (ops->read) != NULL)
return (ops->read)(gsc, data, len);
return 0;
}
size_t
gaim_ssl_write(GaimSslConnection *gsc, const void *data, size_t len)
{
GaimSslOps *ops;
g_return_val_if_fail(gsc != NULL, 0);
g_return_val_if_fail(data != NULL, 0);
g_return_val_if_fail(len > 0, 0);
ops = gaim_ssl_get_ops();
if (ops != NULL && (ops->write) != NULL)
return (ops->write)(gsc, data, len);
return 0;
}
void
gaim_ssl_set_ops(GaimSslOps *ops)
{
_ssl_ops = ops;
}
GaimSslOps *
gaim_ssl_get_ops(void)
{
return _ssl_ops;
}
void
gaim_ssl_init(void)
{
}
void
gaim_ssl_uninit(void)
{
GaimSslOps *ops;
if (!_ssl_initialized)
return;
ops = gaim_ssl_get_ops();
if (ops != NULL && ops->uninit != NULL)
ops->uninit();
_ssl_initialized = FALSE;
}