aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.bzrignore9
-rw-r--r--Makefile8
-rw-r--r--account.c14
-rw-r--r--account.h4
-rw-r--r--bitlbee.c45
-rw-r--r--commands.c35
-rwxr-xr-xconfigure9
-rw-r--r--doc/BUILD.win3223
-rw-r--r--doc/example_plugin.c13
-rw-r--r--irc.c2
-rw-r--r--nick.c4
-rw-r--r--nick.h6
-rw-r--r--protocols/jabber/jabber.c15
-rw-r--r--protocols/msn/msn.c9
-rw-r--r--protocols/nogaim.c103
-rw-r--r--protocols/nogaim.h73
-rw-r--r--protocols/oscar/oscar.c13
-rw-r--r--protocols/proxy.c10
-rw-r--r--protocols/yahoo/yahoo.c18
-rw-r--r--unix.c11
-rw-r--r--url.h3
-rw-r--r--win32.c315
-rw-r--r--win32/bitlbee.dsp247
-rw-r--r--win32/bitlbee.dsw119
-rw-r--r--win32/bitlbee.iss73
-rw-r--r--win32/bitlbee_ssl.dsp99
-rw-r--r--win32/jabber.dsp228
-rw-r--r--win32/msn.dsp116
-rw-r--r--win32/oscar.dsp204
-rw-r--r--win32/yahoo.dsp152
30 files changed, 1818 insertions, 162 deletions
diff --git a/.bzrignore b/.bzrignore
index cd46f461..ffd468a4 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -1,6 +1,15 @@
Makefile.settings
config.h
bitlbee
+Debug
+Debugx
+deps
+admin/Debug
+admin/admin.plg
+bitlbee.plg
+*.plg
+*.aps
+*.clw
user-guide.txt
user-guide.html
help.txt
diff --git a/Makefile b/Makefile
index e3ca059d..73a54ce0 100644
--- a/Makefile
+++ b/Makefile
@@ -9,9 +9,15 @@
-include Makefile.settings
# Program variables
-objects = account.o bitlbee.o commands.o conf.o crypting.o help.o ini.o irc.o log.o nick.o query.o set.o unix.o url.o user.o
+objects = account.o bitlbee.o commands.o crypting.o help.o ini.o irc.o nick.o query.o set.o url.o user.o log.o
subdirs = protocols
+ifeq ($(ARCH),Windows)
+objects += win32.o
+else
+objects += unix.o conf.o
+endif
+
# Expansion of variables
subdirobjs = $(foreach dir,$(subdirs),$(dir)/$(dir).o)
CFLAGS += -Wall
diff --git a/account.c b/account.c
index d5bd24c4..c1e25a06 100644
--- a/account.c
+++ b/account.c
@@ -27,7 +27,7 @@
#include "bitlbee.h"
#include "account.h"
-account_t *account_add( irc_t *irc, int protocol, char *user, char *pass )
+account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass )
{
account_t *a;
@@ -41,7 +41,7 @@ account_t *account_add( irc_t *irc, int protocol, char *user, char *pass )
irc->accounts = a = g_new0 ( account_t, 1 );
}
- a->protocol = protocol;
+ a->prpl = prpl;
a->user = g_strdup( user );
a->pass = g_strdup( pass );
a->irc = irc;
@@ -65,7 +65,7 @@ account_t *account_get( irc_t *irc, char *id )
for( a = irc->accounts; a; a = a->next )
{
- if( g_strcasecmp( id, proto_name[a->protocol] ) == 0 )
+ if( g_strcasecmp( id, a->prpl->name ) == 0 )
{
if( !ret )
ret = a;
@@ -123,9 +123,9 @@ void account_on( irc_t *irc, account_t *a )
return;
}
- if( proto_prpl[a->protocol]->login == NULL )
+ if (a->prpl == NULL )
{
- irc_usermsg( irc, "Support for protocol %s is not included in this BitlBee", proto_name[a->protocol] );
+ irc_usermsg( irc, "Support for protocol %s is not included in this BitlBee", a->prpl->name );
return;
}
@@ -133,7 +133,7 @@ void account_on( irc_t *irc, account_t *a )
u = g_new0 ( struct aim_user, 1 );
u->irc = irc;
- u->protocol = a->protocol;
+ u->prpl = a->prpl;
strncpy( u->username, a->user, sizeof( u->username ) - 1 );
strncpy( u->password, a->pass, sizeof( u->password ) - 1 );
if( a->server) strncpy( u->proto_opt[0], a->server, sizeof( u->proto_opt[0] ) - 1 );
@@ -141,7 +141,7 @@ void account_on( irc_t *irc, account_t *a )
a->gc = (struct gaim_connection *) u; /* Bit hackish :-/ */
a->reconnect = 0;
- proto_prpl[a->protocol]->login( u );
+ a->prpl->login( u );
}
void account_off( irc_t *irc, account_t *a )
diff --git a/account.h b/account.h
index a8653411..37cd8814 100644
--- a/account.h
+++ b/account.h
@@ -28,7 +28,7 @@
typedef struct account
{
- int protocol;
+ struct prpl *prpl;
char *user;
char *pass;
char *server;
@@ -40,7 +40,7 @@ typedef struct account
struct account *next;
} account_t;
-account_t *account_add( irc_t *irc, int protocol, char *user, char *pass );
+account_t *account_add( irc_t *irc, struct prpl *prpl, char *user, char *pass );
account_t *account_get( irc_t *irc, char *id );
void account_del( irc_t *irc, account_t *acc );
void account_on( irc_t *irc, account_t *a );
diff --git a/bitlbee.c b/bitlbee.c
index ef64a753..8c51f92c 100644
--- a/bitlbee.c
+++ b/bitlbee.c
@@ -54,9 +54,6 @@ int bitlbee_daemon_init()
int i;
GIOChannel *ch;
- log_link( LOGLVL_ERROR, LOGOUTPUT_SYSLOG );
- log_link( LOGLVL_WARNING, LOGOUTPUT_SYSLOG );
-
global.listen_socket = socket( AF_INET, SOCK_STREAM, 0 );
if( global.listen_socket == -1 )
{
@@ -110,9 +107,6 @@ int bitlbee_inetd_init()
if( !irc_new( 0 ) )
return( 1 );
- log_link( LOGLVL_ERROR, LOGOUTPUT_IRC );
- log_link( LOGLVL_WARNING, LOGOUTPUT_IRC );
-
return( 0 );
}
@@ -235,11 +229,26 @@ gboolean bitlbee_io_current_client_write( GIOChannel *source, GIOCondition condi
}
}
+/* DO NOT USE THIS FUNCTION IN NEW CODE. This
+ * function is here merely because the save/load code still uses
+ * ids rather then names */
+struct prpl *find_protocol_by_id(int id)
+{
+ switch (id) {
+ case 1: return find_protocol("oscar");
+ case 4: return find_protocol("msn");
+ case 2: return find_protocol("yahoo");
+ case 8: return find_protocol("jabber");
+ default: break;
+ }
+ return NULL;
+}
+
int bitlbee_load( irc_t *irc, char* password )
{
char s[512];
char *line;
- int proto;
+ char proto[20];
char nick[MAX_NICK_LENGTH+1];
FILE *fp;
user_t *ru = user_find( irc, ROOT_NICK );
@@ -274,10 +283,22 @@ int bitlbee_load( irc_t *irc, char* password )
g_snprintf( s, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" );
fp = fopen( s, "r" );
if( !fp ) return( 0 );
- while( fscanf( fp, "%s %d %s", s, &proto, nick ) > 0 )
+ while( fscanf( fp, "%s %s %s", s, proto, nick ) > 0 )
{
+ struct prpl *prpl;
+
+ prpl = find_protocol(proto);
+
+ /* Older files saved the protocol number rather then the protocol name */
+ if (!prpl && atoi(proto)) {
+ prpl = find_protocol_by_id(atoi(proto));
+ }
+
+ if (!prpl)
+ continue;
+
http_decode( s );
- nick_set( irc, s, proto, nick );
+ nick_set( irc, s, prpl, nick );
}
fclose( fp );
@@ -332,7 +353,7 @@ int bitlbee_save( irc_t *irc )
strcpy( s, n->handle );
s[169] = 0; /* Prevent any overflow (169 ~ 512 / 3) */
http_encode( s );
- g_snprintf( s + strlen( s ), 510 - strlen( s ), " %d %s", n->proto, n->nick );
+ g_snprintf( s + strlen( s ), 510 - strlen( s ), " %s %s", n->proto->name, n->nick );
if( fprintf( fp, "%s\n", s ) != strlen( s ) + 1 )
{
irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );
@@ -374,11 +395,11 @@ int bitlbee_save( irc_t *irc )
for( a = irc->accounts; a; a = a->next )
{
- if( a->protocol == PROTO_OSCAR || a->protocol == PROTO_ICQ || a->protocol == PROTO_TOC )
+ if( !strcmp( a->prpl->name, "oscar" ) )
g_snprintf( s, sizeof( s ), "account add oscar \"%s\" \"%s\" %s", a->user, a->pass, a->server );
else
g_snprintf( s, sizeof( s ), "account add %s \"%s\" \"%s\" \"%s\"",
- proto_name[a->protocol], a->user, a->pass, a->server ? a->server : "" );
+ a->prpl->name, a->user, a->pass, a->server ? a->server : "" );
line = obfucrypt( irc, s );
if( *line )
diff --git a/commands.c b/commands.c
index 504a9345..e099d635 100644
--- a/commands.c
+++ b/commands.c
@@ -183,7 +183,7 @@ int cmd_account( irc_t *irc, char **cmd )
if( g_strcasecmp( cmd[1], "add" ) == 0 )
{
- int prot;
+ struct prpl *prpl;
if( cmd[2] == NULL || cmd[3] == NULL || cmd[4] == NULL )
{
@@ -191,23 +191,15 @@ int cmd_account( irc_t *irc, char **cmd )
return( 0 );
}
- for( prot = 0; prot < PROTO_MAX; prot ++ )
- if( proto_name[prot] && *proto_name[prot] && g_strcasecmp( proto_name[prot], cmd[2] ) == 0 )
- break;
+ prpl = find_protocol(cmd[2]);
- if( ( prot == PROTO_MAX ) || ( proto_prpl[prot] == NULL ) )
+ if( prpl == NULL )
{
irc_usermsg( irc, "Unknown protocol" );
return( 0 );
}
- if( prot == PROTO_OSCAR && cmd[5] == NULL )
- {
- irc_usermsg( irc, "Not enough parameters" );
- return( 0 );
- }
-
- a = account_add( irc, prot, cmd[3], cmd[4] );
+ a = account_add( irc, prpl, cmd[3], cmd[4] );
if( cmd[5] )
a->server = g_strdup( cmd[5] );
@@ -251,10 +243,7 @@ int cmd_account( irc_t *irc, char **cmd )
else
con = "";
- if( a->protocol == PROTO_OSCAR || a->protocol == PROTO_ICQ || a->protocol == PROTO_TOC )
- irc_usermsg( irc, "%2d. OSCAR, %s on %s%s", i, a->user, a->server, con );
- else
- irc_usermsg( irc, "%2d. %s, %s%s", i, proto_name[a->protocol], a->user, con );
+ irc_usermsg( irc, "%2d. %s, %s%s", i, a->prpl->name, a->user, con );
i ++;
}
@@ -371,7 +360,7 @@ int cmd_add( irc_t *irc, char **cmd )
}
else
{
- nick_set( irc, cmd[2], a->gc->protocol, cmd[3] );
+ nick_set( irc, cmd[2], a->gc->prpl, cmd[3] );
}
}
a->gc->prpl->add_buddy( a->gc, cmd[2] );
@@ -452,7 +441,7 @@ int cmd_rename( irc_t *irc, char **cmd )
}
else if( u->send_handler == buddy_send_handler )
{
- nick_set( irc, u->handle, u->gc->protocol, cmd[2] );
+ nick_set( irc, u->handle, u->gc->prpl, cmd[2] );
}
irc_usermsg( irc, "Nick successfully changed" );
@@ -663,21 +652,21 @@ int cmd_blist( irc_t *irc, char **cmd )
if( online == 1 ) for( u = irc->users; u; u = u->next ) if( u->gc && u->online && !u->away )
{
- g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, proto_name[u->gc->user->protocol] );
+ g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
irc_usermsg( irc, "%-16.16s %-40.40s %s", u->nick, s, "Online" );
n_online ++;
}
if( away == 1 ) for( u = irc->users; u; u = u->next ) if( u->gc && u->online && u->away )
{
- g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, proto_name[u->gc->user->protocol] );
+ g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
irc_usermsg( irc, "%-16.16s %-40.40s %s", u->nick, s, u->away );
n_away ++;
}
if( offline == 1 ) for( u = irc->users; u; u = u->next ) if( u->gc && !u->online )
{
- g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, proto_name[u->gc->user->protocol] );
+ g_snprintf( s, 63, "%s@%s (%s)", u->user, u->host, u->gc->user->prpl->name );
irc_usermsg( irc, "%-16.16s %-40.40s %s", u->nick, s, "Offline" );
n_offline ++;
}
@@ -738,7 +727,7 @@ int cmd_qlist( irc_t *irc, char **cmd )
for( num = 0; q; q = q->next, num ++ )
if( q->gc ) /* Not necessary yet, but it might come later */
- irc_usermsg( irc, "%d, %s(%s): %s", num, proto_name[q->gc->protocol], q->gc->username, q->question );
+ irc_usermsg( irc, "%d, %s(%s): %s", num, q->gc->prpl->name, q->gc->username, q->question );
else
irc_usermsg( irc, "%d, BitlBee: %s", num, q->question );
@@ -786,7 +775,7 @@ int cmd_import_buddies( irc_t *irc, char **cmd )
for( n = gc->irc->nicks; n; n = n->next )
{
- if( n->proto == gc->protocol && !user_findhandle( gc, n->handle ) )
+ if( n->proto == gc->prpl && !user_findhandle( gc, n->handle ) )
{
gc->prpl->add_buddy( gc, n->handle );
add_buddy( gc, NULL, n->handle, NULL );
diff --git a/configure b/configure
index 3c15e646..5d478010 100755
--- a/configure
+++ b/configure
@@ -13,6 +13,7 @@ etcdir='$prefix/etc/bitlbee/'
mandir='$prefix/share/man/'
datadir='$prefix/share/bitlbee/'
config='/var/lib/bitlbee/'
+plugindir='$prefix/lib/bitlbee'
msn=1
jabber=1
@@ -44,6 +45,7 @@ Option Description Default
--etcdir=... $etcdir
--mandir=... $mandir
--datadir=... $datadir
+--plugindir=... $plugindir
--config=... $config
--msn=0/1 Disable/enable MSN part $msn
@@ -72,6 +74,7 @@ etcdir=`eval echo "$etcdir/" | sed 's/\/\{1,\}/\//g'`
mandir=`eval echo "$mandir/" | sed 's/\/\{1,\}/\//g'`
datadir=`eval echo "$datadir/" | sed 's/\/\{1,\}/\//g'`
config=`eval echo "$config/" | sed 's/\/\{1,\}/\//g'`
+plugindir=`eval echo "$plugindir/" | sed 's/\/\{1,\}/\//g'`
cat<<EOF>Makefile.settings
## BitlBee settings, generated by configure
@@ -80,6 +83,7 @@ BINDIR=$bindir
ETCDIR=$etcdir
MANDIR=$mandir
DATADIR=$datadir
+PLUGINDIR=$plugindir
CONFIG=$config
ARCH=$arch
@@ -100,6 +104,7 @@ cat<<EOF>config.h
#define CONFIG "$config"
#define ETCDIR "$etcdir"
#define VARDIR "$datadir"
+#define PLUGINDIR "$plugindir"
#define ARCH "$arch"
#define CPU "$cpu"
EOF
@@ -142,8 +147,8 @@ fi
if type pkg-config > /dev/null 2>/dev/null && pkg-config glib-2.0; then
cat<<EOF>>Makefile.settings
-EFLAGS+=`pkg-config --libs glib-2.0`
-CFLAGS+=`pkg-config --cflags glib-2.0`
+EFLAGS+=`pkg-config --libs glib-2.0 gmodule-2.0`
+CFLAGS+=`pkg-config --cflags glib-2.0 gmodule-2.0`
EOF
echo '#define GLIB2' >> config.h
elif type glib-config > /dev/null 2> /dev/null; then
diff --git a/doc/BUILD.win32 b/doc/BUILD.win32
new file mode 100644
index 00000000..03e1b8d9
--- /dev/null
+++ b/doc/BUILD.win32
@@ -0,0 +1,23 @@
+Instructions for building the Bitlbee Win32 port
+================================================
+
+1. Download the latest version using bzr (http://www.bazaar-ng.org/):
+ bzr branch http://jelmer.vernstok.nl/oss/bitlbee/bzr/win32 bitlbee-win32
+2. Download and install the required development files:
+ from ftp://ftp.gtk.org/pub/gtk/v2.8/win32/
+ - glib
+ - glib-dev
+ - libiconv
+ - gettext
+ from http://ftp.mozilla.org/pub/mozilla.org/
+ - nss
+ - nspr
+
+I've put them inside c:\dev, so you might have the most with that location.
+
+3. Open bitlbee.dsw in VC++ and build :-)
+
+4. Now you're done. When running, make sure all the required DLL's are accessible. If they can't be found, place them inside c:\winnt\system32 or the Debug or Release directories inside bitlbee-...\win32\.
+
+5. To build setup files, compile the bitlbee.iss file using the Inno Setup
+ program (available from www.jrsoftware.org).
diff --git a/doc/example_plugin.c b/doc/example_plugin.c
new file mode 100644
index 00000000..38d02260
--- /dev/null
+++ b/doc/example_plugin.c
@@ -0,0 +1,13 @@
+/*
+ * This is the most simple possible BitlBee plugin. To use, compile it as
+ * a shared library and place it in the plugin directory:
+ *
+ * gcc -o example.so -shared example.c
+ * cp example.so /usr/local/lib/bitlbee
+ */
+#include <stdio.h>
+
+void init_plugin(void)
+{
+ printf("I am a BitlBee plugin!\n");
+}
diff --git a/irc.c b/irc.c
index 1d908382..f5448495 100644
--- a/irc.c
+++ b/irc.c
@@ -1164,7 +1164,7 @@ void irc_whois( irc_t *irc, char *nick )
if( u->gc )
irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->user->username,
- *u->gc->user->proto_opt[0] ? u->gc->user->proto_opt[0] : "", proto_name[u->gc->user->protocol] );
+ *u->gc->user->proto_opt[0] ? u->gc->user->proto_opt[0] : "", u->gc->prpl->name );
else
irc_reply( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO );
diff --git a/nick.c b/nick.c
index ebf156c3..1376f365 100644
--- a/nick.c
+++ b/nick.c
@@ -26,7 +26,7 @@
#define BITLBEE_CORE
#include "bitlbee.h"
-void nick_set( irc_t *irc, char *handle, int proto, char *nick )
+void nick_set( irc_t *irc, char *handle, struct prpl *proto, char *nick )
{
nick_t *m = NULL, *n = irc->nicks;
@@ -55,7 +55,7 @@ void nick_set( irc_t *irc, char *handle, int proto, char *nick )
nick_strip( n->nick );
}
-char *nick_get( irc_t *irc, char *handle, int proto, const char *realname )
+char *nick_get( irc_t *irc, char *handle, struct prpl *proto, const char *realname )
{
static char nick[MAX_NICK_LENGTH+1];
nick_t *n = irc->nicks;
diff --git a/nick.h b/nick.h
index 5e53694c..d48369c6 100644
--- a/nick.h
+++ b/nick.h
@@ -26,13 +26,13 @@
typedef struct __NICK
{
char *handle;
- int proto;
+ struct prpl *proto;
char *nick;
struct __NICK *next;
} nick_t;
-void nick_set( irc_t *irc, char *handle, int proto, char *nick );
-char *nick_get( irc_t *irc, char *handle, int proto, const char *realname );
+void nick_set( irc_t *irc, char *handle, struct prpl *proto, char *nick );
+char *nick_get( irc_t *irc, char *handle, struct prpl *proto, const char *realname );
void nick_del( irc_t *irc, char *nick );
void nick_strip( char *nick );
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index d8d77a36..413f77ef 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -157,11 +157,6 @@ struct jabber_chat {
#define JCS_CLOSED 3 /* closed */
-static char *jabber_name()
-{
- return "Jabber";
-}
-
#define STATE_EVT(arg) if(gjc->on_state) { (gjc->on_state)(gjc, (arg) ); }
static void jabber_remove_buddy(struct gaim_connection *gc, char *name, char *group);
@@ -2364,13 +2359,13 @@ static GList *jabber_actions()
return m;
}
-static struct prpl *my_protocol = NULL;
-void jabber_init(struct prpl *ret)
+void jabber_init()
{
+ struct prpl *ret = g_new0(struct prpl, 1);
+
/* the NULL's aren't required but they're nice to have */
- ret->protocol = PROTO_JABBER;
- ret->name = jabber_name;
+ ret->name = "jabber";
ret->away_states = jabber_away_states;
ret->actions = jabber_actions;
ret->login = jabber_login;
@@ -2394,5 +2389,5 @@ void jabber_init(struct prpl *ret)
ret->group_buddy = jabber_group_change;
ret->cmp_buddynames = g_strcasecmp;
- my_protocol = ret;
+ register_protocol (ret);
}
diff --git a/protocols/msn/msn.c b/protocols/msn/msn.c
index bc2f1235..b828d31c 100644
--- a/protocols/msn/msn.c
+++ b/protocols/msn/msn.c
@@ -26,8 +26,6 @@
#include "nogaim.h"
#include "msn.h"
-static struct prpl *my_protocol = NULL;
-
static void msn_login( struct aim_user *acct )
{
struct gaim_connection *gc = new_gaim_conn( acct );
@@ -374,9 +372,10 @@ static int msn_send_typing( struct gaim_connection *gc, char *who, int typing )
return( 1 );
}
-void msn_init(struct prpl *ret)
+void msn_init()
{
- ret->protocol = PROTO_MSN;
+ struct prpl *ret = g_new0(struct prpl, 1);
+ ret->name = "msn";
ret->login = msn_login;
ret->close = msn_close;
ret->send_im = msn_send_im;
@@ -399,5 +398,5 @@ void msn_init(struct prpl *ret)
ret->send_typing = msn_send_typing;
ret->cmp_buddynames = g_strcasecmp;
- my_protocol = ret;
+ register_protocol(ret);
}
diff --git a/protocols/nogaim.c b/protocols/nogaim.c
index 101cbb14..474b91b2 100644
--- a/protocols/nogaim.c
+++ b/protocols/nogaim.c
@@ -38,9 +38,6 @@
#include <ctype.h>
#include <iconv.h>
-struct prpl *proto_prpl[PROTO_MAX];
-char proto_name[PROTO_MAX][8] = { "TOC", "OSCAR", "YAHOO", "ICQ", "MSN", "", "", "", "JABBER", "", "", "", "", "", "", "" };
-
static char *proto_away_alias[7][5] =
{
{ "Away from computer", "Away", "Extended away", NULL },
@@ -57,30 +54,95 @@ static int remove_chat_buddy_silent( struct conversation *b, char *handle );
GSList *connections;
+gboolean load_plugin(char *path)
+{
+ void (*init_function) (void);
+
+ GModule *mod = g_module_open(path, G_MODULE_BIND_LAZY);
+
+ if(!mod) {
+ log_message(LOGLVL_ERROR, "Can't find `%s', not loading", path);
+ return FALSE;
+ }
+
+ if(!g_module_symbol(mod,"init_plugin",(gpointer *) &init_function)) {
+ log_message(LOGLVL_WARNING, "Can't find function `init_plugin' in `%s'\n", path);
+ return FALSE;
+ }
+
+ init_function();
+
+ return TRUE;
+}
/* nogaim.c */
+GList *protocols = NULL;
+
+void register_protocol (struct prpl *p)
+{
+ protocols = g_list_append(protocols, p);
+}
+
+
+struct prpl *find_protocol(const char *name)
+{
+ GList *gl;
+ for (gl = protocols; gl; gl = gl->next)
+ {
+ struct prpl *proto = gl->data;
+ if(!g_strcasecmp(proto->name, name))
+ return proto;
+ }
+ return NULL;
+}
+
+/* nogaim.c */
void nogaim_init()
{
- proto_prpl[PROTO_MSN] = g_new0 ( struct prpl, 1 );
+ GDir *dir;
+ GError *error = NULL;
+
#ifdef WITH_MSN
- msn_init( proto_prpl[PROTO_MSN] );
+ extern void msn_init();
+ msn_init();
#endif
- proto_prpl[PROTO_OSCAR] = g_new0( struct prpl, 1 );
#ifdef WITH_OSCAR
- oscar_init( proto_prpl[PROTO_OSCAR] );
+ extern void oscar_init();
+ oscar_init();
#endif
- proto_prpl[PROTO_YAHOO] = g_new0( struct prpl, 1 );
#ifdef WITH_YAHOO
- byahoo_init( proto_prpl[PROTO_YAHOO] );
+ extern void byahoo_init();
+ byahoo_init();
#endif
- proto_prpl[PROTO_JABBER] = g_new0( struct prpl, 1 );
#ifdef WITH_JABBER
- jabber_init( proto_prpl[PROTO_JABBER] );
+ extern void jabber_init();
+ jabber_init();
#endif
+
+ dir = g_dir_open(PLUGINDIR, 0, &error);
+
+ if (dir) {
+ const gchar *entry;
+ char *path;
+
+ while ((entry = g_dir_read_name(dir))) {
+ path = g_build_filename(PLUGINDIR, entry, NULL);
+ if(!path) {
+ log_message(LOGLVL_WARNING, "Can't build path for %s\n", entry);
+ continue;
+ }
+
+ load_plugin(path);
+
+ g_free(path);
+ }
+
+ g_dir_close(dir);
+ }
}
GSList *get_connections() { return connections; }
@@ -171,8 +233,7 @@ struct gaim_connection *new_gaim_conn( struct aim_user *user )
gc = g_new0( struct gaim_connection, 1 );
- gc->protocol = user->protocol;
- gc->prpl = proto_prpl[gc->protocol];
+ gc->prpl = user->prpl;
g_snprintf( gc->username, sizeof( gc->username ), "%s", user->username );
g_snprintf( gc->password, sizeof( gc->password ), "%s", user->password );
/* [MD] BUGFIX: don't set gc->irc to the global IRC, but use the one from the struct aim_user.
@@ -253,14 +314,14 @@ void serv_got_crap( struct gaim_connection *gc, char *format, ... )
/* Try to find a different connection on the same protocol. */
for( a = gc->irc->accounts; a; a = a->next )
- if( proto_prpl[a->protocol] == gc->prpl && a->gc != gc )
+ if( a->prpl == gc->prpl && a->gc != gc )
break;
/* If we found one, add the screenname to the acc_id. */
if( a )
- g_snprintf( acc_id, 32, "%s(%s)", proto_name[gc->protocol], gc->username );
+ g_snprintf( acc_id, 32, "%s(%s)", gc->prpl->name, gc->username );
else
- g_snprintf( acc_id, 32, "%s", proto_name[gc->protocol] );
+ g_snprintf( acc_id, 32, "%s", gc->prpl->name );
irc_usermsg( gc->irc, "%s - %s", acc_id, msg );
}
@@ -294,7 +355,7 @@ void account_online( struct gaim_connection *gc )
if( u && u->away ) proto_away( gc, u->away );
- if( gc->protocol == PROTO_ICQ )
+ if( !strcmp(gc->prpl->name, "icq") )
{
for( u = gc->irc->users; u; u = u->next )
if( u->gc == gc )
@@ -422,7 +483,7 @@ void add_buddy( struct gaim_connection *gc, char *group, char *handle, char *rea
}
memset( nick, 0, MAX_NICK_LENGTH + 1 );
- strcpy( nick, nick_get( gc->irc, handle, gc->protocol, realname ) );
+ strcpy( nick, nick_get( gc->irc, handle, gc->prpl, realname ) );
u = user_add( gc->irc, nick );
@@ -446,7 +507,7 @@ void add_buddy( struct gaim_connection *gc, char *group, char *handle, char *rea
}
else
{
- u->host = g_strdup( proto_name[gc->user->protocol] );
+ u->host = g_strdup( gc->user->prpl->name );
u->user = g_strdup( handle );
}
@@ -575,11 +636,11 @@ void serv_got_update( struct gaim_connection *gc, char *handle, int loggedin, in
remove_chat_buddy_silent( c, handle );
}
- if( ( type & UC_UNAVAILABLE ) && ( gc->protocol == PROTO_OSCAR || gc->protocol == PROTO_TOC ) )
+ if( ( type & UC_UNAVAILABLE ) && ( !strcmp(gc->prpl->name, "oscar") || !strcmp(gc->prpl->name, "icq")) )
{
u->away = g_strdup( "Away" );
}
- else if( ( type & UC_UNAVAILABLE ) && ( gc->protocol == PROTO_JABBER ) )
+ else if( ( type & UC_UNAVAILABLE ) && ( !strcmp(gc->prpl->name, "jabber") ) )
{
if( type & UC_DND )
u->away = g_strdup( "Do Not Disturb" );
diff --git a/protocols/nogaim.h b/protocols/nogaim.h
index 5fc9aca5..3d5006d9 100644
--- a/protocols/nogaim.h
+++ b/protocols/nogaim.h
@@ -71,7 +71,6 @@
struct gaim_connection {
/* we need to do either oscar or TOC */
/* we make this as an int in case if we want to add more protocols later */
- int protocol;
struct prpl *prpl;
guint32 flags;
@@ -151,7 +150,7 @@ struct aim_user {
char password[32];
char user_info[2048];
int options;
- int protocol;
+ struct prpl *prpl;
/* prpls can use this to save information about the user,
* like which server to connect to, etc */
char proto_opt[7][256];
@@ -160,10 +159,28 @@ struct aim_user {
irc_t *irc;
};
+struct ft
+{
+ const char *filename;
+
+ /* Total number of bytes in file */
+ size_t total_bytes;
+
+ /* Current number of bytes received */
+ size_t cur_bytes;
+};
+
+struct ft_request
+{
+ const char *filename;
+ struct gaim_connection *gc;
+};
+
+typedef void (*ft_recv_handler) (struct ft *, void *data, size_t len);
+
struct prpl {
- int protocol;
int options;
- char *(* name)();
+ const char *name;
/* for ICQ and Yahoo, who have off/on per-conversation options */
/* char *checkbox; this should be per-connection */
@@ -216,6 +233,11 @@ struct prpl {
/* change a buddy's group on a server list/roster */
void (* group_buddy) (struct gaim_connection *, char *who, char *old_group, char *new_group);
+ /* file transfers */
+ struct ft_send_req *(* req_send_file) (struct gaim_connection *, const char *file);
+ void (* send_file_part) (struct gaim_connection *, struct ft*, void *data, size_t length);
+ void (* accept_recv_file) (struct gaim_connection *, struct ft*, ft_recv_handler);
+
void (* buddy_free) (struct buddy *);
char *(* get_status_string) (struct gaim_connection *gc, int stat);
@@ -223,22 +245,6 @@ struct prpl {
int (* cmp_buddynames) (const char *who1, const char *who2);
};
-#define PROTO_TOC 0
-#define PROTO_OSCAR 1
-#define PROTO_YAHOO 2
-#define PROTO_ICQ 3
-#define PROTO_MSN 4
-#define PROTO_IRC 5
-#define PROTO_FTP 6
-#define PROTO_VGATE 7
-#define PROTO_JABBER 8
-#define PROTO_NAPSTER 9
-#define PROTO_ZEPHYR 10
-#define PROTO_GADUGADU 11
-#define PROTO_MAX 16
-
-extern char proto_name[PROTO_MAX][8];
-
#define UC_UNAVAILABLE 1
/* JABBER */
@@ -248,7 +254,8 @@ extern char proto_name[PROTO_MAX][8];
#define UC_DND (0x10 | UC_UNAVAILABLE)
G_MODULE_EXPORT GSList *get_connections();
-extern struct prpl *proto_prpl[16];
+G_MODULE_EXPORT struct prpl *find_protocol(const char *name);
+G_MODULE_EXPORT void register_protocol(struct prpl *);
/* nogaim.c */
int serv_send_im(irc_t *irc, user_t *u, char *msg, int flags);
@@ -318,25 +325,11 @@ G_MODULE_EXPORT void strip_html( char *msg );
G_MODULE_EXPORT char * escape_html(const char *html);
G_MODULE_EXPORT void info_string_append(GString *str, char *newline, char *name, char *value);
-#ifdef WITH_MSN
-/* msn.c */
-G_MODULE_EXPORT void msn_init( struct prpl *ret );
-#endif
-
-#ifdef WITH_OSCAR
-/* oscar.c */
-G_MODULE_EXPORT void oscar_init( struct prpl *ret );
-#endif
-
-#ifdef WITH_JABBER
-/* jabber.c */
-G_MODULE_EXPORT void jabber_init( struct prpl *ret );
-#endif
-
-#ifdef WITH_YAHOO
-/* yahoo.c */
-G_MODULE_EXPORT void byahoo_init( struct prpl *ret );
-#endif
+/* file transfers */
+G_MODULE_EXPORT void ft_progress( struct ft *, int);
+G_MODULE_EXPORT void ft_incoming( struct ft_request * );
+G_MODULE_EXPORT void ft_accepted( struct ft_request *, struct ft *);
+G_MODULE_EXPORT void ft_denied( struct ft_request *, const char *reason);
/* prefs.c */
G_MODULE_EXPORT void build_block_list();
diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c
index 76d61b13..538f47ae 100644
--- a/protocols/oscar/oscar.c
+++ b/protocols/oscar/oscar.c
@@ -357,10 +357,8 @@ static void oscar_login(struct aim_user *user) {
if (isdigit(*user->username)) {
odata->icq = TRUE;
/* this is odd but it's necessary for a proper do_import and do_export */
- gc->protocol = PROTO_ICQ;
gc->password[8] = 0;
} else {
- gc->protocol = PROTO_TOC;
gc->flags |= OPT_CONN_HTML;
}
@@ -2483,10 +2481,10 @@ int oscar_send_typing(struct gaim_connection *gc, char * who, int typing)
return( aim_im_sendmtn(od->sess, 1, who, typing ? 0x0002 : 0x0000) );
}
-static struct prpl *my_protocol = NULL;
-
-void oscar_init(struct prpl *ret) {
- ret->protocol = PROTO_OSCAR;
+void oscar_init()
+{
+ struct prpl *ret = g_new0(struct prpl, 1);
+ ret->name = "oscar";
ret->away_states = oscar_away_states;
ret->login = oscar_login;
ret->close = oscar_close;
@@ -2504,8 +2502,7 @@ void oscar_init(struct prpl *ret) {
ret->keepalive = oscar_keepalive;
ret->cmp_buddynames = aim_sncmp;
ret->get_status_string = oscar_get_status_string;
-
ret->send_typing = oscar_send_typing;
- my_protocol = ret;
+ register_protocol(ret);
}
diff --git a/protocols/proxy.c b/protocols/proxy.c
index 59b480f4..6d450c92 100644
--- a/protocols/proxy.c
+++ b/protocols/proxy.c
@@ -49,16 +49,6 @@
#define GAIM_WRITE_COND (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL)
#define GAIM_ERR_COND (G_IO_HUP | G_IO_ERR | G_IO_NVAL)
-/*FIXME*
- #ifndef _WIN32
- if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
- closesocket(fd);
- g_free(phb);
- return -1;
- }
- fcntl(fd, F_SETFL, 0);
-#endif*/
-
char proxyhost[128] = "";
int proxyport = 0;
int proxytype = PROXY_NONE;
diff --git a/protocols/yahoo/yahoo.c b/protocols/yahoo/yahoo.c
index d7f7d1dc..e55b30af 100644
--- a/protocols/yahoo/yahoo.c
+++ b/protocols/yahoo/yahoo.c
@@ -63,12 +63,6 @@ struct byahoo_conf_invitation
struct gaim_connection *gc;
};
-static char *yahoo_name()
-{
- return "Yahoo";
-}
-
-static struct prpl *my_protocol = NULL;
static GSList *byahoo_inputs = NULL;
static int byahoo_chat_id = 0;
@@ -395,15 +389,14 @@ static int byahoo_chat_open( struct gaim_connection *gc, char *who )
return( 1 );
}
-void byahoo_init( struct prpl *ret )
+void byahoo_init( )
{
- ret->protocol = PROTO_YAHOO;
- ret->name = yahoo_name;
+ struct prpl *ret = g_new0(struct prpl, 1);
+ ret->name = "yahoo";
ret->login = byahoo_login;
ret->close = byahoo_close;
ret->send_im = byahoo_send_im;
- ret->send_typing = byahoo_send_typing;
ret->get_info = byahoo_get_info;
ret->away_states = byahoo_away_states;
ret->set_away = byahoo_set_away;
@@ -411,6 +404,7 @@ void byahoo_init( struct prpl *ret )
ret->add_buddy = byahoo_add_buddy;
ret->remove_buddy = byahoo_remove_buddy;
ret->get_status_string = byahoo_get_status_string;
+ ret->send_typing = byahoo_send_typing;
ret->chat_send = byahoo_chat_send;
ret->chat_invite = byahoo_chat_invite;
@@ -418,7 +412,7 @@ void byahoo_init( struct prpl *ret )
ret->chat_open = byahoo_chat_open;
ret->cmp_buddynames = g_strcasecmp;
- my_protocol = ret;
+ register_protocol(ret);
}
static struct gaim_connection *byahoo_get_gc_by_id( int id )
@@ -432,7 +426,7 @@ static struct gaim_connection *byahoo_get_gc_by_id( int id )
gc = l->data;
yd = gc->proto_data;
- if( gc->protocol == PROTO_YAHOO && yd->y2_id == id )
+ if( !strcmp(gc->prpl->name, "yahoo") && yd->y2_id == id )
return( gc );
}
diff --git a/unix.c b/unix.c
index c4b3975e..c108528a 100644
--- a/unix.c
+++ b/unix.c
@@ -46,8 +46,9 @@ int main( int argc, char *argv[] )
global.loop = g_main_new( FALSE );
log_init( );
- nogaim_init( );
-
+
+ nogaim_init();
+
CONF_FILE = g_strdup( CONF_FILE_DEF );
global.helpfile = g_strdup( HELP_FILE );
@@ -58,12 +59,18 @@ int main( int argc, char *argv[] )
if( global.conf->runmode == RUNMODE_INETD )
{
+ log_link( LOGLVL_ERROR, LOGOUTPUT_IRC );
+ log_link( LOGLVL_WARNING, LOGOUTPUT_IRC );
+
i = bitlbee_inetd_init();
log_message( LOGLVL_INFO, "Bitlbee %s starting in inetd mode.", BITLBEE_VERSION );
}
else if( global.conf->runmode == RUNMODE_DAEMON )
{
+ log_link( LOGLVL_ERROR, LOGOUTPUT_SYSLOG );
+ log_link( LOGLVL_WARNING, LOGOUTPUT_SYSLOG );
+
i = bitlbee_daemon_init();
log_message( LOGLVL_INFO, "Bitlbee %s starting in daemon mode.", BITLBEE_VERSION );
}
diff --git a/url.h b/url.h
index 6555d15d..c8426876 100644
--- a/url.h
+++ b/url.h
@@ -25,7 +25,8 @@
#include "bitlbee.h"
-#define PROTO_HTTP 2
+#define PROTO_FTP 1
+#define PROTO_HTTP 2
#define PROTO_SOCKS4 3
#define PROTO_SOCKS5 4
#define PROTO_DEFAULT PROTO_HTTP
diff --git a/win32.c b/win32.c
new file mode 100644
index 00000000..63148271
--- /dev/null
+++ b/win32.c
@@ -0,0 +1,315 @@
+ /********************************************************************\
+ * BitlBee -- An IRC to other IM-networks gateway *
+ * *
+ * Copyright 2002-2004 Wilmer van der Gaast and others *
+ \********************************************************************/
+
+/* Main file (Windows specific part) */
+
+/*
+ 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 with
+ the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
+ if not, write to the Free Software Foundation, Inc., 59 Temple Place,
+ Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#define BITLBEE_CORE
+#include "bitlbee.h"
+#include "commands.h"
+#include "crypting.h"
+#include "protocols/nogaim.h"
+#include "help.h"
+#include <signal.h>
+#include <windows.h>
+
+global_t global; /* Against global namespace pollution */
+
+static void WINAPI service_ctrl (DWORD dwControl)
+{
+ switch (dwControl)
+ {
+ case SERVICE_CONTROL_STOP:
+ /* FIXME */
+ break;
+
+ case SERVICE_CONTROL_INTERROGATE:
+ break;
+
+ default:
+ break;
+
+ }
+}
+
+static void bitlbee_init(int argc, char **argv)
+{
+ int i = -1;
+ memset( &global, 0, sizeof( global_t ) );
+
+ global.loop = g_main_new( FALSE );
+
+ global.conf = conf_load( argc, argv );
+ if( global.conf == NULL )
+ return;
+
+ if( global.conf->runmode == RUNMODE_INETD )
+ {
+ i = bitlbee_inetd_init();
+ log_message( LOGLVL_INFO, "Bitlbee %s starting in inetd mode.", BITLBEE_VERSION );
+
+ }
+ else if( global.conf->runmode == RUNMODE_DAEMON )
+ {
+ i = bitlbee_daemon_init();
+ log_message( LOGLVL_INFO, "Bitlbee %s starting in daemon mode.", BITLBEE_VERSION );
+ }
+ else
+ {
+ log_message( LOGLVL_INFO, "No bitlbee mode specified...");
+ }
+
+ if( i != 0 )
+ return;
+
+ if( access( global.conf->configdir, F_OK ) != 0 )
+ log_message( LOGLVL_WARNING, "The configuration directory %s does not exist. Configuration won't be saved.", global.conf->configdir );
+ else if( access( global.conf->configdir, 06 ) != 0 )
+ log_message( LOGLVL_WARNING, "Permission problem: Can't read/write from/to %s.", global.conf->configdir );
+ if( help_init( &(global.help) ) == NULL )
+ log_message( LOGLVL_WARNING, "Error opening helpfile %s.", global.helpfile );
+}
+
+void service_main (DWORD argc, LPTSTR *argv)
+{
+ SERVICE_STATUS_HANDLE handle;
+ SERVICE_STATUS status;
+
+ handle = RegisterServiceCtrlHandler("bitlbee", service_ctrl);
+
+ if (!handle)
+ return;
+
+ status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ status.dwServiceSpecificExitCode = 0;
+
+ bitlbee_init(argc, argv);
+
+ SetServiceStatus(handle, &status);
+
+ g_main_run( global.loop );
+}
+
+SERVICE_TABLE_ENTRY dispatch_table[] =
+{
+ { TEXT("bitlbee"), (LPSERVICE_MAIN_FUNCTION)service_main },
+ { NULL, NULL }
+};
+
+static int debug = 0;
+
+static void usage()
+{
+ printf("Options:\n");
+ printf("-h Show this help message\n");
+ printf("-d Debug mode (simple console program)\n");
+}
+
+int main( int argc, char **argv)
+{
+ int i;
+ WSADATA WSAData;
+
+ nogaim_init( );
+
+ for (i = 1; i < argc; i++) {
+ if (!strcmp(argv[i], "-d")) debug = 1;
+ if (!strcmp(argv[i], "-h")) {
+ usage();
+ return 0;
+ }
+ }
+
+ WSAStartup(MAKEWORD(1,1), &WSAData);
+
+ if (!debug) {
+ if (!StartServiceCtrlDispatcher(dispatch_table))
+ log_message( LOGLVL_ERROR, "StartServiceCtrlDispatcher failed.");
+ } else {
+ bitlbee_init(argc, argv);
+ g_main_run( global.loop );
+ }
+
+ return 0;
+}
+
+double gettime()
+{
+ return (GetTickCount() / 1000);
+}
+
+void conf_get_string(HKEY section, const char *name, const char *def, char **dest)
+{
+ char buf[4096];
+ long x;
+ if (RegQueryValue(section, name, buf, &x) == ERROR_SUCCESS) {
+ *dest = g_strdup(buf);
+ } else if (!def) {
+ *dest = NULL;
+ } else {
+ *dest = g_strdup(def);
+ }
+}
+
+
+void conf_get_int(HKEY section, const char *name, int def, int *dest)
+{
+ char buf[20];
+ long x;
+ DWORD y;
+ if (RegQueryValue(section, name, buf, &x) == ERROR_SUCCESS) {
+ memcpy(&y, buf, sizeof(DWORD));
+ *dest = y;
+ } else {
+ *dest = def;
+ }
+}
+
+conf_t *conf_load( int argc, char *argv[] )
+{
+ conf_t *conf;
+ HKEY key, key_main, key_proxy;
+ char *tmp;
+
+ RegOpenKey(HKEY_CURRENT_USER, "SOFTWARE\\Bitlbee", &key);
+ RegOpenKey(key, "main", &key_main);
+ RegOpenKey(key, "proxy", &key_proxy);
+
+ memset( &global, 0, sizeof( global_t ) );
+ global.loop = g_main_new(FALSE);
+
+ conf = g_new0( conf_t,1 );
+ global.conf = conf;
+ conf_get_string(key_main, "interface", "0.0.0.0", &global.conf->iface);
+ conf_get_int(key_main, "port", 6667, &global.conf->port);
+ conf_get_int(key_main, "verbose", 0, &global.conf->verbose);
+ conf_get_string(key_main, "password", "", &global.conf->password);
+ conf_get_int(key_main, "ping_interval_timeout", 60, &global.conf->ping_interval);
+ conf_get_string(key_main, "hostname", "localhost", &global.conf->hostname);
+ conf_get_string(key_main, "configdir", NULL, &global.conf->configdir);
+ conf_get_string(key_main, "motdfile", NULL, &global.conf->motdfile);
+ conf_get_string(key_main, "helpfile", NULL, &global.helpfile);
+ global.conf->runmode = RUNMODE_DAEMON;
+ conf_get_int(key_main, "AuthMode", AUTHMODE_OPEN, &global.conf->authmode);
+ conf_get_string(key_proxy, "host", "", &tmp); strcpy(proxyhost, tmp);
+ conf_get_string(key_proxy, "user", "", &tmp); strcpy(proxyuser, tmp);
+ conf_get_string(key_proxy, "password", "", &tmp); strcpy(proxypass, tmp);
+ conf_get_int(key_proxy, "type", PROXY_NONE, &proxytype);
+ conf_get_int(key_proxy, "port", 3128, &proxyport);
+
+ RegCloseKey(key);
+ RegCloseKey(key_main);
+ RegCloseKey(key_proxy);
+
+ return conf;
+}
+
+void conf_loaddefaults( irc_t *irc )
+{
+ HKEY key_defaults;
+ int i;
+ char name[4096], data[4096];
+ DWORD namelen = sizeof(name), datalen = sizeof(data);
+ DWORD type;
+ if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Bitlbee\\defaults", &key_defaults) != ERROR_SUCCESS) {
+ return;
+ }
+
+ for (i = 0; RegEnumValue(key_defaults, i, name, &namelen, NULL, &type, data, &datalen) == ERROR_SUCCESS; i++) {
+ set_t *s = set_find( irc, name );
+
+ if( s )
+ {
+ if( s->def ) g_free( s->def );
+ s->def = g_strdup( data );
+ }
+
+ namelen = sizeof(name);
+ datalen = sizeof(data);
+ }
+
+ RegCloseKey(key_defaults);
+}
+
+#ifndef INADDR_NONE
+#define INADDR_NONE 0xffffffff
+#endif
+
+int
+inet_aton(const char *cp, struct in_addr *addr)
+{
+ addr->s_addr = inet_addr(cp);
+ return (addr->s_addr == INADDR_NONE) ? 0 : 1;
+}
+
+void log_error(char *msg)
+{
+ log_message(LOGLVL_ERROR, "%s", msg);
+}
+
+void log_message(int level, char *message, ...)
+{
+ HANDLE hEventSource;
+ LPTSTR lpszStrings[2];
+ WORD elevel;
+ va_list ap;
+
+ va_start(ap, message);
+
+ if (debug) {
+ vprintf(message, ap);
+ putchar('\n');
+ va_end(ap);
+ return;
+ }
+
+ hEventSource = RegisterEventSource(NULL, TEXT("bitlbee"));
+
+ lpszStrings[0] = TEXT("bitlbee");
+ lpszStrings[1] = g_strdup_vprintf(message, ap);
+ va_end(ap);
+
+ switch (level) {
+ case LOGLVL_ERROR: elevel = EVENTLOG_ERROR_TYPE; break;
+ case LOGLVL_WARNING: elevel = EVENTLOG_WARNING_TYPE; break;
+ case LOGLVL_INFO: elevel = EVENTLOG_INFORMATION_TYPE; break;
+#ifdef DEBUG
+ case LOGLVL_DEBUG: elevel = EVENTLOG_AUDIT_SUCCESS; break;
+#endif
+ }
+
+ if (hEventSource != NULL) {
+ ReportEvent(hEventSource,
+ elevel,
+ 0,
+ 0,
+ NULL,
+ 2,
+ 0,
+ lpszStrings,
+ NULL);
+
+ DeregisterEventSource(hEventSource);
+ }
+
+ g_free(lpszStrings[1]);
+}
diff --git a/win32/bitlbee.dsp b/win32/bitlbee.dsp
new file mode 100644
index 00000000..f08f64a9
--- /dev/null
+++ b/win32/bitlbee.dsp
@@ -0,0 +1,247 @@
+# Microsoft Developer Studio Project File - Name="bitlbee" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=bitlbee - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "bitlbee.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "bitlbee.mak" CFG="bitlbee - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "bitlbee - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "bitlbee - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "bitlbee - Win32 Release"
+
+# PROP BASE Use_MFC 6
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 6
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x409 /d "NDEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib iconv.lib glib-2.0.lib gmodule-2.0.lib wsock32.lib advapi32.lib /nologo /machine:I386 /libpath:"release" /libpath:"deps\lib"
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF "$(CFG)" == "bitlbee - Win32 Debug"
+
+# PROP BASE Use_MFC 6
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 6
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_AFXDLL" /FR /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x409 /d "_DEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 iconv.lib glib-2.0.lib gmodule-2.0.lib wsock32.lib kernel32.lib user32.lib advapi32.lib /nologo /debug /machine:I386 /pdbtype:sept /libpath:"debug" /libpath:"deps\lib"
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "bitlbee - Win32 Release"
+# Name "bitlbee - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\account.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\bitlbee.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\commands.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\crypting.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\debug.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\help.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\irc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\md5.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\nick.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\nogaim.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\proxy.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\query.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\set.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\sha.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\user.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\util.c
+
+!IF "$(CFG)" == "bitlbee - Win32 Release"
+
+!ELSEIF "$(CFG)" == "bitlbee - Win32 Debug"
+
+# PROP Intermediate_Dir "Debugx"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=..\win32.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\account.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\bitlbee.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\commands.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\conf.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\config.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\crypting.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\help.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\ini.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\irc.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\log.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\md5.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\nick.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\nogaim.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\set.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\sha.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\sock.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\user.h
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/win32/bitlbee.dsw b/win32/bitlbee.dsw
new file mode 100644
index 00000000..7f446962
--- /dev/null
+++ b/win32/bitlbee.dsw
@@ -0,0 +1,119 @@
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "admin"=.\admin1\admin.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "bitlbee"=.\bitlbee.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "bitlbee_ssl"=.\bitlbee_ssl.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "jabber"=.\jabber.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name bitlbee
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name bitlbee_ssl
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "msn"=.\msn.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name bitlbee
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name bitlbee_ssl
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "oscar"=.\oscar.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name bitlbee
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "yahoo"=.\yahoo.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name bitlbee
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/win32/bitlbee.iss b/win32/bitlbee.iss
new file mode 100644
index 00000000..a9863f3b
--- /dev/null
+++ b/win32/bitlbee.iss
@@ -0,0 +1,73 @@
+; Inno setup script for Bitlbee
+; (C) 2004-2005 Jelmer Vernooij <jelmer@samba.org>
+
+[Setup]
+AppName=BitlBee
+AppPublisher=The BitlBee Team
+AppPublisherURL=http://www.bitlbee.org/
+AppSupportURL=http://win32.bitlbee.org/
+AppUpdatesURL=http://win32.bitlbee.org/
+AppCopyright=Copyright © 2002-2005 The BitlBee Team
+DefaultDirName={pf}\Bitlbee
+DefaultGroupName=Bitlbee
+LicenseFile=..\COPYING
+InfoAfterFile=README.TXT
+OutputDir=.
+AppVerName=Bitlbee-20050516
+OutputBaseFileName="BitlBee-setup"
+
+[Components]
+Name: main; Description: Main executable and files; Types: full compact custom; Flags: fixed;
+Name: "yahoo"; Description: Yahoo! Messenger support; Types: full;
+Name: "oscar"; Description: AIM/ICQ support; Types: full;
+Name: ssl; Description: SSL Support; Types: full;
+Name: "ssl\msn"; Description: MSN messenger support; Types: full;
+Name: "ssl\jabber"; Description: Jabber support; Types: full;
+Name: docs; Description: Documentation; Types: full;
+
+[Tasks]
+Name: startupicon; Description: "&Automatically start when the computer boots"; GroupDescription: "Other tasks:"; Flags: unchecked
+
+[Files]
+Source: "Release\bitlbee.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "Release\libmsn.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl\msn"
+Source: "Deps\lib\ssl3.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl"
+Source: "Deps\lib\nss3.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl"
+Source: "Deps\lib\nssckbi.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl"
+Source: "Deps\lib\smime3.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl"
+Source: "Deps\lib\softokn3.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl"
+Source: "Deps\lib\libplc4.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl"
+Source: "Deps\lib\libnspr4.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl"
+Source: "Release\libjabber.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl\jabber"
+Source: "Release\bitlbee_ssl.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "ssl"
+Source: "Deps\bin\libglib-2.0-0.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "Deps\bin\libgmodule-2.0-0.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "Release\liboscar.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "oscar"
+Source: "Deps\bin\intl.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "Deps\bin\iconv.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "Release\libyahoo.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: "yahoo"
+Source: "..\motd.txt"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "..\doc\help.txt"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "..\COPYING"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "..\doc\TODO"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "..\doc\README"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "..\doc\FAQ"; DestDir: "{app}"; Flags: ignoreversion; Components: docs;
+Source: "..\doc\CREDITS"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+; Source: "..\doc\user-guide.pdf"; DestDir: "{app}"; Flags: ignoreversion; Components: docs;
+Source: "..\doc\CHANGES"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+Source: "..\doc\AUTHORS"; DestDir: "{app}"; Flags: ignoreversion; Components: main;
+; NOTE: Don't use "Flags: ignoreversion" on any shared system files
+
+[Icons]
+Name: "{group}\Bitlbee"; Filename: "{app}\bitlbee.exe"
+Name: "{commonstartup}\Bitlbee"; Filename: "{app}\bitlbee.exe"; Tasks: startupicon
+
+
+[Run]
+; NOTE: The following entry contains an English phrase ("Launch"). You are free to translate it into another language if required.
+Filename: "{app}\bitlbee.exe"; Description: "Launch Bitlbee"; Flags: nowait postinstall skipifsilent
+
+[Registry]
+Root: HKLM; Subkey: "SOFTWARE\Bitlbee"; ValueType: string; ValueName: "helpfile"; ValueData: "{app}\help.txt"
+Root: HKLM; Subkey: "SOFTWARE\Bitlbee"; ValueType: string; ValueName: "motdfile"; ValueData: "{app}\motd.txt"
+Root: HKLM; Subkey: "SOFTWARE\Bitlbee"; ValueType: string; ValueName: "configdir"; ValueData: "{userappdata}\Bitlbee"
diff --git a/win32/bitlbee_ssl.dsp b/win32/bitlbee_ssl.dsp
new file mode 100644
index 00000000..5a4e764d
--- /dev/null
+++ b/win32/bitlbee_ssl.dsp
@@ -0,0 +1,99 @@
+# Microsoft Developer Studio Project File - Name="bitlbee_ssl" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=bitlbee_ssl - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "bitlbee_ssl.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "bitlbee_ssl.mak" CFG="bitlbee_ssl - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "bitlbee_ssl - Win32 Release" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "bitlbee_ssl - Win32 Debug" (based on\
+ "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "bitlbee_ssl - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libnspr4.lib nss3.lib ssl3.lib ws2_32.lib glib-2.0.lib /nologo /subsystem:windows /dll /machine:I386 /libpath:"release" /libpath:"deps\lib"
+
+!ELSEIF "$(CFG)" == "bitlbee_ssl - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib libnspr4.lib nss3.lib ssl3.lib ws2_32.lib glib-2.0.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"debug" /libpath:"deps\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "bitlbee_ssl - Win32 Release"
+# Name "bitlbee_ssl - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\protocols\ssl_client.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\ssl_nss.c
+# End Source File
+# End Target
+# End Project
diff --git a/win32/jabber.dsp b/win32/jabber.dsp
new file mode 100644
index 00000000..ce5b08c7
--- /dev/null
+++ b/win32/jabber.dsp
@@ -0,0 +1,228 @@
+# Microsoft Developer Studio Project File - Name="jabber" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=jabber - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "jabber.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "jabber.mak" CFG="jabber - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "jabber - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "jabber - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "jabber - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "jabrel"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\protocols\jabber" /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib iconv.lib glib-2.0.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release/libjabber.dll" /libpath:"release" /libpath:"deps\lib"
+
+!ELSEIF "$(CFG)" == "jabber - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "jabber__"
+# PROP BASE Intermediate_Dir "jabber__"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "jabdeb"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\protocols\jabber" /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 odbc32.lib glib-2.0.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbccp32.lib ws2_32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug/libjabber.dll" /pdbtype:sept /libpath:"debug" /libpath:"deps\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "jabber - Win32 Release"
+# Name "jabber - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\protocols\jabber\asciitab.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\expat.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\genhash.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\hashtable.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\hashtable.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\iasciitab.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\jabber.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\jabber.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\jconn.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\jid.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\jpacket.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\jutil.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\karma.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\latin1tab.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\libxode.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\log.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\log.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\nametab.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\pool.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\pproxy.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\rate.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\str.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\utf8tab.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xhash.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmldef.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmlnode.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmlparse.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmlparse.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmlrole.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmlrole.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmltok.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmltok.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xmltok_impl.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\jabber\xstream.c
+# End Source File
+# End Target
+# End Project
diff --git a/win32/msn.dsp b/win32/msn.dsp
new file mode 100644
index 00000000..4c5fcfb3
--- /dev/null
+++ b/win32/msn.dsp
@@ -0,0 +1,116 @@
+# Microsoft Developer Studio Project File - Name="msn" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=msn - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "msn.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "msn.mak" CFG="msn - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "msn - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "msn - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "msn - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "msnrel"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "e:\dev\include\nss" /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib iconv.lib glib-2.0.lib nss3.lib libnspr4.lib ssl3.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release/libmsn.dll" /libpath:"release" /libpath:"deps\lib"
+
+!ELSEIF "$(CFG)" == "msn - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "msn___Wi"
+# PROP BASE Intermediate_Dir "msn___Wi"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "msndeb"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 odbc32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbccp32.lib ws2_32.lib glib-2.0.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug/libmsn.dll" /pdbtype:sept /libpath:"debug" /libpath:"deps\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "msn - Win32 Release"
+# Name "msn - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\protocols\msn\msn.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\msn\msn_util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\msn\ns.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\msn\passport.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\msn\sb.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\msn\tables.c
+# End Source File
+# End Target
+# End Project
diff --git a/win32/oscar.dsp b/win32/oscar.dsp
new file mode 100644
index 00000000..aa2242ba
--- /dev/null
+++ b/win32/oscar.dsp
@@ -0,0 +1,204 @@
+# Microsoft Developer Studio Project File - Name="oscar" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=oscar - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "oscar.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "oscar.mak" CFG="oscar - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "oscar - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "oscar - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "oscar - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "oscarrel"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\protocols\oscar" /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib iconv.lib ws2_32.lib glib-2.0.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release/liboscar.dll" /libpath:"release" /libpath:"deps\lib"
+
+!ELSEIF "$(CFG)" == "oscar - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "oscar___"
+# PROP BASE Intermediate_Dir "oscar___"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "oscdeb"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\protocols\oscar" /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 gmodule-2.0.lib ws2_32.lib glib-2.0.lib iconv.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug/liboscar.dll" /pdbtype:sept /libpath:"debug" /libpath:"deps\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "oscar - Win32 Release"
+# Name "oscar - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\protocols\oscar\admin.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\aim.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\aim_cbtypes.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\aim_internal.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\auth.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\bos.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\buddylist.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\chat.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\chatnav.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\conn.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\faimconfig.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\ft.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\icq.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\im.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\info.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\misc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\msgcookie.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\oscar.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\oscar_util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\rxhandlers.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\rxqueue.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\search.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\service.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\snac.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\ssi.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\stats.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\tlv.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\oscar\txqueue.c
+# End Source File
+# End Target
+# End Project
diff --git a/win32/yahoo.dsp b/win32/yahoo.dsp
new file mode 100644
index 00000000..ebfc4eef
--- /dev/null
+++ b/win32/yahoo.dsp
@@ -0,0 +1,152 @@
+# Microsoft Developer Studio Project File - Name="yahoo" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=yahoo - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "yahoo.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "yahoo.mak" CFG="yahoo - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "yahoo - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "yahoo - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "yahoo - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "yahrel"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_CONFIG_H" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib iconv.lib glib-2.0.lib /nologo /subsystem:windows /dll /machine:I386 /out:"Release/libyahoo.dll" /libpath:"release" /libpath:"deps\lib"
+
+!ELSEIF "$(CFG)" == "yahoo - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "yahoo___"
+# PROP BASE Intermediate_Dir "yahoo___"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "yahdeb"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "." /I "..\protocols" /I ".." /I "deps\include" /I "deps\include\glib-2.0" /I "deps\lib\glib-2.0\include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_CONFIG_H" /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ws2_32.lib glib-2.0.lib gmodule-2.0.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug/libyahoo.dll" /pdbtype:sept /libpath:"debug" /libpath:"deps\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "yahoo - Win32 Release"
+# Name "yahoo - Win32 Debug"
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\crypt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\libyahoo2.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo2.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo2_callbacks.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo2_types.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_debug.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_fn.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_fn.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_httplib.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_httplib.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_list.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_list.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_util.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\protocols\yahoo\yahoo_util.h
+# End Source File
+# End Target
+# End Project