diff options
| author | Paul Buetow <paul@buetow.org> | 2013-04-06 13:14:44 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2013-04-06 13:14:44 +0200 |
| commit | c507ce3198ea4d822832cc8740f0128df8873c02 (patch) | |
| tree | 260ca004916ae03b7d5438bf89007e3984da6934 | |
| parent | c8b2ef7b899766d04562f7e04a84251cea8fa701 (diff) | |
tagging ychat-0.3ychat-0.3
| -rw-r--r--[-rwxr-xr-x] | COPYING | 0 | ||||
| -rw-r--r-- | CVS/Entries | 66 | ||||
| -rw-r--r-- | CVS/Entries.Log | 2 | ||||
| -rw-r--r-- | CVS/Root | 2 | ||||
| -rw-r--r--[-rwxr-xr-x] | Makefile | 108 | ||||
| -rwxr-xr-x | Makefile.in | 2 | ||||
| -rwxr-xr-x | README | 664 | ||||
| -rwxr-xr-x | base.cpp | 22 | ||||
| -rwxr-xr-x | base.h | 21 | ||||
| -rwxr-xr-x | chat.cpp | 9 | ||||
| -rwxr-xr-x | chat.h | 7 | ||||
| -rw-r--r-- | cmnd/CVS/Entries | 4 | ||||
| -rw-r--r-- | cmnd/CVS/Root | 2 | ||||
| -rwxr-xr-x | conf.cpp | 4 | ||||
| -rwxr-xr-x | conf.txt | 29 | ||||
| -rwxr-xr-x | configure | 1618 | ||||
| -rw-r--r-- | gfx/CVS/Entries | 2 | ||||
| -rw-r--r-- | gfx/CVS/Root | 2 | ||||
| -rwxr-xr-x | gfx/y_ani_black.gif | bin | 0 -> 61100 bytes | |||
| -rwxr-xr-x | gfx/y_ani_white.gif | bin | 0 -> 53536 bytes | |||
| -rwxr-xr-x | glob.h | 14 | ||||
| -rw-r--r-- | hmap.cpp | 9 | ||||
| -rw-r--r-- | hmap.h | 6 | ||||
| -rwxr-xr-x | html.cpp | 1 | ||||
| -rw-r--r-- | html/CVS/Entries | 1 | ||||
| -rw-r--r-- | html/CVS/Root | 2 | ||||
| -rwxr-xr-x | html/frameset.html | 12 | ||||
| -rwxr-xr-x | html/index.html | 46 | ||||
| -rwxr-xr-x | html/input.html | 52 | ||||
| -rwxr-xr-x | html/notfound.html | 4 | ||||
| -rwxr-xr-x | html/online.html | 21 | ||||
| -rwxr-xr-x | html/stream.html | 42 | ||||
| -rw-r--r--[-rwxr-xr-x] | html/style.css | 45 | ||||
| -rwxr-xr-x | main.cpp | 14 | ||||
| -rwxr-xr-x | msgs.h | 11 | ||||
| -rwxr-xr-x | pool.cpp | 2 | ||||
| -rwxr-xr-x | reqp.cpp | 59 | ||||
| -rwxr-xr-x | reqp.h | 5 | ||||
| -rw-r--r-- | s_conf.h | 2 | ||||
| -rw-r--r-- | s_tool.cpp | 28 | ||||
| -rw-r--r-- | s_tool.h | 1 | ||||
| -rwxr-xr-x | sock.cpp | 38 | ||||
| -rwxr-xr-x | sock.h | 4 | ||||
| -rwxr-xr-x | user.cpp | 23 | ||||
| -rwxr-xr-x | user.h | 7 |
45 files changed, 1846 insertions, 1167 deletions
diff --git a/CVS/Entries b/CVS/Entries index 9382269..749e7b2 100644 --- a/CVS/Entries +++ b/CVS/Entries @@ -1,70 +1,56 @@ /COPYING/1.1/Fri Mar 28 00:27:16 2003// -/Makefile.in/1.7/Sat Apr 19 16:16:14 2003// -/README/1.4/Sun Sep 14 14:48:45 2003// -/base.cpp/1.8/Wed Apr 2 10:50:18 2003// -/base.h/1.5/Wed Apr 2 10:50:18 2003// -/chat.cpp/1.12/Sat Apr 19 19:39:17 2003// -/chat.h/1.8/Sat Apr 19 16:16:14 2003// +/Makefile.in/1.2/Fri Mar 28 01:38:07 2003// +/README/1.1/Sun Mar 30 00:26:42 2003// +/base.cpp/1.7/Sun Mar 30 01:35:21 2003// +/base.h/1.4/Sun Mar 30 00:14:09 2003// +/chat.cpp/1.8/Tue Mar 25 23:03:14 2003// +/chat.h/1.4/Fri Mar 28 02:51:03 2003// /cmnd.cpp/1.3/Tue Mar 25 14:54:07 2003// /cmnd.h/1.1.1.1/Fri Mar 21 15:54:56 2003// -/conf.cpp/1.5/Fri Apr 4 21:35:59 2003// +/conf.cpp/1.3/Tue Mar 25 14:54:07 2003// /conf.h/1.2/Tue Mar 25 14:54:07 2003// -/conf.txt/1.19/Sun Sep 14 14:31:49 2003// +/conf.txt/1.13/Sun Mar 30 01:35:21 2003// /configure/1.4/Fri Mar 28 02:02:00 2003// /configure.in/1.5/Fri Mar 28 02:02:00 2003// /cont.cpp/1.3/Tue Mar 25 14:54:07 2003// /cont.h/1.2/Sun Mar 30 00:26:42 2003// -/glob.h/1.6/Sun Sep 14 14:31:49 2003// -/hmap.cpp/1.8/Mon Apr 7 13:24:09 2003// -/hmap.h/1.8/Wed Apr 2 10:50:18 2003// -/html.cpp/1.7/Wed Apr 2 10:50:18 2003// +/dltest.cpp/1.1/Thu Mar 27 16:14:44 2003// +/glob.h/1.3/Tue Mar 25 14:54:07 2003// +/hmap.cpp/1.6/Sun Mar 30 01:35:21 2003// +/hmap.h/1.6/Sun Mar 30 01:35:21 2003// +/html.cpp/1.6/Sat Mar 29 23:18:11 2003// /html.h/1.3/Tue Mar 25 14:54:07 2003// /incl.h/1.1.1.1/Fri Mar 21 15:54:56 2003// -/lang.cpp/1.1/Fri Apr 4 22:14:35 2003// -/lang.h/1.1/Fri Apr 4 22:14:35 2003// -/logd.cpp/1.2/Thu Apr 10 15:36:10 2003// -/logd.h/1.1/Fri Apr 4 15:19:11 2003// -/main.cpp/1.11/Sat Apr 19 16:16:14 2003// -/modl.cpp/1.2/Wed Apr 2 21:57:34 2003// -/modl.h/1.1/Wed Apr 2 13:23:09 2003// -/msgs.h/1.12/Sun Sep 14 14:48:45 2003// +/main.cpp/1.8/Sat Mar 29 23:21:52 2003// +/msgs.h/1.8/Tue Mar 25 22:41:35 2003// /mutx.cpp/1.3/Tue Mar 25 14:54:07 2003// /mutx.h/1.2/Tue Mar 25 14:54:08 2003// /name.cpp/1.3/Tue Mar 25 22:19:51 2003// /name.h/1.3/Tue Mar 25 22:21:26 2003// -/pool.cpp/1.8/Sun Sep 7 12:49:46 2003// +/pool.cpp/1.6/Tue Mar 25 14:54:08 2003// /pool.h/1.1/Sun Mar 23 04:55:58 2003// -/reqp.cpp/1.18/Sun Sep 14 14:31:49 2003// -/reqp.h/1.10/Fri Apr 4 15:19:11 2003// +/reqp.cpp/1.11/Sun Mar 30 00:06:57 2003// +/reqp.h/1.7/Sun Mar 30 00:06:57 2003// /room.cpp/1.2/Sun Mar 23 05:41:19 2003// /room.h/1.2/Fri Mar 28 02:51:03 2003// /s_chat.cpp/1.1/Tue Mar 25 14:54:08 2003// /s_chat.h/1.1/Tue Mar 25 14:54:08 2003// /s_conf.cpp/1.1/Tue Mar 25 14:54:08 2003// -/s_conf.h/1.2/Fri Apr 4 21:35:59 2003// +/s_conf.h/1.1/Tue Mar 25 14:54:08 2003// /s_html.cpp/1.1/Tue Mar 25 14:54:08 2003// /s_html.h/1.1/Tue Mar 25 14:54:08 2003// -/s_lang.cpp/1.1/Fri Apr 4 22:14:35 2003// -/s_lang.h/1.1/Fri Apr 4 22:14:35 2003// -/s_modl.cpp/1.1/Wed Apr 2 23:01:20 2003// -/s_modl.h/1.1/Wed Apr 2 23:01:20 2003// /s_mutx.cpp/1.1/Tue Mar 25 14:54:08 2003// /s_mutx.h/1.1/Tue Mar 25 14:54:08 2003// -/s_sman.cpp/1.1/Sat Apr 19 16:16:15 2003// -/s_sman.h/1.1/Sat Apr 19 16:17:09 2003// /s_sock.cpp/1.1/Tue Mar 25 14:54:08 2003// /s_sock.h/1.1/Tue Mar 25 14:54:08 2003// -/s_tool.cpp/1.4/Fri Apr 4 10:41:12 2003// -/s_tool.h/1.4/Fri Apr 4 10:41:12 2003// -/sess.cpp/1.2/Sat Apr 19 19:39:17 2003// -/sess.h/1.2/Sat Apr 19 19:39:17 2003// -/sman.cpp/1.1/Sat Apr 19 16:16:15 2003// -/sman.h/1.2/Sat Apr 19 19:39:17 2003// -/sock.cpp/1.17/Sun Sep 14 14:31:49 2003// -/sock.h/1.6/Fri Apr 4 15:19:11 2003// +/s_tool.cpp/1.3/Sun Mar 30 00:06:57 2003// +/s_tool.h/1.3/Sun Mar 30 00:06:57 2003// +/sock.cpp/1.9/Wed Mar 26 15:44:09 2003// +/sock.h/1.5/Wed Mar 26 15:44:09 2003// /thrd.cpp/1.5/Wed Mar 26 14:57:04 2003// /thrd.h/1.1.1.1/Fri Mar 21 15:54:56 2003// /todo.txt/1.4/Sun Mar 30 01:48:46 2003// -/user.cpp/1.7/Fri Apr 4 22:14:35 2003// -/user.h/1.8/Sat Apr 19 19:39:17 2003// +/user.cpp/1.5/Tue Mar 25 14:54:08 2003// +/user.h/1.4/Tue Mar 25 20:06:34 2003// +/yc_test.cpp/1.1/Thu Mar 27 16:14:44 2003// D diff --git a/CVS/Entries.Log b/CVS/Entries.Log index c7be84c..3384330 100644 --- a/CVS/Entries.Log +++ b/CVS/Entries.Log @@ -1,5 +1,3 @@ A D/cmnd//// A D/gfx//// A D/html//// -A D/lang//// -A D/log//// @@ -1 +1 @@ -:pserver:anonymous@cvs.ychat.berlios.de:/cvsroot/ychat +:pserver:volker@cvs.exa-ds.com:/home/cvsroot @@ -1,95 +1,13 @@ -MAKE=`tail -n 1 make.version` -PREFIX=`grep "define PREFIX" src/glob.h | cut -d'"' -f2` -all: version base modules - @echo "Now edit the ychat.conf and run ychat!" - @echo "The config file is searched in the following order:" - @echo " ./ychat.conf " - @echo " ~/.ychat/ychat.conf " - @echo " ./etc/ychat.conf " - @echo " /etc/ychat.conf " - @echo " $(PREFIX)/etc/ychat.conf " - @echo If you want to help the yChat project please run gmake mail - @echo so that the developers receive an email about the platform - @echo being used. - @echo WARNING! This software is EXPERIMENTAL! -mail: - @echo "VERSION:" > mail.tmp - @${MAKE} version >> mail.tmp - @echo >> mail.tmp - @echo "UNAME:" >> mail.tmp - @uname -a >> mail.tmp - @echo >> mail.tmp - @echo "DATE:" >> mail.tmp - @date >> mail.tmp - @echo >> mail.tmp - @echo "COMPILER AND MAKE:" >> mail.tmp - @cat g++.version make.version >> mail.tmp - @cat mail.tmp | mail -s "Successfull build of yChat" successfullbuild@yhttpd.org - @rm -f mail.tmp -install: deinstall -uninstall: deinstall -deinstall: - @echo Install/deinstall is not supported! - @echo Start yChat with ./bin/ychat instead! - @exit 1 -modules: - @if test -d ./src/mods; then ${MAKE} -C ./src/mods; fi -clean_modules: - @if test -d ./src/mods; then ${MAKE} -C ./src/mods clean; fi -base: - @if test -f bin/ychat; then echo "Backing up old binary";if test -f bin/ychat.old; then rm -f bin/ychat.old; fi; mv bin/ychat bin/ychat.old; fi - @perl ./scripts/buildnr.pl - @perl ./scripts/setglobvals.pl - @${MAKE} -C ./src -clean_base: - @${MAKE} -C ./src clean -stats: - @perl scripts/stats.pl -run: - ./bin/ychat -base_start: base - ./bin/ychat -gpl: - @more COPYING -#//<<* -yhttpdbase: - @perl scripts/makeyhttpd.pl || echo "You need to have perl to do this!" - @echo yhttpd code base has been generated in ../yhttpd -#//*>> -clean: clean_base clean_modules -help: - @echo "You may run ${MAKE} with the following parameters:" - @grep "^ ${MAKE} " README - @echo "For more questions read the README file or contact mail@ychat.org!" -setup: - @./configure - @${MAKE} -config: - @sh -c "scripts/config.sh" - @echo If you run ${MAKE} config from the command line then you may need - @echo to rerun ./configure and recompile all now! - -mrproper: clean - @if test -f src/glob.h.org; then mv -f src/glob.h.org src/glob.h;fi - @if test -f g++.version; then rm -f g++.version; fi - @if test -f make.version; then rm -f make.version; fi - @if test -f src/Makefile; then rm -f src/Makefile; fi - @if test -f bin/ychat; then find bin/ -name "*ychat*" | xargs rm -f; fi - @if test -d src/mods; then find src/mods/*/ -name Makefile | xargs rm -f; fi - @find . -name "*.add" | xargs rm -f - @ls | grep core | xargs rm -f -version: - @./scripts/version.sh -debug: - @gdb bin/ychat ychat.core -confdebug: - ./configure -g3 -ggdb -dist: - @./scripts/makedist.sh -ssltest: - openssl genrsa -des3 -out privkey.pem 2048 - openssl req -new -x509 -key privkey.pem -out cert.pem -days 1095 - @mv -f privkey.pem cert.pem etc - - - +# Generated automatically from Makefile.in by configure. +SRCS=base.cpp chat.cpp s_chat.cpp cmnd.cpp conf.cpp s_conf.cpp cont.cpp html.cpp s_html.cpp main.cpp mutx.cpp s_mutx.cpp name.cpp pool.cpp reqp.cpp room.cpp sock.cpp s_sock.cpp thrd.cpp s_tool.cpp user.cpp +OBJS=$(SRCS:.cpp=.o) +CC=g++ +LDFLAGS=-ldl -lstdc++ -g +LDADD=-pthread -D_THREAD_SAFE +all: ychat +$(SRCS): + $(CC) $(CFLAGS) -c $*.cpp +ychat: $(OBJS) + $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDADD) +clean: + rm *.o diff --git a/Makefile.in b/Makefile.in index 300d035..7c2a0c1 100755 --- a/Makefile.in +++ b/Makefile.in @@ -1,4 +1,4 @@ -SRCS=chat.cpp s_chat.cpp cmnd.cpp conf.cpp s_conf.cpp cont.cpp html.cpp s_html.cpp lang.cpp s_lang.cpp logd.cpp main.cpp modl.cpp s_modl.cpp mutx.cpp s_mutx.cpp name.cpp pool.cpp reqp.cpp room.cpp sock.cpp s_sock.cpp thrd.cpp s_tool.cpp user.cpp sess.cpp sman.cpp s_sman.cpp +SRCS=base.cpp chat.cpp s_chat.cpp cmnd.cpp conf.cpp s_conf.cpp cont.cpp html.cpp s_html.cpp main.cpp mutx.cpp s_mutx.cpp name.cpp pool.cpp reqp.cpp room.cpp sock.cpp s_sock.cpp thrd.cpp s_tool.cpp user.cpp OBJS=$(SRCS:.cpp=.o) CC=g++ LDFLAGS=@LDFLAGS@ -lstdc++ -g @@ -1,8 +1,7 @@ -yChat; Homepage: www.yChat.org; Version 0.8-RELEASE - +yChat++; Homepage: www.yChat.org; Version CVS Copyright (C) 2003 Paul C. Buetow, Volker Richter -Copyright (C) 2004, 2005 Paul C. Buetow ----------------------------------------------------------------- + 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 @@ -16,596 +15,161 @@ 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. ------------------------------------------------------------------ -YCHAT TABLE OF CONTENTS: - -1.0.0 GENERAL -1.1.0 ABOUT RELEASES -1.2.0 YCHAT FEATURES //<< -2.0.0 INSTALLATION AND SETUP -2.1.0 REQUIREMENTS -2.2.0 TESTED PLATFORMS -2.3.0 HOW TO OBTAIN YCHAT -2.4.0 INSTALLATION QUICK-START -2.4.1 INSTALLATION -2.3.3 HOW TO USE OPENSSL WITH YCHAT -2.3.4 HOW TO USE MYSQL WITH YCHAT //<< -2.3.5 HOW TO USE SCREEN WITH YCHAT -2.3.6 HOW TO USE SIGNALS WITH YCHAT -2.4.0 CONFIGURING YCHAT -2.5.0 YHTTPD CODE BASE GENERATION //<< -3.0.0 EXTENDING YCHAT -3.1.0 SOURCE FILES -4.0.0 DIVERSE -4.1.0 WRITING BUG REPORTS -4.2.0 CONTACT ADDRESSES -4.3.0 CREDITS - -1.0.0 GENERAL - -1.1.0 ABOUT RELEASES - -There are several projects involved: - -- The chat - -Its a HTTP based chat server written in C++. Clients are normal web browsers -such as MSIE or Gecko based browsers using only CSS, HTML and JavaScript. - -- The httpd - -Its a small http server based on the chat's socket and threading engine. -yhttpd does not have as much features but is easy to use and faster than -apache. yhttpd is a subset of the chat. It can be generated using the -srcipts/yhttpdbase.pl script in the chat's source tree. - -- The ycurses - -ycurses is a easy to use and small C++ wrapper of the C ncurses API. - -There are different branches: - -- CURRENT - -The CURRENT branch is unstable, this is the bleeding developing edge with -all the new experimental features. - -A RELEASE of CURRENT can be referred as CURRENTRELEASE. - -- STABLE - -The STABLE branch is more stable than CURRENT. This branch may get new -features as well. But those will be more conservative compared to -CURRENT. - -A RELEASE of STABLE can be referred as STABLERELEASE. - -- LEGACY - -The LEGACY branch has no real support. This branch may get bugfixes and -updates and might get minor improvements. But there is no garuantee to -be bug free and stable at all. LEGACY versions are of historic meaning. - -- DEVEL - -DEVEL is only a meta name. If a version is labeled with DEVEL, then its -currently undefined if this is a CURRENT, STABLE or LEGACY branch. It -can be everything. Commonly DEVEL versions are CURRENT. - -There are also releases made: - -- RELEASE - -There can be RELEASEs made out of each branch. While a branch can get -new features, a RELEASE can not. A RELEASE of a branch is just like -a snapshot. RELEASEs are complete versions to test and use. But keep -in mind, that a RELEASE of the STABLE branch is recommended over a -RELEASE of a CURRENT or a LEGACY branch in a production environment. -RELEASEs of CURRENT are still the bleeding edge and RELEASEs of LEGACY -may be out of date. - -- Short names - - -In addition, each description also has short names: (short names are needed -if your text space is limited which happens very fast in IRC channel topics) - -CURRENT aka CUR aka C -RELEASE aka REL aka R -LEGACY aka LEG aka L -STABLE aka SBL aka S -DEVEL aka DEV aka D -PRE aka P - -STABLERELEASE aka STBREL aka SR -PRERELEASE aka PREREL aka PR -PRELEGACYRELEASE aka PRELEGREL aka PLR -etc... - -The short name of the chat is "yC" -The short name of the httpd is "yh" -The short name of ycurses is "yu" - -//<<* -1.2.0 YCHAT FEATURES - -- Its free & portable - -yChat is developed under the GNU general public license and is based on GNU -tools (gcc, gmake), other open source library stuff (such as libncurses etc.) -and should run on any POSIX capable operating system (such as all Linux based -systems, FreeBSD, NetBSD, OpenBSD and other BSD-Systems and on UNICES like -IRIX, HP-UX, Solaris etc.). - -- There is no need for special chat clients - -yChat is web based, that means clients may only connect to the chat server -with an normal web browser such as Microsoft Internet Explorer or any Gecko- -Engine powerd browsers like Mozilla, Firefox, Camino etc. - -- It has features of a real HTTP webserver - -yChat runs completely stand alone and does not need another webserver to build -on like Apache and does not need to be run via any kind of CGI. yChat creates -its own socket on a customized port (standard port: 2000) and seems to be a full -featured HTTP web server to the clients (web browsers). - -The yChat code base can be converted to an yhttpd code base automaticaly. yhttpd -is the webserver subset of yChat which runs completely stand alone and provides -normal websites to the net. It also supports Common Gateway Interface (CGI) -scripting. - -- Its fast and secure - -yChat is written in C++ which is faster than any Java based Chat-Server or any -server written in a scripting language like PHP, Python or Perl. As the -internal data structures hash maps are used to garuantee searching certain -values in O(1) amount of time. If a hash maps gets full, it will be rehashed. -Currently, yChat has been measured providing over 1000 hits/requests per second -on a FreeBSD based server box while using less than 2% of CPU usage -on a Athlon XP 1900+. Performance seems to be limited by your bandwith only. -Also, each user gets its own session id (random string) with a standard length -of 50 chars to authenticate each logged in user. The length of the session id -can be redefined as well. Also, the session id will get md5-hashed optionally -so thats even harder to reverse engineering the session ids of other users. -Also, yChat supports secure hypertext transfer protocol (HTTPS) connections -using the OpenSSL library. Then, all chat messages will be encrypted in a -secure manner. HTTPS is optional to HTTP (unsecured connections). - -- Its HTML template based and easy to customize via XML based configuration - -All HTML sites are predefined as HTML-Template files and can be easily modified -to use with an customized web design. Also, a lot of yChat preferences can be -set in the main configuration file (ychat.conf). ychat.conf is completely written -in XML 1.0 which makes it easier to use the configuration options in programs of -3rd persons which may want to write some usefull tools for yChat. -yChat caches all HTML and web images to improve overall performance. If needed, the -cache can be cleared to recache new versions of the template files. - -- Its language template based - -The administrator can easily create a new language in which all system messages -appear to the Chat-User. The predefined languages is english but others can be -added easily. The language can be edited in the XML based configuration file. - -- MySQL based database - -Registered users are stored in a MySQL database. C++ Programmers may feel free -to replace the database wrapper class (data.h) with another database routines -to use other databases such as PostgreSQL, SQLite or a text based database etc. -If wished, you can disable database support in the pre-compile options. - -- It has an administration interface - -yChat includes an ncurses based administration interface which tracks some -interesting statistics and system messages and enables you to do certain -administrative tasks. In addition, you can switch to the CLI (command line -interface) mode of the administration interface in order to be provided with -more available functions (like keeping track of the current system usage etc.). -If you dont like ncurses and/or the CLI you can disable both options in the pre- -compile options. - -- It has logging capabilities - -The logging manager keeps track to all yChat system messages (such as users -wich log in and out, modules which are loaded, MySQL queries etc.). Also, an -Apache-Style combined log file format is created by yChat (you can parse this -logfile with any Apache logfile parser like awstats etc.). And last but not -least, all public messages of all available rooms will be logged to disk as -well . To improve performance, you can define the logging puffer (standardly -new logs will be written to disk after each 20 lines). If you want to log -everything immediately, you can reset this option to 1 in ychat.conf. - -- Its modular through own command and dynamic HTML engine - -All chat commands are realized through dynamic loadable module files which can -be recompiled and reloaded without restarting the whole yChat server. Also -HTML-Sites with certain tasks can be compiled as a module like -mods/html/yc_register.so, mods/html/yc_options.so and mods/html/yc_colors.so -etc. so you can also program your dynamic yChat websites in C++. - -- Its multi threaded (POSIX threads) - -There is only one main process which spawns several threads, each for its own -unique task. For example one thread is used to handle the socket manager which -waits for incoming TCP/IP requests, another thread schedules the system timer -which proves if clients are still active or frees not needed memory in certain -time intervals (see also "Garbage collector"). Also, each Chat-User gets it own -thread. There is no need of memory wastage by creating for each task a new -process. All User-Threads are managed by a thread pool to avoid CPU wastage -creating every time a new thread by reusing thread objects which have done its -jobs already and have been readded into the queue of the thread pool. The -standard sizes of the queue and the total pool size can be set in ychat.conf. - -- Its using a smart garbage collection engine - -All users and rooms which dont have to be kept in the main memory (because the -user has logged out or the room has been destroyed because it was empty) will -not be deleted immediately but be placed for about 10 minutes in the yChat -garbage collector. Each time a new room is created the systems checks the -garbage to reuse an inactive room object. If a certain user wants to log in, the -system checks if he is already present in the garbage collector. If yes, he will -be reactivated without wasting expensive database queries to fetch the user's -options. This improves overall performance on heavily loaded yChat servers if a -lot of user and room objects are created and destroyed frequently. -//*>> - -2.0.0 INSTALLATION AND SETUP - -2.1.0 REQUIREMENTS: - -- GNU GCC G++ - The GNU C++ compiler version 3.1 or up. - -- GNU make 3.80 (gmake) or higher - If you dont have a gmake executable but make is gnu make then you need - to add a symlink or alias from gmake to make. - yChat Makefiles only have been tested with GNU make and may not work with - other make versions. - -- SGI STL extension - Includes ext/hash_map which may be already default on every Linux distro. - On *BSD you have to install it first before compiling. On FreeBSD - /usr/ports/devel/stlport is your friend. - -- OpenSSL - Includes libssl and the ssl header files of the open source SSL library. - OpenSSL is only needed if you chose to compile yChat w/OpenSSL support. - -//<<* -- mysql-client 4.x (3.x may do too but is not supported) - Includes libmysqlclient and the mysql.h header files. mysql-client is only - needed if you chose to compile yChat w/database support. - -//*>> -- ncurses 5.x - Includes libncurses and the ncurses.h header files. - -- Screen - Only needed if yChat should run in background with - ncurses or CLI enabled. - -- Perl 5.x - Is needed for some scripts. Is not needed if you use precompiled binaries. - -2.1.0 TESTED PLATFORMS: - -The following platforms have been tested with success. If you find out that -a listed platform did not work at all please contact me: - - Operating system (arch) GNU G++ GNU make -- FreeBSD 5.4-RELEASE (i386) 3.4.2 3.80 -- FreeBSD 5.3-RELEASE (i386) 3.4.2 3.80 - - Tested longer time before: -- FreeBSD 5.2.1-RELEASE (i386) 3.3.3 3.80 -- FreeBSD 4.10-RELEASE (i386) 3.4.1 3.80 -- FreeBSD 4.9-RELEASE (i386) 3.3.4 3.80 -- Gentoo Linux 2004 (i386) 3.3.2 3.80 -- OpenBSD 3.6 SMP (i386) 3.3.2 3.80 -- Red Hat Linux 8.0 SMP (i386) 3.2-7 3.79 -- Slackware Linux 10.0 (i386) 3.4.0 3.80 -- SUSE Linux 9.0 (i386) 3.3.1 3.80 -- SUSE Linux 8.1 (i386) 3.2 3.79.1 - -Other platforms like Linux based systems, other BSD-Systems or UNICES -are very likely to work too. - -2.3.0 HOW TO OBTAIN YCHAT: - -yChat can be downloaded as a source package or through CVS. - -The packages are located at http://www.yChat.org -> Sourcecode -> -Packages or go to http://pub.buetow.org/yChat/yChat . - -For CVS download type: - -cvs -d:pserver:anonymous@buetow.org:/usr/home/cvs/cvsroot login -( You will be asked for a password. Use "just enter" ). - -vs -z3 -d:pserver:anonymous@buetow.org:/usr/home/cvs/cvsroot co BRANCH -( The sources will be copied into your local folder ) - -cvs -d:pserver:anonymous@buetow.org:/usr/home/cvs/cvsroot logout -( Logs your CVS session out ). - -Now you may continue with the installation. - -here are different branches in the CVS: - -ychat: This is the latest CURRENT branch of yChat. -ychat-stable: This is the latest STABLE branch of yChat. -ychat-X.Y: This is the branch with the specified version prefix. -yhttpd: This is the latest CURRENT snapshot of yhttpd. - -The CURRENT branch of ychat is mostly untested and unstable, so don't -cry if you get errors. - -2.4.0 INSTALLATION QUICK START - -If you in hury, then you may just type gmake setup. In the yChat configurator -you may just choose all the default values. If done, yChat will get compiled -and is ready to run with ./bin/ychat! If you chose OpenSSL support, then -also run gmake ssltest before starting yChat. - -2.3.1 INSTALLATION +----------------------------------------------------------------- -Invoke "./configure". Afterwards you will get prompted with the before-compile -options of yChat. After choosing those options you are ready to type "gmake" -afterwards. See below what gmake is doing. +Notes: I programmed this on FreeBSD but should also compile without +big problems on Linux or other UNIX-like systems. +If you have tested one of those then pleace write me the name of the OS, +kernel version, make version and compiler & version. I will list it +right here: -//<<* -If you have choosen MySQL database support, then take a look at section 1.3.2 -how to setup a valid database table. Be also sure to enter the valid MySQL -accessing data in the yChat configuration file which is normally located in -the etc/ychat.conf file if not changed by you with the yChat configurator. -//*>> +The following platforms have been tested with success: -You may also invoke gmake with the following options (the PREFIX can be set -in the yChat configurator which will be launched by the top configure script -or gmake config): +- FreeBSD 5.0-RELEASE, GCC 3.2.1, FreeBSD 5.0 make and GNU make 3.80 - gmake or gmake all (compiles everything, also modules and runs "gmake mail") - gmake base (only compiles the base) - gmake base_start (only compiles the base and starts the server) - gmake clean (cleans everything) - gmake clean_base (only cleans the base obj and rpo files) - gmake clean_modules (only cleans the modules .so files) - gmake confdebug (runs ./configure with enabling debugging) - gmake config (runs yChat configurator) - gmake debug (runs gdb on ./ychat.core) - gmake dist (creates a .tar.bz2 ball) - gmake gpl (shows the GNU General Public License) - gmake help (shows all available ychat gmake targets) - gmake mail (sends a mail to the yChat developers containing build opts.) - gmake modules (only compiles modules) - gmake mrproper (same as gmake clean plus removing all temp files) - gmake setup (runs all configure scripts and afterwards gmake all) - gmake stats (generates ychat statistics) - gmake ssltest (generates a self signed ssl test certificate) - gmake version (shows the current version of yChat) -//<<* - gmake yhttpdbase (generates an yhttpd code base) -//*>> (See section 1.9 to read about this marks) +- Linux Kernel 2.4.19, GCC 3.2.0, GNU make 3.79.1 -Example: "gmake all install clean" compiles everything, installs it to PREFIX -and cleans the source directories. - -Now its time to run the server with ./bin/ychat. +Before you compile the source you have to be sure to use at least GCC +version 3.x with pthreads enabled. ( Type gcc -v to check it ). +GCC 2.95 did not work while testing on linux and won't be supported! -Aferwards point your webbrowser to http://yourip:port ! +If you like to support yChat++, please write me an email and tell me +what you can/like/would help ;-]. Please also take a look at the +yChat++ homepage ( www.yChat.org ). +Installation: Just invoke "./configure" and afterwards "make", edit the +conf.txt and run the server with ./ychat. Then point your webbrowser +to http://yourip:port/index.html +( ignoring the index.html on the end of the url will not work! ). ... have fun :-). -2.3.3 HOW TO USE OPENSSL WITH YCHAT - -If you chose to use OpenSSL support you have to have a valid SSL private and -public key. If you are in hurry, use the gmake ssltest command from the top -source tree directory and follow the instructions. Otherwise type the -following commands manually: - -The private key can be created w/the following command: - - openssl genrsa -des3 -out privkey.pem 2048 - -Afterwards, you can create a self-signed test certificate using the following -command: - - openssl req -new -x509 -key privkey.pem -out cert.pem -days 1095 - -Be sure to move the privkey.pem and cert.pem files into the ./etc directory -or edit the path names in the ./etc/ychat.conf file. yChat wont start if there -are no valid files found. - -To learn more about SSL certificates, visit http://www.openssl.org/docs/HOWTO/. - -Now use https:// and NOT http:// to connect to the yChat server. - -//<<* -2.3.4 HOW TO USE MYSQL WITH YCHAT - -If you chose to use MySQL database support you have to create a valid database -to use with yChat. - -Create a new MySQL database called 'ychat' and type the following command into -a MySQL command line client of your choice: - -USE ychat -CREATE TABLE `user` ( - `uid` int(10) NOT NULL auto_increment, - `nick` varchar(30) NOT NULL default '', - `password` varchar(30) NOT NULL default '', - `color1` varchar(30), - `color2` varchar(30), - `email` varchar(50) default '-', - `registerdate` varchar(30) default '-', - `logincounter` varchar(10) default '0', - `status` char(1) default '3', - PRIMARY KEY (`uid`), - KEY `uid` (`uid`) -) TYPE=MyISAM; -GRANT ALL PRIVILEGES ON ychat.* to ychat@localhost IDENTIFIED BY "yctest"; - -This database uses the default MySQL access informations which are stored in the -ychat.conf file. -//*>> - -2.3.5 HOW TO USE SCREEN WITH YCHAT: - -If you are running yChat in ncurses mode you might want to install -the tool which is called "screen". This will enable you putting the -ncurses interface into the background, closing the terminal session -and reusing the interface later through another terminal. - -Just do: - - screen -S ychat ./bin/ychat ( creates a new session and starts yChat in it ) - ctrl+d+a ( will detach the yChat session ) - ( closing the terminal ) - ( opening a new terminal ) - screen -r ychat ( will return you to the yChat process ) - -Screen will terminate automaticaly if all processes in its sessions are -terminated. - -For a closer look read the screen manual page ( man screen ). - -2.3.6 HOW TO USE SIGNALS WITH YCHAT: - -You can send UNIX signals to yChat. This becomes very interesting if you -don't use the command line interface or the ncurses interface and you -don't have access to the options below. - -Run one of the following commands to send the signal you want: -($PID is here the process id of the current yChat process) - -kill -USR1 $PID # yChat clears the HTML template cache -kill -USR2 $PID # yChat reloads all dynamic loadable modules //<< -kill -HUP $PID # yChat will shutdown savely - -2.4.0 CONFIGURING YCHAT: - -If you like to customize the design/layout/language of yChat, you will have -to edit src/msgs.h and src/glob.h before you compile the sources. Afterwards -you can change the html-template files which are placed in the html/ -subdirectory and the language-templates which are placed in the XML config -file (etc/ychat.conf). - -Notice, that you dont have to edit the src/glob.h file by hand any more, its -already done by the top ./configure script for you. - -You can edit the etc/ychat.conf to fit your needs. If you dont want to change -the config file, then you also can use ychat start parameters. - -Exmpl: ./bin/ychat -o chat.database.password secretpassword - -You can also use multiple words for a specific option. - -Exmpl: ./bin/ychat -o ychat.version "word1 word2 word3" - -will overwrite the default database password value of the ychat.conf. You can -do this with every configuration element by adding several -o option value -arguments to the start command. - -Dynamic loadable modules can be found in the mods/ subdirectory. (chat -commands are realized through modules too). Sources of modules can be found -in src/mods instead. If you want to create a new module just create a new -.cpp file and run in src/mods the ./configure script again. Next time -you run gmake your new module gets compiled. - -All messages defined in the msgs.h file contain server messages only ( a chat -user never wont read them, only the administrator will get to see them ). +If you like customizing the design/layout/language of yChat, you will have +to edit msgs.h and glob.h before you compile the sources. Afterwards you can +change the html-template files which are placed in the html/ subdirectory. -Read also section 3.0.0 of this README. +Files: -//<<* -2.5.0 YHTTPD CODE BASE GENERATION +conf.txt - The yChat configuration file. ( read by conf.cpp ). -See docs/yhttpd.txt -//*>> +base.cpp - Encapsulates vector fields of room's or user ( may be later + hash_maps ) and provides methods for manipulating data + objects. -3.0.0 EXTENDING YCHAT +hmap.cpp - The hash map implementation which is a very fast data + structure. is needed for saving users, rooms and so on. -3.1.0 SOURCE FILES +main.cpp - This includes the required manager headers for starting + the server and finally regulates the correct starting. -This list is not complete. Only the most important files are listed here! +pool.cpp - The implementation of the thread pool. all threads are stored + in a queue. Each thread will be reused if the assigned job is + finished. -etc/ychat.conf - The yChat configuration file -html/* - The html template files -src/* - The yChat base sources -src/mods/* - The dynamic loadable modules sources -scripts/* - Some nice scripts needed for building & co. +reqp.cpp - This class implements the http request parser. If a client + starts a request to the server the reqp class will be + invoked. -The following is created by building yChat: -obj/* - The object files of the compiled yChat base -mods/* - The compiled dynamic loadable modules -bin/ychat - The yChat binary (linked by the object files) +room.cpp - Specifies a chat room. For each chat room an instance of + this class exists. -Customizable source files (if changed you need to run gmake clean all) -src/glob.h - Contains some global building options -src/msgs.h - Defines some server side messages +thrd.cpp - This class is needed by sock.cpp while creating a POSIX thread. + All data which a thread needs to do its tasks are stored in a + thrd object and then a pointer to it will be passed to the + POSIX thread function. +user.cpp - Specifies a chat user. For each chat user an instance of + this class exists. -4.0.0 DIVERSE +Abstract classes: -4.1.0 WRITING BUG REPORTS +cont.cpp - All classes which need to store "key - value" data sets + inherit from this class. ( cont for content ). -How to submit a good bug report? +name.cpp - All classes which own a private member string name inherit + from this class. It also provides public get_name and + set_name methods. -Send them to Mail at yChat dot org. +As described ( main.cpp ), there are so called managers. Managers are +accessible through their assigned wrapper classes and may be +instanciated only once. -First you should give the following information: -- yChat version, if CVS (or devel. tarball) then which day? -- operating system / distribution and it's version -- when did it crash? did you do something? can you reproduce the crash? +chat.cpp - The chat manager. Is responsible for managing the internal + data structure of the system and also covers a lot of + important methods of the system. -Getting backtrace of the crash also helps a lot, especially if yChat crashes -randomly. If after crash you see text: +conf.cpp - The config manager. Parses the config file specified in + glob.h and stores all the values of it in a map. - "segmentation fault (core dumped)" +html.cpp - The html-template manager. Reads the requested html-template + files, stores them in an internal cache ( averts reading + template-files from hd twice or more ) and parses the + partivular template in order to substituate dynamic values + of it. -It writes a file named "core" or "ychat.core" depending on your OS to directory -where you started yChat. If it doesn't print the "(core dumped)" or you can't -find the core file, you'll have to raise the limit for max. core file size -before running yChat. To do this, say: +mutx.cpp - The mutex manager. Contains all global mutex handlers for + synchronizing POSIX thread shared data. until now only the + stdout is synchronized by mutx.cpp because most of objects + use their own mutex'. - ulimit -c unlimited +sock.cpp - The socket manager. Manages the socket connections. There + are multiplexed sockets. For each requests a new POSIX thread + will be created. -So, if you have the core file and GNU debugger (gdb), you can get the -backtrace with: +Files written in capital letters contain static C++ classes - gdb ./bin/ychat ychat.core - bt +s_chat.cpp - Static wrapper for the dynamic chat class. holds one global + reachable instance of chat until the program shuts down. -Paste all the lines starting from line having #0 at the beginning. +s_conf.cpp - Static wrapper for the dynamic conf class. holds one global + reachable instance of conf until the program shuts down. -Here's an example session: +s_html.cpp - Static wrapper for the dynamic html class. holds one global + reachable instance of conf until the program shuts down. - in reqp::parse(thrd*, std::string, std::map<std::string, std::string, - std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >&) () - (gdb) bt - #0 0x0805c287 in reqp::parse(thrd*, std::string, std::map<std::string, - std::string, std::less<std::string>, std::allocator<std::pair<std::string - const, std::string> > >&) () - #1 0x0806060f in sock::read_write(thrd*, int) () - #2 0x080612ba in thrd::run() () - #3 0x0805a3b8 in pool::run_func(void*) () - #4 0x0805a375 in pool::tpool_thread(void*) () - #5 0x281d44ae in _thread_start () from /usr/lib/libc_r.so.5 - (gdb) +s_mutx.cpp - Static wrapper for the dynamic mutx class. holds one global + reachable instance of conf until the program shuts down. -If you dont get such a gdb output, you need to recompile the yChat using -debuggig symbols. You can do it this way: +s_sock.cpp - Static wrapper for the dynamic sock class. holds one global + reachable instance of conf until the program shuts down. -cd ychat -gmake confdebug all run +s_tool.cpp - Static class which includes some usefull global reachable + methods which are not integraded in independent classes. -4.2.0 CONTACT ADDRESSES +Special header files ( all other header files which are not listed here +belong to their respective .cpp files ): -You may contact us through the following addresses: +glob.h - Defines global variables which are known by compilation + time. -- Homepage - The yChat homepage is located at http://www.yChat.org +incl.h - This file is included from every other header file and + includes a set of headers which every class should be able + to use. -- E-Mail - Paul C. Buetow: buetow at yChat point org ( core developer ) - Mail at yChat dot org ( reaches everybody of yChat ) - -- ICQ - Paul C. Buetow: 11655527 +msgs.h - Defines console output messages for verbosity level 0 ( see + glob.h for setting up verbosity levels ). and also defines + all the system messages. you may edit this file for translating + the system user language. -- IRC - #Ychat and #Coding at irc.german-elite.net +The basic class structure: -4.2.0 CREDITS + base<room> base<user> + | | name + | | / \ + | | / \ + chat room user -Thanks to the following persons. Without them yChat would not be like today: + cont + / \ + / \ +conf html -- Volker Richter <volker at exa-ds dot de> of EXA Digital Solutions GbR - (http://www.exa-ds.com) for adding initial MySQL support and lots of more - code. +Version Lines of code + 0.1 2402 + 0.2 2377 -- Joshia Teitelbaum <joshuat at cryptomail.org> of CryptpMail.org for adding - initial OpenSSL support and lots of security patches in the HTTP header - handling. +New in 0.2: + - POST request now work. + - Thread pool ( pool.cpp ). + - Bugfixes @@ -1,10 +1,10 @@ /* This file is part of yChat - $Author: snooper $ - $Date: 2003/04/02 10:50:18 $ + $Author: paul $ + $Date: 2003/03/30 01:35:21 $ - $Header: /cvsroot/ychat/ychat/base.cpp,v 1.8 2003/04/02 10:50:18 snooper Exp $ + $Header: /home/cvsroot/ychat/base.cpp,v 1.7 2003/03/30 01:35:21 paul Exp $ */ // template class data implementation; @@ -16,7 +16,7 @@ template<class type> base<type>::base() { - map_elem = new hmap<type*,string>(80); + map_elem = new hmap<name*,string>(80); pthread_mutex_init (&mut_map_elem, NULL ); } @@ -27,10 +27,10 @@ base<type>::~base( ) } template<class type> void -base<type>::add_elem( type* p_type ) +base<type>::add_elem( name* p_name ) { pthread_mutex_lock ( &mut_map_elem ); - map_elem->add_elem ( p_type, p_type->get_name()); + map_elem->add_elem ( p_name, p_name->get_name()); pthread_mutex_unlock( &mut_map_elem ); } @@ -42,20 +42,20 @@ base<type>::del_elem( string &s_name ) pthread_mutex_unlock( &mut_map_elem ); } -template<class type> type* +template<class type> name* base<type>::get_elem( string &s_name, bool &b_found ) { pthread_mutex_lock ( &mut_map_elem ); - type* p_type = map_elem->get_elem( s_name ); + name* p_name = map_elem->get_elem( s_name ); pthread_mutex_unlock( &mut_map_elem ); - b_found = p_type == NULL ? false : true; + b_found = p_name == NULL ? false : true; - return p_type; + return p_name; } template<class type> void -base<type>::run_func( void (*func)(type*, void*), void* v_arg ) +base<type>::run_func( void (*func)(name*, void*), void* v_arg ) { pthread_mutex_lock ( &mut_map_elem ); map_elem->run_func( func, v_arg ); @@ -5,24 +5,25 @@ #include "incl.h" #include "hmap.h" +#include "name.h" template<class type> class base { private: - hmap<type*,string>* map_elem; + hmap<name*,string>* map_elem; pthread_mutex_t mut_map_elem; public: base(); ~base(); - virtual void add_elem( type* p_type ); // add a element. + virtual void add_elem( name* p_name ); // add a element. virtual void del_elem( string &s_name ); // delete a alement. - virtual type* get_elem( string &s_name, bool &b_found ); // get a element. + virtual name* get_elem( string &s_name, bool &b_found ); // get a element. // execute func on all elements of map_elem. v_pointer is the argument. - virtual void run_func( void (*func)(type*, void*), void* v_arg ); + virtual void run_func( void (*func)(name*, void*), void* v_arg ); // chat::msg_post sends to all users of the system a message. // room::msg_post sends to all users of the room a message. @@ -31,9 +32,11 @@ public: { run_func( &base<type>::msg_post_ , (void*)s_msg ); } - static void msg_post_( type* type_obj, void* v_arg ) + static void msg_post_( name* name_obj, void* v_arg ) { string *p_msg = (string*) v_arg; + type *type_obj = static_cast<type*>(name_obj); + type_obj -> msg_post( p_msg ); } @@ -41,9 +44,11 @@ public: { run_func( &base<type>::get_data_ , (void*)p_map_string ); } - static void get_data_( type* type_obj, void* v_arg ) + static void get_data_( name* name_obj, void* v_arg ) { map_string *map_params = (map_string*) v_arg; + type *type_obj = static_cast<type*>(name_obj); + type_obj -> get_data ( map_params ); } @@ -59,9 +64,11 @@ public: run_func( &base<type>::get_user_list_, (void*)&c ); } - static void get_user_list_( type* type_obj, void* v_arg ) + static void get_user_list_( name* name_obj, void* v_arg ) { container *c = (container*) v_arg; + type *type_obj = static_cast<type*>(name_obj); + type_obj -> get_user_list( *((string*)c->elem[0]), *((string*)c->elem[1]) ); } }; @@ -47,9 +47,10 @@ chat::get_user( string &s_user, bool &b_found ) } void -chat::get_user_( room *room_obj, void *v_arg ) +chat::get_user_( name *name_obj, void *v_arg ) { container* param = (container*) v_arg; + room *room_obj = static_cast<room*>(name_obj); param->elem[2] = (void*)room_obj->get_elem( *((string*)param->elem[0]), *((bool*)param->elem[1]) ); } @@ -106,11 +107,9 @@ chat::login( map_string &map_params ) // add user to the room. p_room->add_user( p_user ); - sess *ns =s_sman::get().createSession(); - ns->setValue(string("nick"), (void *)new string(s_user) ); - map_params["tmpid"]=ns->getId(); + // post "username enters the chat" into the room. - p_room->msg_post( new string( s_user.append( s_lang::get().get_val( "USERENTR" ) ) ) ); + p_room->msg_post( new string( s_user.append( USERENTR ) ) ); #ifdef VERBOSE pthread_mutex_lock ( &s_mutx::get().mut_stdout ); @@ -8,9 +8,6 @@ #include "base.h" #include "room.h" #include "user.h" -#include "sess.h" -#include "s_lang.h" -#include "s_sman.h" using namespace std; @@ -20,8 +17,6 @@ private: bool b_strip_html; public: - - room* get_room( string &s_name, bool &b_found ) { return static_cast<room*>( get_elem( s_name, b_found ) ); @@ -34,7 +29,7 @@ public: // get the object of a specific user. virtual user* get_user( string &s_nick ); virtual user* get_user( string &s_nick, bool &b_found ); - static void get_user_( room* room_obj, void *v_arg ); + static void get_user_( name* name_obj, void *v_arg ); // will be called every time a user tries to login. virtual void login( map_string &map_params ); diff --git a/cmnd/CVS/Entries b/cmnd/CVS/Entries index a44a45c..1784810 100644 --- a/cmnd/CVS/Entries +++ b/cmnd/CVS/Entries @@ -1,5 +1 @@ -/compile.sh/1.1/Sun Sep 14 14:31:49 2003// -/yc_q.cpp/1.2/Wed Apr 2 21:57:34 2003// -/yc_test.cpp/1.1/Wed Apr 2 10:52:16 2003// -/yc_version.cpp/1.1/Sun Sep 14 14:55:57 2003// D diff --git a/cmnd/CVS/Root b/cmnd/CVS/Root index a82e29e..4ab853d 100644 --- a/cmnd/CVS/Root +++ b/cmnd/CVS/Root @@ -1 +1 @@ -:pserver:anonymous@cvs.ychat.berlios.de:/cvsroot/ychat +:pserver:volker@cvs.exa-ds.com:/home/cvsroot @@ -8,7 +8,7 @@ using namespace std; -conf::conf( string s_conf = CONFILE ) : name( s_conf ) +conf::conf( string s_conf = s_confILE ) : name( s_conf ) { parse( ); // parse the config file. } @@ -60,7 +60,7 @@ conf::parse() string s_val = s_token.substr( ui_pos+1, s_token.length() ); string s_key = s_token.substr( 0 , --ui_pos ); -#ifdef VERBOSE2 +#ifdef VERBOSE cout << s_key << "=" << s_val << endl; #endif @@ -17,11 +17,10 @@ # server specific configurations ( not allowed to be removed ): HTMLTEMP="html/"; # directory of the html-template files. -THRDPOOL="50"; # thread pool size. -THRDQUEU="50"; # length of the thread pool queue. -SRVRPORT="3000"; # local port on which the server listens. +THRDPOOL="5"; # thread pool size. +THRDQUEU="5"; # length of the thread pool queue. +SRVRPORT="2000"; # local port on which the server listens. STRDROOM="Lounge"; # the name of the standard room. -LANGUAGE="en"; # language of the chat outputs ( CONSOLE OUTPUT IS NOT AFFECTED ) # the html template file which will be send if the requested file does not exists. NOTFOUND="notfound.html"; @@ -30,22 +29,18 @@ STARTMPL="index.html"; # user's standard nick color. USERCOL1="#FFFFFF"; -# length of the generated session id -SESSION_LENGTH="32"; +# superuser level names. level 0 has the most provileges. +SULEVEL0="Coder"; # programmer. +SULEVEL1="Admin"; # administrator. +SULEVEL2="Magic"; # super user with special privileges. +SULEVEL3="Super"; # temporary super user. +SULEVEL4="Basic"; # normal user without special privileges. +SULEVEL5="Guest"; # guest user, has almost no privileges. +SULEVEL6="Restr"; # a very restricted user. +SULEVEL7="Outbn"; # banned out of the system. # html = "OFF" strips all html tags from incoming messages HTML="OFF"; - -# Logging - -# relative or absolute path to logfile -ACCESS_LOG="log/access_log"; - -# we're using buffered logging for performance -# LOG_LINES specifies after how many lines the log is flushed into a file -# if you don't want buffered logging set LOG_LINES to 1 -LOG_LINES="10"; - # values which are used by the html-templates and are not sticked within the yC++ core source! GRAPHICS="http://paul.buetow.info/yChat"; # url for graphic files etc. PGETITLE="yChat++ Basic - Fast Simple Extensible"; @@ -1,77 +1,1555 @@ -#!/bin/sh +#! /bin/sh -if ! ./scripts/checkperl.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: + +# 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=s_chat.h + +# 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_INIT_AUTOMAKE(yChat, 0.2) + +echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6 +echo "configure:528: checking for Cygwin environment" >&5 +if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 533 "configure" +#include "confdefs.h" + +int main() { + +#ifndef __CYGWIN__ +#define __CYGWIN__ __CYGWIN32__ +#endif +return __CYGWIN__; +; return 0; } +EOF +if { (eval echo configure:544: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_cygwin=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_cygwin=no +fi +rm -f conftest* +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_cygwin" 1>&6 +CYGWIN= +test "$ac_cv_cygwin" = yes && CYGWIN=yes +echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6 +echo "configure:561: checking for mingw32 environment" >&5 +if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 566 "configure" +#include "confdefs.h" + +int main() { +return __MINGW32__; +; return 0; } +EOF +if { (eval echo configure:573: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_mingw32=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_mingw32=no +fi +rm -f conftest* +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_mingw32" 1>&6 +MINGW32= +test "$ac_cv_mingw32" = yes && MINGW32=yes +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:590: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext <<EOF +#line 605 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:611: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext <<EOF +#line 622 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:628: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext <<EOF +#line 639 "configure" +#include "confdefs.h" +#include <assert.h> +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:645: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +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:674: 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:706: 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 717 "configure" +#include "confdefs.h" + +int main(){return(0);} +EOF +if { (eval echo configure:722: \"$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:748: 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:753: 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:762: \"$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:781: 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 + + + +echo $ac_n "checking for library containing dlopen""... $ac_c" 1>&6 +echo "configure:815: checking for library containing dlopen" >&5 +if eval "test \"`echo '$''{'ac_cv_search_dlopen'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_func_search_save_LIBS="$LIBS" +ac_cv_search_dlopen="no" +cat > conftest.$ac_ext <<EOF +#line 822 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen(); + +int main() { +dlopen() +; return 0; } +EOF +if { (eval echo configure:833: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_search_dlopen="none required" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +test "$ac_cv_search_dlopen" = "no" && for i in dl; do +LIBS="-l$i $ac_func_search_save_LIBS" +cat > conftest.$ac_ext <<EOF +#line 844 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dlopen(); + +int main() { +dlopen() +; return 0; } +EOF +if { (eval echo configure:855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_search_dlopen="-l$i" +break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done +LIBS="$ac_func_search_save_LIBS" +fi + +echo "$ac_t""$ac_cv_search_dlopen" 1>&6 +if test "$ac_cv_search_dlopen" != "no"; then + test "$ac_cv_search_dlopen" = "none required" || LIBS="$ac_cv_search_dlopen $LIBS" + +else : + +fi +if test "$ac_cv_search_dlopen" = "-ldl"; then +LDFLAGS="$ac_cv_search_dlopen" +fi +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 +echo "configure:883: checking for $ac_hdr that defines DIR" >&5 +if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 888 "configure" +#include "confdefs.h" +#include <sys/types.h> +#include <$ac_hdr> +int main() { +DIR *dirp = 0; +; return 0; } +EOF +if { (eval echo configure:896: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_dirent_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <<EOF +#define $ac_tr_hdr 1 +EOF + ac_header_dirent=$ac_hdr; break +else + echo "$ac_t""no" 1>&6 +fi +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then +echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 +echo "configure:921: checking for opendir in -ldir" >&5 +ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldir $LIBS" +cat > conftest.$ac_ext <<EOF +#line 929 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir(); + +int main() { +opendir() +; return 0; } +EOF +if { (eval echo configure:940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -ldir" +else + echo "$ac_t""no" 1>&6 +fi + +else +echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 +echo "configure:962: checking for opendir in -lx" >&5 +ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lx $LIBS" +cat > conftest.$ac_ext <<EOF +#line 970 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char opendir(); + +int main() { +opendir() +; return 0; } +EOF +if { (eval echo configure:981: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + LIBS="$LIBS -lx" +else + echo "$ac_t""no" 1>&6 +fi + +fi + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:1004: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1009 "configure" +#include "confdefs.h" +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1017: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext <<EOF +#line 1034 "configure" +#include "confdefs.h" +#include <string.h> +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext <<EOF +#line 1052 "configure" +#include "confdefs.h" +#include <stdlib.h> +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext <<EOF +#line 1073 "configure" +#include "confdefs.h" +#include <ctype.h> +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:1084: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null then - exit 1 -fi - -perl -e ' - use strict; - $|=1; - sub check_gcc { - my $f = shift; - my $s = shift; - my $r = 0; - print "Checking for GNU G++ $f.$s\n"; - if ( `g++ -v 2> g++.version && tail -n 1 g++.version` =~ / $f\.$s/ ) { - `echo $f.$s >> g++.version`; - `echo g++ >> g++.version`; - $r = 1; - } else { - if (`g++$f$s -v 2> g++.version && tail -n 1 g++.version` =~ / $f\.$s/) { - `echo $f.$s >> g++.version`; - `echo g++$f$s >> g++.version`; - $r = 1; - } - } - print "No " if $r == 0; - print "GNU G++ $f.$s found!\n"; - return $r; - } - sub check_make { - print "Checking for GNU make\n"; - my $err = "No GNU make found.\nPlease install a version of GNU make!\n"; - my $make; - if (`which gmake`) { - $make = "gmake"; - } elsif ( `which make` ) { - $make = "make"; - } else { - print $err; - exit(1); - } - - `sh -c "$make -v > make.version 2>/dev/null"`; - if ( `cat make.version` =~ /GNU Make/ ) { - `echo $make >> make.version`; - } else { - print $err; - exit(1); - } - } - &check_make; - print "Checking compiler version\n"; - my $r = 0; - for (my $i = 4; $i > 0 && $r == 0; --$i ) { - $r = &check_gcc(3,$i); - } - if ($r == 0) { - print "No suitable g++ compiler found!\n"; - print "Please install a right version of GNU G++!\n"; - exit(1); - } + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +for ac_hdr in unistd.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1111: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1116 "configure" +#include "confdefs.h" +#include <$ac_hdr> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1121: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <<EOF +#define $ac_tr_hdr 1 +EOF - system("perl \"scripts/config.pl\""); - chdir("src"); - system("./configure ".join(" ", @ARGV)); - chdir(".."); +else + echo "$ac_t""no" 1>&6 +fi +done - exit(0); -' `echo "$*" | sed "s/-//g"` +for ac_hdr in string.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:1151: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1156 "configure" +#include "confdefs.h" +#include <$ac_hdr> +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:1161: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <<EOF +#define $ac_tr_hdr 1 +EOF + +else + echo "$ac_t""no" 1>&6 +fi +done -if test -f err -then - rm -f err +echo $ac_n "checking for working const""... $ac_c" 1>&6 +echo "configure:1188: checking for working const" >&5 +if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext <<EOF +#line 1193 "configure" +#include "confdefs.h" + +int main() { + +/* Ultrix mips cc rejects this. */ +typedef int charset[2]; const charset x; +/* SunOS 4.1.1 cc rejects this. */ +char const *const *ccp; +char **p; +/* NEC SVR4.0.2 mips cc rejects this. */ +struct point {int x, y;}; +static struct point const zero = {0,0}; +/* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in an arm + of an if-expression whose if-part is not a constant expression */ +const char *g = "string"; +ccp = &g + (g ? g-g : 0); +/* HPUX 7.0 cc rejects these. */ +++ccp; +p = (char**) ccp; +ccp = (char const *const *) p; +{ /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; +} +{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; +} +{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; +} +{ /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; +} +{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; +} + +; return 0; } +EOF +if { (eval echo configure:1242: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_const=yes else - echo You are ready to type gmake now! + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_const=no +fi +rm -f conftest* fi + +echo "$ac_t""$ac_cv_c_const" 1>&6 +if test $ac_cv_c_const = no; then + cat >> confdefs.h <<\EOF +#define const +EOF + +fi + +echo $ac_n "checking for inline""... $ac_c" 1>&6 +echo "configure:1263: checking for inline" >&5 +if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat > conftest.$ac_ext <<EOF +#line 1270 "configure" +#include "confdefs.h" + +int main() { +} $ac_kw foo() { +; return 0; } +EOF +if { (eval echo configure:1277: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_inline=$ac_kw; break +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 +fi +rm -f conftest* +done + +fi + +echo "$ac_t""$ac_cv_c_inline" 1>&6 +case "$ac_cv_c_inline" in + inline | yes) ;; + no) cat >> confdefs.h <<\EOF +#define inline +EOF + ;; + *) cat >> confdefs.h <<EOF +#define inline $ac_cv_c_inline +EOF + ;; +esac + + + +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 + +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%@CPP@%$CPP%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 + + + 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 +" $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 --git a/gfx/CVS/Entries b/gfx/CVS/Entries index 1784810..5178e8f 100644 --- a/gfx/CVS/Entries +++ b/gfx/CVS/Entries @@ -1 +1,3 @@ +/y_ani_black.gif/1.1.1.1/Fri Mar 21 15:54:56 2003// +/y_ani_white.gif/1.1.1.1/Fri Mar 21 15:54:56 2003// D diff --git a/gfx/CVS/Root b/gfx/CVS/Root index a82e29e..4ab853d 100644 --- a/gfx/CVS/Root +++ b/gfx/CVS/Root @@ -1 +1 @@ -:pserver:anonymous@cvs.ychat.berlios.de:/cvsroot/ychat +:pserver:volker@cvs.exa-ds.com:/home/cvsroot diff --git a/gfx/y_ani_black.gif b/gfx/y_ani_black.gif Binary files differnew file mode 100755 index 0000000..06274c2 --- /dev/null +++ b/gfx/y_ani_black.gif diff --git a/gfx/y_ani_white.gif b/gfx/y_ani_white.gif Binary files differnew file mode 100755 index 0000000..168c937 --- /dev/null +++ b/gfx/y_ani_white.gif @@ -11,7 +11,7 @@ #define false 0 // config filename. -#define CONFILE "conf.txt" +#define s_confILE "conf.txt" // the highest port which is allowed to use. if ychat is unable to create the server // socket it will increment the port number and tries to create another socket. @@ -25,11 +25,6 @@ // the messages. this messages will only printed out by the master thread. #define VERBOSE -// Defines the amount of newlines which have to send to the client's -// chat stream the first log-in. ( prevents white screen because of buffers -// or proxies ). -#define PUSHSTR 1000 - ////////////////////////////////////////////////////////////////////////////////////////// // DO NOT CHANGE ANYTHING BEHIND THIS LINE! @@ -52,17 +47,10 @@ enum rang // some custom typedefs for datatypes which are needed often. typedef map<string, string> map_string; -typedef int function( void *v_arg ); struct container { void* elem[3]; }; -struct dynmod -{ - function *the_func ; - void *the_module; -}; - #endif @@ -1,7 +1,6 @@ #ifndef hmap_cpp #define hmap_cpp - #include "hmap.h" using namespace std; @@ -161,14 +160,6 @@ int hmap<obj_type, key_type>::nextPrime( int n ) const return n; } template<class obj_type, class key_type> void -hmap<obj_type, key_type>::run_func( void (*func)(obj_type) ) -{ - for( int i = 0; i < array.size( ); i++ ) - if ( array[i].info == ACTIVE ) - ( *func ) ( array[i].element ); -} - -template<class obj_type, class key_type> void hmap<obj_type, key_type>::run_func( void (*func)(obj_type, void*), void* v_arg ) { for( int i = 0; i < array.size( ); i++ ) @@ -53,7 +53,6 @@ public: virtual void del_elem ( const key_type &k ); virtual obj_type get_elem ( const key_type &k ); - virtual void run_func( void (*func)(obj_type) ); virtual void run_func( void (*func)(obj_type, void*), void* v_arg ); // inline: @@ -81,11 +80,6 @@ public: return static_cast<double>(getSize())/static_cast<double>(getCapacity()); } - obj_type& operator[]( key_type &k ) - { - return get_elem( k ); - } - }; template <class obj_type, class key_type> @@ -58,6 +58,7 @@ html::parse( map_string &map_params ) } auto char c_buf; + while( !fs_templ.eof() ) { fs_templ.get( c_buf ); diff --git a/html/CVS/Entries b/html/CVS/Entries index e14ddfa..12eb550 100644 --- a/html/CVS/Entries +++ b/html/CVS/Entries @@ -1,5 +1,4 @@ /blank.html/1.1.1.1/Fri Mar 21 15:54:56 2003// -/favicon.ico/1.1/Sat Sep 13 18:52:49 2003// /frameset.html/1.1.1.1/Fri Mar 21 15:54:56 2003// /index.html/1.4/Sun Mar 30 00:34:08 2003// /input.html/1.2/Sun Mar 30 00:34:08 2003// diff --git a/html/CVS/Root b/html/CVS/Root index a82e29e..4ab853d 100644 --- a/html/CVS/Root +++ b/html/CVS/Root @@ -1 +1 @@ -:pserver:anonymous@cvs.ychat.berlios.de:/cvsroot/ychat +:pserver:volker@cvs.exa-ds.com:/home/cvsroot diff --git a/html/frameset.html b/html/frameset.html index 672f8fa..fe6b973 100755 --- a/html/frameset.html +++ b/html/frameset.html @@ -1,21 +1,19 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title> - %%ychat.version%% + %%PGETITLE%% </title> </head> - <frameset boders="0" rows="*,70"> + <frameset rows="*,60"> <noframes> Your browser does not support frames, </noframes> <frameset cols="*,150"> - <frame src="stream.html?event=stream&tmpid=%%tmpid%%" name="stream"> - <frame src="online.html?event=online&tmpid=%%tmpid%%" name="online"> + <frame src="stream.html?event=stream&nick=%%nick%%&tmpid=%%tmpid%%" name="stream"> + <frame src="online.html?event=online&nick=%%nick%%&tmpid=%%tmpid%%" name="online"> </frameset> <frameset rows="*,0"> - <frame src="input.html?event=input&tmpid=%%tmpid%%" name="input"> + <frame src="input.html?event=input&nick=%%nick%%&tmpid=%%tmpid%%" name="input"> <frame src="blank.html" name="blank"> </frameset> </frameset> diff --git a/html/index.html b/html/index.html index 983e7ef..7bc01b0 100755 --- a/html/index.html +++ b/html/index.html @@ -1,54 +1,32 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title> - %%ychat.version%% + %%PGETITLE%% </title> <link rel=stylesheet href="style.css" type=text/css> </head> -<body> +<body bgcolor=#000000 text=#ffff00> <table align=center width=500> <tr> -<td> -<center> -%%ychat.version%%<br><br>%%INFO%% -</center> -</td> +<td align=center><img src="y_black.gif" alt="ychat"></td> +<td align=center class=header>%%PGETITLE%%<br>%%INFO%%</td> </tr> <tr> -<td colspan=2> </td> + <td colspan=2> </td> </tr> <tr> -<td align=center colspan=2> -<form action="frameset.html" method="POST"> + <td align=center colspan=2> +Enter your nick: +<form action="frameset.html" method="GET"> <input type="hidden" name="event" value="login"> -Enter your nick:<br> - <input class="text" type="text" name="nick" value="%%nick%%" maxlength="%%chat.maxlength.username%%" accesskey="n"> -<br> -<br> -Enter your password:<br> - <input class="text" type="password" name="password" value="%%pass%%" maxlength="%%chat.maxlength.password%%" accesskey="p"> -<br> -<br> -Enter your room:<br> - <input class="text" type="text" name="room" value="%%chat.defaultroom%%" maxlength="%%chat.maxlength.roomname%%" accesskey="r"> -<br> -<br> - <input type="hidden" name="end" value="end"> - <input type="submit" value="login" accesskey="s"> + <input type="hidden" name="room" value="%%STRDROOM%%"> + <input type="text" name="nick"> + <input type="submit" value="login"> </form> -<br> -<a class="fancy" href="register.html">Register</a> a new nick -<br> -<br> -If you don't want to register you may login -<br> -without a password using an unregistered nick. </td> </tr> </table> <br><br> -<center><span class="signature">yChat is OpenSource - get it at <a class="fancy" target="_blank" href="http://www.yChat.org">http://www.yChat.org</a></span></center> +<center><span class="signature">yChat is OpenSource - get it at <a target="_blank" href="http://www.yChat.org">http://www.yChat.org</a></span></center> </body> </html> diff --git a/html/input.html b/html/input.html index 31ed9fe..a403d8e 100755 --- a/html/input.html +++ b/html/input.html @@ -1,60 +1,34 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <head> <title> - %%HTML_TITLE_TAG_CONTENT%% + %%PGETITLE%% </title> - <link rel=stylesheet href="style.css" type=text/css> +<link rel=stylesheet href="style.css" type=text/css> + <script language="JavaScript"> <!-- function delout() { - document.input.message.value = document.input.message.value.replace(/&/g, '\\AND'); - document.input.submit(); - document.input.message.value = ""; document.input.message.focus(); + document.input.message.select(); + document.input.submit(); return false; } function selectinput() { document.input.message.select(); } - function popup(site,width,height) - { - var left = (screen.availWidth-width)/2; - var top = (screen.availHeight-height)/2; - var win = window.open(site,"_blank","width="+width+",height="+height+",left="+left+",top="+top+",scrollbars=yes"); - } - function chgscroll(f) - { - if(f.checked) - parent.stream.autoscroll(); - else - parent.stream.stopscroll(); - } //--> </script> </head> - <body> - <form method="GET" name="input" action="input.html" target="blank" onsubmit="return delout();"> - <div style="position: absolute; top: 5px;"> - <input class="text" type="text" name="message" size="60" maxlength="%%chat.maxlength.message%%"> - <input type="submit" value="Send" accesskey='s'> - <input type="button" value="Select" accesskey='e' onclick="javascript:selectinput();"> - </div> - <div style="position: absolute; top: 29px;"> - <a href='#' class="fancy" onclick="javascript:popup('colors.html?event=colors&tmpid=%%tmpid%%', 600, 480)">Colors</a> - <a href='#' class="fancy" onclick="javascript:popup('options.html?event=options&tmpid=%%tmpid%%', 600, 480)">Options</a> - <a href='#' class="fancy" onclick="javascript:popup('help.html?event=help&tmpid=%%tmpid%%', 600, 480)">Help</a> - <a href='#' class="fancy" onclick="javascript:popup('loggedin.html?event=loggedin&tmpid=%%tmpid%%', 600, 480)">Users</a> - <a href='#' class="fancy" onclick="javascript:popup('admin.html?event=admin&tmpid=%%tmpid%%', 600, 480)">Admin</a> - <a href='input.html?event=input&tmpid=%%tmpid%%&message=%2Fq' class="fancy" target='blank'>Logout</a> - Scrolling: - <input type="checkbox" name="scroll" checked onClick="chgscroll(this);"> - </div> - <input type="hidden" name="event" value="input"> + <body bgcolor=#000000 text=#ffffff> + <form name="input" action="input.html" target="blank" onsubmit="return delout();"> + <input type="hidden" name="event" value="post"> + <input type="hidden" name="nick" value="%%nick%%"> <input type="hidden" name="tmpid" value="%%tmpid%%"> + <input type="text" name="message" size="50"> + <input type="submit" value="send"> + <input type="button" value="select" onclick="javascript:selectinput();"> </form> </body> </html> diff --git a/html/notfound.html b/html/notfound.html index a14d44b..574e341 100755 --- a/html/notfound.html +++ b/html/notfound.html @@ -1,9 +1,7 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title> - %%HTML_TITLE_TAG_CONTENT%% + %%PGETITLE%% </title> </head> <body> diff --git a/html/online.html b/html/online.html index 3eda553..aa14f8d 100755 --- a/html/online.html +++ b/html/online.html @@ -1,20 +1,7 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <link rel=stylesheet href="style.css" type=text/css> - </head> - <body> - <b>%%room%%</b> - <br> - <br> - <table> - <tr> - <td> - %%topic%% - </td> - </tr> - %%userlist%% - </table> + <meta http-equiv="refresh" content="20"> +<link rel=stylesheet href="style.css" type=text/css> + <body bgcolor=#000000 text=#ffffff> + %%MESSAGE%% </body> </html> diff --git a/html/stream.html b/html/stream.html index ed08a23..6678069 100755 --- a/html/stream.html +++ b/html/stream.html @@ -1,38 +1,30 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <head> <title> - %%HTML_TITLE_TAG_CONTENT%% + %%PGETITLE%% </title> <link rel=stylesheet href="style.css" type=text/css> <script language="JavaScript"> - var scrolling; - var ison; - function autoscroll() + function autoScroll() { - if(!ison){ - scrolling = window.setInterval("window.scroll(1,1606682)",70); - ison = true; - } + window.scroll(1, 50000 ); + timer = setTimeout('autoScroll()',200); } - function stopscroll() + + autoScroll(); + + function stopScroll() { - if(ison) - { - window.clearInterval(scrolling); - ison = false; - } + clearTimeout(timer); + } + + function startScroll() + { + timer = setTimeout('autoScroll()', 200); } </script> </head> -<body class="stream"> -<h1>Engine: %%ychat.version%%</h2> -<script language="JavaScript"> - autoscroll(); -</script> - - Welcome to the chat, %%nick%%! +<body bgcolor=#000000 text=#ffffff> + Welcome to yChat %%nick%%! <br> <br> - diff --git a/html/style.css b/html/style.css index 4b6d9ca..e31bd7e 100755..100644 --- a/html/style.css +++ b/html/style.css @@ -1,48 +1,11 @@ -body, div { +BODY, TD { font-family: Verdana, Helvetica, sans-serif; - background-color: #000000; - color: #FFFFEF; font-size: 11pt; } - -input { - color: #000000; - font-family: Verdana, Helvetica, sans-serif; - text-decoration: none; - font-size: 9pt; - padding: 2px; -} - -input.text { - background-color: #FFFFEF; -} - -.fancy { - font-family: Verdana, Helvetica, sans-serif; - font-size: 9pt; - color: #FFFFEF; - padding: 2px; -} - -a:hover.fancy { - text-decoration: none; - color: #FFFFEF; - background-color: #000000; -} - -h1 { - background-color: #ffa500; - border: solid #000000 1px; - font-size: 20pt; - padding: 13px; - font-width: bold; -} - -body.stream { - background-color: #323232; +A { + color: #dddddd; } - .signature { - color: #AAAAAA; + color: #dddddd; font-size: 9pt; } @@ -37,18 +37,9 @@ // include the mutex manager for global synchronization. #include "s_mutx.h" -// include the module loader manager for global synchronization. -#include "s_modl.h" - // include the socket manager. #include "s_sock.h" -// include the language manager -#include "s_lang.h" - -// include the session manager -#include "s_sman.h" - using namespace std; int main() @@ -80,12 +71,9 @@ cout << " ___ _ _ " << endl s_mutx::init(); // init the mutex manager. s_conf::init(); // init the config manager. s_html::init(); // init the html-template manager. - s_lang::init(); // init the language manager - s_sman::init(); // init the session manager. - s_modl::init(); // init the module-loader manager. s_sock::init(); // init the socket manager. s_chat::init(); // init the chat manager. - + // start the socket manager. this one will listen for incoming http requests and will // forward them to the specified routines which will generate a http response. s_sock::get().start(); @@ -1,6 +1,14 @@ #ifndef MSGS_H #define MSGS_H +// message templates. + +// will be posed if a command does not exist for an user. +#define ERRORCMD " <font color='#FF0000'>No such command!</font><br>\n" +// will post "nickname enters the chat" into the room. +#define USERENTR " enters the chat<br>\n" +// will post "nickname leaves the chat" into the room. +#define USERLEAV " leaves the chat<br>\n" // several error messages which will apear by the clients. #define E_ALPNUM "The nick you have specified is not alphanumeric, please change that.<br><br>" @@ -20,7 +28,6 @@ #define DESCRIP "yChat++ Copyright (C) 2003 Paul C. Buetow, Volker Richer " #define DOWNMSG "Shutting down " #define LOGINPR "Login procedure succeeded for nick " -#define MODULEC "Caching module " #define NEWROOM "Adding room " #define REQUEST "Request string " #define SEPERAT "----------------------------------------- " @@ -31,6 +38,6 @@ #define TECACHE "Caching template " #define THREADS "Starting thread job " #define THREADE "Exiting thread job " -#define VERSION "Version: yChat++ Basic 0.5" +#define VERSION "Version: CVS" #endif @@ -197,6 +197,7 @@ pool::tpool_add_work( tpool_t tpool, void(*routine)(void*), void* arg ) /// if( tpool->cur_queue_size == 0 ) { tpool->queue_tail = tpool->queue_head = workp; + pthread_cond_signal( &(tpool->queue_not_empty) ); } else @@ -206,7 +207,6 @@ pool::tpool_add_work( tpool_t tpool, void(*routine)(void*), void* arg ) /// } tpool->cur_queue_size++; - pthread_cond_signal( &(tpool->queue_not_empty) ); pthread_mutex_unlock( &(tpool->queue_lock) ); return 1; } @@ -15,7 +15,7 @@ using namespace std; string reqp::HTTP_CODEOK = "HTTP/1.1 200 OK\n"; string reqp::HTTP_SERVER = "Server: yChat (Unix)\n"; string reqp::HTTP_CONTAC = "Contact: www.yChat.org\n"; -string reqp::HTTP_CACHEC = "Expires: 0\nCache-control: no-cache\nPragma: no-cache\n"; +string reqp::HTTP_CACHEC = "Cache-control: no-cache\n"; string reqp::HTTP_CONNEC = "Connection: keep-alive\n"; string reqp::HTTP_COTYPE = "Content-Type: "; @@ -73,10 +73,7 @@ reqp::get_url( thrd* p_thrd, string s_req, map_string &map_params ) if ( i_request == RQ_POST && s_params.empty() ) { char c_req[READBUF]; - - if ( read ( p_thrd->get_sock() , c_req, READBUF ) <= 0 ) - return "NOBYTE"; - + read ( p_thrd->get_sock() , c_req, READBUF ); s_params = string( strstr( c_req, "event" ) ); } @@ -115,7 +112,7 @@ reqp::get_url( thrd* p_thrd, string s_req, map_string &map_params ) } string -reqp::get_content_type( string s_file ) +reqp::getContentType( string s_file ) { string s_ext=s_tool::getExtension( s_file ); @@ -124,31 +121,6 @@ reqp::get_content_type( string s_file ) return s_conf::get().get_val( "CT_"+s_ext ); } -void -reqp::parse_headers( string s_req, map_string &map_params ) -{ - - int pos = s_req.find("\n"); - map_params["QUERY_STRING"]=s_tool::trim(s_req.substr(0,pos-1)); - while(pos!=string::npos) - { - auto string s_line=s_req.substr(0,pos); - auto int pos2=s_line.find(":"); - if(pos2!=string::npos) - { - auto string key=s_tool::trim(s_line.substr(0, pos2)); - auto string value=s_tool::trim(s_line.substr(pos2+1)); - - map_params[key]=value; - - - } - s_req=s_req.substr(s_line.size()+1); - pos=s_req.find("\n"); - } - -} - int reqp::htoi(string *s) @@ -215,20 +187,16 @@ reqp::parse( thrd* p_thrd, string s_req, map_string &map_params ) // store all request informations in map_params. store the url in // map_params["request"]. + get_url( p_thrd, s_req, map_params ); - if ( get_url( p_thrd, s_req, map_params ).compare("NOBYTE") == 0 ) - map_params["request"] = s_conf::get().get_val("NOTFOUND"); - - parse_headers( s_req, map_params ); // create the http header. string s_rep( HTTP_CODEOK ); s_rep.append( HTTP_SERVER ); s_rep.append( HTTP_CONTAC ); s_rep.append( HTTP_CACHEC ); s_rep.append( HTTP_CONNEC ); s_rep.append( HTTP_COTYPE ); - s_rep.append( get_content_type( map_params["request"] ) ); - s_rep.append("\r\n\r\n"); + s_rep.append( getContentType( map_params["request"] ) ); s_rep.append("\n\n"); - // check the event variable. + // check the event variable. string s_event( map_params["event"] ); if ( ! s_event.empty() ) { @@ -241,27 +209,18 @@ reqp::parse( thrd* p_thrd, string s_req, map_string &map_params ) else { bool b_found; - -// user* p_user = s_chat::get().get_user( map_params["nick"], b_found ); - sess *sess_temp=s_sman::get().getSession( map_params["tmpid"] ); - user *p_user; - if(sess_temp!=NULL) - { - string *s_nick=static_cast<string*>(sess_temp->getValue(string("nick"))); - p_user = s_chat::get().get_user( *s_nick, b_found); - } - else - return s_rep; + user* p_user = s_chat::get().get_user( map_params["nick"], b_found ); + if ( ! b_found ) { map_params["INFO"] = E_NOTONL; map_params["request"] = s_conf::get().get_val( "STARTMPL" ); // redirect to the startpage. } + // if a message post. else if ( s_event == "post" ) s_chat::get().post( p_user, map_params ); - // if a chat stream else if ( s_event == "stream" ) { @@ -24,7 +24,7 @@ private: HTTP_CACHEC, HTTP_CONNEC, HTTP_COTYPE; - + // returns the request url from thr client's http request header // until the first "?" and stores all request parameter values // ( behind "?" ) into map_params. @@ -40,8 +40,7 @@ public: explicit reqp( ); // simple constructor. virtual string parse( thrd* p_thrd, string s_req, map_string &map_params ); virtual string url_decode ( string ); - virtual string get_content_type( string ); - virtual void parse_headers( string s_req, map_string &map_params ); + virtual string getContentType( string ); }; #endif @@ -13,7 +13,7 @@ private: public: static void init() { - obj = new conf( CONFILE ); + obj = new conf( s_confILE ); } static conf& get() @@ -20,34 +20,6 @@ s_tool::is_alpha_numeric( string &s_digit ) return true; } -string -s_tool::trim( string s_str ) -{ - if(s_str.empty())return ""; - char c_cur=s_str[0]; - auto int pos=0; -// left trim - while(c_cur==' ' || c_cur == '\n' || c_cur == '\r') - { - s_str.erase(pos,1); - - c_cur=s_str[++pos]; - - } -// right trim - - pos=s_str.size(); - c_cur=s_str[s_str.size()]; - - while(c_cur==' ' || c_cur == '\n' || c_cur == '\0' || c_cur == '\r') - { - s_str.erase(pos,1); - c_cur=s_str[--pos]; - - } - return s_str; -} - string s_tool::getExtension( string s_file ) { @@ -10,7 +10,6 @@ class s_tool public: static bool is_alpha_numeric( string &s_digit ); static int string2int( string s_digit ); - static string trim( string s_str ); static long unixtime(); static void strip_html( string *s_str); static string getExtension( string s_file ); @@ -11,8 +11,7 @@ #include "s_conf.h" #include "s_mutx.h" #include "s_tool.h" -#include "s_lang.h" -#include "s_sman.h" + #include "chat.h" #include "user.h" @@ -24,32 +23,22 @@ sock::sock() this->i_req = 0; this->req_parser = new reqp(); this->thrd_pool = new pool(); - this->log_daemon = new logd(s_conf::get().get_val( "ACCESS_LOG" )); } void sock::chat_stream( int i_sock, user* p_user, map_string &map_params ) { - string s_msg( "\n" ); + string s_msg( "" ); pthread_mutex_lock ( &(p_user->mut_message) ); - for ( int i = 0; i < PUSHSTR; i++ ) - send( i_sock, s_msg.c_str(), s_msg.size(), 0 ); - - do + while( p_user->get_online() ) { + pthread_cond_wait( &(p_user->cond_message), &(p_user->mut_message) ); s_msg = p_user->get_mess( ); if ( 0 > send( i_sock, s_msg.c_str(), s_msg.size(), 0 ) ) p_user->set_online( false ); - pthread_cond_wait( &(p_user->cond_message), &(p_user->mut_message) ); - } - while( p_user->get_online() ); - - // if there is still a message to send: - s_msg = p_user->get_mess( ); - if ( ! s_msg.empty() ) - send( i_sock, s_msg.c_str(), s_msg.size(), 0 ); + } pthread_mutex_unlock( &(p_user->mut_message) ); @@ -58,11 +47,7 @@ sock::chat_stream( int i_sock, user* p_user, map_string &map_params ) p_user->get_p_room()->del_elem( s_user ); // post the room that the user has left the chat. - p_user->get_p_room()->msg_post( new string( p_user->get_name().append( s_lang::get().get_val( "USERLEAV" ) ) ) ); - s_sman::get().destroySession( p_user->get_id() ); - #ifdef VERBOSE - cout << s_user << " left | SessionCount: " << s_sman::get().getSessionCount() << endl; - #endif + p_user->get_p_room()->msg_post( new string( p_user->get_name().append( USERLEAV ) ) ); p_user->~user(); } @@ -129,19 +114,10 @@ sock::read_write( thrd* p_thrd, int i_sock ) // get the s_rep ( s_html response which will be send imediatly to the client // and fill map_params with request values. auto string s_temp=(string)c_req; - struct sockaddr_in client; - size_t size=sizeof(client); - - getpeername( i_sock, (struct sockaddr *)&client, &size); - - map_params["REMOTE_ADDR"]=inet_ntoa(client.sin_addr); - map_params["REMOTE_PORT"]=ntohs( client.sin_port); - string s_rep = req_parser->parse( p_thrd, string( c_req ), map_params ); - // send s_rep to the client. - log_daemon->log(map_params); + // send s_rep to the client. send( i_sock, s_rep.c_str(), s_rep.size(), 0 ); // dont need those vals anymore. @@ -19,7 +19,7 @@ #include "reqp.h" #include "thrd.h" #include "user.h" -#include "logd.h" + using namespace std; class sock @@ -31,7 +31,7 @@ private: bool b_run; // true while socket manager is running. reqp* req_parser; // parses the http requests from clients. pool* thrd_pool; // the thread pool. - logd* log_daemon; // the log daemon + // creates a server socket. virtual int make_socket( uint16_t port ); @@ -5,7 +5,6 @@ #include "user.h" #include "s_conf.h" -#include "s_modl.h" #include "s_tool.h" using namespace std; @@ -115,27 +114,7 @@ user::set_sock( int i_sock ) void user::command( string &s_command ) { - - auto unsigned int pos = s_command.find( "/" ); - while( pos != string::npos ) - { - s_command.replace( pos, 1, "" ); - pos = s_command.find( "/" ); - } - - string s_mod( "cmnd/yc_" ); - s_mod.append( s_command ).append( ".so" ); - - dynmod *mod = s_modl::get().get_module( s_mod ); - - if ( mod == NULL ) - { - msg_post( new string( s_lang::get().get_val( "ERRORCMD" ) ) ); - return; - } - - // execute the module. - ( *(mod->the_func) ) ( (void*) this ); + msg_post( new string( ERRORCMD ) ); } void @@ -5,7 +5,7 @@ #include "incl.h" #include "hmap.h" #include "name.h" -#include "s_lang.h" + using namespace std; class room; @@ -20,7 +20,6 @@ private: long l_time; // user's last activity time. rang r_rang; // user's rang ( see enum rang @ globals.h ). rang r_oldr; // user's previous rang. - string s_id; string s_agnt; // user's http user agent. string s_away; // user's last away message. string s_col1; // user's nick color. @@ -39,8 +38,6 @@ public: // small inline methods: string get_col1() const { return s_col1; } - string get_id() const { return s_id; } - void set_id ( string s_id ) { this -> s_id = s_id; } void set_col1 ( string s_col1 ) { this -> s_col1 = s_col1; } rang get_rang ( ) const { return r_rang; } @@ -78,7 +75,9 @@ public: // appends a string to s_mess including br. virtual void msg_post( string *p_msg ); + virtual void get_user_list( string &s_list, string &s_seperator ); + }; #endif |
