summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2013-04-06 13:14:44 +0200
committerPaul Buetow <paul@buetow.org>2013-04-06 13:14:44 +0200
commitc507ce3198ea4d822832cc8740f0128df8873c02 (patch)
tree260ca004916ae03b7d5438bf89007e3984da6934
parentc8b2ef7b899766d04562f7e04a84251cea8fa701 (diff)
tagging ychat-0.3ychat-0.3
-rw-r--r--[-rwxr-xr-x]COPYING0
-rw-r--r--CVS/Entries66
-rw-r--r--CVS/Entries.Log2
-rw-r--r--CVS/Root2
-rw-r--r--[-rwxr-xr-x]Makefile108
-rwxr-xr-xMakefile.in2
-rwxr-xr-xREADME664
-rwxr-xr-xbase.cpp22
-rwxr-xr-xbase.h21
-rwxr-xr-xchat.cpp9
-rwxr-xr-xchat.h7
-rw-r--r--cmnd/CVS/Entries4
-rw-r--r--cmnd/CVS/Root2
-rwxr-xr-xconf.cpp4
-rwxr-xr-xconf.txt29
-rwxr-xr-xconfigure1618
-rw-r--r--gfx/CVS/Entries2
-rw-r--r--gfx/CVS/Root2
-rwxr-xr-xgfx/y_ani_black.gifbin0 -> 61100 bytes
-rwxr-xr-xgfx/y_ani_white.gifbin0 -> 53536 bytes
-rwxr-xr-xglob.h14
-rw-r--r--hmap.cpp9
-rw-r--r--hmap.h6
-rwxr-xr-xhtml.cpp1
-rw-r--r--html/CVS/Entries1
-rw-r--r--html/CVS/Root2
-rwxr-xr-xhtml/frameset.html12
-rwxr-xr-xhtml/index.html46
-rwxr-xr-xhtml/input.html52
-rwxr-xr-xhtml/notfound.html4
-rwxr-xr-xhtml/online.html21
-rwxr-xr-xhtml/stream.html42
-rw-r--r--[-rwxr-xr-x]html/style.css45
-rwxr-xr-xmain.cpp14
-rwxr-xr-xmsgs.h11
-rwxr-xr-xpool.cpp2
-rwxr-xr-xreqp.cpp59
-rwxr-xr-xreqp.h5
-rw-r--r--s_conf.h2
-rw-r--r--s_tool.cpp28
-rw-r--r--s_tool.h1
-rwxr-xr-xsock.cpp38
-rwxr-xr-xsock.h4
-rwxr-xr-xuser.cpp23
-rwxr-xr-xuser.h7
45 files changed, 1846 insertions, 1167 deletions
diff --git a/COPYING b/COPYING
index a43ea21..a43ea21 100755..100644
--- a/COPYING
+++ b/COPYING
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////
diff --git a/CVS/Root b/CVS/Root
index a82e29e..4ab853d 100644
--- a/CVS/Root
+++ b/CVS/Root
@@ -1 +1 @@
-:pserver:anonymous@cvs.ychat.berlios.de:/cvsroot/ychat
+:pserver:volker@cvs.exa-ds.com:/home/cvsroot
diff --git a/Makefile b/Makefile
index 27a8d90..d3eaf7a 100755..100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/README b/README
index 536c6e2..d75d16c 100755
--- a/README
+++ b/README
@@ -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
diff --git a/base.cpp b/base.cpp
index ce585ea..e75a2ff 100755
--- a/base.cpp
+++ b/base.cpp
@@ -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 );
diff --git a/base.h b/base.h
index 6f06e4b..8e2492c 100755
--- a/base.h
+++ b/base.h
@@ -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]) );
}
};
diff --git a/chat.cpp b/chat.cpp
index b845ec3..2d6e681 100755
--- a/chat.cpp
+++ b/chat.cpp
@@ -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 );
diff --git a/chat.h b/chat.h
index 60bcf9d..0fbba4a 100755
--- a/chat.h
+++ b/chat.h
@@ -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
diff --git a/conf.cpp b/conf.cpp
index 3ff71b8..6e544ad 100755
--- a/conf.cpp
+++ b/conf.cpp
@@ -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
diff --git a/conf.txt b/conf.txt
index 936af92..9ca66d4 100755
--- a/conf.txt
+++ b/conf.txt
@@ -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";
diff --git a/configure b/configure
index 9aab971..8c5f0a7 100755
--- a/configure
+++ b/configure
@@ -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
new file mode 100755
index 0000000..06274c2
--- /dev/null
+++ b/gfx/y_ani_black.gif
Binary files differ
diff --git a/gfx/y_ani_white.gif b/gfx/y_ani_white.gif
new file mode 100755
index 0000000..168c937
--- /dev/null
+++ b/gfx/y_ani_white.gif
Binary files differ
diff --git a/glob.h b/glob.h
index 6f89ef1..15f9923 100755
--- a/glob.h
+++ b/glob.h
@@ -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
diff --git a/hmap.cpp b/hmap.cpp
index 662a203..ec9c37c 100644
--- a/hmap.cpp
+++ b/hmap.cpp
@@ -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++ )
diff --git a/hmap.h b/hmap.h
index 2392133..39923c7 100644
--- a/hmap.h
+++ b/hmap.h
@@ -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>
diff --git a/html.cpp b/html.cpp
index f40e466..3b9ed18 100755
--- a/html.cpp
+++ b/html.cpp
@@ -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>&nbsp;</td>
+ <td colspan=2>&nbsp;</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;
}
diff --git a/main.cpp b/main.cpp
index 08f89f8..f354907 100755
--- a/main.cpp
+++ b/main.cpp
@@ -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();
diff --git a/msgs.h b/msgs.h
index 0cf634f..19271ae 100755
--- a/msgs.h
+++ b/msgs.h
@@ -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
diff --git a/pool.cpp b/pool.cpp
index a8c1556..470ea24 100755
--- a/pool.cpp
+++ b/pool.cpp
@@ -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;
}
diff --git a/reqp.cpp b/reqp.cpp
index 894e81c..4730477 100755
--- a/reqp.cpp
+++ b/reqp.cpp
@@ -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" )
{
diff --git a/reqp.h b/reqp.h
index 399c751..e3f8540 100755
--- a/reqp.h
+++ b/reqp.h
@@ -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
diff --git a/s_conf.h b/s_conf.h
index 09c4ea7..e36c8df 100644
--- a/s_conf.h
+++ b/s_conf.h
@@ -13,7 +13,7 @@ private:
public:
static void init()
{
- obj = new conf( CONFILE );
+ obj = new conf( s_confILE );
}
static conf& get()
diff --git a/s_tool.cpp b/s_tool.cpp
index ae6357a..675daf3 100644
--- a/s_tool.cpp
+++ b/s_tool.cpp
@@ -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 )
{
diff --git a/s_tool.h b/s_tool.h
index f778c37..10d91de 100644
--- a/s_tool.h
+++ b/s_tool.h
@@ -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 );
diff --git a/sock.cpp b/sock.cpp
index fb041fb..630962b 100755
--- a/sock.cpp
+++ b/sock.cpp
@@ -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.
diff --git a/sock.h b/sock.h
index ea695c4..d477987 100755
--- a/sock.h
+++ b/sock.h
@@ -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 );
diff --git a/user.cpp b/user.cpp
index 4cda685..057b2bc 100755
--- a/user.cpp
+++ b/user.cpp
@@ -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
diff --git a/user.h b/user.h
index 75be662..d0c182f 100755
--- a/user.h
+++ b/user.h
@@ -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