diff options
author | vanilla <vanilla@FreeBSD.org> | 2003-11-03 16:16:27 +0000 |
---|---|---|
committer | vanilla <vanilla@FreeBSD.org> | 2003-11-03 16:16:27 +0000 |
commit | 64ca24a450e7e0ed9c12b0cd643f93e214482144 (patch) | |
tree | 4f4265d6afdd9d24e645fdbad1c431a197469abc /net-im/centericq/files | |
parent | 05006e0da58c3464be429be090b836c140fae010 (diff) | |
download | FreeBSD-ports-64ca24a450e7e0ed9c12b0cd643f93e214482144.zip FreeBSD-ports-64ca24a450e7e0ed9c12b0cd643f93e214482144.tar.gz |
- Update from 4.9.7 to 4.9.8
- Add unofficial patch for MSN support
PR: ports/58869
Submitted by: maintainer
Diffstat (limited to 'net-im/centericq/files')
-rw-r--r-- | net-im/centericq/files/msn-Makefile.in | 32 | ||||
-rw-r--r-- | net-im/centericq/files/msn-abstracthook.cc | 20 | ||||
-rw-r--r-- | net-im/centericq/files/msn-config.h.in | 12 | ||||
-rw-r--r-- | net-im/centericq/files/msn-configure | 72 | ||||
-rw-r--r-- | net-im/centericq/files/msn-imcontroller.cc | 10 | ||||
-rw-r--r-- | net-im/centericq/files/msn-libmsn | 5986 | ||||
-rw-r--r-- | net-im/centericq/files/msn-msnhook.cc | 804 | ||||
-rw-r--r-- | net-im/centericq/files/msn-msnhook.h | 92 | ||||
-rw-r--r-- | net-im/centericq/files/msn-src::Makefile.in | 17 | ||||
-rw-r--r-- | net-im/centericq/files/msn-src::hooks::Makefile.in | 34 | ||||
-rw-r--r-- | net-im/centericq/files/patch-icqconf.cc | 11 | ||||
-rw-r--r-- | net-im/centericq/files/patch-msn_bittybits.C | 28 | ||||
-rw-r--r-- | net-im/centericq/files/patch-msn_core.C | 923 | ||||
-rw-r--r-- | net-im/centericq/files/patch-msn_core.h | 123 | ||||
-rw-r--r-- | net-im/centericq/files/patch-msn_interface.h | 20 | ||||
-rw-r--r-- | net-im/centericq/files/patch-msnhook.cc | 98 | ||||
-rw-r--r-- | net-im/centericq/files/patch-src:Makefile.in | 7 | ||||
-rw-r--r-- | net-im/centericq/files/patch-yahoohook.cc | 11 |
18 files changed, 7079 insertions, 1221 deletions
diff --git a/net-im/centericq/files/msn-Makefile.in b/net-im/centericq/files/msn-Makefile.in new file mode 100644 index 0000000..b7808b0 --- /dev/null +++ b/net-im/centericq/files/msn-Makefile.in @@ -0,0 +1,32 @@ +--- Makefile.in.orig Sat Oct 25 15:53:45 2003 ++++ Makefile.in Mon Nov 3 20:14:01 2003 +@@ -92,10 +92,10 @@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ + +-SUBDIRS = firetalk-0.1 kkconsui-0.1 kkstrtext-0.1 libicq2000-0.1 libjabber-0.1 libyahoo2-0.1 kksystr-0.1 connwrap-0.1 intl po contrib misc share src ++SUBDIRS = blip-0.1 firetalk-0.1 kkconsui-0.1 kkstrtext-0.1 libicq2000-0.1 libjabber-0.1 libyahoo2-0.1 kksystr-0.1 connwrap-0.1 intl po contrib misc share src + + # END OF MOTOR DIST TARGETS # +-EXTRA_DIST = centericq.1 centericq.motor config.rpath FAQ NEWS TODO README THANKS AUTHORS INSTALL ABOUT-NLS ChangeLog COPYING centericq.spec firetalk-0.1/* kkconsui-0.1/* kkstrtext-0.1/* libicq2000-0.1/* libjabber-0.1/* libyahoo2-0.1/* kksystr-0.1/* connwrap-0.1/* ++EXTRA_DIST = centericq.1 centericq.motor config.rpath FAQ NEWS TODO README THANKS AUTHORS INSTALL ABOUT-NLS ChangeLog COPYING centericq.spec blip-0.1/* firetalk-0.1/* kkconsui-0.1/* kkstrtext-0.1/* libicq2000-0.1/* libjabber-0.1/* libyahoo2-0.1/* kksystr-0.1/* connwrap-0.1/* + AUTOMAKE_OPTIONS = foreign + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +@@ -289,6 +289,7 @@ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign Makefile + $(mkinstalldirs) $(distdir)/connwrap-0.1 $(distdir)/firetalk-0.1 \ ++ $(distdir)/blip-0.1 \ + $(distdir)/kkconsui-0.1 $(distdir)/kkstrtext-0.1 \ + $(distdir)/kksystr-0.1 $(distdir)/libicq2000-0.1 \ + $(distdir)/libjabber-0.1 $(distdir)/libyahoo2-0.1 +@@ -388,7 +389,7 @@ + + dist-hook: + cd $(top_distdir); subs=`egrep "^[:space:]*SUBDIRS" Makefile.am | sed 's/SUBDIRS[ =]\+//g'`; \ +- echo "SUBDIRS = firetalk-0.1 kkconsui-0.1 kkstrtext-0.1 libicq2000-0.1 libjabber-0.1 libyahoo2-0.1 kksystr-0.1 connwrap-0.1 $$subs" >>.makefile.am; \ ++ echo "SUBDIRS = blip-0.1 firetalk-0.1 kkconsui-0.1 kkstrtext-0.1 libicq2000-0.1 libjabber-0.1 libyahoo2-0.1 kksystr-0.1 connwrap-0.1 $$subs" >>.makefile.am; \ + egrep -v "^[:space:]*SUBDIRS" Makefile.am >>.makefile.am; \ + mv .makefile.am Makefile.am; autoconf && automake + diff --git a/net-im/centericq/files/msn-abstracthook.cc b/net-im/centericq/files/msn-abstracthook.cc new file mode 100644 index 0000000..111e872 --- /dev/null +++ b/net-im/centericq/files/msn-abstracthook.cc @@ -0,0 +1,20 @@ +--- src/hooks/abstracthook.cc.orig Sun Oct 19 06:57:26 2003 ++++ src/hooks/abstracthook.cc Mon Nov 3 19:54:31 2003 +@@ -31,6 +31,7 @@ + #include "jabberhook.h" + #include "rsshook.h" + #include "ljhook.h" ++#include "msnhook.h" + + #include "md5.h" + +@@ -325,6 +326,9 @@ + #endif + #ifdef BUILD_LJ + case livejournal: return lhook; ++#endif ++#ifdef BUILD_MSN ++ case msn: return mhook; + #endif + } + diff --git a/net-im/centericq/files/msn-config.h.in b/net-im/centericq/files/msn-config.h.in new file mode 100644 index 0000000..44e77b5 --- /dev/null +++ b/net-im/centericq/files/msn-config.h.in @@ -0,0 +1,12 @@ +--- config.h.in.orig Thu Oct 16 06:07:45 2003 ++++ config.h.in Mon Nov 3 21:31:23 2003 +@@ -220,6 +220,9 @@ + /* use gnutls */ + #undef HAVE_GNUTLS + ++/* build with msn support */ ++#undef BUILD_MSN ++ + /* build with yahoo support */ + #undef BUILD_YAHOO + diff --git a/net-im/centericq/files/msn-configure b/net-im/centericq/files/msn-configure new file mode 100644 index 0000000..5fb5aa0 --- /dev/null +++ b/net-im/centericq/files/msn-configure @@ -0,0 +1,72 @@ +--- configure.orig Sat Oct 25 15:53:45 2003 ++++ configure Mon Nov 3 20:21:06 2003 +@@ -27,6 +27,8 @@ + ac_help="$ac_help + --with-libgnutls-extra-prefix=PFX Prefix where libgnutls-extra is installed (optional)" + ac_help="$ac_help ++ --enable-msn Build with MSN!" ++ac_help="$ac_help + --disable-yahoo Build without Yahoo!" + ac_help="$ac_help + --disable-aim Build without AIM" +@@ -2365,6 +2367,14 @@ + ;; + esac + ++# Check whether --enable-msn or --disable-msn was given. ++if test "${enable_msn+set}" = set; then ++ enableval="$enable_msn" ++ build_msn="$enableval" ++else ++ build_msn="yes" ++fi ++ + # Check whether --enable-yahoo or --disable-yahoo was given. + if test "${enable_yahoo+set}" = set; then + enableval="$enable_yahoo" +@@ -2424,6 +2434,13 @@ + + + ++if test "x$build_msn" = xyes; then ++ BUILD_MSN_TRUE= ++ BUILD_MSN_FALSE='#' ++else ++ BUILD_MSN_TRUE='#' ++ BUILD_MSN_FALSE= ++fi + + if test "x$build_yahoo" = xyes; then + BUILD_YAHOO_TRUE= +@@ -2478,6 +2495,13 @@ + BUILD_LJ_FALSE= + fi + ++if test "$build_msn" = "yes"; then ++ cat >> confdefs.h <<\EOF ++#define BUILD_MSN 1 ++EOF ++ ++fi ++ + if test "$build_yahoo" = "yes"; then + cat >> confdefs.h <<\EOF + #define BUILD_YAHOO 1 +@@ -4994,7 +5018,7 @@ + + + +-subdirs="firetalk-0.1 kkconsui-0.1 kkstrtext-0.1 libicq2000-0.1 libjabber-0.1 libyahoo2-0.1 kksystr-0.1 connwrap-0.1" ++subdirs="firetalk-0.1 kkconsui-0.1 kkstrtext-0.1 libicq2000-0.1 libjabber-0.1 libyahoo2-0.1 kksystr-0.1 connwrap-0.1 blip-0.1" + + trap '' 1 2 15 + cat > confcache <<\EOF +@@ -5538,7 +5562,7 @@ + esac + done + +- for ac_config_dir in firetalk-0.1 kkconsui-0.1 kkstrtext-0.1 libicq2000-0.1 libjabber-0.1 libyahoo2-0.1 kksystr-0.1 connwrap-0.1; do ++ for ac_config_dir in firetalk-0.1 kkconsui-0.1 kkstrtext-0.1 libicq2000-0.1 libjabber-0.1 libyahoo2-0.1 kksystr-0.1 connwrap-0.1 blip-0.1; do + + # Do not complain, so a configure script can configure whichever + # parts of a large source tree are present. diff --git a/net-im/centericq/files/msn-imcontroller.cc b/net-im/centericq/files/msn-imcontroller.cc new file mode 100644 index 0000000..079d202 --- /dev/null +++ b/net-im/centericq/files/msn-imcontroller.cc @@ -0,0 +1,10 @@ +--- src/imcontroller.cc.orig Thu Oct 16 07:40:18 2003 ++++ src/imcontroller.cc Mon Nov 3 20:03:55 2003 +@@ -31,6 +31,7 @@ + #include "jabberhook.h" + #include "icqcontacts.h" + #include "eventmanager.h" ++#include "msnhook.h" + + #define clr(c) conf.getcolor(c) + diff --git a/net-im/centericq/files/msn-libmsn b/net-im/centericq/files/msn-libmsn new file mode 100644 index 0000000..1a85fe8 --- /dev/null +++ b/net-im/centericq/files/msn-libmsn @@ -0,0 +1,5986 @@ +diff -ruN blip-0.1.orig/Makefile.am blip-0.1/Makefile.am +--- blip-0.1.orig/Makefile.am Thu Jan 1 08:00:00 1970 ++++ blip-0.1/Makefile.am Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,10 @@ ++noinst_LIBRARIES = libblip.a ++libblip_a_SOURCES = md5.c msn_bittybits.C msn_core.C ++EXTRA_DIST = md5.c msn_bittybits.C msn_core.C md5.h msn_bittybits.h msn_core.h msn_interface.h ++AUTOMAKE_OPTIONS = foreign ++ ++if BUILD_MSN ++ ++ ++endif ++ +diff -ruN blip-0.1.orig/Makefile.in blip-0.1/Makefile.in +--- blip-0.1.orig/Makefile.in Thu Jan 1 08:00:00 1970 ++++ blip-0.1/Makefile.in Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,364 @@ ++# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am ++ ++# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. ++# This Makefile.in is free software; the Free Software Foundation ++# gives unlimited permission to copy and/or distribute it, ++# with or without modifications, as long as this notice is preserved. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++# even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++# PARTICULAR PURPOSE. ++ ++ ++SHELL = @SHELL@ ++ ++srcdir = @srcdir@ ++top_srcdir = @top_srcdir@ ++VPATH = @srcdir@ ++prefix = @prefix@ ++exec_prefix = @exec_prefix@ ++ ++bindir = @bindir@ ++sbindir = @sbindir@ ++libexecdir = @libexecdir@ ++datadir = @datadir@ ++sysconfdir = @sysconfdir@ ++sharedstatedir = @sharedstatedir@ ++localstatedir = @localstatedir@ ++libdir = @libdir@ ++infodir = @infodir@ ++mandir = @mandir@ ++includedir = @includedir@ ++oldincludedir = /usr/include ++ ++DESTDIR = ++ ++pkgdatadir = $(datadir)/@PACKAGE@ ++pkglibdir = $(libdir)/@PACKAGE@ ++pkgincludedir = $(includedir)/@PACKAGE@ ++ ++top_builddir = . ++ ++ACLOCAL = @ACLOCAL@ ++AUTOCONF = @AUTOCONF@ ++AUTOMAKE = @AUTOMAKE@ ++AUTOHEADER = @AUTOHEADER@ ++ ++INSTALL = @INSTALL@ ++INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) ++INSTALL_DATA = @INSTALL_DATA@ ++INSTALL_SCRIPT = @INSTALL_SCRIPT@ ++transform = @program_transform_name@ ++ ++NORMAL_INSTALL = : ++PRE_INSTALL = : ++POST_INSTALL = : ++NORMAL_UNINSTALL = : ++PRE_UNINSTALL = : ++POST_UNINSTALL = : ++CC = @CC@ ++CXX = @CXX@ ++MAKEINFO = @MAKEINFO@ ++PACKAGE = @PACKAGE@ ++RANLIB = @RANLIB@ ++VERSION = @VERSION@ ++ ++noinst_LIBRARIES = libblip.a ++libblip_a_SOURCES = md5.c msn_bittybits.C msn_core.C ++EXTRA_DIST = md5.c msn_bittybits.C msn_core.C md5.h msn_bittybits.h msn_core.h msn_interface.h ++AUTOMAKE_OPTIONS = foreign ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs ++CONFIG_CLEAN_FILES = ++LIBRARIES = $(noinst_LIBRARIES) ++ ++ ++DEFS = @DEFS@ -I. -I$(srcdir) ++CPPFLAGS = @CPPFLAGS@ ++LDFLAGS = @LDFLAGS@ ++LIBS = @LIBS@ ++libblip_a_LIBADD = ++libblip_a_OBJECTS = md5.o msn_bittybits.o msn_core.o ++AR = ar ++CXXFLAGS = @CXXFLAGS@ ++CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) ++CXXLD = $(CXX) ++CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ ++CFLAGS = @CFLAGS@ ++COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) ++CCLD = $(CC) ++LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ ++DIST_COMMON = Makefile.am Makefile.in aclocal.m4 configure configure.in \ ++install-sh missing mkinstalldirs ++ ++ ++DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) ++ ++TAR = gtar ++GZIP_ENV = --best ++DEP_FILES = .deps/md5.P .deps/msn_bittybits.P .deps/msn_core.P ++SOURCES = $(libblip_a_SOURCES) ++OBJECTS = $(libblip_a_OBJECTS) ++ ++all: all-redirect ++.SUFFIXES: ++.SUFFIXES: .C .S .c .o .s ++$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) ++ cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile ++ ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) ++ cd $(top_builddir) \ ++ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status ++ ++$(ACLOCAL_M4): configure.in ++ cd $(srcdir) && $(ACLOCAL) ++ ++config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++ $(SHELL) ./config.status --recheck ++$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) ++ cd $(srcdir) && $(AUTOCONF) ++ ++mostlyclean-noinstLIBRARIES: ++ ++clean-noinstLIBRARIES: ++ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) ++ ++distclean-noinstLIBRARIES: ++ ++maintainer-clean-noinstLIBRARIES: ++ ++.s.o: ++ $(COMPILE) -c $< ++ ++.S.o: ++ $(COMPILE) -c $< ++ ++mostlyclean-compile: ++ -rm -f *.o core *.core ++ ++clean-compile: ++ ++distclean-compile: ++ -rm -f *.tab.c ++ ++maintainer-clean-compile: ++ ++libblip.a: $(libblip_a_OBJECTS) $(libblip_a_DEPENDENCIES) ++ -rm -f libblip.a ++ $(AR) cru libblip.a $(libblip_a_OBJECTS) $(libblip_a_LIBADD) ++ $(RANLIB) libblip.a ++.C.o: ++ $(CXXCOMPILE) -c $< ++ ++tags: TAGS ++ ++ID: $(HEADERS) $(SOURCES) $(LISP) ++ list='$(SOURCES) $(HEADERS)'; \ ++ unique=`for i in $$list; do echo $$i; done | \ ++ awk ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ here=`pwd` && cd $(srcdir) \ ++ && mkid -f$$here/ID $$unique $(LISP) ++ ++TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) ++ tags=; \ ++ here=`pwd`; \ ++ list='$(SOURCES) $(HEADERS)'; \ ++ unique=`for i in $$list; do echo $$i; done | \ ++ awk ' { files[$$0] = 1; } \ ++ END { for (i in files) print i; }'`; \ ++ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ ++ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) ++ ++mostlyclean-tags: ++ ++clean-tags: ++ ++distclean-tags: ++ -rm -f TAGS ID ++ ++maintainer-clean-tags: ++ ++distdir = $(PACKAGE)-$(VERSION) ++top_distdir = $(distdir) ++ ++# This target untars the dist file and tries a VPATH configuration. Then ++# it guarantees that the distribution is self-contained by making another ++# tarfile. ++distcheck: dist ++ -rm -rf $(distdir) ++ GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz ++ mkdir $(distdir)/=build ++ mkdir $(distdir)/=inst ++ dc_install_base=`cd $(distdir)/=inst && pwd`; \ ++ cd $(distdir)/=build \ ++ && ../configure --srcdir=.. --prefix=$$dc_install_base \ ++ && $(MAKE) $(AM_MAKEFLAGS) \ ++ && $(MAKE) $(AM_MAKEFLAGS) dvi \ ++ && $(MAKE) $(AM_MAKEFLAGS) check \ ++ && $(MAKE) $(AM_MAKEFLAGS) install \ ++ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ ++ && $(MAKE) $(AM_MAKEFLAGS) dist ++ -rm -rf $(distdir) ++ @banner="$(distdir).tar.gz is ready for distribution"; \ ++ dashes=`echo "$$banner" | sed s/./=/g`; \ ++ echo "$$dashes"; \ ++ echo "$$banner"; \ ++ echo "$$dashes" ++dist: distdir ++ -chmod -R a+r $(distdir) ++ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) ++ -rm -rf $(distdir) ++dist-all: distdir ++ -chmod -R a+r $(distdir) ++ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) ++ -rm -rf $(distdir) ++distdir: $(DISTFILES) ++ -rm -rf $(distdir) ++ mkdir $(distdir) ++ -chmod 777 $(distdir) ++ here=`cd $(top_builddir) && pwd`; \ ++ top_distdir=`cd $(distdir) && pwd`; \ ++ distdir=`cd $(distdir) && pwd`; \ ++ cd $(top_srcdir) \ ++ && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign Makefile ++ @for file in $(DISTFILES); do \ ++ d=$(srcdir); \ ++ if test -d $$d/$$file; then \ ++ cp -pr $$d/$$file $(distdir)/$$file; \ ++ else \ ++ test -f $(distdir)/$$file \ ++ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ ++ || cp -p $$d/$$file $(distdir)/$$file || :; \ ++ fi; \ ++ done ++ ++DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) ++ ++-include $(DEP_FILES) ++ ++mostlyclean-depend: ++ ++clean-depend: ++ ++distclean-depend: ++ -rm -rf .deps ++ ++maintainer-clean-depend: ++ ++%.o: %.c ++ @echo '$(COMPILE) -c $<'; \ ++ $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< ++ @-cp .deps/$(*F).pp .deps/$(*F).P; \ ++ tr ' ' '\012' < .deps/$(*F).pp \ ++ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ ++ >> .deps/$(*F).P; \ ++ rm .deps/$(*F).pp ++ ++%.lo: %.c ++ @echo '$(LTCOMPILE) -c $<'; \ ++ $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< ++ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ ++ < .deps/$(*F).pp > .deps/$(*F).P; \ ++ tr ' ' '\012' < .deps/$(*F).pp \ ++ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ ++ >> .deps/$(*F).P; \ ++ rm -f .deps/$(*F).pp ++ ++%.o: %.C ++ @echo '$(CXXCOMPILE) -c $<'; \ ++ $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< ++ @-cp .deps/$(*F).pp .deps/$(*F).P; \ ++ tr ' ' '\012' < .deps/$(*F).pp \ ++ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ ++ >> .deps/$(*F).P; \ ++ rm .deps/$(*F).pp ++ ++%.lo: %.C ++ @echo '$(LTCXXCOMPILE) -c $<'; \ ++ $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< ++ @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ ++ < .deps/$(*F).pp > .deps/$(*F).P; \ ++ tr ' ' '\012' < .deps/$(*F).pp \ ++ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ ++ >> .deps/$(*F).P; \ ++ rm -f .deps/$(*F).pp ++info-am: ++info: info-am ++dvi-am: ++dvi: dvi-am ++check-am: all-am ++check: check-am ++installcheck-am: ++installcheck: installcheck-am ++install-exec-am: ++install-exec: install-exec-am ++ ++install-data-am: ++install-data: install-data-am ++ ++install-am: all-am ++ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am ++install: install-am ++uninstall-am: ++uninstall: uninstall-am ++all-am: Makefile $(LIBRARIES) ++all-redirect: all-am ++install-strip: ++ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install ++installdirs: ++ ++ ++mostlyclean-generic: ++ ++clean-generic: ++ ++distclean-generic: ++ -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -rm -f config.cache config.log stamp-h stamp-h[0-9]* ++ ++maintainer-clean-generic: ++mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ ++ mostlyclean-tags mostlyclean-depend mostlyclean-generic ++ ++mostlyclean: mostlyclean-am ++ ++clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-depend \ ++ clean-generic mostlyclean-am ++ ++clean: clean-am ++ ++distclean-am: distclean-noinstLIBRARIES distclean-compile \ ++ distclean-tags distclean-depend distclean-generic \ ++ clean-am ++ ++distclean: distclean-am ++ -rm -f config.status ++ ++maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ ++ maintainer-clean-compile maintainer-clean-tags \ ++ maintainer-clean-depend maintainer-clean-generic \ ++ distclean-am ++ @echo "This command is intended for maintainers to use;" ++ @echo "it deletes files that may require special tools to rebuild." ++ ++maintainer-clean: maintainer-clean-am ++ -rm -f config.status ++ ++.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ ++clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ ++mostlyclean-compile distclean-compile clean-compile \ ++maintainer-clean-compile tags mostlyclean-tags distclean-tags \ ++clean-tags maintainer-clean-tags distdir mostlyclean-depend \ ++distclean-depend clean-depend maintainer-clean-depend info-am info \ ++dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ ++install-exec install-data-am install-data install-am install \ ++uninstall-am uninstall all-redirect all-am all installdirs \ ++mostlyclean-generic distclean-generic clean-generic \ ++maintainer-clean-generic clean mostlyclean distclean maintainer-clean ++ ++ ++# Tell versions [3.59,3.63) of GNU make to not export all variables. ++# Otherwise a system limit (for SysV at least) may be exceeded. ++.NOEXPORT: +diff -ruN blip-0.1.orig/aclocal.m4 blip-0.1/aclocal.m4 +--- blip-0.1.orig/aclocal.m4 Thu Jan 1 08:00:00 1970 ++++ blip-0.1/aclocal.m4 Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,117 @@ ++dnl aclocal.m4 generated automatically by aclocal 1.4-p5 ++ ++dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. ++dnl This file is free software; the Free Software Foundation ++dnl gives unlimited permission to copy and/or distribute it, ++dnl with or without modifications, as long as this notice is preserved. ++ ++dnl This program is distributed in the hope that it will be useful, ++dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without ++dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A ++dnl PARTICULAR PURPOSE. ++ ++# Do all the work for Automake. This macro actually does too much -- ++# some checks are only needed if your package does certain things. ++# But this isn't really a big deal. ++ ++# serial 1 ++ ++dnl Usage: ++dnl AM_INIT_AUTOMAKE(package,version, [no-define]) ++ ++AC_DEFUN([AM_INIT_AUTOMAKE], ++[AC_REQUIRE([AC_PROG_INSTALL]) ++PACKAGE=[$1] ++AC_SUBST(PACKAGE) ++VERSION=[$2] ++AC_SUBST(VERSION) ++dnl test to see if srcdir already configured ++if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then ++ AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) ++fi ++ifelse([$3],, ++AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) ++AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) ++AC_REQUIRE([AM_SANITY_CHECK]) ++AC_REQUIRE([AC_ARG_PROGRAM]) ++dnl FIXME This is truly gross. ++missing_dir=`cd $ac_aux_dir && pwd` ++AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) ++AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) ++AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) ++AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) ++AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) ++AC_REQUIRE([AC_PROG_MAKE_SET])]) ++ ++# ++# Check to make sure that the build environment is sane. ++# ++ ++AC_DEFUN([AM_SANITY_CHECK], ++[AC_MSG_CHECKING([whether build environment is sane]) ++# Just in case ++sleep 1 ++echo timestamp > conftestfile ++# Do `set' in a subshell so we don't clobber the current shell's ++# arguments. Must try -L first in case configure is actually a ++# symlink; some systems play weird games with the mod time of symlinks ++# (eg FreeBSD returns the mod time of the symlink's containing ++# directory). ++if ( ++ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` ++ if test "[$]*" = "X"; then ++ # -L didn't work. ++ set X `ls -t $srcdir/configure conftestfile` ++ fi ++ if test "[$]*" != "X $srcdir/configure conftestfile" \ ++ && test "[$]*" != "X conftestfile $srcdir/configure"; then ++ ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken ++alias in your environment]) ++ fi ++ ++ test "[$]2" = conftestfile ++ ) ++then ++ # Ok. ++ : ++else ++ AC_MSG_ERROR([newly created file is older than distributed files! ++Check your system clock]) ++fi ++rm -f conftest* ++AC_MSG_RESULT(yes)]) ++ ++dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) ++dnl The program must properly implement --version. ++AC_DEFUN([AM_MISSING_PROG], ++[AC_MSG_CHECKING(for working $2) ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if ($2 --version) < /dev/null > /dev/null 2>&1; then ++ $1=$2 ++ AC_MSG_RESULT(found) ++else ++ $1="$3/missing $2" ++ AC_MSG_RESULT(missing) ++fi ++AC_SUBST($1)]) ++ ++# Define a conditional. ++ ++AC_DEFUN([AM_CONDITIONAL], ++[AC_SUBST($1_TRUE) ++AC_SUBST($1_FALSE) ++if $2; then ++ $1_TRUE= ++ $1_FALSE='#' ++else ++ $1_TRUE='#' ++ $1_FALSE= ++fi]) ++ +diff -ruN blip-0.1.orig/configure blip-0.1/configure +--- blip-0.1.orig/configure Thu Jan 1 08:00:00 1970 ++++ blip-0.1/configure Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,1519 @@ ++#! /bin/sh ++ ++# Guess values for system-dependent variables and create Makefiles. ++# Generated automatically using autoconf version 2.13 ++# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. ++# ++# This configure script is free software; the Free Software Foundation ++# gives unlimited permission to copy, distribute and modify it. ++ ++# Defaults: ++ac_help= ++ac_default_prefix=/usr/local ++# Any additions from configure.in: ++ac_help="$ac_help ++ --disable-msn Build without MSN" ++ ++# Initialize some variables set by options. ++# The variables have the same names as the options, with ++# dashes changed to underlines. ++build=NONE ++cache_file=./config.cache ++exec_prefix=NONE ++host=NONE ++no_create= ++nonopt=NONE ++no_recursion= ++prefix=NONE ++program_prefix=NONE ++program_suffix=NONE ++program_transform_name=s,x,x, ++silent= ++site= ++srcdir= ++target=NONE ++verbose= ++x_includes=NONE ++x_libraries=NONE ++bindir='${exec_prefix}/bin' ++sbindir='${exec_prefix}/sbin' ++libexecdir='${exec_prefix}/libexec' ++datadir='${prefix}/share' ++sysconfdir='${prefix}/etc' ++sharedstatedir='${prefix}/com' ++localstatedir='${prefix}/var' ++libdir='${exec_prefix}/lib' ++includedir='${prefix}/include' ++oldincludedir='/usr/include' ++infodir='${prefix}/info' ++mandir='${prefix}/man' ++ ++# Initialize some other variables. ++subdirs= ++MFLAGS= MAKEFLAGS= ++SHELL=${CONFIG_SHELL-/bin/sh} ++# Maximum number of lines to put in a shell here document. ++ac_max_here_lines=12 ++ ++ac_prev= ++for ac_option ++do ++ ++ # If the previous option needs an argument, assign it. ++ if test -n "$ac_prev"; then ++ eval "$ac_prev=\$ac_option" ++ ac_prev= ++ continue ++ fi ++ ++ case "$ac_option" in ++ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; ++ *) ac_optarg= ;; ++ esac ++ ++ # Accept the important Cygnus configure options, so we can diagnose typos. ++ ++ case "$ac_option" in ++ ++ -bindir | --bindir | --bindi | --bind | --bin | --bi) ++ ac_prev=bindir ;; ++ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) ++ bindir="$ac_optarg" ;; ++ ++ -build | --build | --buil | --bui | --bu) ++ ac_prev=build ;; ++ -build=* | --build=* | --buil=* | --bui=* | --bu=*) ++ build="$ac_optarg" ;; ++ ++ -cache-file | --cache-file | --cache-fil | --cache-fi \ ++ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ++ ac_prev=cache_file ;; ++ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ ++ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) ++ cache_file="$ac_optarg" ;; ++ ++ -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ++ ac_prev=datadir ;; ++ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ ++ | --da=*) ++ datadir="$ac_optarg" ;; ++ ++ -disable-* | --disable-*) ++ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then ++ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } ++ fi ++ ac_feature=`echo $ac_feature| sed 's/-/_/g'` ++ eval "enable_${ac_feature}=no" ;; ++ ++ -enable-* | --enable-*) ++ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then ++ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } ++ fi ++ ac_feature=`echo $ac_feature| sed 's/-/_/g'` ++ case "$ac_option" in ++ *=*) ;; ++ *) ac_optarg=yes ;; ++ esac ++ eval "enable_${ac_feature}='$ac_optarg'" ;; ++ ++ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ ++ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ ++ | --exec | --exe | --ex) ++ ac_prev=exec_prefix ;; ++ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ ++ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ ++ | --exec=* | --exe=* | --ex=*) ++ exec_prefix="$ac_optarg" ;; ++ ++ -gas | --gas | --ga | --g) ++ # Obsolete; use --with-gas. ++ with_gas=yes ;; ++ ++ -help | --help | --hel | --he) ++ # Omit some internal or obsolete options to make the list less imposing. ++ # This message is too long to be a string in the A/UX 3.1 sh. ++ cat << EOF ++Usage: configure [options] [host] ++Options: [defaults in brackets after descriptions] ++Configuration: ++ --cache-file=FILE cache test results in FILE ++ --help print this message ++ --no-create do not create output files ++ --quiet, --silent do not print \`checking...' messages ++ --version print the version of autoconf that created configure ++Directory and file names: ++ --prefix=PREFIX install architecture-independent files in PREFIX ++ [$ac_default_prefix] ++ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX ++ [same as prefix] ++ --bindir=DIR user executables in DIR [EPREFIX/bin] ++ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] ++ --libexecdir=DIR program executables in DIR [EPREFIX/libexec] ++ --datadir=DIR read-only architecture-independent data in DIR ++ [PREFIX/share] ++ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] ++ --sharedstatedir=DIR modifiable architecture-independent data in DIR ++ [PREFIX/com] ++ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] ++ --libdir=DIR object code libraries in DIR [EPREFIX/lib] ++ --includedir=DIR C header files in DIR [PREFIX/include] ++ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] ++ --infodir=DIR info documentation in DIR [PREFIX/info] ++ --mandir=DIR man documentation in DIR [PREFIX/man] ++ --srcdir=DIR find the sources in DIR [configure dir or ..] ++ --program-prefix=PREFIX prepend PREFIX to installed program names ++ --program-suffix=SUFFIX append SUFFIX to installed program names ++ --program-transform-name=PROGRAM ++ run sed PROGRAM on installed program names ++EOF ++ cat << EOF ++Host type: ++ --build=BUILD configure for building on BUILD [BUILD=HOST] ++ --host=HOST configure for HOST [guessed] ++ --target=TARGET configure for TARGET [TARGET=HOST] ++Features and packages: ++ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) ++ --enable-FEATURE[=ARG] include FEATURE [ARG=yes] ++ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] ++ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) ++ --x-includes=DIR X include files are in DIR ++ --x-libraries=DIR X library files are in DIR ++EOF ++ if test -n "$ac_help"; then ++ echo "--enable and --with options recognized:$ac_help" ++ fi ++ exit 0 ;; ++ ++ -host | --host | --hos | --ho) ++ ac_prev=host ;; ++ -host=* | --host=* | --hos=* | --ho=*) ++ host="$ac_optarg" ;; ++ ++ -includedir | --includedir | --includedi | --included | --include \ ++ | --includ | --inclu | --incl | --inc) ++ ac_prev=includedir ;; ++ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ ++ | --includ=* | --inclu=* | --incl=* | --inc=*) ++ includedir="$ac_optarg" ;; ++ ++ -infodir | --infodir | --infodi | --infod | --info | --inf) ++ ac_prev=infodir ;; ++ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) ++ infodir="$ac_optarg" ;; ++ ++ -libdir | --libdir | --libdi | --libd) ++ ac_prev=libdir ;; ++ -libdir=* | --libdir=* | --libdi=* | --libd=*) ++ libdir="$ac_optarg" ;; ++ ++ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ ++ | --libexe | --libex | --libe) ++ ac_prev=libexecdir ;; ++ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ ++ | --libexe=* | --libex=* | --libe=*) ++ libexecdir="$ac_optarg" ;; ++ ++ -localstatedir | --localstatedir | --localstatedi | --localstated \ ++ | --localstate | --localstat | --localsta | --localst \ ++ | --locals | --local | --loca | --loc | --lo) ++ ac_prev=localstatedir ;; ++ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ ++ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ ++ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) ++ localstatedir="$ac_optarg" ;; ++ ++ -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ++ ac_prev=mandir ;; ++ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) ++ mandir="$ac_optarg" ;; ++ ++ -nfp | --nfp | --nf) ++ # Obsolete; use --without-fp. ++ with_fp=no ;; ++ ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c) ++ no_create=yes ;; ++ ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ++ no_recursion=yes ;; ++ ++ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ ++ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ ++ | --oldin | --oldi | --old | --ol | --o) ++ ac_prev=oldincludedir ;; ++ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ ++ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ ++ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) ++ oldincludedir="$ac_optarg" ;; ++ ++ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ++ ac_prev=prefix ;; ++ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ++ prefix="$ac_optarg" ;; ++ ++ -program-prefix | --program-prefix | --program-prefi | --program-pref \ ++ | --program-pre | --program-pr | --program-p) ++ ac_prev=program_prefix ;; ++ -program-prefix=* | --program-prefix=* | --program-prefi=* \ ++ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) ++ program_prefix="$ac_optarg" ;; ++ ++ -program-suffix | --program-suffix | --program-suffi | --program-suff \ ++ | --program-suf | --program-su | --program-s) ++ ac_prev=program_suffix ;; ++ -program-suffix=* | --program-suffix=* | --program-suffi=* \ ++ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) ++ program_suffix="$ac_optarg" ;; ++ ++ -program-transform-name | --program-transform-name \ ++ | --program-transform-nam | --program-transform-na \ ++ | --program-transform-n | --program-transform- \ ++ | --program-transform | --program-transfor \ ++ | --program-transfo | --program-transf \ ++ | --program-trans | --program-tran \ ++ | --progr-tra | --program-tr | --program-t) ++ ac_prev=program_transform_name ;; ++ -program-transform-name=* | --program-transform-name=* \ ++ | --program-transform-nam=* | --program-transform-na=* \ ++ | --program-transform-n=* | --program-transform-=* \ ++ | --program-transform=* | --program-transfor=* \ ++ | --program-transfo=* | --program-transf=* \ ++ | --program-trans=* | --program-tran=* \ ++ | --progr-tra=* | --program-tr=* | --program-t=*) ++ program_transform_name="$ac_optarg" ;; ++ ++ -q | -quiet | --quiet | --quie | --qui | --qu | --q \ ++ | -silent | --silent | --silen | --sile | --sil) ++ silent=yes ;; ++ ++ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ++ ac_prev=sbindir ;; ++ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ ++ | --sbi=* | --sb=*) ++ sbindir="$ac_optarg" ;; ++ ++ -sharedstatedir | --sharedstatedir | --sharedstatedi \ ++ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ ++ | --sharedst | --shareds | --shared | --share | --shar \ ++ | --sha | --sh) ++ ac_prev=sharedstatedir ;; ++ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ ++ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ ++ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ ++ | --sha=* | --sh=*) ++ sharedstatedir="$ac_optarg" ;; ++ ++ -site | --site | --sit) ++ ac_prev=site ;; ++ -site=* | --site=* | --sit=*) ++ site="$ac_optarg" ;; ++ ++ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ++ ac_prev=srcdir ;; ++ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ++ srcdir="$ac_optarg" ;; ++ ++ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ ++ | --syscon | --sysco | --sysc | --sys | --sy) ++ ac_prev=sysconfdir ;; ++ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ ++ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) ++ sysconfdir="$ac_optarg" ;; ++ ++ -target | --target | --targe | --targ | --tar | --ta | --t) ++ ac_prev=target ;; ++ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) ++ target="$ac_optarg" ;; ++ ++ -v | -verbose | --verbose | --verbos | --verbo | --verb) ++ verbose=yes ;; ++ ++ -version | --version | --versio | --versi | --vers) ++ echo "configure generated by autoconf version 2.13" ++ exit 0 ;; ++ ++ -with-* | --with-*) ++ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then ++ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } ++ fi ++ ac_package=`echo $ac_package| sed 's/-/_/g'` ++ case "$ac_option" in ++ *=*) ;; ++ *) ac_optarg=yes ;; ++ esac ++ eval "with_${ac_package}='$ac_optarg'" ;; ++ ++ -without-* | --without-*) ++ ac_package=`echo $ac_option|sed -e 's/-*without-//'` ++ # Reject names that are not valid shell variable names. ++ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then ++ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } ++ fi ++ ac_package=`echo $ac_package| sed 's/-/_/g'` ++ eval "with_${ac_package}=no" ;; ++ ++ --x) ++ # Obsolete; use --with-x. ++ with_x=yes ;; ++ ++ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ ++ | --x-incl | --x-inc | --x-in | --x-i) ++ ac_prev=x_includes ;; ++ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ ++ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) ++ x_includes="$ac_optarg" ;; ++ ++ -x-libraries | --x-libraries | --x-librarie | --x-librari \ ++ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ++ ac_prev=x_libraries ;; ++ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ ++ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) ++ x_libraries="$ac_optarg" ;; ++ ++ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ++ ;; ++ ++ *) ++ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then ++ echo "configure: warning: $ac_option: invalid host type" 1>&2 ++ fi ++ if test "x$nonopt" != xNONE; then ++ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ++ fi ++ nonopt="$ac_option" ++ ;; ++ ++ esac ++done ++ ++if test -n "$ac_prev"; then ++ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } ++fi ++ ++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++# File descriptor usage: ++# 0 standard input ++# 1 file creation ++# 2 errors and warnings ++# 3 some systems may open it to /dev/tty ++# 4 used on the Kubota Titan ++# 6 checking for... messages and results ++# 5 compiler messages saved in config.log ++if test "$silent" = yes; then ++ exec 6>/dev/null ++else ++ exec 6>&1 ++fi ++exec 5>./config.log ++ ++echo "\ ++This file contains any messages produced by compilers while ++running configure, to aid debugging if configure makes a mistake. ++" 1>&5 ++ ++# Strip out --no-create and --no-recursion so they do not pile up. ++# Also quote any args containing shell metacharacters. ++ac_configure_args= ++for ac_arg ++do ++ case "$ac_arg" in ++ -no-create | --no-create | --no-creat | --no-crea | --no-cre \ ++ | --no-cr | --no-c) ;; ++ -no-recursion | --no-recursion | --no-recursio | --no-recursi \ ++ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; ++ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ++ ac_configure_args="$ac_configure_args '$ac_arg'" ;; ++ *) ac_configure_args="$ac_configure_args $ac_arg" ;; ++ esac ++done ++ ++# NLS nuisances. ++# Only set these to C if already set. These must not be set unconditionally ++# because not all systems understand e.g. LANG=C (notably SCO). ++# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! ++# Non-C LC_CTYPE values break the ctype check. ++if test "${LANG+set}" = set; then LANG=C; export LANG; fi ++if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi ++if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi ++if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi ++ ++# confdefs.h avoids OS command line length limits that DEFS can exceed. ++rm -rf conftest* confdefs.h ++# AIX cpp loses on an empty file, so make sure it contains at least a newline. ++echo > confdefs.h ++ ++# A filename unique to this package, relative to the directory that ++# configure is in, which we can look for to find out if srcdir is correct. ++ac_unique_file=aclocal.m4 ++ ++# Find the source files, if location was not specified. ++if test -z "$srcdir"; then ++ ac_srcdir_defaulted=yes ++ # Try the directory containing this script, then its parent. ++ ac_prog=$0 ++ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` ++ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. ++ srcdir=$ac_confdir ++ if test ! -r $srcdir/$ac_unique_file; then ++ srcdir=.. ++ fi ++else ++ ac_srcdir_defaulted=no ++fi ++if test ! -r $srcdir/$ac_unique_file; then ++ if test "$ac_srcdir_defaulted" = yes; then ++ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } ++ else ++ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } ++ fi ++fi ++srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` ++ ++# Prefer explicitly selected file to automatically selected ones. ++if test -z "$CONFIG_SITE"; then ++ if test "x$prefix" != xNONE; then ++ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" ++ else ++ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" ++ fi ++fi ++for ac_site_file in $CONFIG_SITE; do ++ if test -r "$ac_site_file"; then ++ echo "loading site script $ac_site_file" ++ . "$ac_site_file" ++ fi ++done ++ ++if test -r "$cache_file"; then ++ echo "loading cache $cache_file" ++ . $cache_file ++else ++ echo "creating cache $cache_file" ++ > $cache_file ++fi ++ ++ac_ext=c ++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ++ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' ++cross_compiling=$ac_cv_prog_cc_cross ++ ++ac_exeext= ++ac_objext=o ++if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then ++ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. ++ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ++ ac_n= ac_c=' ++' ac_t=' ' ++ else ++ ac_n=-n ac_c= ac_t= ++ fi ++else ++ ac_n= ac_c='\c' ac_t= ++fi ++ ++ ++ac_aux_dir= ++for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do ++ if test -f $ac_dir/install-sh; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install-sh -c" ++ break ++ elif test -f $ac_dir/install.sh; then ++ ac_aux_dir=$ac_dir ++ ac_install_sh="$ac_aux_dir/install.sh -c" ++ break ++ fi ++done ++if test -z "$ac_aux_dir"; then ++ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } ++fi ++ac_config_guess=$ac_aux_dir/config.guess ++ac_config_sub=$ac_aux_dir/config.sub ++ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. ++ ++# Find a good install program. We prefer a C program (faster), ++# so one script is as good as another. But avoid the broken or ++# incompatible versions: ++# SysV /etc/install, /usr/sbin/install ++# SunOS /usr/etc/install ++# IRIX /sbin/install ++# AIX /bin/install ++# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag ++# AFS /usr/afsws/bin/install, which mishandles nonexistent args ++# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# ./install, which can be erroneously created by make from ./install.sh. ++echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 ++echo "configure:558: checking for a BSD compatible install" >&5 ++if test -z "$INSTALL"; then ++if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" ++ for ac_dir in $PATH; do ++ # Account for people who put trailing slashes in PATH elements. ++ case "$ac_dir/" in ++ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; ++ *) ++ # OSF1 and SCO ODT 3.0 have their own names for install. ++ # Don't use installbsd from OSF since it installs stuff as root ++ # by default. ++ for ac_prog in ginstall scoinst install; do ++ if test -f $ac_dir/$ac_prog; then ++ if test $ac_prog = install && ++ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ else ++ ac_cv_path_install="$ac_dir/$ac_prog -c" ++ break 2 ++ fi ++ fi ++ done ++ ;; ++ esac ++ done ++ IFS="$ac_save_IFS" ++ ++fi ++ if test "${ac_cv_path_install+set}" = set; then ++ INSTALL="$ac_cv_path_install" ++ else ++ # As a last resort, use the slow shell script. We don't cache a ++ # path for INSTALL within a source directory, because that will ++ # break other packages using the cache if that directory is ++ # removed, or if the path is relative. ++ INSTALL="$ac_install_sh" ++ fi ++fi ++echo "$ac_t""$INSTALL" 1>&6 ++ ++# Use test -z because SunOS4 sh mishandles braces in ${var-val}. ++# It thinks the first close brace ends the variable substitution. ++test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' ++ ++test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' ++ ++test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ++ ++echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 ++echo "configure:611: checking whether build environment is sane" >&5 ++# Just in case ++sleep 1 ++echo timestamp > conftestfile ++# Do `set' in a subshell so we don't clobber the current shell's ++# arguments. Must try -L first in case configure is actually a ++# symlink; some systems play weird games with the mod time of symlinks ++# (eg FreeBSD returns the mod time of the symlink's containing ++# directory). ++if ( ++ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` ++ if test "$*" = "X"; then ++ # -L didn't work. ++ set X `ls -t $srcdir/configure conftestfile` ++ fi ++ if test "$*" != "X $srcdir/configure conftestfile" \ ++ && test "$*" != "X conftestfile $srcdir/configure"; then ++ ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken ++alias in your environment" 1>&2; exit 1; } ++ fi ++ ++ test "$2" = conftestfile ++ ) ++then ++ # Ok. ++ : ++else ++ { echo "configure: error: newly created file is older than distributed files! ++Check your system clock" 1>&2; exit 1; } ++fi ++rm -f conftest* ++echo "$ac_t""yes" 1>&6 ++if test "$program_transform_name" = s,x,x,; then ++ program_transform_name= ++else ++ # Double any \ or $. echo might interpret backslashes. ++ cat <<\EOF_SED > conftestsed ++s,\\,\\\\,g; s,\$,$$,g ++EOF_SED ++ program_transform_name="`echo $program_transform_name|sed -f conftestsed`" ++ rm -f conftestsed ++fi ++test "$program_prefix" != NONE && ++ program_transform_name="s,^,${program_prefix},; $program_transform_name" ++# Use a double $ so make ignores it. ++test "$program_suffix" != NONE && ++ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" ++ ++# sed with no file args requires a program. ++test "$program_transform_name" = "" && program_transform_name="s,x,x," ++ ++echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 ++echo "configure:668: checking whether ${MAKE-make} sets \${MAKE}" >&5 ++set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftestmake <<\EOF ++all: ++ @echo 'ac_maketemp="${MAKE}"' ++EOF ++# GNU make sometimes prints "make[1]: Entering...", which would confuse us. ++eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` ++if test -n "$ac_maketemp"; then ++ eval ac_cv_prog_make_${ac_make}_set=yes ++else ++ eval ac_cv_prog_make_${ac_make}_set=no ++fi ++rm -f conftestmake ++fi ++if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ SET_MAKE= ++else ++ echo "$ac_t""no" 1>&6 ++ SET_MAKE="MAKE=${MAKE-make}" ++fi ++ ++ ++PACKAGE=blip ++ ++VERSION=0.1 ++ ++if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then ++ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } ++fi ++cat >> confdefs.h <<EOF ++#define PACKAGE "$PACKAGE" ++EOF ++ ++cat >> confdefs.h <<EOF ++#define VERSION "$VERSION" ++EOF ++ ++ ++ ++missing_dir=`cd $ac_aux_dir && pwd` ++echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 ++echo "configure:714: checking for working aclocal" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (aclocal --version) < /dev/null > /dev/null 2>&1; then ++ ACLOCAL=aclocal ++ echo "$ac_t""found" 1>&6 ++else ++ ACLOCAL="$missing_dir/missing aclocal" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 ++echo "configure:727: checking for working autoconf" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (autoconf --version) < /dev/null > /dev/null 2>&1; then ++ AUTOCONF=autoconf ++ echo "$ac_t""found" 1>&6 ++else ++ AUTOCONF="$missing_dir/missing autoconf" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++echo $ac_n "checking for working automake""... $ac_c" 1>&6 ++echo "configure:740: checking for working automake" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (automake --version) < /dev/null > /dev/null 2>&1; then ++ AUTOMAKE=automake ++ echo "$ac_t""found" 1>&6 ++else ++ AUTOMAKE="$missing_dir/missing automake" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 ++echo "configure:753: checking for working autoheader" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (autoheader --version) < /dev/null > /dev/null 2>&1; then ++ AUTOHEADER=autoheader ++ echo "$ac_t""found" 1>&6 ++else ++ AUTOHEADER="$missing_dir/missing autoheader" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 ++echo "configure:766: checking for working makeinfo" >&5 ++# Run test in a subshell; some versions of sh will print an error if ++# an executable is not found, even if stderr is redirected. ++# Redirect stdin to placate older versions of autoconf. Sigh. ++if (makeinfo --version) < /dev/null > /dev/null 2>&1; then ++ MAKEINFO=makeinfo ++ echo "$ac_t""found" 1>&6 ++else ++ MAKEINFO="$missing_dir/missing makeinfo" ++ echo "$ac_t""missing" 1>&6 ++fi ++ ++ ++ ++# Extract the first word of "ranlib", so it can be a program name with args. ++set dummy ranlib; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:783: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$RANLIB"; then ++ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_RANLIB="ranlib" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" ++fi ++fi ++RANLIB="$ac_cv_prog_RANLIB" ++if test -n "$RANLIB"; then ++ echo "$ac_t""$RANLIB" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ++# Check whether --enable-msn or --disable-msn was given. ++if test "${enable_msn+set}" = set; then ++ enableval="$enable_msn" ++ build_msn="$enableval" ++else ++ build_msn="yes" ++fi ++ ++ ++ ++if test "x$build_msn" = xyes; then ++ BUILD_MSN_TRUE= ++ BUILD_MSN_FALSE='#' ++else ++ BUILD_MSN_TRUE='#' ++ BUILD_MSN_FALSE= ++fi ++ ++if test "$build_msn" = "yes"; then ++ # Extract the first word of "gcc", so it can be a program name with args. ++set dummy gcc; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:833: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_CC="gcc" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++fi ++fi ++CC="$ac_cv_prog_CC" ++if test -n "$CC"; then ++ echo "$ac_t""$CC" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++if test -z "$CC"; then ++ # Extract the first word of "cc", so it can be a program name with args. ++set dummy cc; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:863: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_prog_rejected=no ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ++ ac_prog_rejected=yes ++ continue ++ fi ++ ac_cv_prog_CC="cc" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++if test $ac_prog_rejected = yes; then ++ # We found a bogon in the path, so make sure we never use it. ++ set dummy $ac_cv_prog_CC ++ shift ++ if test $# -gt 0; then ++ # We chose a different compiler from the bogus one. ++ # However, it has the same basename, so the bogon will be chosen ++ # first if we set CC to just the basename; use the full file name. ++ shift ++ set dummy "$ac_dir/$ac_word" "$@" ++ shift ++ ac_cv_prog_CC="$@" ++ fi ++fi ++fi ++fi ++CC="$ac_cv_prog_CC" ++if test -n "$CC"; then ++ echo "$ac_t""$CC" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ if test -z "$CC"; then ++ case "`uname -s`" in ++ *win32* | *WIN32*) ++ # Extract the first word of "cl", so it can be a program name with args. ++set dummy cl; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:914: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$CC"; then ++ ac_cv_prog_CC="$CC" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_CC="cl" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++fi ++fi ++CC="$ac_cv_prog_CC" ++if test -n "$CC"; then ++ echo "$ac_t""$CC" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ;; ++ esac ++ fi ++ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } ++fi ++ ++echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 ++echo "configure:946: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ++ ++ac_ext=c ++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ++ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' ++cross_compiling=$ac_cv_prog_cc_cross ++ ++cat > conftest.$ac_ext << EOF ++ ++#line 957 "configure" ++#include "confdefs.h" ++ ++main(){return(0);} ++EOF ++if { (eval echo configure:962: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ ac_cv_prog_cc_works=yes ++ # If we can't run a trivial program, we are probably using a cross compiler. ++ if (./conftest; exit) 2>/dev/null; then ++ ac_cv_prog_cc_cross=no ++ else ++ ac_cv_prog_cc_cross=yes ++ fi ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ ac_cv_prog_cc_works=no ++fi ++rm -fr conftest* ++ac_ext=c ++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ++ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' ++cross_compiling=$ac_cv_prog_cc_cross ++ ++echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 ++if test $ac_cv_prog_cc_works = no; then ++ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } ++fi ++echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 ++echo "configure:988: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 ++echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 ++cross_compiling=$ac_cv_prog_cc_cross ++ ++echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 ++echo "configure:993: checking whether we are using GNU C" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.c <<EOF ++#ifdef __GNUC__ ++ yes; ++#endif ++EOF ++if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1002: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ++ ac_cv_prog_gcc=yes ++else ++ ac_cv_prog_gcc=no ++fi ++fi ++ ++echo "$ac_t""$ac_cv_prog_gcc" 1>&6 ++ ++if test $ac_cv_prog_gcc = yes; then ++ GCC=yes ++else ++ GCC= ++fi ++ ++ac_test_CFLAGS="${CFLAGS+set}" ++ac_save_CFLAGS="$CFLAGS" ++CFLAGS= ++echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 ++echo "configure:1021: checking whether ${CC-cc} accepts -g" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ echo 'void f(){}' > conftest.c ++if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ++ ac_cv_prog_cc_g=yes ++else ++ ac_cv_prog_cc_g=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 ++if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++elif test $ac_cv_prog_cc_g = yes; then ++ if test "$GCC" = yes; then ++ CFLAGS="-g -O2" ++ else ++ CFLAGS="-g" ++ fi ++else ++ if test "$GCC" = yes; then ++ CFLAGS="-O2" ++ else ++ CFLAGS= ++ fi ++fi ++ ++ for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl ++do ++# Extract the first word of "$ac_prog", so it can be a program name with args. ++set dummy $ac_prog; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:1057: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$CXX"; then ++ ac_cv_prog_CXX="$CXX" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_CXX="$ac_prog" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++fi ++fi ++CXX="$ac_cv_prog_CXX" ++if test -n "$CXX"; then ++ echo "$ac_t""$CXX" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++test -n "$CXX" && break ++done ++test -n "$CXX" || CXX="gcc" ++ ++ ++echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6 ++echo "configure:1089: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 ++ ++ac_ext=C ++# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CXXCPP $CPPFLAGS' ++ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ++ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' ++cross_compiling=$ac_cv_prog_cxx_cross ++ ++cat > conftest.$ac_ext << EOF ++ ++#line 1100 "configure" ++#include "confdefs.h" ++ ++int main(){return(0);} ++EOF ++if { (eval echo configure:1105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ ac_cv_prog_cxx_works=yes ++ # If we can't run a trivial program, we are probably using a cross compiler. ++ if (./conftest; exit) 2>/dev/null; then ++ ac_cv_prog_cxx_cross=no ++ else ++ ac_cv_prog_cxx_cross=yes ++ fi ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ ac_cv_prog_cxx_works=no ++fi ++rm -fr conftest* ++ac_ext=c ++# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ++ac_cpp='$CPP $CPPFLAGS' ++ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ++ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' ++cross_compiling=$ac_cv_prog_cc_cross ++ ++echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6 ++if test $ac_cv_prog_cxx_works = no; then ++ { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; } ++fi ++echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 ++echo "configure:1131: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5 ++echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6 ++cross_compiling=$ac_cv_prog_cxx_cross ++ ++echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6 ++echo "configure:1136: checking whether we are using GNU C++" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.C <<EOF ++#ifdef __GNUC__ ++ yes; ++#endif ++EOF ++if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:1145: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ++ ac_cv_prog_gxx=yes ++else ++ ac_cv_prog_gxx=no ++fi ++fi ++ ++echo "$ac_t""$ac_cv_prog_gxx" 1>&6 ++ ++if test $ac_cv_prog_gxx = yes; then ++ GXX=yes ++else ++ GXX= ++fi ++ ++ac_test_CXXFLAGS="${CXXFLAGS+set}" ++ac_save_CXXFLAGS="$CXXFLAGS" ++CXXFLAGS= ++echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6 ++echo "configure:1164: checking whether ${CXX-g++} accepts -g" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ echo 'void f(){}' > conftest.cc ++if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then ++ ac_cv_prog_cxx_g=yes ++else ++ ac_cv_prog_cxx_g=no ++fi ++rm -f conftest* ++ ++fi ++ ++echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6 ++if test "$ac_test_CXXFLAGS" = set; then ++ CXXFLAGS="$ac_save_CXXFLAGS" ++elif test $ac_cv_prog_cxx_g = yes; then ++ if test "$GXX" = yes; then ++ CXXFLAGS="-g -O2" ++ else ++ CXXFLAGS="-g" ++ fi ++else ++ if test "$GXX" = yes; then ++ CXXFLAGS="-O2" ++ else ++ CXXFLAGS= ++ fi ++fi ++ ++for ac_declaration in \ ++ ''\ ++ '#include <stdlib.h>' \ ++ 'extern "C" void std::exit (int) throw (); using std::exit;' \ ++ 'extern "C" void std::exit (int); using std::exit;' \ ++ 'extern "C" void exit (int) throw ();' \ ++ 'extern "C" void exit (int);' \ ++ 'void exit (int);' ++do ++ cat > conftest.$ac_ext <<EOF ++#line 1205 "configure" ++#include "confdefs.h" ++#include <stdlib.h> ++$ac_declaration ++int main() { ++exit (42); ++; return 0; } ++EOF ++if { (eval echo configure:1213: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ : ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ continue ++fi ++rm -f conftest* ++ cat > conftest.$ac_ext <<EOF ++#line 1223 "configure" ++#include "confdefs.h" ++$ac_declaration ++int main() { ++exit (42); ++; return 0; } ++EOF ++if { (eval echo configure:1230: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ break ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++fi ++rm -f conftest* ++done ++if test -n "$ac_declaration"; then ++ echo '#ifdef __cplusplus' >>confdefs.h ++ echo $ac_declaration >>confdefs.h ++ echo '#endif' >>confdefs.h ++fi ++ ++ ++fi ++ ++trap '' 1 2 15 ++cat > confcache <<\EOF ++# This file is a shell script that caches the results of configure ++# tests run on this system so they can be shared between configure ++# scripts and configure runs. It is not useful on other systems. ++# If it contains results you don't want to keep, you may remove or edit it. ++# ++# By default, configure uses ./config.cache as the cache file, ++# creating it if it does not exist already. You can give configure ++# the --cache-file=FILE option to use a different cache file; that is ++# what configure does when it calls configure scripts in ++# subdirectories, so they share the cache. ++# Giving --cache-file=/dev/null disables caching, for debugging configure. ++# config.status only pays attention to the cache file if you give it the ++# --recheck option to rerun configure. ++# ++EOF ++# The following way of writing the cache mishandles newlines in values, ++# but we know of no workaround that is simple, portable, and efficient. ++# So, don't put newlines in cache variables' values. ++# Ultrix sh set writes to stderr and can't be redirected directly, ++# and sets the high bit in the cache file unless we assign to the vars. ++(set) 2>&1 | ++ case `(ac_space=' '; set | grep ac_space) 2>&1` in ++ *ac_space=\ *) ++ # `set' does not quote correctly, so add quotes (double-quote substitution ++ # turns \\\\ into \\, and sed turns \\ into \). ++ sed -n \ ++ -e "s/'/'\\\\''/g" \ ++ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" ++ ;; ++ *) ++ # `set' quotes correctly as required by POSIX, so do not add quotes. ++ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' ++ ;; ++ esac >> confcache ++if cmp -s $cache_file confcache; then ++ : ++else ++ if test -w $cache_file; then ++ echo "updating cache $cache_file" ++ cat confcache > $cache_file ++ else ++ echo "not updating unwritable cache $cache_file" ++ fi ++fi ++rm -f confcache ++ ++trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 ++ ++test "x$prefix" = xNONE && prefix=$ac_default_prefix ++# Let make expand exec_prefix. ++test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' ++ ++# Any assignment to VPATH causes Sun make to only execute ++# the first set of double-colon rules, so remove it if not needed. ++# If there is a colon in the path, we need to keep it. ++if test "x$srcdir" = x.; then ++ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' ++fi ++ ++trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 ++ ++# Transform confdefs.h into DEFS. ++# Protect against shell expansion while executing Makefile rules. ++# Protect against Makefile macro expansion. ++cat > conftest.defs <<\EOF ++s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g ++s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g ++s%\[%\\&%g ++s%\]%\\&%g ++s%\$%$$%g ++EOF ++DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '` ++rm -f conftest.defs ++ ++ ++# Without the "./", some shells look in PATH for config.status. ++: ${CONFIG_STATUS=./config.status} ++ ++echo creating $CONFIG_STATUS ++rm -f $CONFIG_STATUS ++cat > $CONFIG_STATUS <<EOF ++#! /bin/sh ++# Generated automatically by configure. ++# Run this file to recreate the current configuration. ++# This directory was configured as follows, ++# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: ++# ++# $0 $ac_configure_args ++# ++# Compiler output produced by configure, useful for debugging ++# configure, is in ./config.log if it exists. ++ ++ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" ++for ac_option ++do ++ case "\$ac_option" in ++ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ++ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" ++ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; ++ -version | --version | --versio | --versi | --vers | --ver | --ve | --v) ++ echo "$CONFIG_STATUS generated by autoconf version 2.13" ++ exit 0 ;; ++ -help | --help | --hel | --he | --h) ++ echo "\$ac_cs_usage"; exit 0 ;; ++ *) echo "\$ac_cs_usage"; exit 1 ;; ++ esac ++done ++ ++ac_given_srcdir=$srcdir ++ac_given_INSTALL="$INSTALL" ++ ++trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 ++EOF ++cat >> $CONFIG_STATUS <<EOF ++ ++# Protect against being on the right side of a sed subst in config.status. ++sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; ++ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF ++$ac_vpsub ++$extrasub ++s%@SHELL@%$SHELL%g ++s%@CFLAGS@%$CFLAGS%g ++s%@CPPFLAGS@%$CPPFLAGS%g ++s%@CXXFLAGS@%$CXXFLAGS%g ++s%@FFLAGS@%$FFLAGS%g ++s%@DEFS@%$DEFS%g ++s%@LDFLAGS@%$LDFLAGS%g ++s%@LIBS@%$LIBS%g ++s%@exec_prefix@%$exec_prefix%g ++s%@prefix@%$prefix%g ++s%@program_transform_name@%$program_transform_name%g ++s%@bindir@%$bindir%g ++s%@sbindir@%$sbindir%g ++s%@libexecdir@%$libexecdir%g ++s%@datadir@%$datadir%g ++s%@sysconfdir@%$sysconfdir%g ++s%@sharedstatedir@%$sharedstatedir%g ++s%@localstatedir@%$localstatedir%g ++s%@libdir@%$libdir%g ++s%@includedir@%$includedir%g ++s%@oldincludedir@%$oldincludedir%g ++s%@infodir@%$infodir%g ++s%@mandir@%$mandir%g ++s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g ++s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g ++s%@INSTALL_DATA@%$INSTALL_DATA%g ++s%@PACKAGE@%$PACKAGE%g ++s%@VERSION@%$VERSION%g ++s%@ACLOCAL@%$ACLOCAL%g ++s%@AUTOCONF@%$AUTOCONF%g ++s%@AUTOMAKE@%$AUTOMAKE%g ++s%@AUTOHEADER@%$AUTOHEADER%g ++s%@MAKEINFO@%$MAKEINFO%g ++s%@SET_MAKE@%$SET_MAKE%g ++s%@RANLIB@%$RANLIB%g ++s%@BUILD_MSN_TRUE@%$BUILD_MSN_TRUE%g ++s%@BUILD_MSN_FALSE@%$BUILD_MSN_FALSE%g ++s%@CC@%$CC%g ++s%@CXX@%$CXX%g ++ ++CEOF ++EOF ++ ++cat >> $CONFIG_STATUS <<\EOF ++ ++# Split the substitutions into bite-sized pieces for seds with ++# small command number limits, like on Digital OSF/1 and HP-UX. ++ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. ++ac_file=1 # Number of current file. ++ac_beg=1 # First line for current file. ++ac_end=$ac_max_sed_cmds # Line after last line for current file. ++ac_more_lines=: ++ac_sed_cmds="" ++while $ac_more_lines; do ++ if test $ac_beg -gt 1; then ++ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file ++ else ++ sed "${ac_end}q" conftest.subs > conftest.s$ac_file ++ fi ++ if test ! -s conftest.s$ac_file; then ++ ac_more_lines=false ++ rm -f conftest.s$ac_file ++ else ++ if test -z "$ac_sed_cmds"; then ++ ac_sed_cmds="sed -f conftest.s$ac_file" ++ else ++ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" ++ fi ++ ac_file=`expr $ac_file + 1` ++ ac_beg=$ac_end ++ ac_end=`expr $ac_end + $ac_max_sed_cmds` ++ fi ++done ++if test -z "$ac_sed_cmds"; then ++ ac_sed_cmds=cat ++fi ++EOF ++ ++cat >> $CONFIG_STATUS <<EOF ++ ++CONFIG_FILES=\${CONFIG_FILES-"Makefile"} ++EOF ++cat >> $CONFIG_STATUS <<\EOF ++for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then ++ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". ++ case "$ac_file" in ++ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ++ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; ++ *) ac_file_in="${ac_file}.in" ;; ++ esac ++ ++ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. ++ ++ # Remove last slash and all that follows it. Not all systems have dirname. ++ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` ++ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then ++ # The file is in a subdirectory. ++ test ! -d "$ac_dir" && mkdir "$ac_dir" ++ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" ++ # A "../" for each directory in $ac_dir_suffix. ++ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` ++ else ++ ac_dir_suffix= ac_dots= ++ fi ++ ++ case "$ac_given_srcdir" in ++ .) srcdir=. ++ if test -z "$ac_dots"; then top_srcdir=. ++ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; ++ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; ++ *) # Relative path. ++ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" ++ top_srcdir="$ac_dots$ac_given_srcdir" ;; ++ esac ++ ++ case "$ac_given_INSTALL" in ++ [/$]*) INSTALL="$ac_given_INSTALL" ;; ++ *) INSTALL="$ac_dots$ac_given_INSTALL" ;; ++ esac ++ ++ echo creating "$ac_file" ++ rm -f "$ac_file" ++ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." ++ case "$ac_file" in ++ *Makefile*) ac_comsub="1i\\ ++# $configure_input" ;; ++ *) ac_comsub= ;; ++ esac ++ ++ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` ++ sed -e "$ac_comsub ++s%@configure_input@%$configure_input%g ++s%@srcdir@%$srcdir%g ++s%@top_srcdir@%$top_srcdir%g ++s%@INSTALL@%$INSTALL%g ++" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file ++fi; done ++rm -f conftest.s* ++ ++EOF ++cat >> $CONFIG_STATUS <<EOF ++ ++EOF ++cat >> $CONFIG_STATUS <<\EOF ++ ++exit 0 ++EOF ++chmod +x $CONFIG_STATUS ++rm -fr confdefs* $ac_clean_files ++test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 ++ +diff -ruN blip-0.1.orig/configure.in blip-0.1/configure.in +--- blip-0.1.orig/configure.in Thu Jan 1 08:00:00 1970 ++++ blip-0.1/configure.in Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,14 @@ ++AC_INIT(aclocal.m4) ++AM_INIT_AUTOMAKE(blip, 0.1) ++ ++AC_PROG_RANLIB ++ ++AC_ARG_ENABLE(msn, [ --disable-msn Build without MSN], build_msn="$enableval", build_msn="yes") ++AM_CONDITIONAL(BUILD_MSN, test "x$build_msn" = xyes) ++ ++if test "$build_msn" = "yes"; then ++ AC_PROG_CC ++ AC_PROG_CXX ++fi ++ ++AC_OUTPUT(Makefile) +diff -ruN blip-0.1.orig/install-sh blip-0.1/install-sh +--- blip-0.1.orig/install-sh Thu Jan 1 08:00:00 1970 ++++ blip-0.1/install-sh Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,251 @@ ++#!/bin/sh ++# ++# install - install a program, script, or datafile ++# This comes from X11R5 (mit/util/scripts/install.sh). ++# ++# Copyright 1991 by the Massachusetts Institute of Technology ++# ++# Permission to use, copy, modify, distribute, and sell this software and its ++# documentation for any purpose is hereby granted without fee, provided that ++# the above copyright notice appear in all copies and that both that ++# copyright notice and this permission notice appear in supporting ++# documentation, and that the name of M.I.T. not be used in advertising or ++# publicity pertaining to distribution of the software without specific, ++# written prior permission. M.I.T. makes no representations about the ++# suitability of this software for any purpose. It is provided "as is" ++# without express or implied warranty. ++# ++# Calling this script install-sh is preferred over install.sh, to prevent ++# `make' implicit rules from creating a file called install from it ++# when there is no Makefile. ++# ++# This script is compatible with the BSD install script, but was written ++# from scratch. It can only install one file at a time, a restriction ++# shared with many OS's install programs. ++ ++ ++# set DOITPROG to echo to test this script ++ ++# Don't use :- since 4.3BSD and earlier shells don't like it. ++doit="${DOITPROG-}" ++ ++ ++# put in absolute paths if you don't have them in your path; or use env. vars. ++ ++mvprog="${MVPROG-mv}" ++cpprog="${CPPROG-cp}" ++chmodprog="${CHMODPROG-chmod}" ++chownprog="${CHOWNPROG-chown}" ++chgrpprog="${CHGRPPROG-chgrp}" ++stripprog="${STRIPPROG-strip}" ++rmprog="${RMPROG-rm}" ++mkdirprog="${MKDIRPROG-mkdir}" ++ ++transformbasename="" ++transform_arg="" ++instcmd="$mvprog" ++chmodcmd="$chmodprog 0755" ++chowncmd="" ++chgrpcmd="" ++stripcmd="" ++rmcmd="$rmprog -f" ++mvcmd="$mvprog" ++src="" ++dst="" ++dir_arg="" ++ ++while [ x"$1" != x ]; do ++ case $1 in ++ -c) instcmd="$cpprog" ++ shift ++ continue;; ++ ++ -d) dir_arg=true ++ shift ++ continue;; ++ ++ -m) chmodcmd="$chmodprog $2" ++ shift ++ shift ++ continue;; ++ ++ -o) chowncmd="$chownprog $2" ++ shift ++ shift ++ continue;; ++ ++ -g) chgrpcmd="$chgrpprog $2" ++ shift ++ shift ++ continue;; ++ ++ -s) stripcmd="$stripprog" ++ shift ++ continue;; ++ ++ -t=*) transformarg=`echo $1 | sed 's/-t=//'` ++ shift ++ continue;; ++ ++ -b=*) transformbasename=`echo $1 | sed 's/-b=//'` ++ shift ++ continue;; ++ ++ *) if [ x"$src" = x ] ++ then ++ src=$1 ++ else ++ # this colon is to work around a 386BSD /bin/sh bug ++ : ++ dst=$1 ++ fi ++ shift ++ continue;; ++ esac ++done ++ ++if [ x"$src" = x ] ++then ++ echo "install: no input file specified" ++ exit 1 ++else ++ true ++fi ++ ++if [ x"$dir_arg" != x ]; then ++ dst=$src ++ src="" ++ ++ if [ -d $dst ]; then ++ instcmd=: ++ chmodcmd="" ++ else ++ instcmd=mkdir ++ fi ++else ++ ++# Waiting for this to be detected by the "$instcmd $src $dsttmp" command ++# might cause directories to be created, which would be especially bad ++# if $src (and thus $dsttmp) contains '*'. ++ ++ if [ -f $src -o -d $src ] ++ then ++ true ++ else ++ echo "install: $src does not exist" ++ exit 1 ++ fi ++ ++ if [ x"$dst" = x ] ++ then ++ echo "install: no destination specified" ++ exit 1 ++ else ++ true ++ fi ++ ++# If destination is a directory, append the input filename; if your system ++# does not like double slashes in filenames, you may need to add some logic ++ ++ if [ -d $dst ] ++ then ++ dst="$dst"/`basename $src` ++ else ++ true ++ fi ++fi ++ ++## this sed command emulates the dirname command ++dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` ++ ++# Make sure that the destination directory exists. ++# this part is taken from Noah Friedman's mkinstalldirs script ++ ++# Skip lots of stat calls in the usual case. ++if [ ! -d "$dstdir" ]; then ++defaultIFS=' ++' ++IFS="${IFS-${defaultIFS}}" ++ ++oIFS="${IFS}" ++# Some sh's can't handle IFS=/ for some reason. ++IFS='%' ++set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` ++IFS="${oIFS}" ++ ++pathcomp='' ++ ++while [ $# -ne 0 ] ; do ++ pathcomp="${pathcomp}${1}" ++ shift ++ ++ if [ ! -d "${pathcomp}" ] ; ++ then ++ $mkdirprog "${pathcomp}" ++ else ++ true ++ fi ++ ++ pathcomp="${pathcomp}/" ++done ++fi ++ ++if [ x"$dir_arg" != x ] ++then ++ $doit $instcmd $dst && ++ ++ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && ++ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && ++ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && ++ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi ++else ++ ++# If we're going to rename the final executable, determine the name now. ++ ++ if [ x"$transformarg" = x ] ++ then ++ dstfile=`basename $dst` ++ else ++ dstfile=`basename $dst $transformbasename | ++ sed $transformarg`$transformbasename ++ fi ++ ++# don't allow the sed command to completely eliminate the filename ++ ++ if [ x"$dstfile" = x ] ++ then ++ dstfile=`basename $dst` ++ else ++ true ++ fi ++ ++# Make a temp file name in the proper directory. ++ ++ dsttmp=$dstdir/#inst.$$# ++ ++# Move or copy the file name to the temp name ++ ++ $doit $instcmd $src $dsttmp && ++ ++ trap "rm -f ${dsttmp}" 0 && ++ ++# and set any options; do chmod last to preserve setuid bits ++ ++# If any of these fail, we abort the whole thing. If we want to ++# ignore errors from any of these, just make sure not to ignore ++# errors from the above "$doit $instcmd $src $dsttmp" command. ++ ++ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && ++ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && ++ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && ++ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && ++ ++# Now rename the file to the real destination. ++ ++ $doit $rmcmd -f $dstdir/$dstfile && ++ $doit $mvcmd $dsttmp $dstdir/$dstfile ++ ++fi && ++ ++ ++exit 0 +diff -ruN blip-0.1.orig/md5.c blip-0.1/md5.c +--- blip-0.1.orig/md5.c Thu Jan 1 08:00:00 1970 ++++ blip-0.1/md5.c Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,392 @@ ++/* ++ Copyright (C) 1999 Aladdin Enterprises. All rights reserved. ++ ++ This software is provided 'as-is', without any express or implied ++ warranty. In no event will the authors be held liable for any damages ++ arising from the use of this software. ++ ++ Permission is granted to anyone to use this software for any purpose, ++ including commercial applications, and to alter it and redistribute it ++ freely, subject to the following restrictions: ++ ++ 1. The origin of this software must not be misrepresented; you must not ++ claim that you wrote the original software. If you use this software ++ in a product, an acknowledgment in the product documentation would be ++ appreciated but is not required. ++ 2. Altered source versions must be plainly marked as such, and must not be ++ misrepresented as being the original software. ++ 3. This notice may not be removed or altered from any source distribution. ++ ++ L. Peter Deutsch ++ ghost@aladdin.com ++ ++ */ ++/*$Id: md5.c,v 1.1.1.1 2002/12/09 08:48:19 konst Exp $ */ ++/* ++ Independent implementation of MD5 (RFC 1321). ++ ++ This code implements the MD5 Algorithm defined in RFC 1321. ++ It is derived directly from the text of the RFC and not from the ++ reference implementation. ++ ++ The original and principal author of md5.c is L. Peter Deutsch ++ <ghost@aladdin.com>. Other authors are noted in the change history ++ that follows (in reverse chronological order): ++ ++ 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. ++ 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). ++ 1999-05-03 lpd Original version. ++ */ ++ ++#include "md5.h" ++ ++#ifdef TEST ++/* ++ * Compile with -DTEST to create a self-contained executable test program. ++ * The test program should print out the same values as given in section ++ * A.5 of RFC 1321, reproduced below. ++ */ ++#include <string.h> ++main() ++{ ++ static const char *const test[7] = { ++ "", /*d41d8cd98f00b204e9800998ecf8427e*/ ++ "945399884.61923487334tuvga", /*0cc175b9c0f1b6a831c399e269772661*/ ++ "abc", /*900150983cd24fb0d6963f7d28e17f72*/ ++ "message digest", /*f96b697d7cb7938d525a2f31aaf161d0*/ ++ "abcdefghijklmnopqrstuvwxyz", /*c3fcd3d76192e4007dfb496cca67e13b*/ ++ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", ++ /*d174ab98d277d9f5a5611c2c9f419d9f*/ ++ "12345678901234567890123456789012345678901234567890123456789012345678901234567890" /*57edf4a22be3c955ac49da2e2107b67a*/ ++ }; ++ int i; ++ ++ for (i = 0; i < 7; ++i) { ++ md5_state_t state; ++ md5_byte_t digest[16]; ++ int di; ++ ++ md5_init(&state); ++ md5_append(&state, (const md5_byte_t *)test[i], strlen(test[i])); ++ md5_finish(&state, digest); ++ printf("MD5 (\"%s\") = ", test[i]); ++ for (di = 0; di < 16; ++di) ++ printf("%02x", digest[di]); ++ printf("\n"); ++ } ++ return 0; ++} ++#endif /* TEST */ ++ ++ ++/* ++ * For reference, here is the program that computed the T values. ++ */ ++#if 0 ++#include <math.h> ++main() ++{ ++ int i; ++ for (i = 1; i <= 64; ++i) { ++ unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i))); ++ printf("#define T%d 0x%08lx\n", i, v); ++ } ++ return 0; ++} ++#endif ++/* ++ * End of T computation program. ++ */ ++#define T1 0xd76aa478 ++#define T2 0xe8c7b756 ++#define T3 0x242070db ++#define T4 0xc1bdceee ++#define T5 0xf57c0faf ++#define T6 0x4787c62a ++#define T7 0xa8304613 ++#define T8 0xfd469501 ++#define T9 0x698098d8 ++#define T10 0x8b44f7af ++#define T11 0xffff5bb1 ++#define T12 0x895cd7be ++#define T13 0x6b901122 ++#define T14 0xfd987193 ++#define T15 0xa679438e ++#define T16 0x49b40821 ++#define T17 0xf61e2562 ++#define T18 0xc040b340 ++#define T19 0x265e5a51 ++#define T20 0xe9b6c7aa ++#define T21 0xd62f105d ++#define T22 0x02441453 ++#define T23 0xd8a1e681 ++#define T24 0xe7d3fbc8 ++#define T25 0x21e1cde6 ++#define T26 0xc33707d6 ++#define T27 0xf4d50d87 ++#define T28 0x455a14ed ++#define T29 0xa9e3e905 ++#define T30 0xfcefa3f8 ++#define T31 0x676f02d9 ++#define T32 0x8d2a4c8a ++#define T33 0xfffa3942 ++#define T34 0x8771f681 ++#define T35 0x6d9d6122 ++#define T36 0xfde5380c ++#define T37 0xa4beea44 ++#define T38 0x4bdecfa9 ++#define T39 0xf6bb4b60 ++#define T40 0xbebfbc70 ++#define T41 0x289b7ec6 ++#define T42 0xeaa127fa ++#define T43 0xd4ef3085 ++#define T44 0x04881d05 ++#define T45 0xd9d4d039 ++#define T46 0xe6db99e5 ++#define T47 0x1fa27cf8 ++#define T48 0xc4ac5665 ++#define T49 0xf4292244 ++#define T50 0x432aff97 ++#define T51 0xab9423a7 ++#define T52 0xfc93a039 ++#define T53 0x655b59c3 ++#define T54 0x8f0ccc92 ++#define T55 0xffeff47d ++#define T56 0x85845dd1 ++#define T57 0x6fa87e4f ++#define T58 0xfe2ce6e0 ++#define T59 0xa3014314 ++#define T60 0x4e0811a1 ++#define T61 0xf7537e82 ++#define T62 0xbd3af235 ++#define T63 0x2ad7d2bb ++#define T64 0xeb86d391 ++ ++static void ++md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) ++{ ++ md5_word_t ++ a = pms->abcd[0], b = pms->abcd[1], ++ c = pms->abcd[2], d = pms->abcd[3]; ++ md5_word_t t; ++ ++#ifndef ARCH_IS_BIG_ENDIAN ++# define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */ ++#endif ++#if ARCH_IS_BIG_ENDIAN ++ ++ /* ++ * On big-endian machines, we must arrange the bytes in the right ++ * order. (This also works on machines of unknown byte order.) ++ */ ++ md5_word_t X[16]; ++ const md5_byte_t *xp = data; ++ int i; ++ ++ for (i = 0; i < 16; ++i, xp += 4) ++ X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); ++ ++#else /* !ARCH_IS_BIG_ENDIAN */ ++ ++ /* ++ * On little-endian machines, we can process properly aligned data ++ * without copying it. ++ */ ++ md5_word_t xbuf[16]; ++ const md5_word_t *X; ++ ++ if (!((data - (const md5_byte_t *)0) & 3)) { ++ /* data are properly aligned */ ++ X = (const md5_word_t *)data; ++ } else { ++ /* not aligned */ ++ memcpy(xbuf, data, 64); ++ X = xbuf; ++ } ++#endif ++ ++#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) ++ ++ /* Round 1. */ ++ /* Let [abcd k s i] denote the operation ++ a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ ++#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) ++#define SET(a, b, c, d, k, s, Ti)\ ++ t = a + F(b,c,d) + X[k] + Ti;\ ++ a = ROTATE_LEFT(t, s) + b ++ /* Do the following 16 operations. */ ++ SET(a, b, c, d, 0, 7, T1); ++ SET(d, a, b, c, 1, 12, T2); ++ SET(c, d, a, b, 2, 17, T3); ++ SET(b, c, d, a, 3, 22, T4); ++ SET(a, b, c, d, 4, 7, T5); ++ SET(d, a, b, c, 5, 12, T6); ++ SET(c, d, a, b, 6, 17, T7); ++ SET(b, c, d, a, 7, 22, T8); ++ SET(a, b, c, d, 8, 7, T9); ++ SET(d, a, b, c, 9, 12, T10); ++ SET(c, d, a, b, 10, 17, T11); ++ SET(b, c, d, a, 11, 22, T12); ++ SET(a, b, c, d, 12, 7, T13); ++ SET(d, a, b, c, 13, 12, T14); ++ SET(c, d, a, b, 14, 17, T15); ++ SET(b, c, d, a, 15, 22, T16); ++#undef SET ++ ++ /* Round 2. */ ++ /* Let [abcd k s i] denote the operation ++ a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ ++#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) ++#define SET(a, b, c, d, k, s, Ti)\ ++ t = a + G(b,c,d) + X[k] + Ti;\ ++ a = ROTATE_LEFT(t, s) + b ++ /* Do the following 16 operations. */ ++ SET(a, b, c, d, 1, 5, T17); ++ SET(d, a, b, c, 6, 9, T18); ++ SET(c, d, a, b, 11, 14, T19); ++ SET(b, c, d, a, 0, 20, T20); ++ SET(a, b, c, d, 5, 5, T21); ++ SET(d, a, b, c, 10, 9, T22); ++ SET(c, d, a, b, 15, 14, T23); ++ SET(b, c, d, a, 4, 20, T24); ++ SET(a, b, c, d, 9, 5, T25); ++ SET(d, a, b, c, 14, 9, T26); ++ SET(c, d, a, b, 3, 14, T27); ++ SET(b, c, d, a, 8, 20, T28); ++ SET(a, b, c, d, 13, 5, T29); ++ SET(d, a, b, c, 2, 9, T30); ++ SET(c, d, a, b, 7, 14, T31); ++ SET(b, c, d, a, 12, 20, T32); ++#undef SET ++ ++ /* Round 3. */ ++ /* Let [abcd k s t] denote the operation ++ a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ ++#define H(x, y, z) ((x) ^ (y) ^ (z)) ++#define SET(a, b, c, d, k, s, Ti)\ ++ t = a + H(b,c,d) + X[k] + Ti;\ ++ a = ROTATE_LEFT(t, s) + b ++ /* Do the following 16 operations. */ ++ SET(a, b, c, d, 5, 4, T33); ++ SET(d, a, b, c, 8, 11, T34); ++ SET(c, d, a, b, 11, 16, T35); ++ SET(b, c, d, a, 14, 23, T36); ++ SET(a, b, c, d, 1, 4, T37); ++ SET(d, a, b, c, 4, 11, T38); ++ SET(c, d, a, b, 7, 16, T39); ++ SET(b, c, d, a, 10, 23, T40); ++ SET(a, b, c, d, 13, 4, T41); ++ SET(d, a, b, c, 0, 11, T42); ++ SET(c, d, a, b, 3, 16, T43); ++ SET(b, c, d, a, 6, 23, T44); ++ SET(a, b, c, d, 9, 4, T45); ++ SET(d, a, b, c, 12, 11, T46); ++ SET(c, d, a, b, 15, 16, T47); ++ SET(b, c, d, a, 2, 23, T48); ++#undef SET ++ ++ /* Round 4. */ ++ /* Let [abcd k s t] denote the operation ++ a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ ++#define I(x, y, z) ((y) ^ ((x) | ~(z))) ++#define SET(a, b, c, d, k, s, Ti)\ ++ t = a + I(b,c,d) + X[k] + Ti;\ ++ a = ROTATE_LEFT(t, s) + b ++ /* Do the following 16 operations. */ ++ SET(a, b, c, d, 0, 6, T49); ++ SET(d, a, b, c, 7, 10, T50); ++ SET(c, d, a, b, 14, 15, T51); ++ SET(b, c, d, a, 5, 21, T52); ++ SET(a, b, c, d, 12, 6, T53); ++ SET(d, a, b, c, 3, 10, T54); ++ SET(c, d, a, b, 10, 15, T55); ++ SET(b, c, d, a, 1, 21, T56); ++ SET(a, b, c, d, 8, 6, T57); ++ SET(d, a, b, c, 15, 10, T58); ++ SET(c, d, a, b, 6, 15, T59); ++ SET(b, c, d, a, 13, 21, T60); ++ SET(a, b, c, d, 4, 6, T61); ++ SET(d, a, b, c, 11, 10, T62); ++ SET(c, d, a, b, 2, 15, T63); ++ SET(b, c, d, a, 9, 21, T64); ++#undef SET ++ ++ /* Then perform the following additions. (That is increment each ++ of the four registers by the value it had before this block ++ was started.) */ ++ pms->abcd[0] += a; ++ pms->abcd[1] += b; ++ pms->abcd[2] += c; ++ pms->abcd[3] += d; ++} ++ ++void ++md5_init(md5_state_t *pms) ++{ ++ pms->count[0] = pms->count[1] = 0; ++ pms->abcd[0] = 0x67452301; ++ pms->abcd[1] = 0xefcdab89; ++ pms->abcd[2] = 0x98badcfe; ++ pms->abcd[3] = 0x10325476; ++} ++ ++void ++md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes) ++{ ++ const md5_byte_t *p = data; ++ int left = nbytes; ++ int offset = (pms->count[0] >> 3) & 63; ++ md5_word_t nbits = (md5_word_t)(nbytes << 3); ++ ++ if (nbytes <= 0) ++ return; ++ ++ /* Update the message length. */ ++ pms->count[1] += nbytes >> 29; ++ pms->count[0] += nbits; ++ if (pms->count[0] < nbits) ++ pms->count[1]++; ++ ++ /* Process an initial partial block. */ ++ if (offset) { ++ int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); ++ ++ memcpy(pms->buf + offset, p, copy); ++ if (offset + copy < 64) ++ return; ++ p += copy; ++ left -= copy; ++ md5_process(pms, pms->buf); ++ } ++ ++ /* Process full blocks. */ ++ for (; left >= 64; p += 64, left -= 64) ++ md5_process(pms, p); ++ ++ /* Process a final partial block. */ ++ if (left) ++ memcpy(pms->buf, p, left); ++} ++ ++void ++md5_finish(md5_state_t *pms, md5_byte_t digest[16]) ++{ ++ static const md5_byte_t pad[64] = { ++ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ++ }; ++ md5_byte_t data[8]; ++ int i; ++ ++ /* Save the length before padding. */ ++ for (i = 0; i < 8; ++i) ++ data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); ++ /* Pad to 56 bytes mod 64. */ ++ md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); ++ /* Append the length. */ ++ md5_append(pms, data, 8); ++ for (i = 0; i < 16; ++i) ++ digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); ++} +diff -ruN blip-0.1.orig/md5.h blip-0.1/md5.h +--- blip-0.1.orig/md5.h Thu Jan 1 08:00:00 1970 ++++ blip-0.1/md5.h Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,94 @@ ++/* ++ Copyright (C) 1999 Aladdin Enterprises. All rights reserved. ++ ++ This software is provided 'as-is', without any express or implied ++ warranty. In no event will the authors be held liable for any damages ++ arising from the use of this software. ++ ++ Permission is granted to anyone to use this software for any purpose, ++ including commercial applications, and to alter it and redistribute it ++ freely, subject to the following restrictions: ++ ++ 1. The origin of this software must not be misrepresented; you must not ++ claim that you wrote the original software. If you use this software ++ in a product, an acknowledgment in the product documentation would be ++ appreciated but is not required. ++ 2. Altered source versions must be plainly marked as such, and must not be ++ misrepresented as being the original software. ++ 3. This notice may not be removed or altered from any source distribution. ++ ++ L. Peter Deutsch ++ ghost@aladdin.com ++ ++ */ ++/*$Id: md5.h,v 1.1.1.1 2002/12/09 08:48:22 konst Exp $ */ ++/* ++ Independent implementation of MD5 (RFC 1321). ++ ++ This code implements the MD5 Algorithm defined in RFC 1321. ++ It is derived directly from the text of the RFC and not from the ++ reference implementation. ++ ++ The original and principal author of md5.h is L. Peter Deutsch ++ <ghost@aladdin.com>. Other authors are noted in the change history ++ that follows (in reverse chronological order): ++ ++ 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. ++ 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); ++ added conditionalization for C++ compilation from Martin ++ Purschke <purschke@bnl.gov>. ++ 1999-05-03 lpd Original version. ++ */ ++ ++#ifndef md5_INCLUDED ++# define md5_INCLUDED ++ ++/* ++ * This code has some adaptations for the Ghostscript environment, but it ++ * will compile and run correctly in any environment with 8-bit chars and ++ * 32-bit ints. Specifically, it assumes that if the following are ++ * defined, they have the same meaning as in Ghostscript: P1, P2, P3, ++ * ARCH_IS_BIG_ENDIAN. ++ */ ++ ++typedef unsigned char md5_byte_t; /* 8-bit byte */ ++typedef unsigned int md5_word_t; /* 32-bit word */ ++ ++/* Define the state of the MD5 Algorithm. */ ++typedef struct md5_state_s { ++ md5_word_t count[2]; /* message length in bits, lsw first */ ++ md5_word_t abcd[4]; /* digest buffer */ ++ md5_byte_t buf[64]; /* accumulate block */ ++} md5_state_t; ++ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++ ++/* Initialize the algorithm. */ ++#ifdef P1 ++void md5_init(P1(md5_state_t *pms)); ++#else ++void md5_init(md5_state_t *pms); ++#endif ++ ++/* Append a string to the message. */ ++#ifdef P3 ++void md5_append(P3(md5_state_t *pms, const md5_byte_t *data, int nbytes)); ++#else ++void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes); ++#endif ++ ++/* Finish the message and return the digest. */ ++#ifdef P2 ++void md5_finish(P2(md5_state_t *pms, md5_byte_t digest[16])); ++#else ++void md5_finish(md5_state_t *pms, md5_byte_t digest[16]); ++#endif ++ ++#ifdef __cplusplus ++} /* end extern "C" */ ++#endif ++ ++#endif /* md5_INCLUDED */ +diff -ruN blip-0.1.orig/missing blip-0.1/missing +--- blip-0.1.orig/missing Thu Jan 1 08:00:00 1970 ++++ blip-0.1/missing Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,198 @@ ++#! /bin/sh ++# Common stub for a few missing GNU programs while installing. ++# Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc. ++# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996. ++ ++# 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, 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. ++ ++if test $# -eq 0; then ++ echo 1>&2 "Try \`$0 --help' for more information" ++ exit 1 ++fi ++ ++# In the cases where this matters, `missing' is being run in the ++# srcdir already. ++if test -f configure.in; then ++ configure_ac=configure.ac ++else ++ configure_ac=configure.in ++fi ++ ++case "$1" in ++ ++ -h|--h|--he|--hel|--help) ++ echo "\ ++$0 [OPTION]... PROGRAM [ARGUMENT]... ++ ++Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an ++error status if there is no known handling for PROGRAM. ++ ++Options: ++ -h, --help display this help and exit ++ -v, --version output version information and exit ++ ++Supported PROGRAM values: ++ aclocal touch file \`aclocal.m4' ++ autoconf touch file \`configure' ++ autoheader touch file \`config.h.in' ++ automake touch all \`Makefile.in' files ++ bison create \`y.tab.[ch]', if possible, from existing .[ch] ++ flex create \`lex.yy.c', if possible, from existing .c ++ lex create \`lex.yy.c', if possible, from existing .c ++ makeinfo touch the output file ++ yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ++ ;; ++ ++ -v|--v|--ve|--ver|--vers|--versi|--versio|--version) ++ echo "missing - GNU libit 0.0" ++ ;; ++ ++ -*) ++ echo 1>&2 "$0: Unknown \`$1' option" ++ echo 1>&2 "Try \`$0 --help' for more information" ++ exit 1 ++ ;; ++ ++ aclocal) ++ echo 1>&2 "\ ++WARNING: \`$1' is missing on your system. You should only need it if ++ you modified \`acinclude.m4' or \`$configure_ac'. You might want ++ to install the \`Automake' and \`Perl' packages. Grab them from ++ any GNU archive site." ++ touch aclocal.m4 ++ ;; ++ ++ autoconf) ++ echo 1>&2 "\ ++WARNING: \`$1' is missing on your system. You should only need it if ++ you modified \`$configure_ac'. You might want to install the ++ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU ++ archive site." ++ touch configure ++ ;; ++ ++ autoheader) ++ echo 1>&2 "\ ++WARNING: \`$1' is missing on your system. You should only need it if ++ you modified \`acconfig.h' or \`$configure_ac'. You might want ++ to install the \`Autoconf' and \`GNU m4' packages. Grab them ++ from any GNU archive site." ++ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac` ++ test -z "$files" && files="config.h" ++ touch_files= ++ for f in $files; do ++ case "$f" in ++ *:*) touch_files="$touch_files "`echo "$f" | ++ sed -e 's/^[^:]*://' -e 's/:.*//'`;; ++ *) touch_files="$touch_files $f.in";; ++ esac ++ done ++ touch $touch_files ++ ;; ++ ++ automake) ++ echo 1>&2 "\ ++WARNING: \`$1' is missing on your system. You should only need it if ++ you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'. ++ You might want to install the \`Automake' and \`Perl' packages. ++ Grab them from any GNU archive site." ++ find . -type f -name Makefile.am -print | ++ sed 's/\.am$/.in/' | ++ while read f; do touch "$f"; done ++ ;; ++ ++ bison|yacc) ++ echo 1>&2 "\ ++WARNING: \`$1' is missing on your system. You should only need it if ++ you modified a \`.y' file. You may need the \`Bison' package ++ in order for those modifications to take effect. You can get ++ \`Bison' from any GNU archive site." ++ rm -f y.tab.c y.tab.h ++ if [ $# -ne 1 ]; then ++ eval LASTARG="\${$#}" ++ case "$LASTARG" in ++ *.y) ++ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` ++ if [ -f "$SRCFILE" ]; then ++ cp "$SRCFILE" y.tab.c ++ fi ++ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` ++ if [ -f "$SRCFILE" ]; then ++ cp "$SRCFILE" y.tab.h ++ fi ++ ;; ++ esac ++ fi ++ if [ ! -f y.tab.h ]; then ++ echo >y.tab.h ++ fi ++ if [ ! -f y.tab.c ]; then ++ echo 'main() { return 0; }' >y.tab.c ++ fi ++ ;; ++ ++ lex|flex) ++ echo 1>&2 "\ ++WARNING: \`$1' is missing on your system. You should only need it if ++ you modified a \`.l' file. You may need the \`Flex' package ++ in order for those modifications to take effect. You can get ++ \`Flex' from any GNU archive site." ++ rm -f lex.yy.c ++ if [ $# -ne 1 ]; then ++ eval LASTARG="\${$#}" ++ case "$LASTARG" in ++ *.l) ++ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` ++ if [ -f "$SRCFILE" ]; then ++ cp "$SRCFILE" lex.yy.c ++ fi ++ ;; ++ esac ++ fi ++ if [ ! -f lex.yy.c ]; then ++ echo 'main() { return 0; }' >lex.yy.c ++ fi ++ ;; ++ ++ makeinfo) ++ echo 1>&2 "\ ++WARNING: \`$1' is missing on your system. You should only need it if ++ you modified a \`.texi' or \`.texinfo' file, or any other file ++ indirectly affecting the aspect of the manual. The spurious ++ call might also be the consequence of using a buggy \`make' (AIX, ++ DU, IRIX). You might want to install the \`Texinfo' package or ++ the \`GNU make' package. Grab either from any GNU archive site." ++ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` ++ if test -z "$file"; then ++ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` ++ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` ++ fi ++ touch $file ++ ;; ++ ++ *) ++ echo 1>&2 "\ ++WARNING: \`$1' is needed, and you do not seem to have it handy on your ++ system. You might have modified some files without having the ++ proper tools for further handling them. Check the \`README' file, ++ it often tells you about the needed prerequirements for installing ++ this package. You may also peek at any GNU archive site, in case ++ some other package would contain this missing \`$1' program." ++ exit 1 ++ ;; ++esac ++ ++exit 0 +diff -ruN blip-0.1.orig/mkinstalldirs blip-0.1/mkinstalldirs +--- blip-0.1.orig/mkinstalldirs Thu Jan 1 08:00:00 1970 ++++ blip-0.1/mkinstalldirs Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,40 @@ ++#! /bin/sh ++# mkinstalldirs --- make directory hierarchy ++# Author: Noah Friedman <friedman@prep.ai.mit.edu> ++# Created: 1993-05-16 ++# Public domain ++ ++# $Id: mkinstalldirs,v 1.13 1999/01/05 03:18:55 bje Exp $ ++ ++errstatus=0 ++ ++for file ++do ++ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` ++ shift ++ ++ pathcomp= ++ for d ++ do ++ pathcomp="$pathcomp$d" ++ case "$pathcomp" in ++ -* ) pathcomp=./$pathcomp ;; ++ esac ++ ++ if test ! -d "$pathcomp"; then ++ echo "mkdir $pathcomp" ++ ++ mkdir "$pathcomp" || lasterr=$? ++ ++ if test ! -d "$pathcomp"; then ++ errstatus=$lasterr ++ fi ++ fi ++ ++ pathcomp="$pathcomp/" ++ done ++done ++ ++exit $errstatus ++ ++# mkinstalldirs ends here +diff -ruN blip-0.1.orig/msn_bittybits.C blip-0.1/msn_bittybits.C +--- blip-0.1.orig/msn_bittybits.C Thu Jan 1 08:00:00 1970 ++++ blip-0.1/msn_bittybits.C Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,283 @@ ++/* msn_bittybits.c - all the little string- and list-bashing functions */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++#include <ctype.h> ++#include <sys/errno.h> ++ ++#include "msn_core.h" ++#include "msn_interface.h" ++#include "msn_bittybits.h" ++ ++char ** msn_read_line(int sock, int * numargs) ++{ ++ // Right, this is quite a task. Step One is to read the thing in. ++ char ** retval; ++ char c; ++ int pos=0, numspaces=0; ++ ++ *numargs = 0; ++ ++ while(1) ++ { ++ if(read(sock, &c, 1)<1) ++ { ++ #ifdef MSNDEBUG ++ perror("Stream closed\n"); //DEBUG ++ #endif ++ return NULL; ++ } ++ if(c=='\314') { return NULL; } // just drop it ++ if(c=='\r') { continue; } ++ if(c=='\n') { numspaces++; buf[pos]='\0'; break; } ++ if(c==' ') { numspaces++; } ++ buf[pos]=c; ++ pos++; ++ if(pos>=BUF_SIZE) ++ { ++ #ifdef MSNDEBUG ++ printf("Severe warning - overflow, dropping/splitting a line!"); ++ #endif ++ return NULL; ++ } ++ } ++ ++ if(numspaces==0) { ++ #ifdef MSNDEBUG ++ printf("What the..?\n"); ++ #endif ++ return NULL; } ++ ++ ext_protocol_log(buf, 1, 0); ++ ++ retval=new char * [numspaces]; ++ retval[0]=new char[strlen(buf)+1]; ++ strcpy(retval[0], buf); ++ *numargs=numspaces; ++ ++ // OK, take it as read (boom, boom!) ++ // Now we cruise through the string, changing all spaces to null 0's and setting ++ // a pointer at the beginning of each substring ++ ++ pos=0; ++ numspaces=1; // pointer #0 is already set at the beginning ++ while(1) ++ { ++ if(retval[0][pos]==' ') ++ { ++ retval[0][pos]='\0'; ++ retval[numspaces]=retval[0]+pos+1; ++ numspaces++; ++ pos++; ++ continue; ++ } ++ if(retval[0][pos]=='\0') { break; } ++ ++ pos++; ++ } ++ ++ return retval; ++} ++ ++void msn_clean_up(msnconn * conn) ++{ ++ llist * connlist; ++ connlist=connections; ++ ++ if(conn->type!=CONN_FTP) ++ { ext_closing_connection(conn); } ++ ++ while(1) ++ { ++ if(connlist==NULL) { return; } ++ if(connlist->data==conn) { break; } ++ connlist=connlist->next; ++ } ++ ++ close(conn->sock); ++ ext_unregister_sock(conn->sock); ++// delete conn; ++ ++ if(connlist->next!=NULL) ++ { connlist->next->prev=connlist->prev; } ++ if(connlist->prev!=NULL) ++ { connlist->prev->next=connlist->next; } else { connections=connlist->next; } ++ connlist->prev=NULL; // no recursive destructors, please... ++ connlist->next=NULL; ++ connlist->data=NULL; // already deleted the conn object ++ delete connlist; ++} ++ ++void msn_add_callback(msnconn * conn, void (*func)(msnconn * conn, int trid, char ** args, int numargs, callback_data * data), int trid, callback_data * data) ++{ ++ callback * call; ++ ++ call=new callback; ++ call->trid=trid; ++ call->data=data; ++ call->func=func; ++ ++ msn_add_to_llist(conn->callbacks, call); ++} ++ ++void msn_del_callback(msnconn * conn, int trid) ++{ ++ llist * list; ++ callback * call; ++ ++ list=conn->callbacks; ++ ++ if(list==NULL) { return; } ++ ++ do ++ { ++ call=(callback *)list->data; ++ if(call->trid==trid) ++ { ++ if(list->next!=NULL) ++ { list->next->prev=list->prev; } ++ if(list->prev!=NULL) ++ { list->prev->next=list->next; } else { conn->callbacks=NULL; } ++ list->prev=NULL; // no recursive destructors ++ list->next=NULL; ++ delete list; ++ break; ++ } ++ list=list->next; ++ } while(list!=NULL); ++} ++ ++void msn_add_to_llist(llist *& listp, llist_data * data) ++{ ++ llist * tlist; ++ llist * newlist; ++ ++ if(listp==NULL) { listp=new llist; listp->data=data; return; } ++ ++ tlist=listp; ++ ++ while(tlist->next!=NULL) { tlist=tlist->next; } ++ ++ newlist=new llist; ++ newlist->prev=tlist; ++ newlist->next=NULL; ++ newlist->data=data; ++ tlist->next=newlist; ++} ++ ++void msn_del_from_llist(llist *& listp, llist_data * data) ++{ ++ // Note: this function does NOT delete the data, only the list object ++ llist * tlist; ++ ++ tlist=listp; ++ ++ while(tlist!=NULL) ++ { ++ if(tlist->data==data) ++ { ++ if(tlist->next!=NULL) ++ { tlist->next->prev=tlist->prev; } ++ if(tlist->prev!=NULL) ++ { tlist->prev->next=tlist->next; } else { listp=tlist->next; } ++ tlist->next=NULL; // otherwise the whole list is clobbered by the destructor ++ tlist->prev=NULL; ++ tlist->data=NULL; ++ delete tlist; ++ return; ++ } ++ tlist=tlist->next; ++ } ++} ++ ++int msn_count_llist(llist * list) ++{ ++ llist * l=list; ++ int retval=0; ++ ++ while(l!=NULL) { l=l->next; retval++; } ++ ++ return retval; ++} ++ ++char * msn_permstring(const char * s) ++{ ++ char * retval; ++ ++ if(s==NULL) { return NULL; } ++ ++ retval=new char [strlen(s)+1]; ++ ++ strcpy(retval, s); ++ ++ return retval; ++} ++ ++char * msn_decode_URL(char * s) ++{ ++ char * rpos; // read ++ char * wpos; // write ++ ++ wpos=rpos=s; ++ ++ while(1) ++ { ++ if(*rpos=='\0') { *wpos='\0'; break; } ++ ++ if(*rpos=='%') ++ { ++ char buf[3]; ++ int c; ++ rpos++; ++ buf[0]=*rpos; ++ rpos++; ++ buf[1]=*rpos; ++ rpos++; ++ buf[2]='\0'; ++ sscanf(buf, "%x", &c); ++ *wpos=c; ++ wpos++; ++ continue; ++ } ++ ++ *wpos=*rpos; ++ rpos++; ++ wpos++; ++ } ++ return s; ++} ++ ++char * msn_encode_URL(const char * s) ++{ ++ const char * rptr = s; ++ char * wptr; ++ char * retval; ++ ++ wptr=retval=new char[strlen(s)*3]; ++ ++ while(1) ++ { ++ if(*rptr=='\0') ++ { *wptr='\0'; break; } ++ ++ if(!(isalpha(*rptr) || isdigit(*rptr))) ++ { ++ if ( *rptr != '\xc2' && *rptr != '\xb0' ) { ++ sprintf(wptr, "%%%2x", (int)(*rptr)); ++ ++ rptr++; ++ wptr+=3; ++ continue; ++ } ++ } ++ ++ *wptr=*rptr; ++ wptr++; ++ rptr++; ++ } ++ ++ return retval; ++} ++ +diff -ruN blip-0.1.orig/msn_bittybits.h blip-0.1/msn_bittybits.h +--- blip-0.1.orig/msn_bittybits.h Thu Jan 1 08:00:00 1970 ++++ blip-0.1/msn_bittybits.h Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,35 @@ ++#ifndef __MSN_BITTYBITS_H__ ++#define __MSN_BITTYBITS_H__ ++ ++/* msn_bittybits.h - all the little string-bashing functions */ ++ ++/* ++ char ** msn_read_line(int sock, int * numargs); ++ ++ Purpose: Read a line from the MSN server, then break it up into ++ space-separated strings ++ Arguments: ++ sock The socket to use ++ numargs Gets set to the number of arguments ++ Returns: A NULL-terminated array of strings, or NULL on error ++*/ ++char ** msn_read_line(int sock, int * numargs); ++ ++void msn_clean_up(msnconn * conn); ++ ++void msn_add_callback(msnconn * conn, void (*func)(msnconn * conn, int trid, char ** args, int numargs, callback_data * data), int trid, callback_data * data); ++ ++void msn_del_callback(msnconn * conn, int trid); ++ ++void msn_add_to_llist(llist *& listp, llist_data * data); ++ ++void msn_del_from_llist(llist *& listp, llist_data * data); ++ ++int msn_count_llist(llist * list); ++ ++char * msn_permstring(const char * s); ++ ++char * msn_decode_URL(char * s); ++char * msn_encode_URL(const char * s); ++ ++#endif +diff -ruN blip-0.1.orig/msn_core.C blip-0.1/msn_core.C +--- blip-0.1.orig/msn_core.C Thu Jan 1 08:00:00 1970 ++++ blip-0.1/msn_core.C Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,2162 @@ ++/* msn_core.c - this contains all the functions used to do anything with MSN */ ++ ++#include <stdio.h> ++#include <unistd.h> ++#include <ctype.h> ++#include <stdlib.h> ++#include <string.h> ++ ++#include <errno.h> ++#include <sys/time.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++#include <fcntl.h> ++#include <time.h> ++ ++#include <sys/types.h> ++#include <sys/socket.h> // for the accept() in filetrans code ++#include <sys/stat.h> ++ ++#include "md5.h" ++#include "msn_core.h" ++#include "msn_bittybits.h" ++#include "msn_interface.h" ++#include "../connwrap-0.1/connwrap.h" ++ ++#define DEBUG 1 ++#define MSN_VERSION_ID 0 // ID that is sent after commands like CHG, NLN, etc. ++ ++// Define all those extern'ed variables in msn_core.h: ++llist * connections=NULL; ++int next_trid=10; ++char buf[BUF_SIZE]; // used for anything temporary ++char * errors[1000]; ++char default_error_msg[]="Unknown error code"; ++ ++void msn_init(msnconn * conn, const char * username, const char * password) ++{ ++ srand(time(NULL)); ++ ++ conn->auth=new authdata_NS; ++ conn->type=CONN_NS; ++ conn->ready=0; ++ ((authdata_NS *)conn->auth)->username=msn_permstring(username); ++ ((authdata_NS *)conn->auth)->password=msn_permstring(password); ++ ++ for(int a=0; a<1000; a++) ++ { ++ errors[a]=default_error_msg; ++ } ++ ++ errors[200]=msn_permstring("Syntax error"); ++ errors[201]=msn_permstring("Invalid parameter"); ++ errors[205]=msn_permstring("Invalid user"); ++ errors[206]=msn_permstring("Domain name missing from username"); ++ errors[207]=msn_permstring("Already logged in"); ++ errors[208]=msn_permstring("Invalid username"); ++ errors[209]=msn_permstring("Invalid friendly name"); ++ errors[210]=msn_permstring("List full"); ++ errors[215]=msn_permstring("This user is already on this list or in this session"); ++ errors[216]=msn_permstring("Not on list"); ++ errors[218]=msn_permstring("Already in this mode"); ++ errors[219]=msn_permstring("This user is already in the opposite list"); ++ errors[280]=msn_permstring("Switchboard server failed"); ++ errors[281]=msn_permstring("Transfer notification failed"); ++ errors[300]=msn_permstring("Required fields missing"); ++ errors[302]=msn_permstring("Not logged in"); ++ errors[500]=msn_permstring("Internal server error"); ++ errors[501]=msn_permstring("Database server error"); ++ errors[510]=msn_permstring("File operation failed at server"); ++ errors[520]=msn_permstring("Memory allocation failed on server"); ++ errors[600]=msn_permstring("The server is too busy"); ++ errors[601]=msn_permstring("The server is unavailable"); ++ errors[602]=msn_permstring("A Peer Notification Server is down"); ++ errors[603]=msn_permstring("Database connection failed"); ++ errors[604]=msn_permstring("Server going down for maintenance"); ++ errors[707]=msn_permstring("Server failed to create connection"); ++ errors[711]=msn_permstring("Blocking write failed on server"); ++ errors[712]=msn_permstring("Session overload on server"); ++ errors[713]=msn_permstring("You have been too active recently. Slow down!"); ++ errors[714]=msn_permstring("Too many sessions open"); ++ errors[715]=msn_permstring("Not expected"); ++ errors[717]=msn_permstring("Bad friend file on server"); ++ errors[911]=msn_permstring("Authentication failed. Check that you typed your username and password correctly."); ++ errors[913]=msn_permstring("This action is not allowed while you are offline"); ++ errors[920]=msn_permstring("This server is not accepting new users"); ++ ++ msn_add_to_llist(connections, conn); ++} ++ ++void msn_show_verbose_error(msnconn * conn, int errcode) ++{ ++ snprintf(buf, 1024, "An error has occurred while communicating with the MSN Messenger server: %s (code %d)", errors[errcode], errcode); ++ ext_show_error(conn, buf); ++} ++ ++void msn_invite_user(msnconn * conn, char * rcpt) ++{ ++ sprintf(buf, "CAL %d %s\r\n", next_trid++, rcpt); ++ write(conn->sock, buf, strlen(buf)); ++} ++ ++void msn_send_IM(msnconn * conn, const char * rcpt, const char * s) ++{ ++ static char header[]="MIME-Version: 1.0\r\nContent-Type: text/plain; charset=UTF-8\r\n\r\n"; ++ message * msg=new message; ++ msg->body=s; ++ msg->header=msn_permstring(header); ++ msg->font=NULL; ++ msg->colour=NULL; ++ msn_send_IM(conn, rcpt, msg); ++ ++ msg->body=NULL; // don't delete s ++ delete msg; ++} ++ ++void msn_send_IM(msnconn * conn, const char * rcpt, message * msg) ++{ ++ char header[1024]; ++ ++ if(conn->type==CONN_NS) ++ { ++ llist * list; ++ ++ list=connections; ++ while(1) ++ { ++ msnconn * c; ++ llist * users; ++ ++ if(list==NULL) { break ; } ++ c=(msnconn *)list->data; ++ if(c->type==CONN_NS) { list=list->next; continue; } ++ users=c->users; ++ // the below sends a message into this session if the only other participant is ++ // the user we want to talk to ++ if(users!=NULL && users->next==NULL && !strcmp(((char_data *)users->data)->c, rcpt)) ++ { ++ msn_send_IM(c, rcpt, msg); ++ return; ++ } ++ ++ list=list->next; ++ } ++ // otherwise, just connect ++ msn_request_SB(conn, rcpt, msg, NULL); ++ return; ++ } ++ ++ if(msg->header==NULL) ++ { ++ if(msg->font==NULL) ++ { ++ sprintf(header, "MIME-Version: 1.0\r\nContent-Type: %s\r\n\r\n", (msg->content==NULL)?("text/plain; charset=UTF-8"):(msg->content)); ++ } else { ++ char * fontname=msn_encode_URL(msg->font); ++ char ef[2] = {'\0', '\0'}; ++ if(msg->bold) { ef[0]='B'; } ++ if(msg->underline) { ef[0]='U'; } ++ ++ sprintf(header, "MIME-Version: 1.0\r\nContent-Type: %s\r\nX-MMS-IM-Format: FN=%s; EF=%s; CO=%s; CS=0; PF=%d\r\n\r\n", ++ (msg->content==NULL)?("text/plain"):(msg->content), fontname, ef, msg->colour, msg->fontsize); ++ ++ delete fontname; ++ } ++ } else { ++ strcpy(header, msg->header); ++ } ++ ++ ++ sprintf(buf, "MSG %d N %d\r\n%s", next_trid, strlen(header)+strlen(msg->body), header); ++ write(conn->sock, buf, strlen(buf)); ++ write(conn->sock, msg->body, strlen(msg->body)); ++ next_trid++; ++} ++ ++void msn_send_typing(msnconn * conn) ++{ ++ char header[]="MIME-Version: 1.0\r\nContent-Type: text/x-msmsgscontrol\r\nTypingUser: "; ++ char * username=((authdata_SB *)conn->auth)->username; ++ ++ sprintf(buf, "MSG %d U %d\r\n%s%s\r\n\r\n\r\n", ++ next_trid++, strlen(header)+strlen(username)+6, header, username); ++ ++ write(conn->sock, buf, strlen(buf)); ++} ++ ++void msn_add_to_list(msnconn * conn, const char * lst, const char * username) ++{ ++ sprintf(buf, "ADD %d %s %s %s\r\n", next_trid++, lst, username, username); ++ write(conn->sock, buf, strlen(buf)); ++} ++ ++void msn_del_from_list(msnconn * conn, const char * lst, const char * username) ++{ ++ sprintf(buf, "REM %d %s %s\r\n", next_trid++, lst, username); ++ write(conn->sock, buf, strlen(buf)); ++} ++ ++void msn_set_GTC(msnconn * conn, char c) ++{ ++ sprintf(buf, "GTC %d %c\r\n", next_trid++, c); ++ write(conn->sock, buf, strlen(buf)); ++} ++ ++void msn_set_BLP(msnconn * conn, char c) ++{ ++ sprintf(buf, "BLP %d %cL\r\n", next_trid++, c); ++ write(conn->sock, buf, strlen(buf)); ++} ++ ++void msn_set_friendlyname(msnconn * conn, const char * friendlyname) ++{ ++ char * username; ++ ++ username=((authdata_NS *)conn->auth)->username; ++ sprintf(buf, "REA %d %s %s\r\n", next_trid++, username, msn_encode_URL(friendlyname)); ++ write(conn->sock, buf, strlen(buf)); ++} ++ ++void msn_get_list_info( msnconn *conn, int nargs, char **args ) ++{ ++ char buf[ 1000 ]; ++ syncinfo *info; ++ ++ info = conn->sync_info; ++ ++ if ( NULL == info ) ++ { ++ ext_debug("error! : conn->sync_info == NULL in msn_get_list_info"); ++ return ; ++ } ++ ++ if ( !nargs ) ++ return ; ++ ++ if ( !strcmp( args[ 0 ], "SYN" ) ) ++ { ++ if ( info->serial == atoi( args[ 2 ] ) ) ++ { ++ delete info; ++ info = NULL; ++ ext_got_info(conn, NULL); ++ return; ++ } ++ ++ info->serial = atoi( args[ 2 ] ); ++ ext_latest_serial( conn, info->serial ); ++ info->nContacts = atoi( args[ 3 ] ); ++ info->nGroups = atoi( args[ 4 ] ); ++ return ; ++ } ++ ++ if ( !strcmp( args[ 0 ], "GTC" ) ) ++ { ++ info->gtc = args[ 1 ][ 0 ]; ++ info->complete |= COMPLETE_GTC; ++ ext_got_GTC( conn, args[ 1 ][ 0 ] ); ++ } ++ ++ if ( !strcmp( args[ 0 ], "BLP" ) ) ++ { ++ info->blp = args[ 1 ][0]; ++ info->complete |= COMPLETE_BLP; ++ ext_got_BLP( conn, args[ 1 ][ 0 ] ); ++ } ++ ++ if ( !strcmp( args[ 0 ], "PRP" ) ) ++ { ++ // We just eat PRP-codes. ++ return ; ++ } ++ ++ if ( !strcmp( args[ 0 ], "LSG" ) ) ++ { ++ if ( !info->nContacts ) ++ { ++ msn_check_rl(conn, info); ++ ext_got_info(conn, info); ++ delete info; ++ conn->sync = 0; ++ } ++ ++ // Just eat 'm. ++ return ; ++ } ++ ++ if ( !strcmp( args[ 0 ], "BPR" ) ) ++ { ++ if ( !info->nFound ) { ++ ext_debug("MSNp8: error: got BPR without contact"); ++ } else { ++ llist *ll = info->fl; ++ ++ while( ll ) { ++ userdata * ud = (userdata *) ll->data; ++ ++ if( !strcmp( ud->username, info->last_user_handled ) ) ++ { ++ phonedata * newphone=new phonedata(); ++ newphone->title=msn_permstring(args[1]); ++ newphone->number=msn_decode_URL(msn_permstring(args[2])); ++ msn_add_to_llist( ud->phone, newphone ); ++ break; ++ } ++ ++ ll = ll->next; ++ } ++ } ++ ++ return ; ++ } ++ ++ // 0 1 2 ++ // LST email@address.com Friendly%20Nickname w x,y,z ++ if ( !strcmp( args[ 0 ], "LST" ) ) ++ { ++ // XXX - Todo: see if the user is really on our FL ++ // list and handle the BL list. ++ ++ userdata *newuser_fl = new userdata(); ++ newuser_fl->username = msn_permstring( args[ 1 ] ); ++ newuser_fl->friendlyname = msn_decode_URL( msn_permstring( args[ 1 ] ) ); ++ ++ info->last_user_handled = newuser_fl->username; ++ ++ msn_add_to_llist( info->fl, newuser_fl ); ++ ++ userdata *newuser_rl = new userdata(); ++ newuser_rl->username = msn_permstring( args[ 1 ] ); ++ newuser_rl->friendlyname = msn_decode_URL( msn_permstring( args[ 1 ] ) ); ++ ++ msn_add_to_llist( info->rl, newuser_rl ); ++ ++ userdata *newuser_al = new userdata(); ++ newuser_al->username = msn_permstring( args[ 1 ] ); ++ newuser_al->friendlyname = msn_decode_URL( msn_permstring( args[ 1 ] ) ); ++ ++ msn_add_to_llist( info->al, newuser_al ); ++ ++ info->nFound++; ++ ++ if ( info->nFound == info->nContacts ) ++ { ++ msn_check_rl(conn, info); ++ ext_got_info(conn, info); ++ delete info; ++ conn->sync = 0; ++ } ++ } ++} ++ ++void msn_sync_lists(msnconn * conn, int version) ++{ ++ syncinfo * info=new syncinfo; ++ ++ info->serial=version; ++ ++ sprintf(buf, "SYN %d %d\r\n", next_trid, version); ++ write(conn->sock, buf, strlen(buf)); ++ ++ conn->sync = 1; ++ conn->sync_info = info; ++ ++ next_trid++; ++} ++ ++void msn_check_rl(msnconn * conn, syncinfo * info) ++{ ++ llist * flist; // FL ++ llist * olist; // other list ++ userdata * fcontact; ++ userdata * ocontact; ++ ++ int is_on_list; ++ int a=0; ++ ++ flist=info->rl; ++ ++ while(flist!=NULL) ++ { ++ is_on_list=0; ++ ++ fcontact=(userdata *)flist->data; ++ ++ a=0; ++ for(olist=info->al; a<2; olist=info->bl, a++) ++ { ++ while(olist!=NULL) ++ { ++ ocontact=(userdata *)olist->data; ++ if(!strcmp(ocontact->username, fcontact->username)) ++ { ++ is_on_list=1; ++ break; ++ } ++ olist=olist->next; ++ } ++ if(is_on_list) { break; } // avoid a second loop if unnecessary ++ } ++ ++ if(!is_on_list) ++ { ++ ext_new_RL_entry(conn, fcontact->username, fcontact->friendlyname); ++ } ++ ++ flist=flist->next; ++ } ++} ++ ++void msn_new_SB(msnconn * nsconn, void * tag) ++{ ++ msn_request_SB(nsconn, NULL, NULL, tag); ++} ++ ++void msn_request_SB(msnconn * nsconn, const char * rcpt, message * msg, void * tag) ++{ ++ conninfo_SB * info=new conninfo_SB; ++ ++ info->auth=new authdata_SB; ++ info->auth->username=msn_permstring(((authdata_NS *)nsconn->auth)->username); ++ info->auth->rcpt=msn_permstring(rcpt); ++ if(msg==NULL) ++ { ++ info->auth->msg=NULL; ++ } else { ++ info->auth->msg=new message; ++ info->auth->msg->header=msn_permstring(msg->header); ++ info->auth->msg->body=msn_permstring(msg->body); ++ info->auth->msg->font=msn_permstring(msg->font); ++ info->auth->msg->colour=msn_permstring(msg->colour); ++ info->auth->msg->content=msn_permstring(msg->content); ++ info->auth->msg->bold=msg->bold; ++ info->auth->msg->italic=msg->italic; ++ info->auth->msg->underline=msg->underline; ++ } ++ ++ info->auth->tag=tag; ++ ++ sprintf(buf, "XFR %d SB\r\n", next_trid); ++ write(nsconn->sock, buf, strlen(buf)); ++ ++ msn_add_callback(nsconn, msn_SBconn_2, next_trid, info); ++ next_trid++; ++} ++ ++void msn_SBconn_2(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) ++{ ++ conninfo_SB * info=(conninfo_SB *)data; ++ ++ msn_del_callback(conn, trid); ++ ++ if(strcmp(args[0], "XFR")) ++ { ++ msn_show_verbose_error(conn, atoi(args[0])); ++ delete info; ++ return; ++ } ++ ++ info->auth->cookie=msn_permstring(args[5]); ++ info->auth->sessionID=NULL; ++ ++ msnconn * newconn=new msnconn; ++ ++ newconn->auth=info->auth; ++ newconn->type=CONN_SB; ++ newconn->ready=0; ++ ++ msn_add_to_llist(connections, newconn); ++ ++ int port=1863; ++ char * c; ++ ++ if((c=strstr(args[3], ":"))!=NULL) ++ { ++ *c='\0'; ++ c++; ++ port=atoi(c); ++ } ++ ++ delete info; ++ ++ msn_connect(newconn, args[3], port); ++} ++ ++void msn_SBconn_3(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) ++{ ++ authdata_SB * auth=(authdata_SB *)conn->auth; ++ ++ msn_del_callback(conn, trid); ++ ++ if(strcmp(args[2], "OK")) ++ { ++ msn_show_verbose_error(conn, atoi(args[0])); ++ msn_clean_up(conn); ++ return; ++ } ++ ++ if(auth->rcpt==NULL) // they're requesting the SB session the proper way ++ { ++ ext_got_SB(conn, auth->tag); ++ } else { ++ sprintf(buf, "CAL %d %s\r\n", next_trid, auth->rcpt); ++ write(conn->sock, buf, strlen(buf)); ++ ++ delete auth->rcpt; ++ auth->rcpt=NULL; ++ ++ next_trid++; ++ } ++ conn->ready=1; ++ ext_new_connection(conn); ++} ++ ++void msn_handle_incoming(int sock, int readable, int writable) ++{ ++ // First, we find which msnconn this socket belongs to ++ ++ llist * list; ++ msnconn * conn; ++ callback * call; ++ ++ char ** args; ++ int numargs; ++ int trid; ++ ++ list=connections; ++ ++ if(list==NULL) { return; } ++ ++ while(1) ++ { ++ conn=(msnconn *)list->data; ++ if(conn->sock==sock) ++ { break; } ++ list=list->next; ++ if(list==NULL) ++ { ++ #ifdef MSNDEBUG ++ printf("Network traffic not for us\n"); ++ #endif ++ return; ++ } // not for us ++ } ++ ++ // first, siphon off any file transfer traffic to the special handler ++ if(conn->type==CONN_FTP) ++ { msn_handle_filetrans_incoming(conn, readable, writable); return; } ++ ++ // OK, it's for us. If it's readable, parse it, then deliver it to the appropriate handler ++ ++ if(!readable) { return; } ++ ++ args=msn_read_line(sock, &numargs); ++ if ( !numargs ) ++ { ++ ext_debug("msn: error: no arguments for this data"); ++ return ; ++ } ++ ++ if(args==NULL) ++ { ++ if(errno!=0) ++ { msn_clean_up(conn); } ++ return; ++ } ++ ++ if(!strcmp(args[0], "XFR") && !strcmp(args[2], "NS")) ++ { ++ delete conn->callbacks; // delete the callback data ++ conn->callbacks=NULL; ++ ++ ext_unregister_sock(conn->sock); ++ close(conn->sock); ++ ++ char * c; ++ int port=1863; ++ ++ if((c=strstr(args[3], ":"))!=NULL) ++ { ++ *c='\0'; ++ c++; ++ port=atoi(c); ++ } ++ ++ msn_connect(conn, args[3], port); ++ return; ++ } ++ ++ if(!strcmp(args[0], "RNG")) ++ { ++ msn_handle_RNG(conn, args, numargs); ++ return; ++ } ++ ++ trid=atoi(args[1]); ++ ++ if ( conn->sync ) ++ { ++ // connection is synching. is this a SYNC-relation instruction? ++ if ( !strcmp( args[ 0 ], "SYN" ) || !strcmp( args[ 0 ], "GTC") || !strcmp( args[ 0 ], "BLP" ) || ++ !strcmp( args[ 0 ], "PRP" ) || !strcmp( args[ 0 ], "LSG") || !strcmp( args[ 0 ], "BPR" ) || ++ !strcmp( args[ 0 ], "LST" ) ) ++ { ++ msn_get_list_info( conn, numargs, args ); ++ delete args[0]; ++ delete args; ++ return ; ++ } ++ ++ // else: it's a normal message ++ } ++ ++ list=conn->callbacks; ++ ++ if(list!=NULL && trid>0) ++ { ++ while(1) ++ { ++ call=(callback *)list->data; ++ if(call->trid==trid) ++ { ++ (call->func)(conn, trid, args, numargs, call->data); ++ delete args[0]; ++ delete args; ++ return; ++ } ++ list=list->next; ++ if(list==NULL) { break; } // defaults ++ } ++ } ++ ++ msn_handle_default(conn, args, numargs); ++ ++ delete args[0]; ++ delete args; ++} ++ ++void msn_handle_close(int sock) ++{ ++ // First, we find which msnconn this socket belongs to ++ ++ llist * list; ++ msnconn * conn; ++ ++ list=connections; ++ ++ if(list==NULL) { return; } ++ ++ while(1) ++ { ++ conn=(msnconn *)list->data; ++ if(conn->sock==sock) ++ { break; } ++ list=list->next; ++ if(list==NULL) ++ { ++ #ifdef MSNDEBUG ++ printf("Socket close not for us\n"); ++ #endif ++ return; } // not for us ++ } ++ ++ msn_clean_up(conn); ++} ++ ++void msn_handle_default(msnconn * conn, char ** args, int numargs) ++{ ++ ++ // Switchboard messages ++ ++ if(!strcmp(args[0], "MSG")) ++ { ++ msn_handle_MSG(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "NAK")) ++ { ++ msn_handle_NAK(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "JOI")) ++ { ++ msn_handle_JOI(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "BYE")) ++ { ++ msn_handle_BYE(conn, args, numargs); ++ return; ++ } ++ ++ // Notification server messages ++ ++ if(!strcmp(args[0], "NLN") || !strcmp(args[0], "ILN") || !strcmp(args[0], "FLN")) ++ { ++ msn_handle_statechange(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "CHG")) ++ { ++ ext_changed_state(conn, args[2]); ++ return; ++ } ++ ++ if(!strcmp(args[0], "ADD")) ++ { ++ msn_handle_ADD(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "REM")) ++ { ++ msn_handle_REM(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "BLP")) ++ { ++ msn_handle_BLP(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "GTC")) ++ { ++ msn_handle_GTC(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "REA")) ++ { ++ msn_handle_REA(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "CHL")) ++ { ++ msn_handle_CHL(conn, args, numargs); ++ return; ++ } ++ ++ if(!strcmp(args[0], "OUT")) ++ { ++ msn_handle_OUT(conn, args, numargs); ++ return; ++ } ++ ++ if(isdigit(args[0][0])) ++ { ++ msn_show_verbose_error(conn, atoi(args[0])); ++ return; ++ } ++ ++ #ifdef MSNDEBUG ++ printf("Don't know what to do with this one, ignoring it:\n"); // DEBUG ++ for(int a=0; a<numargs; a++) ++ { ++ printf("%s ", args[a]); ++ } ++ printf("\n"); ++ #endif ++} ++ ++void msn_handle_MSG(msnconn * conn, char ** args, int numargs) ++{ ++ int msglen; ++ char * msg; ++ char * mime; ++ char * body; ++ char * tmp; ++ ++ msglen=atoi(args[3]); ++ ++ msg=new char[msglen+1]; ++ read(conn->sock, msg, msglen); ++ msg[msglen]='\0'; ++ ++ mime=msg; ++ body=strstr(msg, "\r\n\r\n"); ++ if(body!=NULL) { body[2]='\0'; /* finish the MIME string */ body+=4; } ++ ++ // the below is a kludge until I remember the header name for TypingUser ++ if((strstr(mime, "TypingUser")!=NULL) || (strstr(mime, "TypeingUser")!=NULL)) ++ { // the second of the above two is a workaround for a spelling bug in the Jabber MSN transport ++ ext_typing_user(conn, args[1], msn_decode_URL(args[2])); ++ delete msg; ++ return; ++ } ++ ++ /* Warning - the code below was written at what my body clock insisted was past midnight, ++ jetlagged, on a foreign road, because I had nothing better to do. I would like to please ++ call to your attention the no-warranty clause in the GPL.... :^) */ ++ ++ char * content; // content-type ++ ++ content=msn_find_in_mime(mime, "Content-Type"); ++ if(content==NULL) { ext_show_error(conn, "MSG with no Content-type set"); delete msg; return; } ++ #ifdef MSNDEBUG ++ printf("Content type: \"%s\"\n", content); ++ #endif ++ if((tmp=strstr(content, "; charset"))!=NULL) { *tmp='\0'; } ++ ++ if(!strcmp(content, "text/x-msmsgsprofile")) ++ { ++ ext_debug("MSNp8: got x-msmsgsprofile"); ++ } else ++ if(!strcmp(content, "text/plain")) ++ { ++ message * msg=new message; ++ msg->header=mime; ++ msg->body=body; ++ msg->font=NULL; ++ msg->content=msn_find_in_mime(mime, "Content-Type"); // include any "charset=" I've chopped off ++ ++ ext_got_IM(conn, args[1], msn_decode_URL(args[2]), msg); ++ } else if(!strcmp(content, "text/x-msmsgsinitialemailnotification")) { ++ char * unread_ibc; ++ char * unread_folc; ++ int unread_ib=0, unread_fol=0; ++ ++ unread_ibc=msn_find_in_mime(body, "Inbox-Unread"); ++ unread_folc=msn_find_in_mime(body, "Folders-Unread"); ++ if(unread_ibc!=NULL) { unread_ib=atoi(unread_ibc); delete unread_ibc; } ++ if(unread_folc!=NULL) { unread_fol=atoi(unread_folc); delete unread_folc; } ++ ++ ext_initial_email(conn, unread_ib, unread_fol); ++ } else if(!strcmp(content, "text/x-msmsgsemailnotification")) { ++ char * from=msn_find_in_mime(body, "From-Addr"); ++ char * subject=msn_find_in_mime(body, "Subject"); ++ ++ ext_new_mail_arrived(conn, from, subject); ++ ++ delete from; ++ delete subject; ++ } else if(!strcmp(content, "text/x-msmsgsinvite")) { ++ msn_handle_invite(conn, args[1], msn_decode_URL(args[2]), mime, body); ++ } else { ++ #ifdef MSNDEBUG ++ printf("Unknown content-type: \"%s\"\n", content); ++ #endif ++ } ++ delete content; ++ delete msg; ++} ++ ++char * msn_find_in_mime(char * mime, char * header) ++{ ++ char * retval; ++ int pos; ++ ++ if(!strncmp(mime, header, strlen(header))) ++ { ++ retval=mime; ++ } else { ++ char * tmp=new char[strlen(header)+3]; ++ strcpy(tmp, "\r\n"); ++ strcat(tmp, header); ++ retval=strstr(mime, header); ++ if(retval==NULL) { return NULL; } ++ retval+=2; ++ delete tmp; ++ } ++ ++ while(*retval!=':') { retval++; } ++ retval++; // pass the colon ++ while(isspace(*retval)) { retval++; } // position at start of value ++ ++ pos=0; ++ while(retval[pos]!='\0') ++ { ++ if(retval[pos]=='\r') ++ { ++ char * tmp; ++ retval[pos]='\0'; ++ tmp=msn_permstring(retval); ++ retval[pos]='\r'; ++ return tmp; ++ } ++ pos++; ++ } ++ #ifdef MSNDEBUG ++ printf("Invalid MIME header - WTF?!\n"); ++ #endif ++ return NULL; ++} ++ ++void msn_handle_invite(msnconn * conn, char * from, char * friendly, char * mime, char * body) ++{ ++ char * command=msn_find_in_mime(body, "Invitation-Command"); ++ char * cookie=msn_find_in_mime(body, "Invitation-Cookie"); ++ int inv_is_out=0; ++ invitation * inv=NULL; ++ llist * l; ++ ++ l=conn->invitations_in; ++ while(1) ++ { ++ if(l==NULL) ++ { if(!inv_is_out) { l=conn->invitations_out; inv_is_out=1; continue; } else { break; } } ++ inv=(invitation *)l->data; ++ #ifdef MSNDEBUG ++ printf("invitation: checking %s against %s\n", inv->cookie, cookie); ++ #endif ++ if(!strcmp(inv->cookie, cookie)) ++ { break ; } ++ inv=NULL; ++ l=l->next; ++ } ++ ++ ++ if(!strcmp(command, "INVITE")) ++ { ++ msn_handle_new_invite(conn, from, friendly, mime, body); ++ } else if(!strcmp(command, "ACCEPT")) { ++ if(inv==NULL) ++ { ++ #ifdef MSNDEBUG ++ printf("Very odd - just got an ACCEPT out of mid-air...\n"); ++ #endif ++ delete command; return; } ++ ++ if(!inv_is_out && inv->app==APP_FTP) ++ { ++ #ifdef MSNDEBUG ++ printf("Downloading file from remote host..\n"); ++ #endif ++ msn_recv_file((invitation_ftp *)inv, body); ++ } else if(inv_is_out && inv->app==APP_FTP) { ++ msn_send_file((invitation_ftp *)inv, body); ++ } ++ } else if(!strcmp(command, "CANCEL") || !strcmp(command, "REJECT")) { ++ if(inv==NULL) ++ { ++ #ifdef MSNDEBUG ++ printf("Very odd - just got a CANCEL/REJECT out of mid-air...\n"); ++ #endif ++ delete command; ++ return; ++ } ++ if(inv->app==APP_FTP) ++ { ++ ext_filetrans_failed((invitation_ftp *)inv, 0, "Cancelled by remote user"); ++ if(inv_is_out) ++ { ++ msn_del_from_llist(conn->invitations_out, inv); ++ } else { ++ msn_del_from_llist(conn->invitations_in, inv); ++ } ++ delete inv; ++ } ++ } else { ++ #ifdef MSNDEBUG ++ printf("Argh, don't support %s yet!\n", command); ++ #endif ++ } ++ ++ delete command; ++} ++ ++void msn_handle_new_invite(msnconn * conn, char * from, char * friendlyname, char * mime, char * body) ++{ ++ ++ char * appname; ++ ++ char * tmp1=NULL; ++ char * tmp2=NULL; ++ ++ appname=msn_find_in_mime(body, "Application-Name"); ++ invitation * invg=NULL; ++ ++ if((tmp1=msn_find_in_mime (body, "Application-File")) != NULL ++ && (tmp2=msn_find_in_mime (body, "Application-FileSize")) != NULL) ++ { ++ invitation_ftp * inv=new invitation_ftp; ++ invg=inv; ++ invg->app=APP_FTP; ++ invg->other_user=msn_permstring(from); ++ invg->cookie=msn_find_in_mime(body, "Invitation-Cookie"); ++ invg->conn=conn; ++ inv->filename=tmp1; ++ tmp1=NULL; ++ inv->filesize=atol(tmp2); ++ ++ ext_filetrans_invite(conn, from, friendlyname, inv); ++ } ++ if(tmp1!=NULL) { delete tmp1; } ++ if(tmp2!=NULL) { delete tmp2; } ++ ++ delete appname; ++ ++ if(invg==NULL) ++ { ++ ext_show_error(conn, "Unknown invitation type!"); ++ return; ++ } ++ ++ msn_add_to_llist(conn->invitations_in, invg); ++} ++ ++void msn_recv_file(invitation_ftp * inv, char * msg_body) ++{ ++ char * cookie=msn_find_in_mime(msg_body, "AuthCookie"); ++ char * remote=msn_find_in_mime(msg_body, "IP-Address"); ++ char * port_c=msn_find_in_mime(msg_body, "Port"); ++ int port; ++ ++ if(cookie==NULL || remote==NULL || port_c==NULL) ++ { ++ ext_filetrans_failed(inv, 0, "Missing parameters"); ++ msn_del_from_llist(inv->conn->invitations_in, inv); ++ if(cookie!=NULL) { delete cookie; } ++ if(remote!=NULL) { delete remote; } ++ if(port_c!=NULL) { delete port_c; } ++ delete inv; ++ } ++ ++ port=atoi(port_c); ++ delete port_c; ++ ++ msnconn * conn=new msnconn; ++ conn->type=CONN_FTP; ++ ++ sprintf(buf, "Connecting to %s:%d\n", remote, port); ++ ext_filetrans_progress(inv, buf, 0, 0); ++ ++ conn->sock=ext_connect_socket(remote, port); ++ delete remote; ++ ++ if(conn->sock<0) ++ { ++ ext_filetrans_failed(inv, errno, strerror(errno)); ++ msn_del_from_llist(inv->conn->invitations_in, inv); ++ delete cookie; ++ delete inv; ++ return; ++ } ++ ++ ext_register_sock(conn->sock, 1, 0); ++ ++ ext_filetrans_progress(inv, "Connected", 0, 0); ++ ++ authdata_FTP * auth=new authdata_FTP; ++ auth->cookie=msn_permstring(cookie); ++ delete cookie; ++ auth->inv=inv; ++ auth->username=msn_permstring(((authdata_SB *)inv->conn->auth)->username); ++ auth->direction=MSNFTP_RECV; ++ ++ conn->auth=auth; ++ ++ msn_add_to_llist(connections, conn); ++ ++ write(conn->sock, "VER MSNFTP\r\n", strlen("VER MSNFTP\r\n")); ++} ++ ++void msn_handle_filetrans_incoming(msnconn * conn, int readable, int writable) ++{ ++ authdata_FTP * auth=(authdata_FTP *)conn->auth; ++ ++ #ifdef MSNDEBUG ++ printf("Incoming from file sender\n"); ++ #endif ++ ++ if(auth->direction==MSNFTP_RECV) ++ { ++ if(!readable) { return; } // not interested... ++ ++ if(auth->fd==-1) ++ { ++ char ** args; ++ int numargs; ++ ++ args=msn_read_line(conn->sock, &numargs); ++ ++ if(args==NULL) { msn_clean_up(conn); return; } ++ ++ if(!strcmp(args[0], "VER")) ++ { ++ sprintf(buf, "USR %s %s\r\n", auth->username, auth->cookie); ++ write(conn->sock, buf, strlen(buf)); ++ ext_filetrans_progress(auth->inv, "Negotiating", 0, 0); ++ } else if (!strcmp(args[0], "FIL")) { ++ auth->fd=open(auth->inv->filename, O_WRONLY|O_CREAT|O_TRUNC, S_IRWXU); ++ if(auth->fd<0) ++ { ++ ext_filetrans_failed(auth->inv, errno, strerror(errno)); ++ msn_del_from_llist(conn->invitations_in, auth->inv); ++ msn_clean_up(conn); ++ delete args[0]; ++ delete args; ++ return; ++ } ++ ++ write(conn->sock, "TFR\r\n", strlen("TFR\r\n")); ++ } ++ delete args[0]; ++ delete args; ++ auth->num_ignore=3; ++ } ++ ++ fd_set readfd; ++ struct timeval timeout={0, 0}; ++ FD_ZERO(&readfd); ++ FD_SET(conn->sock, &readfd); ++ char c; ++ ++ while(select(conn->sock+1, &readfd, NULL, NULL, &timeout)==1) ++ { ++ if(read(conn->sock, &c, 1)<1) ++ { ++ msn_clean_up(conn); ++ return; ++ } ++ if(auth->num_ignore>0) ++ { ++ auth->num_ignore--; ++ continue; ++ } ++ auth->bytes_done++; ++ write(auth->fd, &c, 1); ++ if(auth->bytes_done==auth->inv->filesize) ++ { ++ write(conn->sock, "BYE 16777989\r\n", strlen("BYE 16777989")); ++ ext_filetrans_success(auth->inv); ++ ++ msn_del_from_llist(auth->inv->conn->invitations_in, auth->inv); ++ msn_clean_up(conn); ++ return; ++ } ++ if(auth->bytes_done%2045==0) { auth->num_ignore=3; } ++ } ++ ++ ext_filetrans_progress(auth->inv, "Receiving file", auth->bytes_done, auth->inv->filesize); ++ } else { ++ // We are sending ++ ++ if(!auth->connected) // we have not accept()ed yet, but the read/writability means there's one waiting ++ { ++ int s; ++ ++ if((s=accept(conn->sock, NULL, NULL))<0) ++ { ++ #ifdef MSNDEBUG ++ perror("Could not accept()\n"); ++ #endif ++ ext_filetrans_failed(auth->inv, errno, strerror(errno)); ++ msn_del_from_llist(auth->inv->conn->invitations_out, auth->inv); ++ msn_clean_up(conn); // that will nuke both auth and inv ++ return; ++ } ++ ++ ext_unregister_sock(conn->sock); ++ close(conn->sock); ++ ++ conn->sock=s; ++ ext_register_sock(conn->sock, 1, 1); ++ ++ ext_filetrans_progress(auth->inv, "Connected", 0, 0); ++ ++ auth->connected=1; ++ } else { ++ // we know it's connected already ++ ++ if(auth->fd==-1) ++ { ++ char ** args; ++ int numargs; ++ ++ if(!readable) { return; } // not interested... ++ ++ if((args=msn_read_line(conn->sock, &numargs))==NULL) ++ { ++ #ifdef MSNDEBUG ++ perror("read() failed"); ++ #endif ++ ext_filetrans_failed(auth->inv, errno, strerror(errno)); ++ msn_del_from_llist(auth->inv->conn->invitations_out, auth->inv); ++ msn_clean_up(conn); ++ return; ++ } ++ ++ if(!strcmp(args[0], "VER")) ++ { ++ sprintf(buf, "VER MSNFTP\r\n"); ++ write(conn->sock, buf, strlen(buf)); ++ ext_filetrans_progress(auth->inv, "Negotiating", 0, 0); ++ } ++ ++ if(!strcmp(args[0], "USR")) ++ { ++ if(strcmp(args[2], auth->cookie)) // if they DIFFER ++ { ++ ext_filetrans_failed(auth->inv, errno, strerror(errno)); ++ msn_del_from_llist(auth->inv->conn->invitations_out, auth->inv); ++ msn_clean_up(conn); ++ return; ++ } ++ ++ sprintf(buf, "FIL %lu\r\n", auth->inv->filesize); ++ write(conn->sock, buf, strlen(buf)); ++ } ++ ++ if(!strcmp(args[0], "TFR")) ++ { ++ // you asked for it, go to data-dump mode ++ auth->fd=open(auth->inv->filename, O_RDONLY); ++ if(auth->fd<0) ++ { ++ ext_filetrans_failed(auth->inv, errno, "Could not open file for reading"); ++ msn_del_from_llist(auth->inv->conn->invitations_out, auth->inv); ++ msn_clean_up(conn); ++ return; ++ } ++ ++ // OK, now we lose control, but the next round of the polling loop will ++ // say that the socket is writable, and then the fun starts... ++ ext_filetrans_progress(auth->inv, "Sending data", 0, 0); ++ } ++ } else { ++ // just pumping data now ++ ++ fd_set writefd; ++ FD_ZERO(&writefd); ++ FD_SET(conn->sock, &writefd); ++ struct timeval tout={0, 0}; ++ char c; ++ ++ while(select(conn->sock+1, NULL, &writefd, NULL, &tout)==1) ++ { ++ if(auth->bytes_done%2045==0) ++ { ++ unsigned char check[3]; ++ int to_go=(auth->inv->filesize-auth->bytes_done>2045)?(2045):(auth->inv->filesize-auth->bytes_done); ++ ++ ++ check[0]='\0'; ++ check[1]=to_go%256; ++ check[2]=to_go/256; ++ write(conn->sock, check, 3); ++ } ++ ++ if(read(auth->fd, &c, 1)<1) ++ { ++ ext_filetrans_failed(auth->inv, errno, strerror(errno)); ++ msn_del_from_llist(auth->inv->conn->invitations_out, auth->inv); ++ msn_clean_up(conn); ++ return; ++ } ++ ++ auth->bytes_done++; ++ write(conn->sock, &c, 1); ++ ++ if(auth->bytes_done==auth->inv->filesize) ++ { ++ ext_filetrans_success(auth->inv); ++ ++ msn_del_from_llist(auth->inv->conn->invitations_in, auth->inv); ++ msn_clean_up(conn); ++ return; ++ } ++ } ++ ++ ext_filetrans_progress(auth->inv, "Sending file", auth->bytes_done, auth->inv->filesize); ++ } ++ } ++ } ++} ++ ++void msn_send_file(invitation_ftp * inv, char * msg_body) ++{ ++ int port=6891; ++ msnconn * conn=new msnconn; ++ ++ ext_filetrans_progress(inv, "Sending IP address", 0, 0); ++ ++ conn->type=CONN_FTP; ++ ++ while((conn->sock=ext_server_socket(port))<0) ++ { ++ port++; ++ if(port>6911) ++ { ++ ext_filetrans_failed(inv, errno, strerror(errno)); ++ msn_del_from_llist(inv->conn->invitations_out, inv); ++ delete inv; ++ delete conn; ++ return; ++ } ++ } ++ ++ ext_register_sock(conn->sock, 1, 0); ++ ++ msn_add_to_llist(connections, conn); ++ ++ authdata_FTP * auth=new authdata_FTP; ++ ++ conn->auth=auth; ++ ++ auth->cookie=new char[64]; ++ sprintf(auth->cookie, "%d", rand()); ++ ++ auth->inv=inv; ++ auth->direction=MSNFTP_SEND; ++ ++ auth->connected=0; ++ ++ message * msg=new message; ++ msg->content=msn_permstring("text/x-msmsgsinvite; charset=UTF-8"); ++ ++ ++ sprintf(buf, "Invitation-Command: ACCEPT\r\nInvitation-Cookie: %s\r\nIP-Address: %s\r\nPort: %d\r\nAuthCookie: %s\r\nLaunch-Application: FALSE\r\nRequest-Data: IP-Address:\r\n\r\n", ++ inv->cookie, ext_get_IP(), port, auth->cookie); ++ ++ msg->body=msn_permstring(buf); ++ ++ msn_send_IM(inv->conn, NULL, msg); ++ ++ delete msg; ++} ++ ++void msn_handle_NAK(msnconn * conn, char ** args, int numargs) ++{ ++ ext_IM_failed(conn); ++} ++ ++void msn_handle_JOI(msnconn * conn, char ** args, int numargs) ++{ ++ authdata_SB * auth; ++ ++ auth=(authdata_SB *)conn->auth; ++ ++ if(!strcmp(args[1], auth->username)) { return; } ++ ++ msn_add_to_llist(conn->users, new char_data(msn_permstring(args[1]))); ++ ext_user_joined(conn, args[1], msn_decode_URL(args[2]), 0); ++ ++ if(auth->msg!=NULL) ++ { ++ msn_send_IM(conn, NULL, auth->msg); ++ delete auth->msg; ++ auth->msg=NULL; ++ } ++} ++ ++void msn_handle_RNG(msnconn * conn, char ** args, int numargs) ++{ ++ msnconn * newSBconn=new msnconn; ++ authdata_SB * auth=new authdata_SB; ++ ++ newSBconn->type=CONN_SB; ++ newSBconn->auth=auth; ++ ++ auth->username=msn_permstring(((authdata_NS *)(conn->auth))->username); ++ auth->sessionID=msn_permstring(args[1]); ++ auth->cookie=msn_permstring(args[4]); ++ auth->msg=NULL; ++ ++ msn_add_to_llist(connections, newSBconn); ++ ++ char * c; ++ int port=1863; ++ if((c=strstr(args[2], ":"))!=NULL) ++ { ++ *c='\0'; ++ c++; ++ port=atoi(c); ++ } ++ ++ msn_connect(newSBconn, args[2], port); ++} ++ ++void msn_handle_BYE(msnconn * conn, char ** args, int numargs) ++{ ++ llist * list; ++ char_data * c; ++ ++ list=conn->users; ++ ++ ext_user_left(conn, args[1]); ++ ++ while(list!=NULL) ++ { ++ c=(char_data *)list->data; ++ if(!strcmp(c->c, args[1])) // if the departing user matches this item on the list ++ { ++ if(list->next!=NULL) ++ { list->next->prev=list->prev; } ++ if(list->prev!=NULL) ++ { list->prev->next=list->next; } ++ if(list->prev==NULL) { conn->users=list->next; } ++ list->next=NULL; // otherwise the delete will go through the entire llist! ++ list->prev=NULL; ++ delete list; // will delete the char_data for us too ++ break; ++ } ++ list=list->next; ++ } ++ ++ if(conn->users==NULL) ++ { ++ msn_clean_up(conn); ++ } ++} ++ ++void msn_handle_statechange(msnconn * conn, char ** args, int numargs) ++{ ++ char * buddy; ++ char * state; ++ char * friendlyname; ++ ++ if(!strcmp(args[0], "ILN")) ++ { ++ friendlyname=args[4]; ++ buddy=args[3]; ++ state=args[2]; ++ } else if(!strcmp(args[0], "FLN")) { ++ buddy=args[1]; ++ ext_buddy_offline(conn, buddy); ++ return; ++ } else { ++ friendlyname=args[3]; ++ buddy=args[2]; ++ state=args[1]; ++ } ++ ++ ext_buddy_set(conn, buddy, msn_decode_URL(friendlyname), state); ++} ++ ++void msn_handle_ADD(msnconn * conn, char ** args, int numargs) ++{ ++ if(!strcmp(args[2], "RL")) ++ { ++ #ifdef MSNDEBUG ++ printf("Via ADD:\n"); ++ #endif ++ ext_new_RL_entry(conn, args[4], msn_decode_URL(args[5])); ++ } ++ ++ ext_new_list_entry(conn, args[2], args[4]); ++ ext_latest_serial(conn, atoi(args[3])); ++} ++ ++void msn_handle_REM(msnconn * conn, char ** args, int numargs) ++{ ++ ext_del_list_entry(conn, args[2], args[4]); ++ ext_latest_serial(conn, atoi(args[3])); ++} ++ ++ ++void msn_handle_BLP(msnconn * conn, char ** args, int numargs) ++{ ++ ext_got_BLP(conn, args[3][0]); ++ ext_latest_serial(conn, atoi(args[3])); ++} ++ ++void msn_handle_GTC(msnconn * conn, char ** args, int numargs) ++{ ++ ext_got_GTC(conn, args[3][0]); ++ ext_latest_serial(conn, atoi(args[3])); ++} ++ ++void msn_handle_REA(msnconn * conn, char ** args, int numargs) ++{ ++ ext_latest_serial(conn, atoi(args[2])); ++ ext_got_friendlyname(conn, msn_decode_URL(args[4])); ++} ++ ++void msn_handle_CHL(msnconn * conn, char ** args, int numargs) ++{ ++ md5_state_t state; ++ md5_byte_t digest[16]; ++ int a; ++ ++ md5_init(&state); ++ md5_append(&state, (md5_byte_t *)(args[2]), strlen(args[2])); ++ md5_append(&state, (md5_byte_t *)"VT6PX?UQTM4WM%YR", 16); ++ ++ md5_finish(&state, digest); ++ ++ sprintf(buf, "QRY %d PROD0038W!61ZTF9 32\r\n", next_trid++ ); ++ ++ write(conn->sock, buf, strlen(buf)); ++ ++ for(a=0; a<16; a++) ++ { ++ sprintf(buf, "%02x", digest[a]); ++ write(conn->sock, buf, strlen(buf)); ++ } ++} ++ ++void msn_handle_OUT(msnconn * conn, char ** args, int numargs) ++{ ++ if(numargs>1) ++ { ++ if(!strcmp(args[1], "OTH")) ++ { ++ ext_show_error(conn, "You have logged onto MSN twice at once. Your MSN session will now terminate."); ++ } else if(!strcmp(args[1], "SSD")) { ++ ext_show_error(conn, "This MSN server is going down for maintenance. Your MSN session will now terminate."); ++ } else { ++ sprintf(buf, "The MSN server has terminated the connection with an unknown reason code. Please report this code: %s", args[1]); ++ ext_show_error(conn, buf); ++ } ++ } ++ msn_clean_up(conn); ++} ++ ++void msn_filetrans_reject(invitation_ftp * inv) ++{ ++ message * msg=new message; ++ ++ sprintf(buf, "Invitation-Command: CANCEL\r\nInvitation-Cookie: %s\r\nCancel-Code: REJECT\r\n", ++ inv->cookie); ++ msg->body=msn_permstring(buf); ++ msg->content=msn_permstring("text/x-msmsgsinvite; charset=UTF-8"); ++ msn_send_IM(inv->conn, NULL, msg); ++ delete msg; ++ ++ #ifdef MSNDEBUG ++ printf("Rejecting file transfer\n"); ++ #endif ++ ++ msn_del_from_llist(inv->conn->invitations_in, inv); ++} ++ ++void msn_filetrans_accept(invitation_ftp * inv, const char * dest) ++{ ++ message * msg=new message; ++ ++ delete inv->filename; ++ inv->filename=msn_permstring(dest); ++ sprintf(buf, "Invitation-Command: ACCEPT\r\nInvitation-Cookie: %s\r\nLaunch-Application: FALSE\r\nRequest-Data: IP-Address\r\n\r\n", ++ inv->cookie); ++ msg->body=msn_permstring(buf); ++ msg->content=msn_permstring("text/x-msmsgsinvite; charset=UTF-8"); ++ msn_send_IM(inv->conn, NULL, msg); ++ delete msg; ++ ++ #ifdef MSNDEBUG ++ printf("Accepting file transfer\n"); ++ #endif ++} ++ ++void msn_filetrans_cancel(invitation_ftp * inv) ++{ ++ llist * l; ++ msnconn * conn; ++ ++ // one of the two below will fail, but it will do so safely and quietly ++ msn_del_from_llist(inv->conn->invitations_in, inv); ++ msn_del_from_llist(inv->conn->invitations_out, inv); ++ ++ l=connections; ++ ++ while(1) ++ { ++ if(l==NULL) { delete inv; return; } // Hmm, couldn't find it... ++ ++ conn=(msnconn *)l->data; ++ ++ if(conn->type==CONN_FTP && ((authdata_FTP *)(conn->auth))->inv==inv) ++ { break; } ++ ++ l=l->next; ++ } ++ ++ authdata_FTP * auth=(authdata_FTP *)conn->auth; ++ delete auth->inv; ++ auth->inv=NULL; ++ delete auth; ++ conn->auth=NULL; ++ ++ msn_clean_up(conn); ++} ++ ++invitation_ftp * msn_filetrans_send(msnconn * conn, const char * path) ++{ ++ struct stat st_info; ++ ++ if(stat(path, &st_info)<0) ++ { ext_show_error(conn, "Could not open file"); return NULL; } ++ ++ invitation_ftp * inv=new invitation_ftp; ++ ++ inv->app=APP_FTP; ++ inv->cookie=new char[64]; ++ sprintf(inv->cookie, "%d", rand()); ++ inv->other_user=NULL; ++ inv->conn=conn; ++ ++ inv->filename=msn_permstring(path); ++ inv->filesize=st_info.st_size; ++ ++ message * msg=new message; ++ char * basename; ++ ++ basename=inv->filename+strlen(inv->filename); ++ ++ while(basename>=inv->filename && *basename!='/' && *basename!='\\') ++ { ++ basename--; ++ } ++ ++ basename++; // it will always be 1 char before the start of the string ++ ++ msg->content=msn_permstring("text/x-msmsgsinvite; charset=UTF-8"); ++ ++ sprintf(buf, "Application-Name: File transfer\r\nApplication-GUID: {5D3E02AB-6190-11d3-BBBB-00C04F795683}\r\nInvitation-Command: INVITE\r\nInvitation-Cookie: %s\r\nApplication-File: %s\r\nApplication-FileSize: %lu\r\n\r\n", ++ inv->cookie, basename, inv->filesize); ++ ++ msg->body=msn_permstring(buf); ++ ++ msn_send_IM(conn, NULL, msg); ++ ++ msn_add_to_llist(conn->invitations_out, inv); ++ ++ delete msg; ++ ++ ext_filetrans_progress(inv, "Negotiating connection", 0, 0); ++ ++ return inv; ++} ++ ++#define szUser info->username ++#define szPassword info->password ++ ++int msn_login_read( int nSock, char *buf, int nMax ) ++{ ++ return cw_read( nSock, buf, nMax, 0 ); ++} ++ ++int msn_login_wait( int nSocket, char *szCommand ) ++{ ++ int nRet = 0; ++ ++ while ( !nRet ) ++ nRet = read( nSocket, szCommand, 1000 ); ++ ++ #ifdef MSNDEBUG ++ printf("<< %s", szCommand ); ++ #endif ++ ++ return 1; ++} ++ ++void msn_login_write1( int nSocket, char *szString, char *szArg ) ++{ ++ char szWrite[ 1000 ]; ++ ++ // ext_debug( szString ); ++ // ext_debug( szArg ); ++ ++ memset( szWrite, 0, 999 ); ++ sprintf( szWrite, "%s %s\r\n", szString, szArg ); ++ ++ // ext_debug( szWrite ); ++ ++ cw_write( nSocket, szWrite, strlen( szWrite ), 0 ); ++} ++ ++void msn_login_write( int nSocket, char *szString ) ++{ ++ char szWrite[ 1000 ]; ++ ++ memset( szWrite, 0, 1000 ); ++ sprintf( szWrite, "%s\r\n", szString ); ++ ++ cw_write( nSocket, szWrite, strlen( szWrite ), 0 ); ++} ++ ++int msn_login_connect( int nPort, char *szAddress ) ++{ ++ return ext_connect_socket( szAddress, nPort ); ++} ++ ++int msn_login_ssl_write( int nSock, char *str ) ++{ ++ return cw_write( nSock, str, strlen( str ), 1 ); ++} ++ ++int msn_login_ssl_read( int nSock, char *buf, int nMax ) ++{ ++ return cw_read( nSock, buf, nMax, 1 ); ++} ++ ++int msn_login_close( int nSock ) ++{ ++ return cw_close( nSock ); ++} ++ ++int msn_login_ssl_connect( int nPort, char *szAddr ) ++{ ++ return ext_connect_socket_ssl( szAddr, nPort ); ++} ++ ++int msn_login_get_server( char *str, char *filter, char *Server, char *Site ) ++{ ++ char *c, *c1, *c2; ++ ++ c = strstr( str, filter ); ++ if ( NULL == c ) ++ return 0; ++ // Skip the "Filter="-part. ++ c++; ++ c += strlen( filter ); ++ c1 = strchr( c, '/' ); ++ if ( NULL == c1 ) ++ return 0; ++ c2 = strchr( c1, ',' ); ++ if ( NULL == c2 ) ++ return 0; ++ ++ strncpy( Server, c, (unsigned long)c1 - (unsigned long)c ); ++ strncpy( Site, c1, (unsigned long)c2 - (unsigned long)c1 ); ++ ++ return 1; ++} ++ ++int msnAuth( char *lc, char *ticket, char *user, char *password ) ++{ ++ int nexus; // Passport Login Nexus ++ int logins; // Login Server ++ char result[ 5000 ]; ++ char result2[ 1000 ]; ++ char Server[ 100 ]; // e.g. www.server.com ++ char Site[ 100 ]; // e.g. /site.html ++ char String[ 800 ]; ++ int i; ++ char mail[ 255 ]; ++ char name[ 255 ]; ++ ++ memset( mail, 0, 255 ); ++ memset( name, 0, 255 ); ++ ++ for ( i = 0; i < strlen( user ); i++ ) ++ { ++ if ( user[i] == '@' ) ++ { ++ strncpy( name, user, i ); ++ strcpy( mail, (char*)( (unsigned long)user + i + 1 ) ); ++ break; ++ } ++ } ++ ++ memset( Server, 0, 100 ); ++ memset( Site, 0, 100 ); ++ ++ nexus = msn_login_ssl_connect( 443, "nexus.passport.com" ); ++ msn_login_ssl_write( nexus, "GET /rdr/pprdr.asp HTTP/1.0\r\n\r\n" ); ++ msn_login_ssl_read( nexus, result, 800 ); ++ msn_login_close( nexus ); ++ msn_login_get_server( result, "DALogin", Server, Site ); ++ ++ #ifdef MSNDEBUG ++ printf("Connecting to server '%s' .. site '%s'\n", Server, Site ); ++ #endif ++ ++ for ( ; ; ) ++ { ++ // Connect to Login Server ++ logins = msn_login_ssl_connect( 443, Server ); ++ memset( String, 0, 800 ); ++ sprintf( String, "GET %s HTTP/1.1\r\n" ++ "Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%%3A%%2F%%2Fmessenger%%2Emsn%%2Ecom,sign-in=%s%%40%s,pwd=%s,%s\r\n" ++ "Host: %s\r\n\r\n", ++ Site, name, mail, password, lc, Server ); ++ ++ #ifdef MSNDEBUG ++ printf("Writing: \n%s\n", String ); ++ #endif ++ ++ msn_login_ssl_write( logins, String ); ++ ++ memset( result, 0, 5000 ); ++ memset( result2, 0, 1000 ); ++ ++ msn_login_ssl_read( logins, result, 5000 ); ++ msn_login_ssl_read( logins, result2, 1000 ); ++ ++ strcat( result, result2 ); ++ ++ if ( strstr( result, "200 OK" ) ) ++ { ++ char *tick; ++ char *c3, *c4; ++ // Okay. ++ ++ tick = strstr( result, "t=" ); ++ if ( NULL == tick ) ++ { ++ #ifdef MSNDEBUG ++ printf("No t= found in response.\n"); ++ #endif ++ return 0; ++ } ++ ++ tick += 2; ++ ++ c4 = strstr( tick, "," ); ++ ++ strncpy( ticket, tick, (unsigned long)c4 - (unsigned long)tick - 1 ); ++ ++ //msn_login_close( logins ); ++ return 1; ++ } ++ ++ if ( strstr( result, "302 Found") && strstr( result, "redir" ) && strstr( result, "Location: " ) ) ++ { ++ // Redirection. ++ char *c3, *c4; ++ ++ c3 = strstr( result, "Location: " ); ++ c3 += 10; ++ ++ c3 = strstr( c3, "https://" ); ++ c3 += 8; ++ ++ c4 = strstr( c3, "/" ); ++ strncpy( Server, c3, (unsigned long)c4 - (unsigned long)c3 ); ++ strncpy( Site, c4, (unsigned long)strchr( c4, '\r' ) - (unsigned long)c4 ); ++ ++ // printf("Redirection to server [%s] - Site [%s]\n", Server, Site ); ++ msn_login_close( logins ); ++ continue; ++ } ++ ++ break; ++ } ++ ++ // printf("Error\n"); ++ return 0; ++} ++ ++int msn_connect_v8_error( connectinfo *info, msnconn *conn, char *szErr ) ++{ ++ ext_show_error( NULL, szErr ); ++ delete info; ++ ++ if ( conn->sock != -1 ) ++ { ++ ext_unregister_sock( conn->sock ); ++ close( conn->sock ); ++ conn->sock = -1; ++ } ++ ++ return -1; ++} ++ ++int msn_connect_v8( connectinfo *info, msnconn *conn, int *nNextTrid ) ++{ ++ int ds; // Dispatch Server ++ char result[ 1000 ]; ++ char *c; ++ char szIp[ 20 ]; ++ char szPort[ 20 ]; ++ int nPort; ++ char lc[ 400 ]; ++ char ticket[ 2000 ]; ++ ++ memset( result, 0, 500 ); ++ ++ ext_debug("MSNp8: finding login server"); ++ ++ // ds = msn_login_connect( 1863, "messenger.hotmail.com" ); ++ ds = conn->sock; ++ ++ // >> VER 1 MSNP8 CVR0\r\n ++ msn_login_write( ds, "VER 1 MSNP8 CVR0" ); ++ msn_login_wait( ds, result ); ++ ++ if ( !strstr( result, "VER 1" ) ) ++ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive VER 1)" ); ++ ++ // >> CVR 2 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS something@something.com\r\n ++ // ext_debug( szUser ); ++ ++ msn_login_write1( ds, "CVR 2 0x0409 winnt 5.1 i386 MSNMSGR 5.0.0540 MSMSGS", szUser ); ++ ++ msn_login_wait( ds, result ); ++ ++ if ( !strstr( result, "CVR 2" ) ) ++ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive CVR 2)" ); ++ ++ // >> USR 3 TWN I something@something.com\r\n ++ msn_login_write1( ds, "USR 3 TWN I", szUser ); ++ msn_login_wait( ds, result ); ++ if ( !strstr( result, "XFR 3 NS " ) ) ++ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive XFR 3)" ); ++ ++ // Read MSN Server IP from message. ++ c = strstr( result, "NS "); ++ c += 3; ++ memset( szIp, 0, 20 ); ++ memset( szPort, 0, 20 ); ++ strncpy( szIp, c, (unsigned long)strchr( c, ':' ) - (unsigned long)c ); ++ c = strchr( c, ':' ); c++; ++ strncpy( szPort, c, (unsigned long)strchr( c, ' ' ) - (unsigned long)c ); ++ nPort = atoi( szPort ); ++ ++ // Close current socket. ++ msn_login_close( ds ); ++ ext_unregister_sock( ds ); ++ conn->sock = -1; ++ ++ #ifdef MSNDEBUG ++ printf("* Connecting to IP `%s' port %d *\n", szIp, nPort ); ++ #endif ++ ++ ext_debug("MSNp8: found.. connecting"); ++ ++ // Try to connect to other server. ++ ds = msn_login_connect( nPort, szIp ); ++ if ( ds <= 0 ) ++ return msn_connect_v8_error( info, conn, "Error connecting to specified MSN Server" ); ++ ++ // OK. Register the socket. ++ conn->sock = ds; ++ ext_register_sock( ds, 1, 0 ); ++ ++ // >> VER 4 MSNP8 CVR0\r\n ++ msn_login_write( ds, "VER 4 MSNP8 CVR0" ); ++ msn_login_wait( ds, result ); ++ ++ if ( !strstr( result, "VER 4" ) ) ++ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive VER 4)" ); ++ ++ // >> CVR 5 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS something@something.com\r\n ++ msn_login_write1( ds, "CVR 5 0x0409 winnt 5.1 i386 MSNMSGR 5.0.0540 MSMSGS", szUser ); ++ msn_login_wait( ds, result ); ++ ++ if ( !strstr( result, "CVR 5" ) ) ++ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive CVR 5)" ); ++ ++ // >> USR 6 TWN I something@something.com\r\n ++ msn_login_write1( ds, "USR 6 TWN I", szUser ); ++ msn_login_wait( ds, result ); ++ ++ // << USR 6 TWN S something@something.com lc=....,....=...\r\n ++ if ( !strstr( result, "TWN S" ) ) ++ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive TWS S)" ); ++ ++ memset( lc, 0, 400 ); ++ c = strstr( result, "TWN S " ); ++ c+=6; ++ ++ strncpy( lc, c, (unsigned long)strchr(c, '\r') - (unsigned long)c ); ++ ++ #ifdef MSNDEBUG ++ printf("LC-etc string = `%s'\n", lc ); ++ #endif ++ ++ memset( ticket, 0, 2000 ); ++ ++ ext_debug("MSNp8: doing SSL auth"); ++ ++ if ( ! msnAuth( lc, ticket, szUser, szPassword ) ) ++ { ++ // printf("Error #6\n"); ++ return 0; ++ } ++ ++ ext_debug("MSNp8: OK.. logging in"); ++ ++ #ifdef MSNDEBUG ++ printf("Ticket = `%s'\n", ticket ); ++ #endif ++ ++ memset( result, 0, 500 ); ++ sprintf( result, "USR 7 TWN S t=%s", ticket ); ++ ++ // >> USR 7 TWN S t=<ticket> ++ msn_login_write( ds, result ); ++ memset( result, 0, 500 ); ++ msn_login_wait( ds, result ); ++ ++ if ( !strstr( result, "USR 7 OK") ) ++ { ++ if ( result[ 0 ] >= '0' && result[ 0 ] <= '9' ) ++ { ++ char *err; ++ int nCode = 0; ++ // We received an error code. ++ ++ err = strchr( result, ' ' ); ++ if ( NULL == err ) ++ nCode = atoi( result ); ++ else { ++ *err = '\0'; ++ nCode = atoi( result ); ++ } ++ if ( nCode <= 0 ) ++ return msn_connect_v8_error( info, conn, "Protocol error (Invalid response after USR 7)" ); ++ return nCode; ++ } ++ ++ // Invalid response. ++ return msn_connect_v8_error( info, conn, "Protocol error (Invalid response after USR 7)" ); ++ } ++ ++ // We are now connected to the MSN Server ++ ++ // msn_login_write( ds, "OUT" ); ++ // msn_login_close( ds ); ++ ++ // << USR 7 OK something@something.com Something%20Friendly%Nick 1 0 ++ { ++ char *szFriendly; ++ char *cEnd; ++ int i; ++ ++ szFriendly = result; ++ ++ for ( i = 0; i < 4; i++ ) ++ { ++ szFriendly = strchr( szFriendly, ' ' ); ++ ++ if ( NULL == szFriendly ) ++ { ++ ext_got_friendlyname( conn, "Unknown nickname" ); ++ return 0; ++ } ++ ++ szFriendly++; ++ } ++ ++ cEnd = strchr( szFriendly, ' '); ++ if ( NULL != cEnd ) ++ *cEnd = '\0'; ++ ++ // ext_debug( msn_decode_URL( szFriendly ) ); ++ ext_got_friendlyname( conn, msn_decode_URL( szFriendly ) ); ++ } ++ ++ *nNextTrid = 8; ++ ++ // No error. ++ return 0; ++} ++ ++void msn_connect(msnconn * conn, const char * server, int port) ++{ ++ int result; ++ ++ conn->ready=0; ++ ++ if(conn->type==CONN_SB) ++ { ++ authdata_SB * auth=(authdata_SB *)conn->auth; ++ ++ if((conn->sock=ext_connect_socket(server, port))==-1) ++ { ++ ext_show_error(conn, "Could not connect to switchboard server"); ++ return; ++ } ++ ++ ext_register_sock(conn->sock, 1, 0); ++ ++ if(auth->sessionID==NULL) ++ { ++ sprintf(buf, "USR %d %s %s\r\n", next_trid, auth->username, auth->cookie); ++ write(conn->sock, buf, strlen(buf)); ++ ++ msn_add_callback(conn, msn_SBconn_3, next_trid, NULL); ++ } else { ++ sprintf(buf, "ANS %d %s %s %s\r\n", next_trid, auth->username, auth->cookie, auth->sessionID); ++ write(conn->sock, buf, strlen(buf)); ++ ++ ext_new_connection(conn); ++ conn->ready=1; ++ msn_add_callback(conn, msn_SB_ans, next_trid, NULL); ++ } ++ ++ next_trid++; ++ ++ return; ++ } // Otherwise, it's a Notification Server (NS) ++ ++ connectinfo * info; ++ ++ info=new connectinfo; ++ ++ // The following is necessary as username and password may be temp variables ++ // that will no longer exist when the next function is called ++ info->username=msn_permstring( ((authdata_NS *)conn->auth)->username); ++ info->password=msn_permstring( ((authdata_NS *)conn->auth)->password); ++ ++ conn->ready=0; ++ if((conn->sock=ext_connect_socket(server, port))==-1) ++ { ++ ext_show_error(conn, "Could not connect to MSN server"); ++ return; ++ } ++ ++ ext_register_sock(conn->sock, 1, 0); ++ ++ // Okay, now try to connect. ++ ++ ext_debug("MSNp8: connecting to MSN.. this could take a few seconds"); ++ ++ result = msn_connect_v8( info, conn, &next_trid ); ++ ++ if ( 0 != result ) ++ { ++ // Error code. ++ ++ if ( result > 0 ) ++ { ++ msn_show_verbose_error( conn, result ); ++ delete info; ++ msn_clean_up( conn ); ++ conn->sock = -1; ++ ++ } // else: connection failed completely. msn_connect_v8 already took care of destroying the connection ++ ++ } ++ else ++ { ++ ++ // We received no error code. Everything went ok! ++ delete info; ++ ++ ext_debug("MSNp8: OK"); ++ ++ conn->ready = 1; ++ ext_new_connection( conn ); ++ } ++} ++ ++void msn_SB_ans(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) ++{ ++ if(!strcmp(args[0], "ANS") && !strcmp(args[2], "OK")) ++ { return; } ++ ++ if(isdigit(args[0][0])) ++ { ++ msn_del_callback(conn, trid); ++ msn_show_verbose_error(conn, atoi(args[0])); ++ msn_clean_up(conn); ++ return; ++ } ++ ++ if(!strcmp(args[0], "IRO")) ++ { ++ if(!strcmp(args[4], ((authdata_SB *)conn->auth)->username)) { return; } ++ msn_add_to_llist(conn->users, new char_data(msn_permstring(args[4]))); ++ ext_user_joined(conn, args[4], msn_decode_URL(args[5]), 1); ++ if(!strcmp(args[2], args[3])) ++ { ++ msn_del_callback(conn, trid); ++ } ++ } ++} ++ ++void msn_set_state(msnconn * conn, const char * state) ++{ ++ sprintf(buf, "CHG %d %s %d\r\n", next_trid, state, MSN_VERSION_ID ); ++ write(conn->sock, buf, strlen(buf)); ++ next_trid++; ++} +diff -ruN blip-0.1.orig/msn_core.h blip-0.1/msn_core.h +--- blip-0.1.orig/msn_core.h Thu Jan 1 08:00:00 1970 ++++ blip-0.1/msn_core.h Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,355 @@ ++/* msn_core.h - prototypes for msn_core.C */ ++#ifndef MSN_CORE_H ++#define MSN_CORE_H ++ ++class llist_data // inherit it ++{}; ++ ++class llist ++{ ++ public: ++ llist_data * data; ++ llist * next; ++ llist * prev; ++ ++ llist() { data=NULL; next=NULL; prev=NULL; } ++ ~llist() { if(data!=NULL) { delete data; } if(next!=NULL) { delete next; } } ++}; ++ ++class char_data : public llist_data ++{ ++ public: ++ char * c; ++ char_data(char * tc) { c=tc; } ++ ~char_data() { if(c!=NULL) { delete c; } } ++}; ++ ++class callback_data ++{}; ++ ++class callback : public llist_data ++{ ++ public: ++ int trid; ++ void (*func)(struct msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++ callback_data * data; // just gets passed ++}; ++ ++// Intermediate steps in synchronisation ++class syncinfo : public callback_data ++{ ++ public: ++ ++ llist * fl; ++ llist * rl; ++ llist * al; ++ llist * bl; ++ ++ unsigned int complete; ++ ++ int serial; ++ int nContacts; ++ int nGroups; ++ int nFound; ++ ++ char *last_user_handled; ++ ++ char blp; ++ char gtc; ++ ++ syncinfo() { nFound = 0; nContacts = 0; blp='A'; gtc='A'; fl=rl=al=bl=NULL; complete=0; serial=0; } ++ ~syncinfo() ++ { ++ if(fl!=NULL) { delete fl; } ++ if(rl!=NULL) { delete rl; } ++ if(al!=NULL) { delete al; } ++ if(bl!=NULL) { delete bl; } ++ } ++}; ++ ++class message : public llist_data // This class encapsulates all that you need to know (tm) about a MSG ++{ ++ public: ++ ++ // Raw stuff ++ char * header; // MIME ++ const char * body; ++ ++ // Parsed stuff ++ char * font; ++ char * colour; ++ int bold; ++ int italic; ++ int underline; ++ int fontsize; ++ ++ char * content; // Content-type ++ ++ message() { header=NULL; font=NULL; content=NULL; colour=NULL; } ++}; ++ ++class phonedata : public llist_data ++{ ++ public: ++ char * title; ++ char * number; ++ ++ phonedata() { title=number=NULL; } ++ ~phonedata() { if(title!=NULL) { delete title; } if(number!=NULL) { delete number; } } ++}; ++ ++class userdata : public llist_data ++{ ++ public: ++ char * username; ++ char * friendlyname; ++ ++ llist * phone; ++ ++ userdata() { username=friendlyname=NULL; phone=NULL; } ++ ~userdata() ++ { ++ if(username!=NULL) { delete username; } ++ if(friendlyname!=NULL) { delete friendlyname; } ++ if(phone!=NULL) { delete phone; } ++ } ++}; ++ ++class authdata ++{}; ++ ++ ++class msnconn : public llist_data ++{ ++ public: ++ int sock; // Socket (durr...) ++ int type; // one of the #defines below ++ int sync; // syncing ++ int ready; ++ ++ syncinfo *sync_info; ++ llist * users; // Users in this session - only for SB connections ++ llist * invitations_out; // invitations extended but not responded to ++ llist * invitations_in; // invitations received but not responded to ++ llist * callbacks; ++ authdata * auth; ++ ++ msnconn() { sync = 0; users=NULL; callbacks=NULL; invitations_out=NULL; invitations_in=NULL; } ++ ~msnconn() ++ { ++ if(users!=NULL) { delete users; } ++ if(invitations_in!=NULL) { delete invitations_in; } ++ if(invitations_out!=NULL) { delete invitations_out; } ++ if(callbacks!=NULL) { delete callbacks; } ++ } ++}; ++ ++#define CONN_NS 1 // Notification Server (also Dispatch, as it does exactly the same thing) ++#define CONN_SB 2 // Switchboard Server ++#define CONN_FTP 3 // MSN file transfer ++ ++class authdata_NS : public authdata ++{ ++ public: ++ char * username; ++ char * password; ++ ++ authdata_NS() { username=password=NULL; } ++ ~authdata_NS() { if(username!=NULL) { delete username; delete password; } } ++}; ++ ++class authdata_SB : public authdata ++{ ++ public: ++ char * username; ++ char * sessionID; ++ char * cookie; ++ char * rcpt; // recipient of the below ++ message * msg; // to be sent as soon as connection is complete and someone joins ++ void * tag; // for SB connections without an initial message ++ ++ authdata_SB() { username=sessionID=cookie=NULL; } ++ ~authdata_SB() ++ { if(username!=NULL) { delete username; delete sessionID; delete cookie; } } ++}; ++ ++class invitation : public llist_data ++{ ++ public: ++ int app; ++ char * cookie; ++ char * other_user; ++ msnconn * conn; ++ ++ invitation() { cookie=other_user=NULL; } ++ ~invitation() { if(cookie!=NULL) { delete cookie; } if(other_user!=NULL) { delete other_user; } } ++}; ++ ++#define APP_FTP 1 // NOTE: this is MSN file transfer, which is NOTHING to do with ordinary FTP! ++ ++class invitation_ftp : public invitation ++{ ++ public: ++ char * filename; ++ long unsigned filesize; ++ ++ invitation_ftp() { filename=NULL; } ++ ~invitation_ftp() ++ { if(filename!=NULL) { delete filename; } } ++}; ++ ++ ++class authdata_FTP : public authdata ++{ ++ public: ++ char * cookie; ++ char * username; ++ invitation_ftp * inv; ++ int fd; ++ unsigned long bytes_done; ++ int num_ignore; ++ int direction; ++ int connected; ++ ++ authdata_FTP() { cookie=username=NULL; inv=NULL; fd=-1; bytes_done=num_ignore=connected=0; } ++ ~authdata_FTP() ++ { ++ if(cookie!=NULL) { delete cookie; } ++ if(username!=NULL) { delete username; } ++ if(inv!=NULL) { delete inv; } ++ } ++}; ++ ++#define MSNFTP_SEND 1 ++#define MSNFTP_RECV 2 ++ ++ ++extern llist * connections; ++extern int next_trid; ++ ++#define BUF_SIZE 1024 ++extern char buf[]; // Used for anything temporary ++ ++void msn_init(msnconn * conn, const char * username, const char * password); ++ ++void msn_show_verbose_error(msnconn * conn, int errcode); ++ ++void msn_connect(msnconn * conn, const char * server, int port); ++ ++void msn_invite_user(msnconn * conn, char * rcpt); ++ ++void msn_send_IM(msnconn * conn, const char * rcpt, const char * msg); ++ ++void msn_send_IM(msnconn * conn, const char * rcpt, message * msg); ++ ++void msn_send_typing(msnconn * conn); ++ ++void msn_filetrans_accept(invitation_ftp * inv, const char * dest); ++ ++void msn_filetrans_reject(invitation_ftp * inv); ++ ++invitation_ftp * msn_filetrans_send(msnconn * conn, const char * path); ++ ++void msn_sync_lists(msnconn * conn, int version); ++ ++#define LST_FL 1 ++#define LST_RL 2 ++#define LST_AL 4 ++#define LST_BL 8 ++ ++#define COMPLETE_BLP 16 ++#define COMPLETE_GTC 32 ++ ++void msn_set_friendlyname(msnconn * conn, const char * friendlyname); ++ ++void msn_sync_lists(msnconn * conn, int version); ++void msn_add_to_list(msnconn * conn, const char * lst, const char * user); ++void msn_del_from_list(msnconn * conn, const char * lst, const char * user); ++void msn_set_GTC(msnconn * conn, char c); ++void msn_set_BLP(msnconn * conn, char c); ++void msn_syncdata(msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++void msn_phonedata(msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++void msn_check_rl(msnconn * conn, syncinfo * info); ++ ++void msn_connect_and_send(msnconn * nsconn, char * dest, char * msg); ++ ++void msn_set_state(msnconn * conn, const char * state); ++ ++// Intermediate steps in switchboard connection: ++class conninfo_SB : public callback_data ++{ ++ public: ++ authdata_SB * auth; ++}; ++ ++void msn_new_SB(msnconn * nsconn, void * tag); ++void msn_request_SB(msnconn * nsconn, const char * rcpt, message * msg, void * tag); ++ ++void msn_SBconn_2(msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++void msn_SBconn_3(msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++ ++void msn_handle_incoming(int sock, int readable, int writable); ++ ++void msn_handle_filetrans_incoming(msnconn * conn, int readable, int writable); ++ ++void msn_handle_close(int sock); ++ ++void msn_handle_default(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_MSG(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_invite(msnconn * conn, char * from, char * friendly, char * mime, char * body); ++ ++void msn_handle_new_invite(msnconn * conn, char * from, char * friendly, char * mime, char * body); ++ ++void msn_recv_file(invitation_ftp * inv, char * dest); ++ ++char * msn_find_in_mime(char * mime, char * header); ++ ++void msn_send_file(invitation_ftp * inv, char * msg_body); ++ ++void msn_handle_NAK(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_JOI(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_BYE(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_RNG(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_statechange(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_ADD(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_REM(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_BLP(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_GTC(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_REA(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_CHL(msnconn * conn, char ** args, int numargs); ++ ++void msn_handle_OUT(msnconn * conn, char ** args, int numargs); ++ ++ ++ ++// Intermediate steps in connection: ++class connectinfo : public callback_data ++{ ++ public: ++ char * username; ++ char * password; ++ connectinfo() { username=password=NULL; } ++ ~connectinfo() ++ { if(username!=NULL) { delete username; } if(password!=NULL) { delete password; } } ++}; ++ ++void msn_connect_2(msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++void msn_connect_3(msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++void msn_connect_4(msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++ ++// Connecting to switchboards: ++void msn_SB_ans(msnconn * conn, int trid, char ** args, int numargs, callback_data * data); ++ ++#endif // MSN_CORE_H +diff -ruN blip-0.1.orig/msn_interface.h blip-0.1/msn_interface.h +--- blip-0.1.orig/msn_interface.h Thu Jan 1 08:00:00 1970 ++++ blip-0.1/msn_interface.h Mon Nov 3 20:09:02 2003 +@@ -0,0 +1,92 @@ ++#ifndef __MSN_INTERFACE_H__ ++#define __MSN_INTERFACE_H__ ++ ++/* msn_interface.h - functions that talk to the outside world */ ++ ++/* ++ void ext_show_error(char * msg); ++ ++ Purpose: Displays an error ++ Arguments: ++ msg The error message ++ Return: Nothing ++*/ ++ ++void ext_register_sock(int s, int read, int write); ++void ext_unregister_sock(int s); ++ ++void ext_show_error(msnconn * conn, const char * msg); ++ ++void ext_buddy_set(msnconn * conn, const char * buddy, const char * friendlyname, const char * state); ++ ++void ext_buddy_offline(msnconn * conn, const char * buddy); ++ ++void ext_got_friendlyname(msnconn * conn, const char * friendlyname); ++ ++void ext_got_info(msnconn * conn, syncinfo * data); ++ ++void ext_debug( char *msg ); ++ ++void ext_latest_serial(msnconn * conn, int serial); ++ ++void ext_got_GTC(msnconn * conn, char c); ++ ++void ext_got_BLP(msnconn * conn, char c); ++ ++void ext_new_RL_entry(msnconn * conn, const char * username, const char * friendlyname); ++ ++void ext_new_list_entry(msnconn * conn, const char * lst, const char * username); ++ ++void ext_del_list_entry(msnconn * conn, const char * lst, const char * username); ++ ++void ext_got_SB(msnconn * conn, void * tag); ++ ++void ext_user_joined(msnconn * conn, const char * username, const char * friendlyname, int is_initial); ++ ++void ext_user_left(msnconn * conn, const char * username); ++ ++void ext_got_IM(msnconn * conn, const char * username, const char * friendlyname, message * msg); ++ ++void ext_IM_failed(msnconn * conn); ++ ++void ext_typing_user(msnconn * conn, const char * username, const char * friendlyname); ++ ++void ext_initial_email(msnconn * conn, int unread_inbox, int unread_folders); ++ ++void ext_new_mail_arrived(msnconn * conn, const char * from, const char * subject); ++ ++void ext_filetrans_invite(msnconn * conn, const char * username, const char * friendlyname, invitation_ftp * inv); ++ ++void ext_filetrans_progress(invitation_ftp * inv, const char * status, unsigned long recv, unsigned long total); ++ ++void ext_filetrans_failed(invitation_ftp * inv, int error, const char * message); ++ ++void ext_filetrans_success(invitation_ftp * inv); ++ ++void ext_new_connection(msnconn * conn); ++ ++void ext_closing_connection(msnconn * conn); ++ ++void ext_changed_state(msnconn * conn, const char * state); ++ ++/* ++ int connect_socket(char * server, int port); ++ ++ Purpose: Makes a TCP socket, connects it to the specified server and port, ++ and then registers it for ++ Arguments: ++ server The server name ++ port The TCP port to connect to ++ Return: Nothing ++*/ ++int ext_connect_socket(const char * server, int port); ++ ++int ext_connect_socket_ssl(const char * server, int port); ++ ++int ext_server_socket(int port); ++ ++char * ext_get_IP(void); ++ ++void ext_protocol_log(const char *buf, int readev, int writeev); ++ ++#endif diff --git a/net-im/centericq/files/msn-msnhook.cc b/net-im/centericq/files/msn-msnhook.cc new file mode 100644 index 0000000..3e00cd6 --- /dev/null +++ b/net-im/centericq/files/msn-msnhook.cc @@ -0,0 +1,804 @@ +--- src/hooks/msnhook.cc.orig Mon Nov 3 20:25:37 2003 ++++ src/hooks/msnhook.cc Mon Nov 3 20:24:20 2003 +@@ -0,0 +1,801 @@ ++/* ++* ++* centericq MSN protocol handling class ++* $Id: msnhook.cc,v 1.67 2003/09/30 11:38:43 konst Exp $ ++* ++* Copyright (C) 2001 by Konstantin Klyagin <konst@konst.org.ua> ++* ++* 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 "icqcommon.h" ++ ++#ifdef BUILD_MSN ++ ++#include "msnhook.h" ++#include "icqconf.h" ++#include "icqface.h" ++#include "icqcontacts.h" ++#include "accountmanager.h" ++#include "eventmanager.h" ++#include "imlogger.h" ++#include "connwrap.h" ++ ++#include "msn_bittybits.h" ++ ++#include <unistd.h> ++#include <sys/types.h> ++#include <sys/socket.h> ++#include <netinet/in.h> ++#include <netdb.h> ++#include <arpa/inet.h> ++ ++msnhook mhook; ++ ++static string nicknormalize(const string &nick) { ++ if(nick.find("@") == -1) return nick + "@hotmail.com"; ++ return nick; ++} ++ ++static string nicktodisp(const string &nick) { ++ int pos; ++ string r = nick; ++ ++ if((pos = r.find("@")) != -1) ++ if(r.substr(pos+1) == "hotmail.com") ++ r.erase(pos); ++ ++ return r; ++} ++ ++struct st2imr { ++ char *name; ++ imstatus st; ++}; ++ ++const st2imr st2im[] = { ++ { "FLN", offline }, ++ { "NLN", available }, ++ { "HDN", invisible }, ++ { "BSY", dontdisturb }, ++ { "PHN", occupied }, ++ { "AWY", away }, ++ { "BRB", away }, ++ { "LUN", notavail }, ++ { "IDL", away }, ++ { 0, offline } ++}; ++ ++static imstatus msn2imstatus(const string &sname) { ++ for(const st2imr *sa = st2im; sa->name; sa++) ++ if(sname == sa->name) ++ return sa->st; ++ ++ return offline; ++} ++ ++static const char *stat2name(imstatus st) { ++ for(const st2imr *sa = st2im; sa->name; sa++) ++ if(st == sa->st) ++ return sa->name; ++ ++ return "NLN"; ++} ++ ++// ---------------------------------------------------------------------------- ++ ++msnhook::msnhook(): abstracthook(msn) { ++ ourstatus = offline; ++ fonline = false; ++ ++ fcapabs.insert(hookcapab::synclist); ++ fcapabs.insert(hookcapab::changedetails); ++ fcapabs.insert(hookcapab::directadd); ++// fcapabs.insert(hookcapab::files); ++} ++ ++msnhook::~msnhook() { ++} ++ ++void msnhook::init() { ++ manualstatus = conf.getstatus(msn); ++} ++ ++void msnhook::connect() { ++ icqconf::imaccount account = conf.getourid(msn); ++ ++ face.log(_("+ [msn] connecting to the server")); ++ ++ flogged = false; ++ fonline = true; ++ ++ msn_init(&conn, nicknormalize(account.nickname).c_str(), account.password.c_str()); ++ msn_connect(&conn, account.server.c_str(), account.port); ++ ++ fonline = true; ++ flogged = true; ++} ++ ++void msnhook::disconnect() { ++ msn_clean_up(&conn); ++} ++ ++void msnhook::exectimers() { ++} ++ ++void msnhook::main() { ++ vector<int>::const_iterator i; ++ fd_set rs, ws; ++ struct timeval tv; ++ int hsock; ++ ++ FD_ZERO(&rs); ++ FD_ZERO(&ws); ++ ++ tv.tv_sec = tv.tv_usec = 0; ++ hsock = 0; ++ ++ for(i = rfds.begin(); i != rfds.end(); ++i) { ++ FD_SET(*i, &rs); ++ hsock = max(hsock, *i); ++ } ++ ++ for(i = wfds.begin(); i != wfds.end(); ++i) { ++ FD_SET(*i, &ws); ++ hsock = max(hsock, *i); ++ } ++ ++ if(select(hsock+1, &rs, &ws, 0, &tv) > 0) { ++ for(i = rfds.begin(); i != rfds.end(); ++i) ++ if(FD_ISSET(*i, &rs)) { ++ msn_handle_incoming(*i, 1, 0); ++ return; ++ } ++ ++ for(i = wfds.begin(); i != wfds.end(); ++i) ++ if(FD_ISSET(*i, &ws)) { ++ msn_handle_incoming(*i, 0, 1); ++ return; ++ } ++ } ++} ++ ++void msnhook::getsockets(fd_set &rf, fd_set &wf, fd_set &efds, int &hsocket) const { ++ vector<int>::const_iterator i; ++ ++ for(i = rfds.begin(); i != rfds.end(); ++i) { ++ hsocket = max(hsocket, *i); ++ FD_SET(*i, &rf); ++ } ++ ++ for(i = wfds.begin(); i != wfds.end(); ++i) { ++ hsocket = max(hsocket, *i); ++ FD_SET(*i, &wf); ++ } ++} ++ ++bool msnhook::isoursocket(fd_set &rf, fd_set &wf, fd_set &efds) const { ++ vector<int>::const_iterator i; ++ ++ for(i = rfds.begin(); i != rfds.end(); ++i) ++ if(FD_ISSET(*i, &rf)) ++ return true; ++ ++ for(i = wfds.begin(); i != wfds.end(); ++i) ++ if(FD_ISSET(*i, &wf)) ++ return true; ++ ++ return false; ++} ++ ++bool msnhook::online() const { ++ return fonline; ++} ++ ++bool msnhook::logged() const { ++ return fonline && flogged; ++} ++ ++bool msnhook::isconnecting() const { ++ return fonline && !flogged; ++} ++ ++bool msnhook::enabled() const { ++ return true; ++} ++ ++bool msnhook::send(const imevent &ev) { ++ string text; ++ ++ if(ev.gettype() == imevent::message) { ++ const immessage *m = static_cast<const immessage *>(&ev); ++ if(m) text = m->gettext(); ++ ++ } else if(ev.gettype() == imevent::url) { ++ const imurl *m = static_cast<const imurl *>(&ev); ++ if(m) text = m->geturl() + "\n\n" + m->getdescription(); ++ ++ } else if(ev.gettype() == imevent::file) { ++ const imfile *m = static_cast<const imfile *>(&ev); ++ vector<imfile::record> files = m->getfiles(); ++ vector<imfile::record>::const_iterator ir; ++ ++ for(ir = files.begin(); ir != files.end(); ++ir) { ++ imfile::record r; ++ invitation_ftp *p; ++ ++ r.fname = ir->fname; ++ r.size = ir->size; ++ ++ imfile fr(ev.getcontact(), imevent::outgoing, "", vector<imfile::record>(1, r)); ++ ++ if(p = msn_filetrans_send(&conn, ir->fname.c_str())) ++ transferinfo[fr].first = p; ++ } ++ ++ return true; ++ } ++ ++ icqcontact *c = clist.get(ev.getcontact()); ++ text = siconv(text, conf.getrussian(msn) ? "koi8-u" : conf.getdefcharset(), "utf-8"); ++ ++ if(c) ++ if(c->getstatus() != offline || !c->inlist()) { ++ msn_send_IM(&conn, nicknormalize(ev.getcontact().nickname).c_str(), text.c_str()); ++ return true; ++ } ++ ++ return false; ++} ++ ++void msnhook::sendnewuser(const imcontact &ic) { ++ if(logged()) { ++ icqcontact *c; ++ imcontact icc(nicktodisp(ic.nickname), msn); ++ ++ if(icc.nickname != ic.nickname) ++ if(c = clist.get(ic)) { ++ c->setdesc(icc); ++ c->setnick(icc.nickname); ++ c->setdispnick(icc.nickname); ++ } ++ ++ msn_add_to_list(&conn, "FL", nicknormalize(ic.nickname).c_str()); ++ } ++ ++ requestinfo(ic); ++} ++ ++void msnhook::setautostatus(imstatus st) { ++ if(st != offline) { ++ if(getstatus() == offline) { ++ connect(); ++ } else { ++ logger.putourstatus(msn, ourstatus, st); ++ msn_set_state(&conn, stat2name(ourstatus = st)); ++ } ++ } else { ++ if(getstatus() != offline) { ++ disconnect(); ++ } ++ } ++} ++ ++imstatus msnhook::getstatus() const { ++ return online() ? ourstatus : offline; ++} ++ ++void msnhook::removeuser(const imcontact &ic) { ++ removeuser(ic, true); ++} ++ ++void msnhook::removeuser(const imcontact &ic, bool report) { ++ if(online()) { ++ if(report) ++ face.log(_("+ [msn] removing %s from the contacts"), ic.nickname.c_str()); ++ ++ msn_del_from_list(&conn, "FL", nicknormalize(ic.nickname).c_str()); ++ } ++} ++ ++void msnhook::requestinfo(const imcontact &ic) { ++ icqcontact *c = clist.get(ic); ++ ++ if(!c) { ++ c = clist.get(contactroot); ++ c->clear(); ++ } ++ ++ icqcontact::moreinfo m = c->getmoreinfo(); ++ icqcontact::basicinfo b = c->getbasicinfo(); ++ ++ b.email = nicknormalize(ic.nickname); ++ m.homepage = "http://members.msn.com/" + b.email; ++ ++ if(ic.nickname == conf.getourid(msn).nickname) ++ c->setnick(friendlynicks[ic.nickname]); ++ ++ c->setmoreinfo(m); ++ c->setbasicinfo(b); ++} ++ ++void msnhook::lookup(const imsearchparams ¶ms, verticalmenu &dest) { ++ if(params.reverse) { ++ vector<pair<string, string> >::const_iterator i = slst["RL"].begin(); ++ ++ while(i != slst["RL"].end()) { ++ icqcontact *c = new icqcontact(imcontact(nicktodisp(i->first), msn)); ++ c->setnick(i->second); ++ ++ dest.additem(conf.getcolor(cp_clist_msn), c, (string) " " + i->first); ++ ++i; ++ } ++ face.findready(); ++ ++ face.log(_("+ [msn] reverse users listing finished, %d found"), ++ slst["RL"].size()); ++ ++ dest.redraw(); ++ } ++} ++ ++vector<icqcontact *> msnhook::getneedsync() { ++ int i; ++ vector<icqcontact *> r; ++ bool found; ++ ++ for(i = 0; i < clist.count; i++) { ++ icqcontact *c = (icqcontact *) clist.at(i); ++ ++ if(c->getdesc().pname == msn) { ++ vector<pair<string, string> >::const_iterator fi = slst["FL"].begin(); ++ ++ for(found = false; fi != slst["FL"].end() && !found; ++fi) ++ found = c->getdesc().nickname == fi->first; ++ ++ if(!found) ++ r.push_back(c); ++ } ++ } ++ ++ return r; ++} ++ ++void msnhook::sendupdateuserinfo(const icqcontact &c) { ++ msn_set_friendlyname(&conn, c.getnick().c_str()); ++} ++ ++void msnhook::checkfriendly(icqcontact *c, const string friendlynick, bool forcefetch) { ++ string oldnick = c->getnick(); ++ string newnick = siconv(unmime(friendlynick), "utf-8", conf.getrussian(msn) ? "koi8-u" : conf.getdefcharset()); ++ ++ c->setnick(newnick); ++ ++ if(forcefetch || (oldnick != newnick && c->getdispnick() != oldnick) || oldnick.empty()) { ++ c->setdispnick(newnick); ++ face.relaxedupdate(); ++ } ++} ++ ++void msnhook::checkinlist(imcontact ic) { ++ icqcontact *c = clist.get(ic); ++ vector<icqcontact *> notremote = getneedsync(); ++ ++ if(c) ++ if(c->inlist()) ++ if(find(notremote.begin(), notremote.end(), c) != notremote.end()) ++ mhook.sendnewuser(ic); ++} ++ ++bool msnhook::knowntransfer(const imfile &fr) const { ++ return transferinfo.find(fr) != transferinfo.end(); ++} ++ ++void msnhook::replytransfer(const imfile &fr, bool accept, const string &localpath) { ++ if(accept) { ++ transferinfo[fr].second = localpath; ++ ++ if(transferinfo[fr].second.substr(transferinfo[fr].second.size()-1) != "/") ++ transferinfo[fr].second += "/"; ++ ++ transferinfo[fr].second += justfname(fr.getfiles().begin()->fname); ++ msn_filetrans_accept(transferinfo[fr].first, transferinfo[fr].second.c_str()); ++ ++ } else { ++ msn_filetrans_reject(transferinfo[fr].first); ++ transferinfo.erase(fr); ++ ++ } ++} ++ ++void msnhook::aborttransfer(const imfile &fr) { ++ msn_filetrans_reject(transferinfo[fr].first); ++ ++ face.transferupdate(fr.getfiles().begin()->fname, fr, ++ icqface::tsCancel, 0, 0); ++ ++ transferinfo.erase(fr); ++} ++ ++bool msnhook::getfevent(invitation_ftp *fhandle, imfile &fr) { ++ map<imfile, pair<invitation_ftp *, string> >::const_iterator i = transferinfo.begin(); ++ ++ while(i != transferinfo.end()) { ++ if(i->second.first == fhandle) { ++ fr = i->first; ++ return true; ++ } ++ ++i; ++ } ++ ++ return false; ++} ++ ++// ---------------------------------------------------------------------------- ++ ++static void log(const string &s) { ++#ifdef DEBUG ++ face.log(s); ++#endif ++} ++ ++int ext_debug( char *str ) ++{ ++ log( str ); ++ return 0; ++} ++ ++void ext_register_sock(int s, int reading, int writing) { ++ log("ext_register_sock"); ++ if(reading) mhook.rfds.push_back(s); ++ if(writing) mhook.wfds.push_back(s); ++} ++ ++void ext_unregister_sock(int s) { ++ log("ext_unregister_sock"); ++ vector<int>::iterator i; ++ ++ i = find(mhook.rfds.begin(), mhook.rfds.end(), s); ++ if(i != mhook.rfds.end()) mhook.rfds.erase(i); ++ ++ i = find(mhook.wfds.begin(), mhook.wfds.end(), s); ++ if(i != mhook.wfds.end()) mhook.wfds.erase(i); ++} ++ ++void ext_got_friendlyname(msnconn * conn, const char * friendlyname) { ++ log("ext_got_friendlyname"); ++ ++ if(friendlyname) ++ if(strlen(friendlyname)) ++ mhook.friendlynicks[conf.getourid(msn).nickname] = friendlyname; ++} ++ ++void ext_got_info(msnconn *conn, syncinfo *info) { ++ log("ext_got_info"); ++ ++ userdata *ud; ++ llist *lst, *pl; ++ imcontact ic; ++ ++ for(lst = info->fl; lst; lst = lst->next) { ++ ud = (userdata *) lst->data; ++ ++ mhook.slst["FL"].push_back(make_pair(ud->username, ud->friendlyname)); ++ ++ ic = imcontact(nicktodisp(ud->username), msn); ++ icqcontact *c = clist.get(ic); ++ if(!c) c = clist.addnew(ic, false); ++ ++ icqcontact::basicinfo bi = c->getbasicinfo(); ++ icqcontact::workinfo wi = c->getworkinfo(); ++ ++ for(pl = ud->phone; pl; pl = pl->next) { ++ phonedata *pd = (phonedata *) pl->data; ++ string title = pd->title ? pd->title : ""; ++ ++ if(pd->number) ++ if(strlen(pd->number)) { ++ if(title == "PHH") bi.phone = pd->number; else ++ if(title == "PHW") wi.phone = pd->number; else ++ if(title == "PHM") bi.cellular = pd->number; ++ } ++ } ++ ++ c->setbasicinfo(bi); ++ c->setworkinfo(wi); ++ } ++ ++ for(lst = info->rl; lst; lst = lst->next) { ++ ud = (userdata *) lst->data; ++ mhook.slst["RL"].push_back(make_pair(ud->username, ud->friendlyname)); ++ } ++ ++ mhook.setautostatus(mhook.ourstatus); ++} ++ ++void ext_latest_serial(msnconn * conn, int serial) { ++ log("ext_latest_serial"); ++} ++ ++void ext_got_GTC(msnconn * conn, char c) { ++ log("ext_got_GTC"); ++} ++ ++void ext_got_BLP(msnconn * conn, char c) { ++ log("ext_got_BLP"); ++} ++ ++void ext_new_RL_entry(msnconn *conn, const char *username, const char *friendlyname) { ++ log("ext_new_RL_entry"); ++ msn_add_to_list(&mhook.conn, "AL", username); ++ ++ imcontact ic(nicktodisp(username), msn); ++ mhook.checkinlist(ic); ++ em.store(imnotification(ic, _("The user has added you to his/her contact list"))); ++} ++ ++void ext_new_list_entry(msnconn *conn, const char *lst, const char *username) { ++ log("ext_new_list_entry"); ++ mhook.slst[lst].push_back(make_pair(username, string())); ++} ++ ++void ext_del_list_entry(msnconn *conn, const char *lst, const char *username) { ++ log("ext_del_list_entry"); ++ ++ vector<pair<string, string> >::iterator i = mhook.slst[lst].begin(); ++ while(i != mhook.slst[lst].end()) { ++ if(i->first == username) { ++ mhook.slst[lst].erase(i); ++ i = mhook.slst[lst].begin(); ++ } else { ++ ++i; ++ } ++ } ++} ++ ++void ext_show_error(msnconn * conn, const char * msg) { ++ log("ext_show_error"); ++ log(msg); ++} ++ ++void ext_buddy_set(msnconn * conn, const char * buddy, const char * friendlyname, const char * status) { ++ log("ext_buddy_set"); ++ imcontact ic(nicktodisp(buddy), msn); ++ icqcontact *c = clist.get(ic); ++ bool forcefetch; ++ ++ if(forcefetch = !c) ++ c = clist.addnew(ic, false); ++ ++ if(friendlyname) ++ mhook.checkfriendly(c, friendlyname, forcefetch); ++ ++ logger.putonline(ic, c->getstatus(), msn2imstatus(status)); ++ c->setstatus(msn2imstatus(status)); ++} ++ ++void ext_buddy_offline(msnconn * conn, const char * buddy) { ++ log("ext_buddy_offline"); ++ ext_buddy_set(conn, buddy, 0, "FLN"); ++} ++ ++void ext_got_SB(msnconn * conn, void * tag) { ++ log("ext_got_SB"); ++} ++ ++void ext_user_joined(msnconn *conn, const char *username, const char *friendlyname, int is_initial) { ++ log("ext_user_joined"); ++} ++ ++void ext_user_left(msnconn *conn, const char *username) { ++ log("ext_user_left"); ++} ++ ++void ext_got_IM(msnconn *conn, const char *username, const char *friendlyname, message *msg) { ++ log("ext_got_IM"); ++ imcontact ic(nicktodisp(username), msn); ++ ++ mhook.checkinlist(ic); ++ ++ string text = siconv(msg->body, "utf-8", conf.getrussian(msn) ? "koi8-u" : conf.getdefcharset()); ++ em.store(immessage(ic, imevent::incoming, text)); ++} ++ ++void ext_IM_failed(msnconn *conn) { ++ log("ext_IM_failed"); ++} ++ ++void ext_typing_user(msnconn *conn, const char *username, const char *friendlyname) { ++ log("ext_typing_user"); ++ icqcontact *c = clist.get(imcontact(nicktodisp(username), msn)); ++ if(c) c->setlasttyping(timer_current); ++} ++ ++void ext_initial_email(msnconn *conn, int unread_inbox, int unread_folders) { ++ log("ext_initial_email"); ++ ++ face.log(_("+ [msn] unread e-mail: %d in inbox, %d in folders"), ++ unread_inbox, unread_folders); ++} ++ ++void ext_new_mail_arrived(msnconn *conn, const char *from, const char *subject) { ++ log("ext_new_mail_arrived"); ++ ++ face.log(_("+ [msn] e-mail from %s, %s"), from, subject); ++ clist.get(contactroot)->playsound(imevent::email); ++} ++ ++void ext_filetrans_invite(msnconn *conn, const char *username, const char *friendlyname, invitation_ftp *inv) { ++ log("ext_filetrans_invite"); ++ ++ if(!mhook.fcapabs.count(hookcapab::files)) ++ return; ++ ++ imfile::record r; ++ r.fname = inv->filename; ++ r.size = inv->filesize; ++ ++ imcontact ic(nicktodisp(username), msn); ++ mhook.checkinlist(ic); ++ ++ imfile fr(ic, imevent::incoming, "", vector<imfile::record>(1, r)); ++ ++ mhook.transferinfo[fr].first = inv; ++ em.store(fr); ++ ++ face.transferupdate(inv->filename, fr, icqface::tsInit, inv->filesize, 0); ++} ++ ++void ext_filetrans_progress(invitation_ftp *inv, const char *status, unsigned long sent, unsigned long total) { ++ log("ext_filetrans_progress"); ++ imfile fr; ++ ++ if(mhook.getfevent(inv, fr)) { ++ face.transferupdate(fr.getfiles().begin()->fname, fr, ++ icqface::tsProgress, total, sent); ++ } ++} ++ ++void ext_filetrans_failed(invitation_ftp *inv, int error, const char *message) { ++ log("ext_filetrans_failed"); ++ imfile fr; ++ ++ if(mhook.getfevent(inv, fr)) { ++ face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsError, 0, 0); ++ mhook.transferinfo.erase(fr); ++ } ++} ++ ++void ext_filetrans_success(invitation_ftp *inv) { ++ log("ext_filetrans_success"); ++ imfile fr; ++ ++ if(mhook.getfevent(inv, fr)) { ++ face.transferupdate(fr.getfiles().begin()->fname, fr, icqface::tsFinish, 0, 0); ++ mhook.transferinfo.erase(fr); ++ } ++} ++ ++void ext_new_connection(msnconn *conn) { ++ log("ext_new_connection"); ++ if(conn->type == CONN_NS) { ++ msn_sync_lists(conn, 0); ++ logger.putourstatus(msn, offline, mhook.ourstatus = mhook.manualstatus); ++ mhook.flogged = true; ++ face.log(_("+ [msn] logged in")); ++ face.update(); ++ } ++} ++ ++void ext_closing_connection(msnconn *conn) { ++ log("ext_closing_connection"); ++ if(conn->type == CONN_NS) { ++ mhook.rfds.clear(); ++ mhook.wfds.clear(); ++ logger.putourstatus(msn, mhook.getstatus(), mhook.ourstatus = offline); ++ clist.setoffline(msn); ++ mhook.fonline = false; ++ mhook.slst.clear(); ++ face.log(_("+ [msn] disconnected")); ++ face.update(); ++ } ++} ++ ++void ext_changed_state(msnconn *conn, const char *state) { ++ log("ext_changed_state"); ++} ++ ++int ext_do_connect_socket(const char *hostname, int port, int ssl) { ++ struct sockaddr_in sa; ++ struct hostent *hp; ++ int a, s; ++ string msgerr = _("+ [msn] cannot connect: "); ++ ++ hp = gethostbyname(hostname); ++ if(!hp) { ++ face.log(msgerr + _("could not resolve hostname")); ++ errno = ECONNREFUSED; ++ return -1; ++ } ++ ++ memset(&sa, 0, sizeof(sa)); ++ memcpy((char *) &sa.sin_addr, hp->h_addr, hp->h_length); ++ sa.sin_family = hp->h_addrtype; ++ sa.sin_port = htons((u_short) port); ++ ++ if((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) ++ return -1; ++ ++ if(cw_connect(s, (struct sockaddr *) &sa, sizeof(sa), ssl) < 0) { ++ face.log(msgerr + _("verify the hostname and port")); ++ close(s); ++ return -1; ++ } ++ ++ return s; ++} ++ ++int ext_connect_socket_ssl(const char *hostname, int port) { ++ log("ext_connect_socket_ssl"); ++ return ext_do_connect_socket(hostname, port, 1); ++} ++ ++int ext_connect_socket(const char *hostname, int port) { ++ log("ext_connect_socket"); ++ return ext_do_connect_socket(hostname, port, 0); ++} ++ ++int ext_server_socket(int port) { ++ log("ext_server_socket"); ++ int s; ++ struct sockaddr_in addr; ++ ++ if((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) ++ return -1; ++ ++ memset(&addr, 0, sizeof(addr)); ++ addr.sin_family = AF_INET; ++ addr.sin_port = htons(port); ++ ++ if(bind(s, (sockaddr *) &addr, sizeof(addr)) < 0 || listen(s, 1) < 0) { ++ close(s); ++ return -1; ++ } ++ ++ return s; ++} ++ ++char *ext_get_IP() { ++ log("ext_get_IP"); ++ struct hostent *hn; ++ char buf2[1024]; ++ ++ gethostname(buf2, 1024); ++ hn = gethostbyname(buf2); ++ ++ return inet_ntoa(*((struct in_addr*) hn->h_addr)); ++} ++ ++void ext_protocol_log(const char *buf, int readev, int writeev) { ++ if(readev) { ++ log(string("[IN] ") + buf); ++ } else if(writeev) { ++ log(string("[OUT] ") + buf); ++ } ++} ++ ++#endif diff --git a/net-im/centericq/files/msn-msnhook.h b/net-im/centericq/files/msn-msnhook.h new file mode 100644 index 0000000..e2e8ac8 --- /dev/null +++ b/net-im/centericq/files/msn-msnhook.h @@ -0,0 +1,92 @@ +--- src/hooks/msnhook.h.orig Mon Nov 3 20:25:39 2003 ++++ src/hooks/msnhook.h Mon Nov 3 20:24:23 2003 +@@ -0,0 +1,89 @@ ++#ifndef __MSNHOOK_H__ ++#define __MSNHOOK_H__ ++ ++#include "abstracthook.h" ++ ++#ifdef BUILD_MSN ++ ++#include "msn_core.h" ++ ++class msnhook : public abstracthook { ++ ++ friend void ext_register_sock(int s, int reading, int writing); ++ friend void ext_unregister_sock(int s); ++ friend void ext_new_connection(msnconn *conn); ++ friend void ext_closing_connection(msnconn * conn); ++ friend void ext_buddy_set(msnconn *conn, const char *buddy, const char *friendlyname, const char *status); ++ friend void ext_got_info(msnconn *conn, syncinfo *info); ++ friend void ext_got_friendlyname(msnconn *conn, const char *friendlyname); ++ friend void ext_new_RL_entry(msnconn *conn, const char *username, const char *friendlyname); ++ friend void ext_new_list_entry(msnconn *conn, const char *lst, const char *username); ++ friend void ext_del_list_entry(msnconn *conn, const char *lst, const char *username); ++ friend void ext_got_IM(msnconn *conn, const char *username, const char *friendlyname, message *msg); ++ friend void ext_filetrans_invite(msnconn *conn, const char *username, const char *friendlyname, invitation_ftp *inv); ++ friend void ext_typing_user(msnconn *conn, const char *username, const char *friendlyname); ++ friend void ext_filetrans_progress(invitation_ftp *inv, const char *status, unsigned long sent, unsigned long total); ++ friend void ext_filetrans_failed(invitation_ftp *inv, int error, const char *message); ++ friend void ext_filetrans_success(invitation_ftp *inv); ++ ++ protected: ++ imstatus ourstatus; ++ bool fonline, flogged; ++ msnconn conn; ++ ++ vector<int> rfds, wfds; ++ map<string, string> friendlynicks; ++ map<string, vector<pair<string, string> > > slst; ++ map<imfile, pair<invitation_ftp *, string> > transferinfo; ++ ++ void checkfriendly(icqcontact *c, const string friendlynick, ++ bool forcefetch = false); ++ ++ void checkinlist(imcontact ic); ++ ++ void removeuser(const imcontact &ic, bool report); ++ bool getfevent(invitation_ftp *fhandle, imfile &fr); ++ ++ public: ++ msnhook(); ++ ~msnhook(); ++ ++ void init(); ++ ++ void connect(); ++ void disconnect(); ++ void exectimers(); ++ void main(); ++ ++ void getsockets(fd_set &rf, fd_set &wf, fd_set &ef, int &hsocket) const; ++ bool isoursocket(fd_set &rf, fd_set &wf, fd_set &ef) const; ++ ++ bool online() const; ++ bool logged() const; ++ bool isconnecting() const; ++ bool enabled() const; ++ ++ bool send(const imevent &ev); ++ ++ void sendnewuser(const imcontact &c); ++ void removeuser(const imcontact &ic); ++ void requestinfo(const imcontact &ic); ++ ++ void sendupdateuserinfo(const icqcontact &c); ++ ++ void setautostatus(imstatus st); ++ imstatus getstatus() const; ++ ++ void lookup(const imsearchparams ¶ms, verticalmenu &dest); ++ vector<icqcontact *> getneedsync(); ++ ++ bool knowntransfer(const imfile &fr) const; ++ void replytransfer(const imfile &fr, bool accept, const string &localpath = string()); ++ void aborttransfer(const imfile &fr); ++}; ++ ++extern msnhook mhook; ++ ++#endif ++ ++#endif diff --git a/net-im/centericq/files/msn-src::Makefile.in b/net-im/centericq/files/msn-src::Makefile.in new file mode 100644 index 0000000..90333d9 --- /dev/null +++ b/net-im/centericq/files/msn-src::Makefile.in @@ -0,0 +1,17 @@ +--- src/Makefile.in.orig Sat Oct 25 15:53:46 2003 ++++ src/Makefile.in Mon Nov 3 20:16:35 2003 +@@ -92,11 +92,11 @@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ + +-INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/hooks -I$(top_srcdir)/firetalk-0.1 -I$(top_srcdir)/kkconsui-0.1/include -I$(top_srcdir)/kkstrtext-0.1 -I$(top_srcdir)/libicq2000-0.1 -I$(top_srcdir)/libjabber-0.1 -I$(top_srcdir)/libyahoo2-0.1 -I$(top_srcdir)/kksystr-0.1/include -I$(top_srcdir)/connwrap-0.1 -I$(top_srcdir)/intl ++INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/hooks -I$(top_srcdir)/firetalk-0.1 -I$(top_srcdir)/kkconsui-0.1/include -I$(top_srcdir)/kkstrtext-0.1 -I$(top_srcdir)/libicq2000-0.1 -I$(top_srcdir)/libjabber-0.1 -I$(top_srcdir)/libyahoo2-0.1 -I$(top_srcdir)/kksystr-0.1/include -I$(top_srcdir)/connwrap-0.1 -I$(top_srcdir)/intl -I$(top_srcdir)/blip-0.1 + bin_PROGRAMS = centericq + centericq_SOURCES = centericq.cc icqcontact.cc icqgroups.cc eventmanager.cc icqdialogs.cc icqhist.cc imexternal.cc imcontact.cc imlogger.cc accountmanager.cc icqcontacts.cc icqmlist.cc imcontroller.cc icqconf.cc imevents.cc icqface.cc centermain.cc icqgroup.cc +-centericq_LDFLAGS = -L$(top_srcdir)/firetalk-0.1 -L$(top_srcdir)/kkconsui-0.1 -L$(top_srcdir)/kkstrtext-0.1 -L$(top_srcdir)/libicq2000-0.1 -L$(top_srcdir)/libjabber-0.1 -L$(top_srcdir)/libyahoo2-0.1 -L$(top_srcdir)/kksystr-0.1 -L$(top_srcdir)/connwrap-0.1 +-centericq_LDADD = $(top_srcdir)/src/hooks/libhooks.a -lfiretalk -lkkconsui -lkkstrtext -llibicq2000 -llibjabber -llibyahoo2 -lkksystr -lconnwrap @INTLLIBS@ ++centericq_LDFLAGS = -L$(top_srcdir)/firetalk-0.1 -L$(top_srcdir)/kkconsui-0.1 -L$(top_srcdir)/kkstrtext-0.1 -L$(top_srcdir)/libicq2000-0.1 -L$(top_srcdir)/libjabber-0.1 -L$(top_srcdir)/libyahoo2-0.1 -L$(top_srcdir)/kksystr-0.1 -L$(top_srcdir)/connwrap-0.1 -L$(top_srcdir)/blip-0.1 ++centericq_LDADD = $(top_srcdir)/src/hooks/libhooks.a -lfiretalk -lkkconsui -lkkstrtext -llibicq2000 -llibjabber -llibyahoo2 -lkksystr -lconnwrap @INTLLIBS@ -intl -lblip + SUBDIRS = hooks + EXTRA_DIST = centericq.cc icqcontact.cc icqgroups.cc eventmanager.cc icqdialogs.cc icqhist.cc imexternal.cc imcontact.cc imlogger.cc accountmanager.cc icqcontacts.cc icqmlist.cc imcontroller.cc icqconf.cc imevents.cc icqface.cc centermain.cc icqgroup.cc icqmlist.h imcontroller.h icqcommon.h icqcontacts.h centericq.h icqgroup.h imcontact.h accountmanager.h eventmanager.h imevents.h icqcontact.h imlogger.h icqconf.h icqface.h icqgroups.h icqhist.h imexternal.h + AUTOMAKE_OPTIONS = foreign diff --git a/net-im/centericq/files/msn-src::hooks::Makefile.in b/net-im/centericq/files/msn-src::hooks::Makefile.in new file mode 100644 index 0000000..a8b2da1 --- /dev/null +++ b/net-im/centericq/files/msn-src::hooks::Makefile.in @@ -0,0 +1,34 @@ +--- src/hooks/Makefile.in.orig Sat Oct 25 15:53:46 2003 ++++ src/hooks/Makefile.in Mon Nov 3 21:35:39 2003 +@@ -92,10 +92,10 @@ + USE_NLS = @USE_NLS@ + VERSION = @VERSION@ + +-INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/hooks -I$(top_srcdir)/firetalk-0.1 -I$(top_srcdir)/kkconsui-0.1/include -I$(top_srcdir)/kkstrtext-0.1 -I$(top_srcdir)/libicq2000-0.1 -I$(top_srcdir)/libjabber-0.1 -I$(top_srcdir)/libyahoo2-0.1 -I$(top_srcdir)/kksystr-0.1/include -I$(top_srcdir)/connwrap-0.1 -I$(top_srcdir)/intl ++INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/hooks -I$(top_srcdir)/firetalk-0.1 -I$(top_srcdir)/kkconsui-0.1/include -I$(top_srcdir)/kkstrtext-0.1 -I$(top_srcdir)/libicq2000-0.1 -I$(top_srcdir)/libjabber-0.1 -I$(top_srcdir)/libyahoo2-0.1 -I$(top_srcdir)/kksystr-0.1/include -I$(top_srcdir)/connwrap-0.1 -I$(top_srcdir)/intl -I$(top_srcdir)/blip-0.1 + noinst_LIBRARIES = libhooks.a +-libhooks_a_SOURCES = yahoohook.cc jabberhook.cc aimhook.cc icqhook.cc irchook.cc abstracthook.cc rsshook.cc HTTPClient.cc ljhook.cc +-EXTRA_DIST = yahoohook.cc jabberhook.cc aimhook.cc icqhook.cc irchook.cc abstracthook.cc rsshook.cc HTTPClient.cc ljhook.cc yahoohook.h aimhook.h jabberhook.h icqhook.h irchook.h abstracthook.h rsshook.h HTTPClient.h ljhook.h ++libhooks_a_SOURCES = yahoohook.cc jabberhook.cc aimhook.cc icqhook.cc irchook.cc abstracthook.cc rsshook.cc HTTPClient.cc ljhook.cc msnhook.cc ++EXTRA_DIST = yahoohook.cc jabberhook.cc aimhook.cc icqhook.cc irchook.cc abstracthook.cc rsshook.cc HTTPClient.cc ljhook.cc msnhook.cc yahoohook.h aimhook.h jabberhook.h icqhook.h irchook.h abstracthook.h rsshook.h HTTPClient.h ljhook.h msnhook.h + mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs + CONFIG_HEADER = ../../config.h + CONFIG_CLEAN_FILES = +@@ -108,7 +108,7 @@ + LIBS = @LIBS@ + libhooks_a_LIBADD = + libhooks_a_OBJECTS = yahoohook.o jabberhook.o aimhook.o icqhook.o \ +-irchook.o abstracthook.o rsshook.o HTTPClient.o ljhook.o ++irchook.o abstracthook.o rsshook.o HTTPClient.o ljhook.o msnhook.o + AR = ar + CXXFLAGS = @CXXFLAGS@ + CXXCOMPILE = $(CXX) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +@@ -123,7 +123,7 @@ + GZIP_ENV = --best + DEP_FILES = .deps/HTTPClient.P .deps/abstracthook.P .deps/aimhook.P \ + .deps/icqhook.P .deps/irchook.P .deps/jabberhook.P .deps/ljhook.P \ +-.deps/rsshook.P .deps/yahoohook.P ++.deps/rsshook.P .deps/yahoohook.P .deps/msnhook.P + SOURCES = $(libhooks_a_SOURCES) + OBJECTS = $(libhooks_a_OBJECTS) + diff --git a/net-im/centericq/files/patch-icqconf.cc b/net-im/centericq/files/patch-icqconf.cc deleted file mode 100644 index 21c75b1..0000000 --- a/net-im/centericq/files/patch-icqconf.cc +++ /dev/null @@ -1,11 +0,0 @@ ---- src/icqconf.cc.orig Wed Oct 1 08:27:45 2003 -+++ src/icqconf.cc Wed Oct 8 17:28:21 2003 -@@ -270,7 +270,7 @@ - if(getantispam()) f << "antispam" << endl; - if(getmailcheck()) f << "mailcheck" << endl; - if(getaskaway()) f << "askaway" << endl; -- f << "defcharset" << getdefcharset() << endl; -+ f << "defcharset\t" << getdefcharset() << endl; - - param = ""; - for(protocolname pname = icq; pname != protocolname_size; (int) pname += 1) diff --git a/net-im/centericq/files/patch-msn_bittybits.C b/net-im/centericq/files/patch-msn_bittybits.C deleted file mode 100644 index aa1a54f..0000000 --- a/net-im/centericq/files/patch-msn_bittybits.C +++ /dev/null @@ -1,28 +0,0 @@ ---- blip-0.1/msn_bittybits.C.orig Mon Dec 9 20:31:41 2002 -+++ blip-0.1/msn_bittybits.C Thu Oct 23 20:02:19 2003 -@@ -18,6 +18,8 @@ - char c; - int pos=0, numspaces=0; - -+ *numargs = 0; -+ - while(1) - { - if(read(sock, &c, 1)<1) -@@ -259,13 +261,16 @@ - { - if(*rptr=='\0') - { *wptr='\0'; break; } -+ - if(!(isalpha(*rptr) || isdigit(*rptr))) - { -+ if ( *rptr != '\xc2' && *rptr != '\xb0' ) { - sprintf(wptr, "%%%2x", (int)(*rptr)); - - rptr++; - wptr+=3; - continue; -+ } - } - - *wptr=*rptr; diff --git a/net-im/centericq/files/patch-msn_core.C b/net-im/centericq/files/patch-msn_core.C deleted file mode 100644 index 767c315..0000000 --- a/net-im/centericq/files/patch-msn_core.C +++ /dev/null @@ -1,923 +0,0 @@ ---- blip-0.1/msn_core.C.orig Sat Dec 14 07:58:01 2002 -+++ blip-0.1/msn_core.C Thu Oct 23 20:02:19 2003 -@@ -18,19 +18,18 @@ - #include <sys/stat.h> - - #include "md5.h" -- - #include "msn_core.h" - #include "msn_bittybits.h" - #include "msn_interface.h" -+#include "../connwrap-0.1/connwrap.h" - - #define DEBUG 1 -+#define MSN_VERSION_ID 0 // ID that is sent after commands like CHG, NLN, etc. - - // Define all those extern'ed variables in msn_core.h: - llist * connections=NULL; -- - int next_trid=10; - char buf[BUF_SIZE]; // used for anything temporary -- - char * errors[1000]; - char default_error_msg[]="Unknown error code"; - -@@ -218,143 +217,151 @@ - write(conn->sock, buf, strlen(buf)); - } - --void msn_sync_lists(msnconn * conn, int version) -+void msn_get_list_info( msnconn *conn, int nargs, char **args ) - { -- syncinfo * info=new syncinfo; -+ char buf[ 1000 ]; -+ syncinfo *info; - -- info->serial=version; -+ info = conn->sync_info; - -- sprintf(buf, "SYN %d %d\r\n", next_trid, version); -- write(conn->sock, buf, strlen(buf)); -+ if ( NULL == info ) -+ { -+ ext_debug("error! : conn->sync_info == NULL in msn_get_list_info"); -+ return ; -+ } - -- msn_add_callback(conn, msn_syncdata, next_trid, info); -- next_trid++; --} -+ if ( !nargs ) -+ return ; - --void msn_syncdata(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) --{ -- syncinfo * info=(syncinfo *)data; -- -- if(!strcmp(args[0], "SYN")) -+ if ( !strcmp( args[ 0 ], "SYN" ) ) - { -- if(info->serial==atoi(args[2])) -+ if ( info->serial == atoi( args[ 2 ] ) ) - { - delete info; -- info=NULL; -- msn_del_callback(conn, trid); -+ info = NULL; - ext_got_info(conn, NULL); - return; -- } else { -- info->serial=atoi(args[2]); -- ext_latest_serial(conn, info->serial); -- msn_add_callback(conn, msn_phonedata, info->serial, info); - } -+ -+ info->serial = atoi( args[ 2 ] ); -+ ext_latest_serial( conn, info->serial ); -+ info->nContacts = atoi( args[ 3 ] ); -+ info->nGroups = atoi( args[ 4 ] ); -+ return ; - } - -- if(!strcmp(args[0], "LST")) -- { -- if(!strcmp(args[2], "FL")) -- { -- if(!strcmp(args[5], "0")) -+ if ( !strcmp( args[ 0 ], "GTC" ) ) - { -- info->fl=NULL; info->complete|=LST_FL; -- } else { -- userdata * newuser=new userdata(); -- newuser->username=msn_permstring(args[6]); -- newuser->friendlyname=msn_decode_URL(msn_permstring(args[6])); -- msn_add_to_llist(info->fl, newuser); -- if(atoi(args[4])==atoi(args[5])) -- { info->complete|=LST_FL; } -- } -+ info->gtc = args[ 1 ][ 0 ]; -+ info->complete |= COMPLETE_GTC; -+ ext_got_GTC( conn, args[ 1 ][ 0 ] ); - } -- if(!strcmp(args[2], "RL")) -- { -- if(!strcmp(args[5], "0")) -+ -+ if ( !strcmp( args[ 0 ], "BLP" ) ) - { -- info->rl=NULL; info->complete|=LST_RL; // no mates! :-) -- } else { -- userdata * newuser=new userdata(); -- newuser->username=msn_permstring(args[6]); -- newuser->friendlyname=msn_decode_URL(msn_permstring(args[6])); -- msn_add_to_llist(info->rl, newuser); -- if(atoi(args[4])==atoi(args[5])) -- { info->complete|=LST_RL; } -+ info->blp = args[ 1 ][0]; -+ info->complete |= COMPLETE_BLP; -+ ext_got_BLP( conn, args[ 1 ][ 0 ] ); - } -+ -+ if ( !strcmp( args[ 0 ], "PRP" ) ) -+ { -+ // We just eat PRP-codes. -+ return ; - } -- if(!strcmp(args[2], "AL")) -+ -+ if ( !strcmp( args[ 0 ], "LSG" ) ) - { -- if(!strcmp(args[5], "0")) -+ if ( !info->nContacts ) - { -- info->al=NULL; info->complete|=LST_AL; -- } else { -- userdata * newuser=new userdata(); -- newuser->username=msn_permstring(args[6]); -- newuser->friendlyname=msn_decode_URL(msn_permstring(args[6])); -- msn_add_to_llist(info->al, newuser); -- if(atoi(args[4])==atoi(args[5])) -- { info->complete|=LST_AL; } -+ msn_check_rl(conn, info); -+ ext_got_info(conn, info); -+ delete info; -+ conn->sync = 0; - } -+ -+ // Just eat 'm. -+ return ; - } -- if(!strcmp(args[2], "BL")) -- { -- if(!strcmp(args[5], "0")) -+ -+ if ( !strcmp( args[ 0 ], "BPR" ) ) - { -- info->bl=NULL; info->complete|=LST_BL; -+ if ( !info->nFound ) { -+ ext_debug("MSNp8: error: got BPR without contact"); - } else { -- userdata * newuser=new userdata(); -- newuser->username=msn_permstring(args[6]); -- newuser->friendlyname=msn_decode_URL(msn_permstring(args[6])); -- msn_add_to_llist(info->bl, newuser); -- if(atoi(args[4])==atoi(args[5])) -- { info->complete|=LST_BL; } -+ llist *ll = info->fl; -+ -+ while( ll ) { -+ userdata * ud = (userdata *) ll->data; -+ -+ if( !strcmp( ud->username, info->last_user_handled ) ) -+ { -+ phonedata * newphone=new phonedata(); -+ newphone->title=msn_permstring(args[1]); -+ newphone->number=msn_decode_URL(msn_permstring(args[2])); -+ msn_add_to_llist( ud->phone, newphone ); -+ break; - } -+ -+ ll = ll->next; - } - } - -- if(!strcmp(args[0], "GTC")) -- { -- info->gtc=args[3][0]; -- info->complete|=COMPLETE_GTC; -- ext_got_GTC(conn, args[3][0]); -+ return ; - } - -- if(!strcmp(args[0], "BLP")) -+ // 0 1 2 -+ // LST email@address.com Friendly%20Nickname w x,y,z -+ if ( !strcmp( args[ 0 ], "LST" ) ) - { -- info->blp=args[3][0]; -- info->complete|=COMPLETE_BLP; -- ext_got_BLP(conn, args[3][0]); -- } -+ // XXX - Todo: see if the user is really on our FL -+ // list and handle the BL list. -+ -+ userdata *newuser_fl = new userdata(); -+ newuser_fl->username = msn_permstring( args[ 1 ] ); -+ newuser_fl->friendlyname = msn_decode_URL( msn_permstring( args[ 1 ] ) ); -+ -+ info->last_user_handled = newuser_fl->username; -+ -+ msn_add_to_llist( info->fl, newuser_fl ); -+ -+ userdata *newuser_rl = new userdata(); -+ newuser_rl->username = msn_permstring( args[ 1 ] ); -+ newuser_rl->friendlyname = msn_decode_URL( msn_permstring( args[ 1 ] ) ); -+ -+ msn_add_to_llist( info->rl, newuser_rl ); - -- if(info->complete == (LST_FL|LST_RL|LST_AL|LST_BL|COMPLETE_BLP|COMPLETE_GTC)) -+ userdata *newuser_al = new userdata(); -+ newuser_al->username = msn_permstring( args[ 1 ] ); -+ newuser_al->friendlyname = msn_decode_URL( msn_permstring( args[ 1 ] ) ); -+ -+ msn_add_to_llist( info->al, newuser_al ); -+ -+ info->nFound++; -+ -+ if ( info->nFound == info->nContacts ) - { -- msn_del_callback(conn, trid); -- msn_del_callback(conn, info->serial); - msn_check_rl(conn, info); - ext_got_info(conn, info); - delete info; -+ conn->sync = 0; -+ } - } - } - --void msn_phonedata(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) -+void msn_sync_lists(msnconn * conn, int version) - { -- syncinfo * info=(syncinfo *)data; -+ syncinfo * info=new syncinfo; - -- if(!strcmp(args[0], "BPR")) -- { -- llist * ll = info->fl; -- while(ll) { -- userdata * ud = (userdata *) ll->data; -- if(!strcmp(ud->username, args[2])) -- { -- phonedata * newphone=new phonedata(); -- newphone->title=msn_permstring(args[3]); -- newphone->number=msn_decode_URL(msn_permstring(args[4])); -- msn_add_to_llist(ud->phone, newphone); -- break; -- } -- ll = ll->next; -- } -- } -+ info->serial=version; -+ -+ sprintf(buf, "SYN %d %d\r\n", next_trid, version); -+ write(conn->sock, buf, strlen(buf)); -+ -+ conn->sync = 1; -+ conn->sync_info = info; -+ -+ next_trid++; - } - - void msn_check_rl(msnconn * conn, syncinfo * info) -@@ -544,6 +551,11 @@ - if(!readable) { return; } - - args=msn_read_line(sock, &numargs); -+ if ( !numargs ) -+ { -+ ext_debug("msn: error: no arguments for this data"); -+ return ; -+ } - - if(args==NULL) - { -@@ -582,6 +594,22 @@ - - trid=atoi(args[1]); - -+ if ( conn->sync ) -+ { -+ // connection is synching. is this a SYNC-relation instruction? -+ if ( !strcmp( args[ 0 ], "SYN" ) || !strcmp( args[ 0 ], "GTC") || !strcmp( args[ 0 ], "BLP" ) || -+ !strcmp( args[ 0 ], "PRP" ) || !strcmp( args[ 0 ], "LSG") || !strcmp( args[ 0 ], "BPR" ) || -+ !strcmp( args[ 0 ], "LST" ) ) -+ { -+ msn_get_list_info( conn, numargs, args ); -+ delete args[0]; -+ delete args; -+ return ; -+ } -+ -+ // else: it's a normal message -+ } -+ - list=conn->callbacks; - - if(list!=NULL && trid>0) -@@ -775,6 +803,10 @@ - #endif - if((tmp=strstr(content, "; charset"))!=NULL) { *tmp='\0'; } - -+ if(!strcmp(content, "text/x-msmsgsprofile")) -+ { -+ ext_debug("MSNp8: got x-msmsgsprofile"); -+ } else - if(!strcmp(content, "text/plain")) - { - message * msg=new message; -@@ -1024,7 +1056,6 @@ - write(conn->sock, "VER MSNFTP\r\n", strlen("VER MSNFTP\r\n")); - } - -- - void msn_handle_filetrans_incoming(msnconn * conn, int readable, int writable) - { - authdata_FTP * auth=(authdata_FTP *)conn->auth; -@@ -1445,10 +1476,12 @@ - - md5_init(&state); - md5_append(&state, (md5_byte_t *)(args[2]), strlen(args[2])); -- md5_append(&state, (md5_byte_t *)"Q1P7W2E4J9R8U3S5", 16); -+ md5_append(&state, (md5_byte_t *)"VT6PX?UQTM4WM%YR", 16); -+ - md5_finish(&state, digest); - -- sprintf(buf, "QRY %d msmsgs@msnmsgr.com 32\r\n", next_trid++); -+ sprintf(buf, "QRY %d PROD0038W!61ZTF9 32\r\n", next_trid++ ); -+ - write(conn->sock, buf, strlen(buf)); - - for(a=0; a<16; a++) -@@ -1591,8 +1624,426 @@ - return inv; - } - -+#define szUser info->username -+#define szPassword info->password -+ -+int msn_login_read( int nSock, char *buf, int nMax ) -+{ -+ return cw_read( nSock, buf, nMax, 0 ); -+} -+ -+int msn_login_wait( int nSocket, char *szCommand ) -+{ -+ int nRet = 0; -+ -+ while ( !nRet ) -+ nRet = read( nSocket, szCommand, 1000 ); -+ -+ #ifdef MSNDEBUG -+ printf("<< %s", szCommand ); -+ #endif -+ -+ return 1; -+} -+ -+void msn_login_write1( int nSocket, char *szString, char *szArg ) -+{ -+ char szWrite[ 1000 ]; -+ -+ // ext_debug( szString ); -+ // ext_debug( szArg ); -+ -+ memset( szWrite, 0, 999 ); -+ sprintf( szWrite, "%s %s\r\n", szString, szArg ); -+ -+ // ext_debug( szWrite ); -+ -+ cw_write( nSocket, szWrite, strlen( szWrite ), 0 ); -+} -+ -+void msn_login_write( int nSocket, char *szString ) -+{ -+ char szWrite[ 1000 ]; -+ -+ memset( szWrite, 0, 1000 ); -+ sprintf( szWrite, "%s\r\n", szString ); -+ -+ cw_write( nSocket, szWrite, strlen( szWrite ), 0 ); -+} -+ -+int msn_login_connect( int nPort, char *szAddress ) -+{ -+ return ext_connect_socket( szAddress, nPort ); -+} -+ -+int msn_login_ssl_write( int nSock, char *str ) -+{ -+ return cw_write( nSock, str, strlen( str ), 1 ); -+} -+ -+int msn_login_ssl_read( int nSock, char *buf, int nMax ) -+{ -+ return cw_read( nSock, buf, nMax, 1 ); -+} -+ -+int msn_login_close( int nSock ) -+{ -+ return cw_close( nSock ); -+} -+ -+int msn_login_ssl_connect( int nPort, char *szAddr ) -+{ -+ return ext_connect_socket_ssl( szAddr, nPort ); -+} -+ -+int msn_login_get_server( char *str, char *filter, char *Server, char *Site ) -+{ -+ char *c, *c1, *c2; -+ -+ c = strstr( str, filter ); -+ if ( NULL == c ) -+ return 0; -+ // Skip the "Filter="-part. -+ c++; -+ c += strlen( filter ); -+ c1 = strchr( c, '/' ); -+ if ( NULL == c1 ) -+ return 0; -+ c2 = strchr( c1, ',' ); -+ if ( NULL == c2 ) -+ return 0; -+ -+ strncpy( Server, c, (unsigned long)c1 - (unsigned long)c ); -+ strncpy( Site, c1, (unsigned long)c2 - (unsigned long)c1 ); -+ -+ return 1; -+} -+ -+int msnAuth( char *lc, char *ticket, char *user, char *password ) -+{ -+ int nexus; // Passport Login Nexus -+ int logins; // Login Server -+ char result[ 5000 ]; -+ char result2[ 1000 ]; -+ char Server[ 100 ]; // e.g. www.server.com -+ char Site[ 100 ]; // e.g. /site.html -+ char String[ 800 ]; -+ int i; -+ char mail[ 255 ]; -+ char name[ 255 ]; -+ -+ memset( mail, 0, 255 ); -+ memset( name, 0, 255 ); -+ -+ for ( i = 0; i < strlen( user ); i++ ) -+ { -+ if ( user[i] == '@' ) -+ { -+ strncpy( name, user, i ); -+ strcpy( mail, (char*)( (unsigned long)user + i + 1 ) ); -+ break; -+ } -+ } -+ -+ memset( Server, 0, 100 ); -+ memset( Site, 0, 100 ); -+ -+ nexus = msn_login_ssl_connect( 443, "nexus.passport.com" ); -+ msn_login_ssl_write( nexus, "GET /rdr/pprdr.asp HTTP/1.0\r\n\r\n" ); -+ msn_login_ssl_read( nexus, result, 800 ); -+ msn_login_close( nexus ); -+ msn_login_get_server( result, "DALogin", Server, Site ); -+ -+ #ifdef MSNDEBUG -+ printf("Connecting to server '%s' .. site '%s'\n", Server, Site ); -+ #endif -+ -+ for ( ; ; ) -+ { -+ // Connect to Login Server -+ logins = msn_login_ssl_connect( 443, Server ); -+ memset( String, 0, 800 ); -+ sprintf( String, "GET %s HTTP/1.1\r\n" -+ "Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%%3A%%2F%%2Fmessenger%%2Emsn%%2Ecom,sign-in=%s%%40%s,pwd=%s,%s\r\n" -+ "Host: %s\r\n\r\n", -+ Site, name, mail, password, lc, Server ); -+ -+ #ifdef MSNDEBUG -+ printf("Writing: \n%s\n", String ); -+ #endif -+ -+ msn_login_ssl_write( logins, String ); -+ -+ memset( result, 0, 5000 ); -+ memset( result2, 0, 1000 ); -+ -+ msn_login_ssl_read( logins, result, 5000 ); -+ msn_login_ssl_read( logins, result2, 1000 ); -+ -+ strcat( result, result2 ); -+ -+ if ( strstr( result, "200 OK" ) ) -+ { -+ char *tick; -+ char *c3, *c4; -+ // Okay. -+ -+ tick = strstr( result, "t=" ); -+ if ( NULL == tick ) -+ { -+ #ifdef MSNDEBUG -+ printf("No t= found in response.\n"); -+ #endif -+ return 0; -+ } -+ -+ tick += 2; -+ -+ c4 = strstr( tick, "," ); -+ -+ strncpy( ticket, tick, (unsigned long)c4 - (unsigned long)tick - 1 ); -+ -+ //msn_login_close( logins ); -+ return 1; -+ } -+ -+ if ( strstr( result, "302 Found") && strstr( result, "redir" ) && strstr( result, "Location: " ) ) -+ { -+ // Redirection. -+ char *c3, *c4; -+ -+ c3 = strstr( result, "Location: " ); -+ c3 += 10; -+ -+ c3 = strstr( c3, "https://" ); -+ c3 += 8; -+ -+ c4 = strstr( c3, "/" ); -+ strncpy( Server, c3, (unsigned long)c4 - (unsigned long)c3 ); -+ strncpy( Site, c4, (unsigned long)strchr( c4, '\r' ) - (unsigned long)c4 ); -+ -+ // printf("Redirection to server [%s] - Site [%s]\n", Server, Site ); -+ msn_login_close( logins ); -+ continue; -+ } -+ -+ break; -+ } -+ -+ // printf("Error\n"); -+ return 0; -+} -+ -+int msn_connect_v8_error( connectinfo *info, msnconn *conn, char *szErr ) -+{ -+ ext_show_error( NULL, szErr ); -+ delete info; -+ -+ if ( conn->sock != -1 ) -+ { -+ ext_unregister_sock( conn->sock ); -+ close( conn->sock ); -+ conn->sock = -1; -+ } -+ -+ return -1; -+} -+ -+int msn_connect_v8( connectinfo *info, msnconn *conn, int *nNextTrid ) -+{ -+ int ds; // Dispatch Server -+ char result[ 1000 ]; -+ char *c; -+ char szIp[ 20 ]; -+ char szPort[ 20 ]; -+ int nPort; -+ char lc[ 400 ]; -+ char ticket[ 2000 ]; -+ -+ memset( result, 0, 500 ); -+ -+ ext_debug("MSNp8: finding login server"); -+ -+ // ds = msn_login_connect( 1863, "messenger.hotmail.com" ); -+ ds = conn->sock; -+ -+ // >> VER 1 MSNP8 CVR0\r\n -+ msn_login_write( ds, "VER 1 MSNP8 CVR0" ); -+ msn_login_wait( ds, result ); -+ -+ if ( !strstr( result, "VER 1" ) ) -+ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive VER 1)" ); -+ -+ // >> CVR 2 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS something@something.com\r\n -+ // ext_debug( szUser ); -+ -+ msn_login_write1( ds, "CVR 2 0x0409 winnt 5.1 i386 MSNMSGR 5.0.0540 MSMSGS", szUser ); -+ -+ msn_login_wait( ds, result ); -+ -+ if ( !strstr( result, "CVR 2" ) ) -+ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive CVR 2)" ); -+ -+ // >> USR 3 TWN I something@something.com\r\n -+ msn_login_write1( ds, "USR 3 TWN I", szUser ); -+ msn_login_wait( ds, result ); -+ if ( !strstr( result, "XFR 3 NS " ) ) -+ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive XFR 3)" ); -+ -+ // Read MSN Server IP from message. -+ c = strstr( result, "NS "); -+ c += 3; -+ memset( szIp, 0, 20 ); -+ memset( szPort, 0, 20 ); -+ strncpy( szIp, c, (unsigned long)strchr( c, ':' ) - (unsigned long)c ); -+ c = strchr( c, ':' ); c++; -+ strncpy( szPort, c, (unsigned long)strchr( c, ' ' ) - (unsigned long)c ); -+ nPort = atoi( szPort ); -+ -+ // Close current socket. -+ msn_login_close( ds ); -+ ext_unregister_sock( ds ); -+ conn->sock = -1; -+ -+ #ifdef MSNDEBUG -+ printf("* Connecting to IP `%s' port %d *\n", szIp, nPort ); -+ #endif -+ -+ ext_debug("MSNp8: found.. connecting"); -+ -+ // Try to connect to other server. -+ ds = msn_login_connect( nPort, szIp ); -+ if ( ds <= 0 ) -+ return msn_connect_v8_error( info, conn, "Error connecting to specified MSN Server" ); -+ -+ // OK. Register the socket. -+ conn->sock = ds; -+ ext_register_sock( ds, 1, 0 ); -+ -+ // >> VER 4 MSNP8 CVR0\r\n -+ msn_login_write( ds, "VER 4 MSNP8 CVR0" ); -+ msn_login_wait( ds, result ); -+ -+ if ( !strstr( result, "VER 4" ) ) -+ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive VER 4)" ); -+ -+ // >> CVR 5 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS something@something.com\r\n -+ msn_login_write1( ds, "CVR 5 0x0409 winnt 5.1 i386 MSNMSGR 5.0.0540 MSMSGS", szUser ); -+ msn_login_wait( ds, result ); -+ -+ if ( !strstr( result, "CVR 5" ) ) -+ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive CVR 5)" ); -+ -+ // >> USR 6 TWN I something@something.com\r\n -+ msn_login_write1( ds, "USR 6 TWN I", szUser ); -+ msn_login_wait( ds, result ); -+ -+ // << USR 6 TWN S something@something.com lc=....,....=...\r\n -+ if ( !strstr( result, "TWN S" ) ) -+ return msn_connect_v8_error( info, conn, "Protocol error (didn't receive TWS S)" ); -+ -+ memset( lc, 0, 400 ); -+ c = strstr( result, "TWN S " ); -+ c+=6; -+ -+ strncpy( lc, c, (unsigned long)strchr(c, '\r') - (unsigned long)c ); -+ -+ #ifdef MSNDEBUG -+ printf("LC-etc string = `%s'\n", lc ); -+ #endif -+ -+ memset( ticket, 0, 2000 ); -+ -+ ext_debug("MSNp8: doing SSL auth"); -+ -+ if ( ! msnAuth( lc, ticket, szUser, szPassword ) ) -+ { -+ // printf("Error #6\n"); -+ return 0; -+ } -+ -+ ext_debug("MSNp8: OK.. logging in"); -+ -+ #ifdef MSNDEBUG -+ printf("Ticket = `%s'\n", ticket ); -+ #endif -+ -+ memset( result, 0, 500 ); -+ sprintf( result, "USR 7 TWN S t=%s", ticket ); -+ -+ // >> USR 7 TWN S t=<ticket> -+ msn_login_write( ds, result ); -+ memset( result, 0, 500 ); -+ msn_login_wait( ds, result ); -+ -+ if ( !strstr( result, "USR 7 OK") ) -+ { -+ if ( result[ 0 ] >= '0' && result[ 0 ] <= '9' ) -+ { -+ char *err; -+ int nCode = 0; -+ // We received an error code. -+ -+ err = strchr( result, ' ' ); -+ if ( NULL == err ) -+ nCode = atoi( result ); -+ else { -+ *err = '\0'; -+ nCode = atoi( result ); -+ } -+ if ( nCode <= 0 ) -+ return msn_connect_v8_error( info, conn, "Protocol error (Invalid response after USR 7)" ); -+ return nCode; -+ } -+ -+ // Invalid response. -+ return msn_connect_v8_error( info, conn, "Protocol error (Invalid response after USR 7)" ); -+ } -+ -+ // We are now connected to the MSN Server -+ -+ // msn_login_write( ds, "OUT" ); -+ // msn_login_close( ds ); -+ -+ // << USR 7 OK something@something.com Something%20Friendly%Nick 1 0 -+ { -+ char *szFriendly; -+ char *cEnd; -+ int i; -+ -+ szFriendly = result; -+ -+ for ( i = 0; i < 4; i++ ) -+ { -+ szFriendly = strchr( szFriendly, ' ' ); -+ -+ if ( NULL == szFriendly ) -+ { -+ ext_got_friendlyname( conn, "Unknown nickname" ); -+ return 0; -+ } -+ -+ szFriendly++; -+ } -+ -+ cEnd = strchr( szFriendly, ' '); -+ if ( NULL != cEnd ) -+ *cEnd = '\0'; -+ -+ // ext_debug( msn_decode_URL( szFriendly ) ); -+ ext_got_friendlyname( conn, msn_decode_URL( szFriendly ) ); -+ } -+ -+ *nNextTrid = 8; -+ -+ // No error. -+ return 0; -+} -+ - void msn_connect(msnconn * conn, const char * server, int port) - { -+ int result; -+ - conn->ready=0; - - if(conn->type==CONN_SB) -@@ -1645,106 +2096,37 @@ - - ext_register_sock(conn->sock, 1, 0); - -- #ifdef MSNDEBUG -- printf("Connected\n"); // DEBUG -- #endif -- -- sprintf(buf, "VER %d MSNP7\r\n", next_trid); -- write(conn->sock, buf, strlen(buf)); -- msn_add_callback(conn, msn_connect_2, next_trid, (callback_data *)info); -- next_trid++; --} -- --// Further connection functions: -+ // Okay, now try to connect. - --void msn_connect_2(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) --{ -- connectinfo * info; -+ ext_debug("MSNp8: connecting to MSN.. this could take a few seconds"); - -- info=(connectinfo *)data; -- msn_del_callback(conn, trid); -+ result = msn_connect_v8( info, conn, &next_trid ); - -- if(strcmp(args[0], "VER") || strcmp(args[2], "MSNP7")) // if either *differs*... -+ if ( 0 != result ) - { -- ext_show_error(NULL, "Protocol negotiation failed"); -- delete info; -- ext_unregister_sock(conn->sock); -- close(conn->sock); -- conn->sock=-1; -- return; -- } -- -- sprintf(buf, "USR %d MD5 I %s\r\n", next_trid, info->username); -- write(conn->sock, buf, strlen(buf)); -- -- msn_add_callback(conn, msn_connect_3, next_trid, data); -- next_trid++; --} -- --void msn_connect_3(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) --{ -- connectinfo * info; -- -- md5_state_t state; -- md5_byte_t digest[16]; -- int a; -- -- info=(connectinfo *)data; -- msn_del_callback(conn, trid); -+ // Error code. - -- if(isdigit(args[0][0])) -+ if ( result > 0 ) - { -- msn_show_verbose_error(conn, atoi(args[0])); -- msn_clean_up(conn); -+ msn_show_verbose_error( conn, result ); - delete info; -- return; -- } -+ msn_clean_up( conn ); -+ conn->sock = -1; - -- // OK, the challenge just arrived as args[4] -+ } // else: connection failed completely. msn_connect_v8 already took care of destroying the connection - -- md5_init(&state); -- md5_append(&state, (md5_byte_t *)(args[4]), strlen(args[4])); -- md5_append(&state, (md5_byte_t *)(info->password), strlen(info->password)); -- md5_finish(&state, digest); -- -- sprintf(buf, "USR %d MD5 S ", next_trid); -- write(conn->sock, buf, strlen(buf)); -- -- for(a=0; a<16; a++) -- { -- sprintf(buf, "%02x", digest[a]); -- write(conn->sock, buf, 2); - } -- -- write(conn->sock, "\r\n", 2); -- -- msn_add_callback(conn, msn_connect_4, next_trid, data); -- next_trid++; --} -- --void msn_connect_4(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) --{ -- connectinfo * info; -- -- info=(connectinfo *)data; -- msn_del_callback(conn, trid); -- -- if(isdigit(args[0][0])) -+ else - { -- msn_show_verbose_error(conn, atoi(args[0])); -- delete info; -- msn_clean_up(conn); -- return; -- } -- -- ext_got_friendlyname(conn, msn_decode_URL(args[4])); - -+ // We received no error code. Everything went ok! - delete info; - -- next_trid++; -+ ext_debug("MSNp8: OK"); - -- conn->ready=1; -- ext_new_connection(conn); -+ conn->ready = 1; -+ ext_new_connection( conn ); -+ } - } - - void msn_SB_ans(msnconn * conn, int trid, char ** args, int numargs, callback_data * data) -@@ -1774,30 +2156,7 @@ - - void msn_set_state(msnconn * conn, const char * state) - { -- sprintf(buf, "CHG %d %s\r\n", next_trid, state); -+ sprintf(buf, "CHG %d %s %d\r\n", next_trid, state, MSN_VERSION_ID ); - write(conn->sock, buf, strlen(buf)); - next_trid++; - } -- --/* --void msn_connect_3(msnconn * conn, char ** args, int numargs, callback_data * data) --{ -- connectinfo * info; -- -- info=(connectinfo *)data; -- msn_del_callback(conn, trid); -- trid++; -- -- if(isdigit(args[0][0])) -- { -- msn_print_verbose_error(conn, atoi(args[0])); -- delete info; -- return; -- } -- -- sprintf(buf, "INF %d\r\n", trid, info->username); -- write(conn.sock, buf, strlen(buf)); -- -- msn_add_callback(conn, msn_connect_4, trid, data); --} --*/ diff --git a/net-im/centericq/files/patch-msn_core.h b/net-im/centericq/files/patch-msn_core.h deleted file mode 100644 index 587455c..0000000 --- a/net-im/centericq/files/patch-msn_core.h +++ /dev/null @@ -1,123 +0,0 @@ ---- blip-0.1/msn_core.h.orig Sat Dec 14 07:58:06 2002 -+++ blip-0.1/msn_core.h Thu Oct 23 20:02:19 2003 -@@ -24,6 +24,49 @@ - ~char_data() { if(c!=NULL) { delete c; } } - }; - -+class callback_data -+{}; -+ -+class callback : public llist_data -+{ -+ public: -+ int trid; -+ void (*func)(struct msnconn * conn, int trid, char ** args, int numargs, callback_data * data); -+ callback_data * data; // just gets passed -+}; -+ -+// Intermediate steps in synchronisation -+class syncinfo : public callback_data -+{ -+ public: -+ -+ llist * fl; -+ llist * rl; -+ llist * al; -+ llist * bl; -+ -+ unsigned int complete; -+ -+ int serial; -+ int nContacts; -+ int nGroups; -+ int nFound; -+ -+ char *last_user_handled; -+ -+ char blp; -+ char gtc; -+ -+ syncinfo() { nFound = 0; nContacts = 0; blp='A'; gtc='A'; fl=rl=al=bl=NULL; complete=0; serial=0; } -+ ~syncinfo() -+ { -+ if(fl!=NULL) { delete fl; } -+ if(rl!=NULL) { delete rl; } -+ if(al!=NULL) { delete al; } -+ if(bl!=NULL) { delete bl; } -+ } -+}; -+ - class message : public llist_data // This class encapsulates all that you need to know (tm) about a MSG - { - public: -@@ -81,14 +124,17 @@ - public: - int sock; // Socket (durr...) - int type; // one of the #defines below -+ int sync; // syncing - int ready; -+ -+ syncinfo *sync_info; - llist * users; // Users in this session - only for SB connections - llist * invitations_out; // invitations extended but not responded to - llist * invitations_in; // invitations received but not responded to - llist * callbacks; - authdata * auth; - -- msnconn() { users=NULL; callbacks=NULL; invitations_out=NULL; invitations_in=NULL; } -+ msnconn() { sync = 0; users=NULL; callbacks=NULL; invitations_out=NULL; invitations_in=NULL; } - ~msnconn() - { - if(users!=NULL) { delete users; } -@@ -177,17 +223,6 @@ - #define MSNFTP_SEND 1 - #define MSNFTP_RECV 2 - --class callback_data --{}; -- --class callback : public llist_data --{ -- public: -- int trid; -- void (*func)(struct msnconn * conn, int trid, char ** args, int numargs, callback_data * data); -- callback_data * data; // just gets passed --}; -- - - extern llist * connections; - extern int next_trid; -@@ -224,33 +259,6 @@ - - #define COMPLETE_BLP 16 - #define COMPLETE_GTC 32 -- --// Intermediate steps in synchronisation --class syncinfo : public callback_data --{ -- public: -- -- llist * fl; -- llist * rl; -- llist * al; -- llist * bl; -- -- unsigned int complete; -- -- int serial; -- -- char blp; -- char gtc; -- -- syncinfo() { blp='A'; gtc='A'; fl=rl=al=bl=NULL; complete=0; serial=0; } -- ~syncinfo() -- { -- if(fl!=NULL) { delete fl; } -- if(rl!=NULL) { delete rl; } -- if(al!=NULL) { delete al; } -- if(bl!=NULL) { delete bl; } -- } --}; - - void msn_set_friendlyname(msnconn * conn, const char * friendlyname); - diff --git a/net-im/centericq/files/patch-msn_interface.h b/net-im/centericq/files/patch-msn_interface.h deleted file mode 100644 index b83df25..0000000 --- a/net-im/centericq/files/patch-msn_interface.h +++ /dev/null @@ -1,20 +0,0 @@ ---- blip-0.1/msn_interface.h.orig Mon Dec 9 20:31:41 2002 -+++ blip-0.1/msn_interface.h Thu Oct 23 20:02:19 2003 -@@ -25,6 +25,8 @@ - - void ext_got_info(msnconn * conn, syncinfo * data); - -+void ext_debug( char *msg ); -+ - void ext_latest_serial(msnconn * conn, int serial); - - void ext_got_GTC(msnconn * conn, char c); -@@ -78,6 +80,8 @@ - Return: Nothing - */ - int ext_connect_socket(const char * server, int port); -+ -+int ext_connect_socket_ssl(const char * server, int port); - - int ext_server_socket(int port); - diff --git a/net-im/centericq/files/patch-msnhook.cc b/net-im/centericq/files/patch-msnhook.cc deleted file mode 100644 index 4f01d45..0000000 --- a/net-im/centericq/files/patch-msnhook.cc +++ /dev/null @@ -1,98 +0,0 @@ ---- src/hooks/msnhook.cc.orig Tue Sep 30 19:38:43 2003 -+++ src/hooks/msnhook.cc Thu Oct 23 20:12:58 2003 -@@ -120,11 +120,14 @@ - - face.log(_("+ [msn] connecting to the server")); - -+ flogged = false; -+ fonline = true; -+ - msn_init(&conn, nicknormalize(account.nickname).c_str(), account.password.c_str()); - msn_connect(&conn, account.server.c_str(), account.port); - - fonline = true; -- flogged = false; -+ flogged = true; - } - - void msnhook::disconnect() { -@@ -248,7 +251,7 @@ - } - - icqcontact *c = clist.get(ev.getcontact()); -- text = siconv(text, conf.getrussian(msn) ? "koi8-u" : conf.getdefcharset(), "utf8"); -+ text = siconv(text, conf.getrussian(msn) ? "koi8-u" : conf.getdefcharset(), "utf-8"); - - if(c) - if(c->getstatus() != offline || !c->inlist()) { -@@ -378,11 +381,11 @@ - - void msnhook::checkfriendly(icqcontact *c, const string friendlynick, bool forcefetch) { - string oldnick = c->getnick(); -- string newnick = unmime(friendlynick); -+ string newnick = siconv(unmime(friendlynick), "utf-8", conf.getrussian(msn) ? "koi8-u" : conf.getdefcharset()); - - c->setnick(newnick); - -- if(forcefetch || (oldnick != newnick && c->getdispnick() == oldnick) || oldnick.empty()) { -+ if(forcefetch || (oldnick != newnick && c->getdispnick() != oldnick) || oldnick.empty()) { - c->setdispnick(newnick); - face.relaxedupdate(); - } -@@ -450,6 +453,12 @@ - #endif - } - -+int ext_debug( char *str ) -+{ -+ log( str ); -+ return 0; -+} -+ - void ext_register_sock(int s, int reading, int writing) { - log("ext_register_sock"); - if(reading) mhook.rfds.push_back(s); -@@ -602,7 +611,7 @@ - - mhook.checkinlist(ic); - -- string text = siconv(msg->body, "utf8", conf.getrussian(msn) ? "koi8-u" : conf.getdefcharset()); -+ string text = siconv(msg->body, "utf-8", conf.getrussian(msn) ? "koi8-u" : conf.getdefcharset()); - em.store(immessage(ic, imevent::incoming, text)); - } - -@@ -710,8 +719,7 @@ - log("ext_changed_state"); - } - --int ext_connect_socket(const char *hostname, int port) { -- log("ext_connect_socket"); -+int ext_do_connect_socket(const char *hostname, int port, int ssl) { - struct sockaddr_in sa; - struct hostent *hp; - int a, s; -@@ -732,13 +740,23 @@ - if((s = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0) - return -1; - -- if(cw_connect(s, (struct sockaddr *) &sa, sizeof(sa), 0) < 0) { -+ if(cw_connect(s, (struct sockaddr *) &sa, sizeof(sa), ssl) < 0) { - face.log(msgerr + _("verify the hostname and port")); - close(s); - return -1; - } - - return s; -+} -+ -+int ext_connect_socket_ssl(const char *hostname, int port) { -+ log("ext_connect_socket_ssl"); -+ return ext_do_connect_socket(hostname, port, 1); -+} -+ -+int ext_connect_socket(const char *hostname, int port) { -+ log("ext_connect_socket"); -+ return ext_do_connect_socket(hostname, port, 0); - } - - int ext_server_socket(int port) { diff --git a/net-im/centericq/files/patch-src:Makefile.in b/net-im/centericq/files/patch-src:Makefile.in deleted file mode 100644 index 413071b..0000000 --- a/net-im/centericq/files/patch-src:Makefile.in +++ /dev/null @@ -1,7 +0,0 @@ ---- src/Makefile.in.orig Thu May 8 14:58:44 2003 -+++ src/Makefile.in Thu May 8 14:58:57 2003 -@@ -98,3 +98,3 @@ - centericq_LDFLAGS = -L$(top_srcdir)/blip-0.1 -L$(top_srcdir)/firetalk-0.1 -L$(top_srcdir)/kkconsui-0.1 -L$(top_srcdir)/kkstrtext-0.1 -L$(top_srcdir)/libicq2000-0.1 -L$(top_srcdir)/libjabber-0.1 -L$(top_srcdir)/libyahoo2-0.1 -L$(top_srcdir)/kksystr-0.1 -L$(top_srcdir)/connwrap-0.1 --centericq_LDADD = $(top_srcdir)/src/hooks/libhooks.a -lblip -lfiretalk -lkkconsui -lkkstrtext -llibicq2000 -llibjabber -llibyahoo2 -lkksystr -lconnwrap @INTLLIBS@ -+centericq_LDADD = $(top_srcdir)/src/hooks/libhooks.a -lblip -lfiretalk -lkkconsui -lkkstrtext -llibicq2000 -llibjabber -llibyahoo2 -lkksystr -lconnwrap @INTLLIBS@ -lintl - SUBDIRS = hooks diff --git a/net-im/centericq/files/patch-yahoohook.cc b/net-im/centericq/files/patch-yahoohook.cc deleted file mode 100644 index 11f5885..0000000 --- a/net-im/centericq/files/patch-yahoohook.cc +++ /dev/null @@ -1,11 +0,0 @@ ---- src/hooks/yahoohook.cc.orig Fri Oct 3 03:55:06 2003 -+++ src/hooks/yahoohook.cc Wed Oct 8 17:29:21 2003 -@@ -556,7 +556,7 @@ - - string yahoohook::decode(const string &text, bool utf) { - if(utf) -- return siconv(text, "utf8", -+ return siconv(text, "utf-8", - conf.getrussian(proto) ? "koi8-u" : conf.getdefcharset()); - - return rushtmlconv("wk", text); |