aboutsummaryrefslogtreecommitdiffstats
path: root/lib/md5.c
blob: 9bc7e57f9fb7fb49f681995b8c85c79951db15dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "md5.h"

/* Creates a new GChecksum in ctx */
void md5_init(md5_state_t *ctx)
{
	*ctx = g_checksum_new(G_CHECKSUM_MD5);
}

/* Wrapper for g_checksum_update */
void md5_append(md5_state_t *ctx, const guint8 *buf, unsigned int len)
{
	g_checksum_update(*ctx, buf, len);
}

/* Wrapper for g_checksum_get_digest
 * Also takes care of g_checksum_free(), since it can't be reused anyway
 * (the GChecksum is closed after get_digest) */
void md5_finish(md5_state_t *ctx, guint8 digest[MD5_HASH_SIZE])
{
	gsize digest_len = MD5_HASH_SIZE;

	g_checksum_get_digest(*ctx, digest, &digest_len);
	g_checksum_free(*ctx);
}

/* Variant of md5_finish that copies the GChecksum
 * and finishes that one instead of the original */
void md5_digest_keep(md5_state_t *ctx, guint8 digest[MD5_HASH_SIZE])
{
	md5_state_t copy = g_checksum_copy(*ctx);

	md5_finish(&copy, digest);
}

void md5_free(md5_state_t *ctx)
{
	g_checksum_free(*ctx);
}
f not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #define BITLBEE_CORE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #ifndef _WIN32 #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #else #include "sock.h" #define ETIMEDOUT WSAETIMEDOUT #define EINPROGRESS WSAEINPROGRESS #endif #include <fcntl.h> #include <errno.h> #include "proxy.h" typedef struct _GaimIOClosure { b_event_handler function; gpointer data; guint flags; } GaimIOClosure; static GMainLoop *loop = NULL; void b_main_init() { if( loop == NULL ) loop = g_main_new( FALSE ); } void b_main_run() { g_main_run( loop ); } void b_main_quit() { g_main_quit( loop ); } static gboolean gaim_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data) { GaimIOClosure *closure = data; b_input_condition gaim_cond = 0; gboolean st; if (condition & GAIM_READ_COND) gaim_cond |= B_EV_IO_READ; if (condition & GAIM_WRITE_COND) gaim_cond |= B_EV_IO_WRITE; event_debug( "gaim_io_invoke( %d, %d, 0x%x )\n", g_io_channel_unix_get_fd(source), condition, data ); st = closure->function(closure->data, g_io_channel_unix_get_fd(source), gaim_cond); if( !st ) event_debug( "Returned FALSE, cancelling.\n" ); if (closure->flags & B_EV_FLAG_FORCE_ONCE) return FALSE; else if (closure->flags & B_EV_FLAG_FORCE_REPEAT) return TRUE; else return st; } static void gaim_io_destroy(gpointer data) { event_debug( "gaim_io_destroy( 0x%x )\n", data ); g_free(data); } gint b_input_add(gint source, b_input_condition condition, b_event_handler function, gpointer data) { GaimIOClosure *closure = g_new0(GaimIOClosure, 1); GIOChannel *channel; GIOCondition cond = 0; int st; closure->function = function; closure->data = data; closure->flags = condition; if (condition & B_EV_IO_READ) cond |= GAIM_READ_COND; if (condition & B_EV_IO_WRITE) cond |= GAIM_WRITE_COND; channel = g_io_channel_unix_new(source); st = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, cond, gaim_io_invoke, closure, gaim_io_destroy); event_debug( "b_input_add( %d, %d, 0x%x, 0x%x ) = %d (%p)\n", source, condition, function, data, st, closure ); g_io_channel_unref(channel); return st; } gint b_timeout_add(gint timeout, b_event_handler func, gpointer data) { /* GSourceFunc and the BitlBee event handler function aren't really the same, but they're "compatible". ;-) It will do for now, BitlBee only looks at the "data" argument. */ gint st = g_timeout_add(timeout, (GSourceFunc) func, data); event_debug( "b_timeout_add( %d, %d, %d ) = %d\n", timeout, func, data, st ); return st; } void b_event_remove(gint tag) { event_debug( "b_event_remove( %d )\n", tag ); if (tag > 0) g_source_remove(tag); }