diff options
| author | Paul Buetow <paul@buetow.org> | 2013-04-06 13:14:49 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2013-04-06 13:14:49 +0200 |
| commit | 5ecef758a2826bd28dd0676940cd12ef6792126f (patch) | |
| tree | 94454ed763dfbaf902eef267e1dcef0b30a0db4c | |
| parent | 5a019f435eb0068b524566d9babf172d58d0e96e (diff) | |
tagging ychat-0.4ychat-0.4
| -rw-r--r--[-rwxr-xr-x] | COPYING | 0 | ||||
| -rw-r--r-- | CVS/Entries | 78 | ||||
| -rw-r--r-- | CVS/Entries.Log | 9 | ||||
| -rw-r--r-- | CVS/Root | 2 | ||||
| -rwxr-xr-x | README | 592 | ||||
| -rwxr-xr-x | base.cpp | 54 | ||||
| -rwxr-xr-x[-rw-r--r--] | base.h | 88 | ||||
| -rwxr-xr-x[-rw-r--r--] | chat.cpp | 181 | ||||
| -rwxr-xr-x[-rw-r--r--] | chat.h | 34 | ||||
| -rwxr-xr-x[-rw-r--r--] | cmnd.cpp | 6 | ||||
| -rwxr-xr-x[-rw-r--r--] | cmnd.h | 8 | ||||
| -rw-r--r-- | cmnd/CVS/Entries | 2 | ||||
| -rw-r--r-- | cmnd/CVS/Root | 2 | ||||
| -rw-r--r-- | cmnd/yc_q.cpp | 17 | ||||
| -rw-r--r-- | cmnd/yc_test.cpp | 13 | ||||
| -rwxr-xr-x[-rw-r--r--] | conf.cpp | 71 | ||||
| -rwxr-xr-x[-rw-r--r--] | conf.h | 8 | ||||
| -rwxr-xr-x | conf.txt | 25 | ||||
| -rwxr-xr-x | configure | 1618 | ||||
| -rwxr-xr-x[-rw-r--r--] | cont.cpp | 8 | ||||
| -rwxr-xr-x[-rw-r--r--] | cont.h | 19 | ||||
| -rw-r--r-- | gfx/CVS/Root | 2 | ||||
| -rwxr-xr-x[-rw-r--r--] | glob.h | 33 | ||||
| -rw-r--r-- | hmap.cpp | 159 | ||||
| -rw-r--r-- | hmap.h | 175 | ||||
| -rwxr-xr-x[-rw-r--r--] | html.cpp | 175 | ||||
| -rwxr-xr-x[-rw-r--r--] | html.h | 40 | ||||
| -rw-r--r-- | html/CVS/Entries | 29 | ||||
| -rw-r--r-- | html/CVS/Root | 2 | ||||
| -rwxr-xr-x | html/frameset.html | 12 | ||||
| -rwxr-xr-x | html/index.html | 46 | ||||
| -rwxr-xr-x | html/input.html | 52 | ||||
| -rwxr-xr-x | html/notfound.html | 4 | ||||
| -rwxr-xr-x | html/online.html | 21 | ||||
| -rwxr-xr-x | html/stream.html | 42 | ||||
| -rw-r--r--[-rwxr-xr-x] | html/style.css | 45 | ||||
| -rwxr-xr-x[-rw-r--r--] | incl.h | 4 | ||||
| -rwxr-xr-x[-rw-r--r--] | lang.cpp | 75 | ||||
| -rwxr-xr-x[-rw-r--r--] | lang.h | 8 | ||||
| -rw-r--r-- | lang/CVS/Root | 2 | ||||
| -rw-r--r-- | logd.cpp | 65 | ||||
| -rw-r--r-- | logd.h | 25 | ||||
| -rwxr-xr-x[-rw-r--r--] | main.cpp | 71 | ||||
| -rwxr-xr-x[-rw-r--r--] | modl.cpp | 104 | ||||
| -rwxr-xr-x[-rw-r--r--] | modl.h | 16 | ||||
| -rwxr-xr-x[-rw-r--r--] | msgs.h | 9 | ||||
| -rwxr-xr-x[-rw-r--r--] | mutx.cpp | 6 | ||||
| -rwxr-xr-x[-rw-r--r--] | mutx.h | 12 | ||||
| -rwxr-xr-x[-rw-r--r--] | name.cpp | 9 | ||||
| -rwxr-xr-x[-rw-r--r--] | name.h | 22 | ||||
| -rwxr-xr-x[-rw-r--r--] | pool.cpp | 294 | ||||
| -rwxr-xr-x[-rw-r--r--] | pool.h | 89 | ||||
| -rwxr-xr-x[-rw-r--r--] | reqp.cpp | 405 | ||||
| -rwxr-xr-x[-rw-r--r--] | reqp.h | 52 | ||||
| -rwxr-xr-x[-rw-r--r--] | room.cpp | 6 | ||||
| -rwxr-xr-x[-rw-r--r--] | room.h | 28 | ||||
| -rw-r--r-- | s_chat.h | 21 | ||||
| -rw-r--r-- | s_conf.h | 21 | ||||
| -rw-r--r-- | s_html.h | 21 | ||||
| -rw-r--r-- | s_lang.h | 22 | ||||
| -rw-r--r-- | s_modl.h | 21 | ||||
| -rw-r--r-- | s_mutx.h | 21 | ||||
| -rw-r--r-- | s_sman.h | 21 | ||||
| -rw-r--r-- | s_sock.h | 21 | ||||
| -rw-r--r-- | s_tool.cpp | 159 | ||||
| -rw-r--r-- | s_tool.h | 15 | ||||
| -rw-r--r-- | sess.cpp | 30 | ||||
| -rw-r--r-- | sess.h | 20 | ||||
| -rw-r--r-- | sman.cpp | 43 | ||||
| -rw-r--r-- | sman.h | 30 | ||||
| -rwxr-xr-x[-rw-r--r--] | sock.cpp | 304 | ||||
| -rwxr-xr-x[-rw-r--r--] | sock.h | 46 | ||||
| -rwxr-xr-x[-rw-r--r--] | thrd.cpp | 5 | ||||
| -rwxr-xr-x[-rw-r--r--] | thrd.h | 19 | ||||
| -rwxr-xr-x[-rw-r--r--] | user.cpp | 175 | ||||
| -rwxr-xr-x[-rw-r--r--] | user.h | 151 |
76 files changed, 3557 insertions, 2583 deletions
diff --git a/CVS/Entries b/CVS/Entries index 6e0ccd2..ba61f67 100644 --- a/CVS/Entries +++ b/CVS/Entries @@ -1,10 +1,70 @@ -/CHANGES/1.32/Sat Mar 5 11:35:09 2005// -/COPYING/1.6/Sun Jun 27 06:32:26 2004// -/INSTALL/1.7/Fri Jul 9 22:33:20 2004// -/Makefile/1.34/Sun Feb 27 06:28:53 2005// -/NEWS/1.42/Sat Mar 5 11:36:48 2005// -/README/1.115/Sat Mar 5 11:35:09 2005// -/RELEASES/1.13/Sat Mar 5 11:35:09 2005// -/TODO/1.75/Sat Mar 5 00:15:23 2005// -/configure/1.34/Fri Mar 4 21:00:44 2005// +/COPYING/1.1/Fri Mar 28 00:27:16 2003// +/Makefile.in/1.7/Sat Apr 19 16:16:14 2003// +/README/1.2/Wed Apr 2 10:50:18 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// +/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.h/1.2/Tue Mar 25 14:54:07 2003// +/conf.txt/1.18/Sat Apr 19 16:16:14 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.5/Fri Apr 4 21:35:59 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// +/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.10/Mon Apr 7 13:18:23 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.6/Tue Mar 25 14:54:08 2003// +/pool.h/1.1/Sun Mar 23 04:55:58 2003// +/reqp.cpp/1.15/Sat Apr 19 19:39:17 2003// +/reqp.h/1.10/Fri Apr 4 15:19:11 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_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.16/Sat Apr 19 19:39:17 2003// +/sock.h/1.6/Fri Apr 4 15:19:11 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// D diff --git a/CVS/Entries.Log b/CVS/Entries.Log index ebf29e1..89d073a 100644 --- a/CVS/Entries.Log +++ b/CVS/Entries.Log @@ -1,7 +1,4 @@ -A D/bin//// -A D/docs//// -A D/etc//// +A D/cmnd//// +A D/gfx//// A D/html//// -A D/log//// -A D/scripts//// -A D/src//// +A D/lang//// @@ -1 +1 @@ -:pserver:anonymous@buetow.org:/usr/home/cvs/cvsroot +:pserver:rover@cvs.ychat.berlios.de:/cvsroot/ychat @@ -1,8 +1,7 @@ -yChat; Homepage: www.yChat.org; Version 0.7.9.2-PRERELEASE - +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,522 +15,165 @@ 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: - -0.0.0 ABOUT RELEASES -0.0.1 YCHAT FEATURES //<< -1.0.0 REQUIREMENTS -1.1.0 TESTED PLATFORMS -1.2.0 IMPORTANT NOTICES -1.3.0 HOW TO OBTAIN YCHAT -1.3.1 INSTALLATION -1.3.2 INSTALLATION QUICK-START -1.3.3 MYSQL SETUP //<< -1.4.0 HOW TO USE SCREEN WITH YCHAT -1.4.1 HOW TO USE SIGNALS WITH YCHAT -1.5.0 CUSTOMIZATION -1.6.0 FILES -1.7.0 WRITING BUG REPORTS -1.8.0 CONTACT -1.9.0 YHTTPD CODE BASE GENERATION //<< - -0.0.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. - -//<<* -0.0.1 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. - -- 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. -//*>> - -1.0.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. - -//<<* -- mysql-client 4.x (3.x may do too but is not supported) - Includes libmysqlclient and the mysql.h header files. - -//*>> -- 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. - -1.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.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. - -1.2.0 IMPORTANT NOTICES: - -Before you compile the source you have to be sure to use at least GCC -version 3.1 with pthreads enabled. ( Type gcc -v to check it ). -GCC 2.95 and 3.0 did not work while testing and WON'T BE SUPPORTED! -If you like to support yChat, please write us an email and tell what -you can/like/would help ;-]. Please also take a look at the yChat -homepage which is located at http://www.yChat.org. - -1.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/CPP-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. - -1.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. +----------------------------------------------------------------- -//<<* -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. -//*>> +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: -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): +The following platforms have been tested with success: - 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 version (shows the current version of yChat) -//<<* - gmake yhttpdbase (generates an yhttpd code base) -//*>> (See section 1.9 to read about this marks) +- FreeBSD 5.0-RELEASE, GCC 3.2.1, FreeBSD 5.0 make and GNU make 3.80 -Example: "gmake all install clean" compiles everything, installs it to PREFIX -and cleans the source directories. +- Linux Kernel 2.4.19, GCC 3.2.0, GNU make 3.79.1 -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 :-). -1.3.2 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! - - -//<<* -1.3.3 MYSQL SETUP - -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. -//*>> - -1.4.0 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 ). - -1.4.1 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 - -1.5.0 CUSTOMIZATION: +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. -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). +Files: -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. +conf.txt - The yChat configuration file. ( read by conf.cpp ). -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. +base.cpp - Encapsulates vector fields of room's or user ( may be later + hash_maps ) and provides methods for manipulating data + objects. -Exmpl: ./bin/ychat -o chat.database.password secretpassword +hmap.cpp - The hash map implementation which is a very fast data + structure. is needed for saving users, rooms and so on. -You can also use multiple words for a specific option. +main.cpp - This includes the required manager headers for starting + the server and finally regulates the correct starting. -Exmpl: ./bin/ychat -o ychat.version "word1 word2 word3" +modl.cpp - The module loader. Stores pointers of all dynamic loaded + yChat modules in a hash map object and loads new modules + if desired or returns their pointers. -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. +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. -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. +reqp.cpp - This class implements the http request parser. If a client + starts a request to the server the reqp class will be + invoked. -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 ). +room.cpp - Specifies a chat room. For each chat room an instance of + this class exists. -1.6.0 FILES: +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. -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. +user.cpp - Specifies a chat user. For each chat user an instance of + this class exists. -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) +Abstract classes: -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 +cont.cpp - All classes which need to store "key - value" data sets + inherit from this class. ( cont for content ). +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. -1.7 WRITING BUG REPORTS +As described ( main.cpp ), there are so called managers. Managers are +accessible through their assigned wrapper classes and may be +instanciated only once. -How to submit a good bug report? +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. -Send them to Bug@yChat.org. +conf.cpp - The config manager. Parses the config file specified in + glob.h and stores all the values of it in a map. -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? +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. -Getting backtrace of the crash also helps a lot, especially if yChat crashes -randomly. If after crash you see text: +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'. - "segmentation fault (core dumped)" +sock.cpp - The socket manager. Manages the socket connections. There + are multiplexed sockets. For each requests a new POSIX thread + will be created. -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: +Files written in capital letters contain static C++ classes - ulimit -c unlimited +s_chat.cpp - Static wrapper for the dynamic chat class. holds one global + reachable instance of chat until the program shuts down. -So, if you have the core file and GNU debugger (gdb), you can get the -backtrace with: +s_conf.cpp - Static wrapper for the dynamic conf class. holds one global + reachable instance of conf until the program shuts down. - gdb ./bin/ychat ychat.core - bt +s_html.cpp - Static wrapper for the dynamic html class. holds one global + reachable instance of conf until the program shuts down. -Paste all the lines starting from line having #0 at the beginning. +s_mutx.cpp - Static wrapper for the dynamic mutx class. holds one global + reachable instance of conf until the program shuts down. -Here's an example session: +s_sock.cpp - Static wrapper for the dynamic sock 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_tool.cpp - Static class which includes some usefull global reachable + methods which are not integraded in independent classes. -If you dont get such a gdb output, you need to recompile the yChat using -debuggig symbols. You can do it this way: +Special header files ( all other header files which are not listed here +belong to their respective .cpp files ): -cd ychat -gmake confdebug all run +glob.h - Defines global variables which are known by compilation + time. -1.8 CONTACT: +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. -You may contact us through the following addresses: +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. -- Homepage - The yChat homepage is located at http://www.yChat.org -- E-Mail - Paul C. Buetow: Snooper at yChat point org ( core developer ) - Volker Richter: Rover at yChat dot org ( core developer ) - Mail at yChat dot org ( reaches everybody of yChat ) - -- ICQ - Paul C. Buetow: 11655527 +The basic class structure: -- IRC - #Ychat and #Coding at irc.german-elite.net + base<room> base<user> + | | name + | | / \ + | | / \ + chat room user -//<<* -1.9.0 YHTTPD CODE BASE GENERATION + cont + / \ + / \ +conf html -See docs/yhttpd.txt -//*>> +Version Lines of code + 0.1 2402 + 0.2 2377 +New in 0.2: + - POST request now work. + - Thread pool ( pool.cpp ). + - Bugfixes @@ -1,10 +1,10 @@ /* This file is part of yChat - - $Author: buetow $ - $Date: 2005/02/27 00:34:59 $ + + $Author: snooper $ + $Date: 2003/04/02 10:50:18 $ - $Header: /usr/home/cvs/cvsroot/ychat-0.5-legacy/base.cpp,v 1.3 2005/02/27 00:34:59 buetow Exp $ + $Header: /cvsroot/ychat/ychat/base.cpp,v 1.8 2003/04/02 10:50:18 snooper Exp $ */ // template class data implementation; @@ -16,54 +16,50 @@ template<class type> base<type>::base() { - map_elem = new hmap<type*,string>(80); - pthread_mutex_init (&mut_map_elem, NULL ); + map_elem = new hmap<type*,string>(80); + pthread_mutex_init (&mut_map_elem, NULL ); } template<class type> base<type>::~base( ) { - pthread_mutex_destroy( &mut_map_elem ); + pthread_mutex_destroy( &mut_map_elem ); } -template<class type> -void +template<class type> void base<type>::add_elem( type* p_type ) { - pthread_mutex_lock ( &mut_map_elem ); - map_elem->add_elem ( p_type, p_type->get_name()); - pthread_mutex_unlock( &mut_map_elem ); + pthread_mutex_lock ( &mut_map_elem ); + map_elem->add_elem ( p_type, p_type->get_name()); + pthread_mutex_unlock( &mut_map_elem ); } -template<class type> -void +template<class type> void base<type>::del_elem( string &s_name ) { - pthread_mutex_lock ( &mut_map_elem ); - map_elem->del_elem ( s_name ); - pthread_mutex_unlock( &mut_map_elem ); + pthread_mutex_lock ( &mut_map_elem ); + map_elem->del_elem ( s_name ); + pthread_mutex_unlock( &mut_map_elem ); } -template<class type> -type* +template<class type> type* 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 ); - pthread_mutex_unlock( &mut_map_elem ); + pthread_mutex_lock ( &mut_map_elem ); + type* p_type = map_elem->get_elem( s_name ); + pthread_mutex_unlock( &mut_map_elem ); - b_found = p_type == NULL ? false : true; + b_found = p_type == NULL ? false : true; - return p_type; + return p_type; } -template<class type> -void +template<class type> void base<type>::run_func( void (*func)(type*, void*), void* v_arg ) { - pthread_mutex_lock ( &mut_map_elem ); - map_elem->run_func( func, v_arg ); - pthread_mutex_unlock( &mut_map_elem ); + pthread_mutex_lock ( &mut_map_elem ); + map_elem->run_func( func, v_arg ); + pthread_mutex_unlock( &mut_map_elem ); } #endif @@ -10,60 +10,60 @@ template<class type> class base { private: - hmap<type*,string>* map_elem; - pthread_mutex_t mut_map_elem; + hmap<type*,string>* map_elem; + pthread_mutex_t mut_map_elem; public: base(); - ~base(); + ~base(); - virtual void add_elem( type* p_type ); // 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 void add_elem( type* p_type ); // 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. - // execute func on all elements of map_elem. v_pointer is the argument. - virtual void run_func( void (*func)(type*, void*), void* v_arg ); + // execute func on all elements of map_elem. v_pointer is the argument. + virtual void run_func( void (*func)(type*, 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. - // user::msg_post sends to the user a message. - void msg_post( string *s_msg ) - { - run_func( &base<type>::msg_post_ , (void*)s_msg ); - } - static void msg_post_( type* type_obj, void* v_arg ) - { - string *p_msg = (string*) v_arg; - type_obj -> msg_post( p_msg ); - } + // chat::msg_post sends to all users of the system a message. + // room::msg_post sends to all users of the room a message. + // user::msg_post sends to the user a message. + void msg_post( string *s_msg ) + { + run_func( &base<type>::msg_post_ , (void*)s_msg ); + } + static void msg_post_( type* type_obj, void* v_arg ) + { + string *p_msg = (string*) v_arg; + type_obj -> msg_post( p_msg ); + } - void get_data( map_string *p_map_string ) - { - run_func( &base<type>::get_data_ , (void*)p_map_string ); - } - static void get_data_( type* type_obj, void* v_arg ) - { - map_string *map_params = (map_string*) v_arg; - type_obj -> get_data ( map_params ); - } + void get_data( map_string *p_map_string ) + { + run_func( &base<type>::get_data_ , (void*)p_map_string ); + } + static void get_data_( type* type_obj, void* v_arg ) + { + map_string *map_params = (map_string*) v_arg; + type_obj -> get_data ( map_params ); + } - // chat::get_user_list gets a list of all users of the system. - // room::get_user_list gets a list of all users of the room. - // user::get_user_list gets a "list" of a user <font color="usercolor">username</font>seperator - void get_user_list( string &s_list, string &s_seperator ) - { + // chat::get_user_list gets a list of all users of the system. + // room::get_user_list gets a list of all users of the room. + // user::get_user_list gets a "list" of a user <font color="usercolor">username</font>seperator + void get_user_list( string &s_list, string &s_seperator ) + { - container c; - c.elem[0] = (void*) &s_list; - c.elem[1] = (void*) &s_seperator; + container c; + c.elem[0] = (void*) &s_list; + c.elem[1] = (void*) &s_seperator; - run_func( &base<type>::get_user_list_, (void*)&c ); - } - static void get_user_list_( type* type_obj, void* v_arg ) - { - container *c = (container*) v_arg; - type_obj -> get_user_list( *((string*)c->elem[0]), *((string*)c->elem[1]) ); - } + run_func( &base<type>::get_user_list_, (void*)&c ); + } + static void get_user_list_( type* type_obj, void* v_arg ) + { + container *c = (container*) v_arg; + type_obj -> get_user_list( *((string*)c->elem[0]), *((string*)c->elem[1]) ); + } }; #include "base.cpp" @@ -12,147 +12,136 @@ using namespace std; chat::chat( ) { - if ( s_conf::get - ().get_val( "HTML" ) == "OFF" ) - b_strip_html = true; - else - b_strip_html = false; + if ( s_conf::get().get_val( "HTML" ) == "OFF" ) + b_strip_html = true; + else + b_strip_html = false; } chat::~chat( ) -{} +{ +} user* chat::get_user( string &s_user ) { - bool b_flag; - return get_user( s_user, b_flag ); + bool b_flag; + return get_user( s_user, b_flag ); } user* chat::get_user( string &s_user, bool &b_found ) { - container param; + container param; - param.elem[0] = (void*) &s_user ; - param.elem[1] = (void*) &b_found; + param.elem[0] = (void*) &s_user ; + param.elem[1] = (void*) &b_found; - b_found = false; + b_found = false; - run_func( get_user_, (void*)¶m ); + run_func( get_user_, (void*)¶m ); - if ( *( (bool*)param.elem[1] ) ) - return (user*)param.elem[2]; + if ( *( (bool*)param.elem[1] ) ) + return (user*)param.elem[2]; } void chat::get_user_( room *room_obj, void *v_arg ) { - container* param = (container*) v_arg; - param->elem[2] = (void*)room_obj->get_elem( *((string*)param->elem[0]), *((bool*)param->elem[1]) ); + container* param = (container*) v_arg; + param->elem[2] = (void*)room_obj->get_elem( *((string*)param->elem[0]), *((bool*)param->elem[1]) ); } void chat::login( map_string &map_params ) { - string s_user = map_params["nick"]; - - // prove if nick is empty: - if ( s_user.empty() ) - { - map_params["INFO"] = E_NONICK; - map_params["request"] = s_conf::get - ().get_val( "STARTMPL" ); // redirect to the startpage. - return; - } - - // prove if the nick ist alphanumeric: - else if ( ! s_tool::is_alpha_numeric( s_user ) ) - { - map_params["INFO"] = E_ALPNUM; - map_params["request"] = s_conf::get - ().get_val( "STARTMPL" ); // redirect to the startpage. - return; - } - - bool b_flag; - - // prove if nick is already online / logged in. - get_user( s_user, b_flag ); - if ( b_flag ) - { - map_params["INFO"] = E_ONLINE; - map_params["request"] = s_conf::get - ().get_val( "STARTMPL" ); - return; - } - - string s_room = map_params["room"]; - room* p_room = get_room( s_room , b_flag ); - - // if room does not exist add room to list! - if ( ! b_flag ) - { - p_room = new room( s_room ); + string s_user = map_params["nick"]; + + // prove if nick is empty: + if ( s_user.empty() ) + { + map_params["INFO"] = E_NONICK; + map_params["request"] = s_conf::get().get_val( "STARTMPL" ); // redirect to the startpage. + return; + } + + // prove if the nick ist alphanumeric: + else if ( ! s_tool::is_alpha_numeric( s_user ) ) + { + map_params["INFO"] = E_ALPNUM; + map_params["request"] = s_conf::get().get_val( "STARTMPL" ); // redirect to the startpage. + return; + } + + bool b_flag; + + // prove if nick is already online / logged in. + get_user( s_user, b_flag ); + if ( b_flag ) + { + map_params["INFO"] = E_ONLINE; + map_params["request"] = s_conf::get().get_val( "STARTMPL" ); + return; + } + + string s_room = map_params["room"]; + room* p_room = get_room( s_room , b_flag ); + + // if room does not exist add room to list! + if ( ! b_flag ) + { + p_room = new room( s_room ); #ifdef VERBOSE - - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cout << NEWROOM << s_room << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cout << NEWROOM << s_room << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); #endif + + add_elem( p_room ); + } - add_elem( p_room ); - } + user *p_user = new user( s_user ); - user *p_user = new user( s_user ); - - // 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" ) ) ) ); + // 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" ) ) ) ); #ifdef VERBOSE - - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cout << LOGINPR << s_user << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cout << LOGINPR << s_user << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); #endif } -void +void chat::post( user* p_user, map_string &map_params ) { - string s_msg( map_params["message"] ); + string s_msg( map_params["message"] ); - auto unsigned i_pos = s_msg.find( "/" ); - if ( i_pos == 0 ) - return p_user->command( s_msg ); + auto unsigned i_pos = s_msg.find( "/" ); + if ( i_pos == 0 ) + return p_user->command( s_msg ); - if ( b_strip_html ) - s_tool::strip_html( &s_msg ); + if ( b_strip_html ) + s_tool::strip_html( &s_msg ); - string s_post( "<font color=\"" ); + string s_post( "<font color=\"" ); - s_post.append( p_user->get_col1() ) - .append( "\">" ) - .append( p_user->get_name() ) - .append( ": " ) - .append( s_msg ) - .append( "</font><br>\n" ); + s_post.append( p_user->get_col1() ) + .append( "\">" ) + .append( p_user->get_name() ) + .append( ": " ) + .append( s_msg ) + .append( "</font><br>\n" ); - p_user->get_p_room()->msg_post( &s_post ); + p_user->get_p_room()->msg_post( &s_post ); } #endif @@ -17,30 +17,30 @@ using namespace std; class chat : public base<room> { private: - bool b_strip_html; + bool b_strip_html; public: + + room* get_room( string &s_name, bool &b_found ) + { + return static_cast<room*>( get_elem( s_name, b_found ) ); + } - room* get_room( string &s_name, bool &b_found ) - { - return static_cast<room*>( get_elem( s_name, b_found ) ); - } + // public methods: + explicit chat(); // a standard constructor. + ~chat(); // destructor. - // public methods: - explicit chat(); // a standard constructor. - ~chat(); // destructor. + // 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 ); - // 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 ); + // will be called every time a user tries to login. + virtual void login( map_string &map_params ); - // will be called every time a user tries to login. - virtual void login( map_string &map_params ); - - // will be called if a user posts a message. - virtual void post ( user* u_user, map_string &map_params ); + // will be called if a user posts a message. + virtual void post ( user* u_user, map_string &map_params ); }; #endif @@ -9,9 +9,11 @@ using namespace std; cmnd::cmnd( ) -{} +{ +} cmnd::~cmnd() -{} +{ +} #endif @@ -7,12 +7,12 @@ using namespace std; -class cmnd +class cmnd { public: - // public methods: - explicit cmnd( ); // a standard constructor. - ~cmnd( ); + // public methods: + explicit cmnd( ); // a standard constructor. + ~cmnd( ); }; #endif diff --git a/cmnd/CVS/Entries b/cmnd/CVS/Entries index 1784810..5f48d3a 100644 --- a/cmnd/CVS/Entries +++ b/cmnd/CVS/Entries @@ -1 +1,3 @@ +/yc_q.cpp/1.2/Wed Apr 2 21:57:34 2003// +/yc_test.cpp/1.1/Wed Apr 2 10:52:16 2003// D diff --git a/cmnd/CVS/Root b/cmnd/CVS/Root index 4ab853d..2818c02 100644 --- a/cmnd/CVS/Root +++ b/cmnd/CVS/Root @@ -1 +1 @@ -:pserver:volker@cvs.exa-ds.com:/home/cvsroot +:pserver:rover@cvs.ychat.berlios.de:/cvsroot/ychat diff --git a/cmnd/yc_q.cpp b/cmnd/yc_q.cpp index 8e48748..acc8596 100644 --- a/cmnd/yc_q.cpp +++ b/cmnd/yc_q.cpp @@ -8,15 +8,14 @@ using namespace std; -extern "C" -{ - export int extern_function(void *v_arg); +extern "C" { + export int extern_function(void *v_arg); - int extern_function(void *v_arg) - { - user *p_user = (user*) v_arg; - p_user->msg_post( new string( "<script language='JavaScript'> window.open( 'index.html', '_top' ); </script>\n " ) ); - p_user->set_online( false ); - } + int extern_function(void *v_arg) + { + user *p_user = (user*) v_arg; + p_user->msg_post( new string( "<script language='JavaScript'> window.open( 'index.html', '_top' ); </script>\n " ) ); + p_user->set_online( false ); + } } diff --git a/cmnd/yc_test.cpp b/cmnd/yc_test.cpp index c96e889..deb3e54 100644 --- a/cmnd/yc_test.cpp +++ b/cmnd/yc_test.cpp @@ -2,12 +2,11 @@ using namespace std; -extern "C" -{ - export int function(void *v_arg); +extern "C" { + export int function(void *v_arg); - int function(void *v_arg) - { - cout << "Hallo " << (char*)v_arg << endl; - } + int function(void *v_arg) + { + cout << "Hallo " << (char*)v_arg << endl; + } } @@ -10,67 +10,66 @@ using namespace std; conf::conf( string s_conf = CONFILE ) : name( s_conf ) { - parse( ); // parse the config file. + parse( ); // parse the config file. } conf::~conf() -{} +{ +} void conf::parse() { #ifdef VERBOSE - cout << CFILEOK << get_name() << endl; + cout << CFILEOK << get_name() << endl; #endif - ifstream fs_conf( get_name().c_str() ); + ifstream fs_conf( get_name().c_str() ); - if ( ! fs_conf ) - { + if ( ! fs_conf ) + { #ifdef VERBOSE - cout << CFILENO << get_name() << endl; + cout << CFILENO << get_name() << endl; #endif + return; + } - return; - } - - char c_buf[READBUF]; + char c_buf[READBUF]; - while( fs_conf.getline( c_buf, READBUF ) ) - { - string s_token( c_buf ); - unsigned int ui_pos = s_token.find( "#", 0 ); + while( fs_conf.getline( c_buf, READBUF ) ) + { + string s_token( c_buf ); + unsigned int ui_pos = s_token.find( "#", 0 ); + + // if line is commented out: + if ( ui_pos == 0 ) + continue; - // if line is commented out: - if ( ui_pos == 0 ) - continue; + ui_pos = s_token.find( ";", 0 ); - ui_pos = s_token.find( ";", 0 ); + // if token has not been found. + if ( ui_pos == string::npos ) + continue; - // if token has not been found. - if ( ui_pos == string::npos ) - continue; + s_token = s_token.substr( 0 , --ui_pos ); + ui_pos = s_token.find ( "\"", 0 ); - s_token = s_token.substr( 0 , --ui_pos ); - ui_pos = s_token.find ( "\"", 0 ); + if ( ui_pos == string::npos ) + continue; - if ( ui_pos == string::npos ) - continue; - - string s_val = s_token.substr( ui_pos+1, s_token.length() ); - string s_key = s_token.substr( 0 , --ui_pos ); + string s_val = s_token.substr( ui_pos+1, s_token.length() ); + string s_key = s_token.substr( 0 , --ui_pos ); #ifdef VERBOSE2 - - cout << s_key << "=" << s_val << endl; + cout << s_key << "=" << s_val << endl; #endif - // fill the map. - map_vals[s_key] = s_val; - } + // fill the map. + map_vals[s_key] = s_val; + } - fs_conf.close(); - fs_conf.~ifstream(); + fs_conf.close(); + fs_conf.~ifstream(); } #endif @@ -14,11 +14,11 @@ class conf : public cont, name private: public: - // public methods: - conf ( string s_conf ); // standard constructor. - ~conf(); // standard destructor. + // public methods: + conf ( string s_conf ); // standard constructor. + ~conf(); // standard destructor. - virtual void parse( ); // parses the config file. + virtual void parse( ); // parses the config file. }; #endif @@ -11,15 +11,15 @@ # all lines which do not contain a semicolon and at least two quotes # or start with a # will be ignored. # -# greets, paul c. buetow ( snooper at ychat dot org ); +# greets, paul c. buetow ( snooper@ychat.org ); # # server specific configurations ( not allowed to be removed ): HTMLTEMP="html/"; # directory of the html-template files. -THRDPOOL="1"; # Initial pool size. -THRDPMAX="52"; # Max thread pool size -SRVRPORT="3000"; # local port on which the server listens. +THRDPOOL="50"; # thread pool size. +THRDQUEU="50"; # 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 ) @@ -30,8 +30,18 @@ STARTMPL="index.html"; # user's standard nick color. USERCOL1="#FFFFFF"; +# 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. + # length of the generated session id -SESSION_LENGTH="32"; +SESSION_LENGTH="64"; # html = "OFF" strips all html tags from incoming messages HTML="OFF"; @@ -39,8 +49,7 @@ HTML="OFF"; # Logging # relative or absolute path to logfile -ACCESS_LOG="log/access_log"; - +ACCESS_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 @@ -48,7 +57,7 @@ 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 0.5.2-LEGACY - Fast Simple Extensible"; +PGETITLE="yChat++ Basic - Fast Simple Extensible"; # do not edit beyond this line @@ -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 + @@ -11,14 +11,14 @@ using namespace std; string cont::get_val( string s_key ) { - if ( map_vals.find( s_key ) != map_vals.end() ) - return map_vals[ s_key ]; - return string(); + if ( map_vals.find( s_key ) != map_vals.end() ) + return map_vals[ s_key ]; + return string(); } cont::~cont() { - map_vals.~map_string(); + map_vals.~map_string(); } #endif @@ -1,6 +1,6 @@ // class cont declaration. defines a simple data container class. -#ifndef CONT_H +#ifndef CONT_H #define CONT_H #include "incl.h" @@ -8,22 +8,19 @@ using namespace std; -class cont +class cont { protected: - map_string map_vals; + map_string map_vals; public: - cont::~cont(); + cont::~cont(); - // small inline methods: - void clear_vals() - { - map_vals.clear(); - } // removes all values. + // small inline methods: + void clear_vals() { map_vals.clear(); } // removes all values. - // public methods: - virtual string get_val( string s_key ); // get a specific map_vals value. + // public methods: + virtual string get_val( string s_key ); // get a specific map_vals value. }; #endif diff --git a/gfx/CVS/Root b/gfx/CVS/Root index 6de547b..2818c02 100644 --- a/gfx/CVS/Root +++ b/gfx/CVS/Root @@ -1 +1 @@ -:pserver:paul@internal.ath.cx:/home/cvsroot +:pserver:rover@cvs.ychat.berlios.de:/cvsroot/ychat @@ -21,15 +21,10 @@ // max length of a line read from a socket or a file ( config-file, html-template ). #define READBUF 1024 -// definition for verbosity level 0 ( normal outputs ). see vmsg.h for custumizing all +// definition for verbosity level 0 ( normal outputs ). see vmsg.h for custumizing all // 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! @@ -39,16 +34,16 @@ using namespace std; // internal rang descriptors ( their external names may be specified different ) enum rang -{ - CODER , // programmer. - ADMIN , // administrator. - MAGIC , // super user with special privileges. - SUPER , // temporary super user. - BASIC , // normal user without special privileges. - GUEST , // guest user, has almost no privileges. - RESTR , // a very restrivted user. - OUTBN // banned out of the system. -}; +{ + CODER , // programmer. + ADMIN , // administrator. + MAGIC , // super user with special privileges. + SUPER , // temporary super user. + BASIC , // normal user without special privileges. + GUEST , // guest user, has almost no privileges. + RESTR , // a very restrivted user. + OUTBN // banned out of the system. +}; // some custom typedefs for datatypes which are needed often. typedef map<string, string> map_string; @@ -56,13 +51,13 @@ typedef int function( void *v_arg ); struct container { - void* elem[3]; + void* elem[3]; }; struct dynmod { - function *the_func ; - void *the_module; + function *the_func ; + void *the_module; }; #endif @@ -12,11 +12,11 @@ int nextPrime( int n ); // Construct the hash table. template <class obj_type, class key_type> hmap<obj_type, key_type>::hmap( double mop ) - : maxOccupiedPercentage(mop), array( nextPrime( 101 ) ) + : maxOccupiedPercentage(mop), array( nextPrime( 101 ) ) { - cout << "hmap Constructor" << endl; - lookups = 0; - make_empty( ); + cout << "hmap Constructor" << endl; + lookups = 0; + make_empty( ); } // Insert item x into the hash table. If the item is @@ -24,48 +24,48 @@ hmap<obj_type, key_type>::hmap( double mop ) template <class obj_type, class key_type> void hmap<obj_type, key_type>::add_elem( const obj_type &x, const key_type &k ) { - // Insert x as active - int currentPos = findPos( k ); - if( isActive( currentPos ) ) - return; - - array[ currentPos ] = hash_entry( x, k, ACTIVE ); - // cout << "Inserted=" << x << "= at " << currentPos << endl; - if( ++occupied > array.size( ) * maxOccupiedPercentage ) - rehash( ); + // Insert x as active + int currentPos = findPos( k ); + if( isActive( currentPos ) ) + return; + + array[ currentPos ] = hash_entry( x, k, ACTIVE ); + // cout << "Inserted=" << x << "= at " << currentPos << endl; + if( ++occupied > array.size( ) * maxOccupiedPercentage ) + rehash( ); } // Expand the hash table. template <class obj_type, class key_type> void hmap<obj_type, key_type>::rehash( ) { - vector<hash_entry> oldArray = array; - - // Create new double-sized, empty table - array.resize( nextPrime( 2 * oldArray.size( ) ) ); - for( int j = 0; j < array.size( ); j++ ) - array[ j ].info = EMPTY; - - // Copy table over - make_empty( ); - for( int i = 0; i < oldArray.size( ); i++ ) - if( oldArray[ i ].info == ACTIVE ) - add_elem( oldArray[ i ].element, oldArray[ i ].key ); + vector<hash_entry> oldArray = array; + + // Create new double-sized, empty table + array.resize( nextPrime( 2 * oldArray.size( ) ) ); + for( int j = 0; j < array.size( ); j++ ) + array[ j ].info = EMPTY; + + // Copy table over + make_empty( ); + for( int i = 0; i < oldArray.size( ); i++ ) + if( oldArray[ i ].info == ACTIVE ) + add_elem( oldArray[ i ].element, oldArray[ i ].key ); } // Hash function, can only handle strings. -// If you want to hash other objects you will have to +// If you want to hash other objects you will have to // create a hash table for them template <class obj_type, class key_type> unsigned int hmap<obj_type, key_type>::hash( const string & key ) const { - unsigned int hashVal = 0; - // cout << key << "%"; + unsigned int hashVal = 0; + // cout << key << "%"; - for( size_t i = 0; i < key.size(); i++ ) - hashVal = ( hashVal << 5 ) ^ key[ i ] ^ hashVal; + for( size_t i = 0; i < key.size(); i++ ) + hashVal = ( hashVal << 5 ) ^ key[ i ] ^ hashVal; - return hashVal; + return hashVal; } // Method that performs quadratic probing resolution. @@ -73,32 +73,32 @@ unsigned int hmap<obj_type, key_type>::hash( const string & key ) const template <class obj_type, class key_type> int hmap<obj_type, key_type>::findPos( const key_type &k ) { - int collisionNum = 0; - int currentPos = hash( k ) % array.size( ); + int collisionNum = 0; + int currentPos = hash( k ) % array.size( ); + lookups++; + + while( array[ currentPos ].info != EMPTY && + array[ currentPos ].key != k ) + { + // cout << array[ currentPos ].element << "!=" << x << endl; lookups++; + currentPos += 2 * ++collisionNum - 1; // Compute ith probe - while( array[ currentPos ].info != EMPTY && - array[ currentPos ].key != k ) - { - // cout << array[ currentPos ].element << "!=" << x << endl; - lookups++; - currentPos += 2 * ++collisionNum - 1; // Compute ith probe + if( currentPos >= array.size( ) ) + currentPos -= array.size( ); + } - if( currentPos >= array.size( ) ) - currentPos -= array.size( ); - } - - // cout << currentPos << " "; - return currentPos; + // cout << currentPos << " "; + return currentPos; } // Remove item x from the hash table. template <class obj_type, class key_type> void hmap<obj_type, key_type>::del_elem( const key_type & k ) { - int currentPos = findPos( k ); - if( isActive( currentPos ) ) - array[ currentPos ].info = DELETED; + int currentPos = findPos( k ); + if( isActive( currentPos ) ) + array[ currentPos ].info = DELETED; } // Find item x in the hash table. @@ -106,46 +106,46 @@ void hmap<obj_type, key_type>::del_elem( const key_type & k ) template <class obj_type, class key_type> obj_type hmap<obj_type, key_type>::get_elem( const key_type &k ) { - int currentPos = findPos( k ); - if( isActive( currentPos ) ) - return array[ currentPos ].element; - else - return 0; + int currentPos = findPos( k ); + if( isActive( currentPos ) ) + return array[ currentPos ].element; + else + return 0; } // Make the hash table logically empty. template <class obj_type, class key_type> void hmap<obj_type, key_type>::make_empty( ) { - occupied = 0; - for( int i = 0; i < array.size( ); i++ ) - array[ i ].info = EMPTY; + occupied = 0; + for( int i = 0; i < array.size( ); i++ ) + array[ i ].info = EMPTY; } // Return true if currentPos exists and is active. template <class obj_type, class key_type> bool hmap<obj_type, key_type>::isActive( int currentPos ) const { - return array[ currentPos ].info == ACTIVE; + return array[ currentPos ].info == ACTIVE; } // Internal method to test if a positive number is prime. // Not an efficient algorithm. template <class obj_type, class key_type> -bool hmap<obj_type, key_type>::isPrime( int n ) const +bool hmap<obj_type, key_type>::isPrime( int n ) const { - if( n == 2 || n == 3 ) - return true; + if( n == 2 || n == 3 ) + return true; - else if( n == 1 || n % 2 == 0 ) - return false; + else if( n == 1 || n % 2 == 0 ) + return false; - for( int i = 3; i * i <= n; i += 2 ) - if( n % i == 0 ) - return false; + for( int i = 3; i * i <= n; i += 2 ) + if( n % i == 0 ) + return false; - return true; + return true; } // Internal method to return a prime number at least as large as n. @@ -153,30 +153,27 @@ bool hmap<obj_type, key_type>::isPrime( int n ) const template <class obj_type, class key_type> int hmap<obj_type, key_type>::nextPrime( int n ) const { - if( n % 2 == 0 ) - n++; + if( n % 2 == 0 ) + n++; - for( ; !isPrime( n ); n += 2 ) - ; + for( ; !isPrime( n ); n += 2 ); - return n; + return n; } -template<class obj_type, class key_type> -void +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 ); + 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 +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++ ) - if ( array[i].info == ACTIVE ) - ( *func ) ( array[i].element, v_arg ); + for( int i = 0; i < array.size( ); i++ ) + if ( array[i].info == ACTIVE ) + ( *func ) ( array[i].element, v_arg ); } #endif @@ -1,4 +1,4 @@ -#pragma warning(disable:4786) +#pragma warning(disable:4786) #ifndef hmap_h #define hmap_h @@ -17,105 +17,100 @@ template <class obj_type, class key_type> class hmap { private: - enum entry_type - { - ACTIVE, EMPTY, DELETED - }; - - struct hash_entry - { - obj_type element; - key_type key; - entry_type info; - - hash_entry( const obj_type &e = obj_type( ), const key_type &k = key_type( ), entry_type i = EMPTY ) : element( e ), key( k ), info( i ) - { } - } - ; - - int occupied; - - virtual bool isActive( int currentPos ) const; - virtual void rehash( ); - virtual bool isPrime ( int n ) const; - virtual int nextPrime( int n ) const; - double maxOccupiedPercentage; + enum entry_type + { + ACTIVE, EMPTY, DELETED + }; + + struct hash_entry + { + obj_type element; + key_type key; + entry_type info; + + hash_entry( const obj_type &e = obj_type( ), const key_type &k = key_type( ), entry_type i = EMPTY ) : element( e ), key( k ), info( i ) { } + }; + + int occupied; + + virtual bool isActive( int currentPos ) const; + virtual void rehash( ); + virtual bool isPrime ( int n ) const; + virtual int nextPrime( int n ) const; + double maxOccupiedPercentage; protected: - int lookups; - unsigned int hash( const string &key ) const; - vector<hash_entry> array; + int lookups; + unsigned int hash( const string &key ) const; + vector<hash_entry> array; public: - hmap( double moc ); - - virtual int findPos ( const key_type &k ); - virtual void make_empty( ); - virtual void add_elem ( const obj_type &x, const key_type &k ); - 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: - void getSize() - { - int size = 0; - for( int j = 0; j < array.size( ); j++ ) - if (array[ j ].info == ACTIVE) - size++; - return size; - }; - - int getLookups() - { - return lookups; - }; - - int getCapacity() - { - return array.size(); - }; - - double getLambda() - { - return static_cast<double>(getSize())/static_cast<double>(getCapacity()); - } - - obj_type& operator[]( key_type &k ) - { - return get_elem( k ); - } + hmap( double moc ); + + virtual int findPos ( const key_type &k ); + virtual void make_empty( ); + virtual void add_elem ( const obj_type &x, const key_type &k ); + 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: + void getSize() + { + int size = 0; + for( int j = 0; j < array.size( ); j++ ) + if (array[ j ].info == ACTIVE) + size++; + return size; + }; + + int getLookups() + { + return lookups; + }; + + int getCapacity() + { + return array.size(); + }; + + double getLambda() + { + 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> -class linearhmap : public hmap<obj_type, key_type> -{ +class linearhmap : public hmap<obj_type, key_type> { public: - linearhmap(double moc) : hmap<obj_type, key_type>(moc) - {} - ; - - virtual int findPos( const key_type &k ) - { - int collisionNum = 0; - int currentPos = hash( k ) % hmap<obj_type, key_type>::array.size( ); - hmap<obj_type, key_type>::lookups++; - - while( hmap<obj_type, key_type>::array[ currentPos ].info != hmap<obj_type, key_type>::EMPTY && - hmap<obj_type, key_type>::array[ currentPos ].key != k ) - { - hmap<obj_type, key_type>::lookups ++; - currentPos++; - - if( currentPos >= hmap<obj_type, key_type>::array.size( ) ) - currentPos -= hmap<obj_type, key_type>::array.size( ); - } - - return currentPos; + linearhmap(double moc) : hmap<obj_type, key_type>(moc) {}; + + virtual int findPos( const key_type &k ) + { + int collisionNum = 0; + int currentPos = hash( k ) % array.size( ); + lookups++; + + while( array[ currentPos ].info != EMPTY && + array[ currentPos ].key != k ) + { + lookups ++; + currentPos++; + + if( currentPos >= array.size( ) ) + currentPos -= array.size( ); } + + return currentPos; + } }; #include "hmap.cpp" @@ -12,135 +12,128 @@ using namespace std; html::html( ) { - set_name( s_conf::get - ().get_val( "HTMLTEMP" ) ); - pthread_mutex_init( &mut_map_vals, NULL ); + set_name( s_conf::get().get_val( "HTMLTEMP" ) ); + pthread_mutex_init( &mut_map_vals, NULL ); } html::~html( ) { - pthread_mutex_destroy( &mut_map_vals ); + pthread_mutex_destroy( &mut_map_vals ); } void -html::clear_cache( ) -{ - pthread_mutex_lock ( &mut_map_vals ); - clear_vals(); - pthread_mutex_unlock( &mut_map_vals ); +html::clear_cache( ) +{ + pthread_mutex_lock ( &mut_map_vals ); + clear_vals(); + pthread_mutex_unlock( &mut_map_vals ); } string -html::parse( map_string &map_params ) +html::parse( map_string &map_params ) { - string s_file = map_params["request"]; + string s_file = map_params["request"]; - // check if s_file is in the container. - pthread_mutex_lock ( &mut_map_vals ); - string s_templ = get_val( s_file ); - pthread_mutex_unlock( &mut_map_vals ); + // check if s_file is in the container. + pthread_mutex_lock ( &mut_map_vals ); + string s_templ = get_val( s_file ); + pthread_mutex_unlock( &mut_map_vals ); - // if not, read file. - if ( s_templ.empty() ) - { - auto string s_path = get_name(); - auto ifstream fs_templ( s_path.append( s_file ).c_str(), ios::binary ); + // if not, read file. + if ( s_templ.empty() ) + { + auto string s_path = get_name(); + auto ifstream fs_templ( s_path.append( s_file ).c_str(), ios::binary ); - if ( ! fs_templ ) - { - - cerr << "File not found: " << s_file << endl; - if(map_params["request"]==s_conf::get - ().get_val( "NOTFOUND" )) - return ""; - - map_params["request"] = s_conf::get - ().get_val( "NOTFOUND" ); - return parse( map_params ); - - } - - auto char c_buf; - while( !fs_templ.eof() ) - { - fs_templ.get( c_buf ); - s_templ+=c_buf; - } + if ( ! fs_templ ) + { + + cerr << "File not found: " << s_file << endl; + if(map_params["request"]==s_conf::get().get_val( "NOTFOUND" )) + return ""; + + map_params["request"] = s_conf::get().get_val( "NOTFOUND" ); + return parse( map_params ); + + } - fs_templ.close(); + auto char c_buf; + while( !fs_templ.eof() ) + { + fs_templ.get( c_buf ); + s_templ+=c_buf; + } + + fs_templ.close(); #ifdef VERBOSE - - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cout << TECACHE << s_path << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cout << TECACHE << s_path << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); #endif - // cache file. - pthread_mutex_lock ( &mut_map_vals ); - map_vals[ s_file ] = s_templ; - pthread_mutex_unlock( &mut_map_vals ); - } - - // find %%KEY%% token and substituate those. - auto unsigned int pos[2]; - pos[0] = pos[1] = 0; - - do - { - pos[0] = s_templ.find( "%%", pos[1] ); + // cache file. + pthread_mutex_lock ( &mut_map_vals ); + map_vals[ s_file ] = s_templ; + pthread_mutex_unlock( &mut_map_vals ); + } - if ( pos[0] == string::npos ) - break; + // find %%KEY%% token and substituate those. + auto unsigned int pos[2]; + pos[0] = pos[1] = 0; - pos[0] += 2; - pos[1] = s_templ.find( "%%", pos[0] ); + do + { + pos[0] = s_templ.find( "%%", pos[1] ); - if ( pos[0] == string::npos ) - break; + if ( pos[0] == string::npos ) + break; - // get key and val. - auto string s_key = s_templ.substr( pos[0], pos[1]-pos[0] ); - auto string s_val = s_conf::get - ().get_val( s_key ); + pos[0] += 2; + pos[1] = s_templ.find( "%%", pos[0] ); - // if s_val is empty use map_params. - if ( s_val.empty() ) - s_val = map_params[ s_key ]; + if ( pos[0] == string::npos ) + break; - // substituate key with val. - s_templ.replace( pos[0]-2, pos[1]-pos[0]+4, s_val ); + // get key and val. + auto string s_key = s_templ.substr( pos[0], pos[1]-pos[0] ); + auto string s_val = s_conf::get().get_val( s_key ); - // calculate the string displacement. - auto int i_dif = s_val.length() - ( pos[1] - pos[0] + 4); + // if s_val is empty use map_params. + if ( s_val.empty() ) + s_val = map_params[ s_key ]; - pos[1] += 2 + i_dif; + // substituate key with val. + s_templ.replace( pos[0]-2, pos[1]-pos[0]+4, s_val ); - } - while( true ); + // calculate the string displacement. + auto int i_dif = s_val.length() - ( pos[1] - pos[0] + 4); + + pos[1] += 2 + i_dif; + + } + while( true ); - return s_templ; + return s_templ; } void html::online_list( user *p_user, map_string &map_params ) { - // prepare user_list. - string s_list ( "" ); - string s_seperator( "<br>" ); + // prepare user_list. + string s_list ( "" ); + string s_seperator( "<br>" ); - p_user->get_p_room()->get_user_list( s_list, s_seperator ); + p_user->get_p_room()->get_user_list( s_list, s_seperator ); - // use the collected data as a message in html-templates. - map_params["MESSAGE"] = s_list; + // use the collected data as a message in html-templates. + map_params["MESSAGE"] = s_list; - // renew the timestamp. - p_user->renew_stamp(); + // renew the timestamp. + p_user->renew_stamp(); - // send a ping to the client chat stream. - p_user->msg_post( new string("\n") ); + // send a ping to the client chat stream. + p_user->msg_post( new string("\n") ); } #endif @@ -15,28 +15,28 @@ using namespace std; class html : public cont, name { private: - // needed for synchronizing the map_vals. - pthread_mutex_t mut_map_vals; +// needed for synchronizing the map_vals. + pthread_mutex_t mut_map_vals; public: - // public methods. - explicit html( ); // simple constructor. - ~html( ); - - // clears the template cache so that new html templates will be read - // from hard disk. this method is needed after changeing s.t. on - // the html-template files. - void clear_cache( ); - - // returns a parsed html-template. this method will check first if the - // required html-template exists inside the classes template cache. if not - // then the file will be read from file and added to the cache. - // afterwards the html-template will be parsed and returned. - // map_params contains the client request parameters which also will be - // used for string substituation. - virtual string parse( map_string &map_params ); - - virtual void online_list( user *p_user, map_string &map_params ); + // public methods. + explicit html( ); // simple constructor. + ~html( ); + + // clears the template cache so that new html templates will be read + // from hard disk. this method is needed after changeing s.t. on + // the html-template files. + void clear_cache( ); + + // returns a parsed html-template. this method will check first if the + // required html-template exists inside the classes template cache. if not + // then the file will be read from file and added to the cache. + // afterwards the html-template will be parsed and returned. + // map_params contains the client request parameters which also will be + // used for string substituation. + virtual string parse( map_string &map_params ); + + virtual void online_list( user *p_user, map_string &map_params ); }; #endif diff --git a/html/CVS/Entries b/html/CVS/Entries index 19aa725..12eb550 100644 --- a/html/CVS/Entries +++ b/html/CVS/Entries @@ -1,20 +1,11 @@ -/admin.html/1.3/Sun Nov 7 02:24:57 2004// -/blank.html/1.1.1.1/Fri Jan 2 03:15:10 2004// -/colors.html/1.8/Sun Nov 7 02:24:57 2004// -/demo.html/1.4/Sun Nov 7 02:24:57 2004// -/favicon.ico/1.1.1.1/Fri Jan 2 03:15:10 2004// -/frameset.html/1.5/Sun Nov 7 02:24:57 2004// -/help.html/1.8/Mon Feb 14 20:09:50 2005// -/index.html/1.11/Sun Nov 7 02:37:57 2004// -/input.html/1.12/Mon Feb 14 18:01:22 2005// -/loggedin.html/1.1/Mon Feb 14 18:01:22 2005// -/notfound.html/1.2/Sat Mar 20 21:58:14 2004// -/online.html/1.7/Wed Feb 23 05:08:04 2005// -/options.html/1.6/Sun Nov 7 02:24:57 2004// -/register.html/1.10/Sun Nov 7 02:37:57 2004// -/robots.txt/1.1.1.1/Fri Jan 2 03:15:10 2004// -/stream.html/1.6/Sat Feb 19 11:08:50 2005// -/style.css/1.4/Sat Feb 19 11:08:50 2005// -/test.cgi/1.2/Sat Sep 25 04:12:43 2004// -/urlredirect.html/1.1/Sun Nov 7 00:33:14 2004// +/blank.html/1.1.1.1/Fri Mar 21 15:54:56 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// +/notfound.html/1.1.1.1/Fri Mar 21 15:54:56 2003// +/online.html/1.2/Sun Mar 30 00:34:08 2003// +/stream.html/1.2/Sun Mar 30 00:34:08 2003// +/style.css/1.1/Sun Mar 30 11:12:49 2003// +/y_ani.gif/1.1.1.1/Fri Mar 21 15:54:56 2003// +/y_black.gif/1.1/Sun Mar 30 11:12:49 2003/-kb/ D diff --git a/html/CVS/Root b/html/CVS/Root index 745de68..2818c02 100644 --- a/html/CVS/Root +++ b/html/CVS/Root @@ -1 +1 @@ -:pserver:anonymous@buetow.org:/usr/home/cvs/cvsroot +:pserver:rover@cvs.ychat.berlios.de:/cvsroot/ychat diff --git a/html/frameset.html b/html/frameset.html index 672f8fa..fe6b973 100755 --- a/html/frameset.html +++ b/html/frameset.html @@ -1,21 +1,19 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title> - %%ychat.version%% + %%PGETITLE%% </title> </head> - <frameset boders="0" rows="*,70"> + <frameset rows="*,60"> <noframes> Your browser does not support frames, </noframes> <frameset cols="*,150"> - <frame src="stream.html?event=stream&tmpid=%%tmpid%%" name="stream"> - <frame src="online.html?event=online&tmpid=%%tmpid%%" name="online"> + <frame src="stream.html?event=stream&nick=%%nick%%&tmpid=%%tmpid%%" name="stream"> + <frame src="online.html?event=online&nick=%%nick%%&tmpid=%%tmpid%%" name="online"> </frameset> <frameset rows="*,0"> - <frame src="input.html?event=input&tmpid=%%tmpid%%" name="input"> + <frame src="input.html?event=input&nick=%%nick%%&tmpid=%%tmpid%%" name="input"> <frame src="blank.html" name="blank"> </frameset> </frameset> diff --git a/html/index.html b/html/index.html index 983e7ef..7bc01b0 100755 --- a/html/index.html +++ b/html/index.html @@ -1,54 +1,32 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title> - %%ychat.version%% + %%PGETITLE%% </title> <link rel=stylesheet href="style.css" type=text/css> </head> -<body> +<body bgcolor=#000000 text=#ffff00> <table align=center width=500> <tr> -<td> -<center> -%%ychat.version%%<br><br>%%INFO%% -</center> -</td> +<td align=center><img src="y_black.gif" alt="ychat"></td> +<td align=center class=header>%%PGETITLE%%<br>%%INFO%%</td> </tr> <tr> -<td colspan=2> </td> + <td colspan=2> </td> </tr> <tr> -<td align=center colspan=2> -<form action="frameset.html" method="POST"> + <td align=center colspan=2> +Enter your nick: +<form action="frameset.html" method="GET"> <input type="hidden" name="event" value="login"> -Enter your nick:<br> - <input class="text" type="text" name="nick" value="%%nick%%" maxlength="%%chat.maxlength.username%%" accesskey="n"> -<br> -<br> -Enter your password:<br> - <input class="text" type="password" name="password" value="%%pass%%" maxlength="%%chat.maxlength.password%%" accesskey="p"> -<br> -<br> -Enter your room:<br> - <input class="text" type="text" name="room" value="%%chat.defaultroom%%" maxlength="%%chat.maxlength.roomname%%" accesskey="r"> -<br> -<br> - <input type="hidden" name="end" value="end"> - <input type="submit" value="login" accesskey="s"> + <input type="hidden" name="room" value="%%STRDROOM%%"> + <input type="text" name="nick"> + <input type="submit" value="login"> </form> -<br> -<a class="fancy" href="register.html">Register</a> a new nick -<br> -<br> -If you don't want to register you may login -<br> -without a password using an unregistered nick. </td> </tr> </table> <br><br> -<center><span class="signature">yChat is OpenSource - get it at <a class="fancy" target="_blank" href="http://www.yChat.org">http://www.yChat.org</a></span></center> +<center><span class="signature">yChat is OpenSource - get it at <a target="_blank" href="http://www.yChat.org">http://www.yChat.org</a></span></center> </body> </html> diff --git a/html/input.html b/html/input.html index 31ed9fe..a403d8e 100755 --- a/html/input.html +++ b/html/input.html @@ -1,60 +1,34 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <head> <title> - %%HTML_TITLE_TAG_CONTENT%% + %%PGETITLE%% </title> - <link rel=stylesheet href="style.css" type=text/css> +<link rel=stylesheet href="style.css" type=text/css> + <script language="JavaScript"> <!-- function delout() { - document.input.message.value = document.input.message.value.replace(/&/g, '\\AND'); - document.input.submit(); - document.input.message.value = ""; document.input.message.focus(); + document.input.message.select(); + document.input.submit(); return false; } function selectinput() { document.input.message.select(); } - function popup(site,width,height) - { - var left = (screen.availWidth-width)/2; - var top = (screen.availHeight-height)/2; - var win = window.open(site,"_blank","width="+width+",height="+height+",left="+left+",top="+top+",scrollbars=yes"); - } - function chgscroll(f) - { - if(f.checked) - parent.stream.autoscroll(); - else - parent.stream.stopscroll(); - } //--> </script> </head> - <body> - <form method="GET" name="input" action="input.html" target="blank" onsubmit="return delout();"> - <div style="position: absolute; top: 5px;"> - <input class="text" type="text" name="message" size="60" maxlength="%%chat.maxlength.message%%"> - <input type="submit" value="Send" accesskey='s'> - <input type="button" value="Select" accesskey='e' onclick="javascript:selectinput();"> - </div> - <div style="position: absolute; top: 29px;"> - <a href='#' class="fancy" onclick="javascript:popup('colors.html?event=colors&tmpid=%%tmpid%%', 600, 480)">Colors</a> - <a href='#' class="fancy" onclick="javascript:popup('options.html?event=options&tmpid=%%tmpid%%', 600, 480)">Options</a> - <a href='#' class="fancy" onclick="javascript:popup('help.html?event=help&tmpid=%%tmpid%%', 600, 480)">Help</a> - <a href='#' class="fancy" onclick="javascript:popup('loggedin.html?event=loggedin&tmpid=%%tmpid%%', 600, 480)">Users</a> - <a href='#' class="fancy" onclick="javascript:popup('admin.html?event=admin&tmpid=%%tmpid%%', 600, 480)">Admin</a> - <a href='input.html?event=input&tmpid=%%tmpid%%&message=%2Fq' class="fancy" target='blank'>Logout</a> - Scrolling: - <input type="checkbox" name="scroll" checked onClick="chgscroll(this);"> - </div> - <input type="hidden" name="event" value="input"> + <body bgcolor=#000000 text=#ffffff> + <form name="input" action="input.html" target="blank" onsubmit="return delout();"> + <input type="hidden" name="event" value="post"> + <input type="hidden" name="nick" value="%%nick%%"> <input type="hidden" name="tmpid" value="%%tmpid%%"> + <input type="text" name="message" size="50"> + <input type="submit" value="send"> + <input type="button" value="select" onclick="javascript:selectinput();"> </form> </body> </html> diff --git a/html/notfound.html b/html/notfound.html index a14d44b..574e341 100755 --- a/html/notfound.html +++ b/html/notfound.html @@ -1,9 +1,7 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title> - %%HTML_TITLE_TAG_CONTENT%% + %%PGETITLE%% </title> </head> <body> diff --git a/html/online.html b/html/online.html index 3eda553..aa14f8d 100755 --- a/html/online.html +++ b/html/online.html @@ -1,20 +1,7 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> -<head> - <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> - <link rel=stylesheet href="style.css" type=text/css> - </head> - <body> - <b>%%room%%</b> - <br> - <br> - <table> - <tr> - <td> - %%topic%% - </td> - </tr> - %%userlist%% - </table> + <meta http-equiv="refresh" content="20"> +<link rel=stylesheet href="style.css" type=text/css> + <body bgcolor=#000000 text=#ffffff> + %%MESSAGE%% </body> </html> diff --git a/html/stream.html b/html/stream.html index ed08a23..6678069 100755 --- a/html/stream.html +++ b/html/stream.html @@ -1,38 +1,30 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> + <head> <title> - %%HTML_TITLE_TAG_CONTENT%% + %%PGETITLE%% </title> <link rel=stylesheet href="style.css" type=text/css> <script language="JavaScript"> - var scrolling; - var ison; - function autoscroll() + function autoScroll() { - if(!ison){ - scrolling = window.setInterval("window.scroll(1,1606682)",70); - ison = true; - } + window.scroll(1, 50000 ); + timer = setTimeout('autoScroll()',200); } - function stopscroll() + + autoScroll(); + + function stopScroll() { - if(ison) - { - window.clearInterval(scrolling); - ison = false; - } + clearTimeout(timer); + } + + function startScroll() + { + timer = setTimeout('autoScroll()', 200); } </script> </head> -<body class="stream"> -<h1>Engine: %%ychat.version%%</h2> -<script language="JavaScript"> - autoscroll(); -</script> - - Welcome to the chat, %%nick%%! +<body bgcolor=#000000 text=#ffffff> + Welcome to yChat %%nick%%! <br> <br> - diff --git a/html/style.css b/html/style.css index 4b6d9ca..e31bd7e 100755..100644 --- a/html/style.css +++ b/html/style.css @@ -1,48 +1,11 @@ -body, div { +BODY, TD { font-family: Verdana, Helvetica, sans-serif; - background-color: #000000; - color: #FFFFEF; font-size: 11pt; } - -input { - color: #000000; - font-family: Verdana, Helvetica, sans-serif; - text-decoration: none; - font-size: 9pt; - padding: 2px; -} - -input.text { - background-color: #FFFFEF; -} - -.fancy { - font-family: Verdana, Helvetica, sans-serif; - font-size: 9pt; - color: #FFFFEF; - padding: 2px; -} - -a:hover.fancy { - text-decoration: none; - color: #FFFFEF; - background-color: #000000; -} - -h1 { - background-color: #ffa500; - border: solid #000000 1px; - font-size: 20pt; - padding: 13px; - font-width: bold; -} - -body.stream { - background-color: #323232; +A { + color: #dddddd; } - .signature { - color: #AAAAAA; + color: #dddddd; font-size: 9pt; } @@ -1,6 +1,6 @@ // contains header files which are included by all classes. -// include some std headers. +// include some std headers. #include <iostream> // since thread synchronization is a big issue this header needs @@ -12,5 +12,5 @@ // include all the custom global variables. #include "glob.h" -// include all the custom messages. +// include all the custom messages. #include "msgs.h" @@ -10,70 +10,69 @@ using namespace std; lang::lang( string s_lang = "en" ) : name( s_lang ) { - parse( ); // parse the config file. + parse( ); // parse the config file. } lang::~lang() -{} +{ +} void lang::parse() { #ifdef VERBOSE - cout << CFILEOK << get_name() << endl; + cout << CFILEOK << get_name() << endl; #endif - string filename("lang/"); - filename.append(get_name()); + string filename("lang/"); + filename.append(get_name()); - ifstream fs_conf( filename.c_str() ); + ifstream fs_conf( filename.c_str() ); - if ( ! fs_conf ) - { + if ( ! fs_conf ) + { #ifdef VERBOSE - cout << CFILENO << get_name() << endl; + cout << CFILENO << get_name() << endl; #endif + return; + } - return; - } - - char c_buf[READBUF]; + char c_buf[READBUF]; - while( fs_conf.getline( c_buf, READBUF ) ) - { - string s_token( c_buf ); - unsigned int ui_pos = s_token.find( "#", 0 ); + while( fs_conf.getline( c_buf, READBUF ) ) + { + string s_token( c_buf ); + unsigned int ui_pos = s_token.find( "#", 0 ); + + // if line is commented out: + if ( ui_pos == 0 ) + continue; - // if line is commented out: - if ( ui_pos == 0 ) - continue; + ui_pos = s_token.find( ";", 0 ); - ui_pos = s_token.find( ";", 0 ); + // if token has not been found. + if ( ui_pos == string::npos ) + continue; - // if token has not been found. - if ( ui_pos == string::npos ) - continue; + s_token = s_token.substr( 0 , --ui_pos ); + ui_pos = s_token.find ( "\"", 0 ); - s_token = s_token.substr( 0 , --ui_pos ); - ui_pos = s_token.find ( "\"", 0 ); + if ( ui_pos == string::npos ) + continue; - if ( ui_pos == string::npos ) - continue; - - string s_val = s_token.substr( ui_pos+1, s_token.length() ); - string s_key = s_token.substr( 0 , --ui_pos ); + string s_val = s_token.substr( ui_pos+1, s_token.length() ); + string s_key = s_token.substr( 0 , --ui_pos ); #ifdef VERBOSE2 - - cout << s_key << "=" << s_val << endl; + cout << s_key << "=" << s_val << endl; #endif - // fill the map. - map_vals[s_key] = s_val; - } + // fill the map. + map_vals[s_key] = s_val; + } - fs_conf.close(); - fs_conf.~ifstream(); + fs_conf.close(); + fs_conf.~ifstream(); } #endif @@ -14,11 +14,11 @@ class lang : public cont, name private: public: - // public methods: - lang ( string s_lang ); // standard constructor. - ~lang(); // standard destructor. + // public methods: + lang ( string s_lang ); // standard constructor. + ~lang(); // standard destructor. - virtual void parse( ); // parses the config file. + virtual void parse( ); // parses the config file. }; #endif diff --git a/lang/CVS/Root b/lang/CVS/Root index a82e29e..2818c02 100644 --- a/lang/CVS/Root +++ b/lang/CVS/Root @@ -1 +1 @@ -:pserver:anonymous@cvs.ychat.berlios.de:/cvsroot/ychat +:pserver:rover@cvs.ychat.berlios.de:/cvsroot/ychat @@ -5,58 +5,57 @@ logd::logd( string filename ) { - if(filename.empty()) - { - cerr << "ycLog: No filename specified" << endl; - exit(1); - } + if(filename.empty()) + { + cerr << "ycLog: No filename specified" << endl; + exit(1); + } + + s_logfile=filename; - s_logfile=filename; - - i_lines=s_tool::string2int( s_conf::get - ().get_val("LOG_LINES")); + i_lines=s_tool::string2int( s_conf::get().get_val("LOG_LINES")); } void logd::flush() { - s_output.open(s_logfile.c_str(), ios::app); + s_output.open(s_logfile.c_str(), ios::app); - if(s_output==NULL) - { - cerr << "ycLog: Could not open file: " << s_logfile << endl; - exit(1); - } + if(s_output==NULL) + { + cerr << "ycLog: Could not open file: " << s_logfile << endl; + exit(1); + } - while(!s_queue.empty()) - { - string s_l=s_queue.front(); - s_queue.pop(); - s_output.write(s_l.c_str(), s_l.size()); + while(!s_queue.empty()) + { + string s_l=s_queue.front(); + s_queue.pop(); + s_output.write(s_l.c_str(), s_l.size()); - } - s_output.close(); + } + s_output.close(); } void logd::log( map_string request ) { - struct tm *t_m; - time_t t_cur=time(NULL); - t_m=gmtime(&t_cur); + struct tm *t_m; + time_t t_cur=time(NULL); + t_m=gmtime(&t_cur); - char buffer[100]; - strftime(buffer, 100, "[%d/%b/%Y:%H:%M:%S %z]", t_m); - string s_time=buffer; - string s_logstr = request["REMOTE_ADDR"] + " - - "+s_time+" \"" + request["QUERY_STRING"]+"\" 200 0 \""+request["request"]+"\" \""+request["User-Agent"]+"\"\n"; + char buffer[100]; + strftime(buffer, 100, "[%d/%b/%Y:%H:%M:%S %z]", t_m); + string s_time=buffer; + string s_logstr = request["REMOTE_ADDR"] + " - - "+s_time+" \"" + request["QUERY_STRING"]+"\" 200 0 \""+request["request"]+"\" \""+request["User-Agent"]+"\"\n"; - s_queue.push(s_logstr); + s_queue.push(s_logstr); - if(s_queue.size()>=i_lines) - flush(); + if(s_queue.size()>=i_lines) + flush(); } logd::~logd() { - flush(); + flush(); } @@ -7,19 +7,18 @@ #include <fstream> #include <queue> #include <time.h> -class logd -{ +class logd { -private: - string s_logfile; - queue<string> s_queue; - ofstream s_output; - int i_lines; -public: - logd( string filename ); - ~logd(); - - void flush(); - void log( map_string request ); + private: + string s_logfile; + queue<string> s_queue; + ofstream s_output; + int i_lines; + public: + logd( string filename ); + ~logd(); + + void flush(); + void log( map_string request ); }; #endif @@ -1,7 +1,6 @@ /* * yChat++; Contact: www.yChat.org; Mail@yChat.org * Copyright (C) 2003 Paul C. Buetow, Volker Richter - * Copyright (C) 2005 Paul C. Buetow * ----------------------------------------------------------------- * * This program is free software; you can redistribute it and/or @@ -56,46 +55,44 @@ int main() { #ifdef VERBOSE - cout << " ___ _ _ " << endl - << " _ _ / __\\ |__ __ _| |_ " << endl - << "| | | |/ / | '_ \\ / _` | __|" << endl - << "| |_| / /___| | | | (_| | |_ " << endl - << " \\__, \\____/|_| |_|\\__,_|\\__|" << endl - << " |___/ " << endl << endl - - << DESCRIP << endl - << VERSION << ", " - << CONTACT << endl - << SEPERAT << endl - << STARTMS << endl ; +cout << " ___ _ _ " << endl + << " _ _ / __\\ |__ __ _| |_ " << endl + << "| | | |/ / | '_ \\ / _` | __|" << endl + << "| |_| / /___| | | | (_| | |_ " << endl + << " \\__, \\____/|_| |_|\\__,_|\\__|" << endl + << " |___/ " << endl << endl + + << DESCRIP << endl + << VERSION << ", " + << CONTACT << endl + << SEPERAT << endl + << STARTMS << endl ; #endif - // ignore SIGPIPE. otherwise the server will shut down with "Broken pipe" if - // a client unexpected disconnects himself from a SOCK_STREAM. - signal( SIGPIPE, SIG_IGN ); - - // all the static data classes have to be initialized once. otherwise they will - // contain only empty pointers and the chat server won't work correctly. - // the order of the initializations is very importand. for example the s_html::init() - // invokations assumes an initialized s_conf class. - 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(); + // ignore SIGPIPE. otherwise the server will shut down with "Broken pipe" if + // a client unexpected disconnects himself from a SOCK_STREAM. + signal( SIGPIPE, SIG_IGN ); + + // all the static data classes have to be initialized once. otherwise they will + // contain only empty pointers and the chat server won't work correctly. + // the order of the initializations is very importand. for example the s_html::init() + // invokations assumes an initialized s_conf class. + 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(); #ifdef VERBOSE - - cout << DOWNMSG << endl; + cout << DOWNMSG << endl; #endif - return 0; + return 0; } @@ -15,90 +15,84 @@ using namespace std; modl::modl( ) { - map_mods = new hmap<dynmod*,string>(80); - pthread_mutex_init( &mut_map_mods, NULL ); + map_mods = new hmap<dynmod*,string>(80); + pthread_mutex_init( &mut_map_mods, NULL ); } modl::~modl() { - pthread_mutex_lock ( &mut_map_mods ); + pthread_mutex_lock ( &mut_map_mods ); - // dlclose all the_module's first! - map_mods->run_func ( &modl::dlclose_ ); + // dlclose all the_module's first! + map_mods->run_func ( &modl::dlclose_ ); - // then clean the hash map. - map_mods->make_empty ( ); + // then clean the hash map. + map_mods->make_empty ( ); - pthread_mutex_unlock ( &mut_map_mods ); - pthread_mutex_destroy( &mut_map_mods ); + pthread_mutex_unlock ( &mut_map_mods ); + pthread_mutex_destroy( &mut_map_mods ); } void modl::dlclose_( dynmod* mod ) { - dlclose( mod->the_module ); + dlclose( mod->the_module ); } dynmod* modl::cache_module( string s_name ) { - void *the_module = NULL; - function *the_func = NULL; - - the_module = dlopen( s_name.c_str(), RTLD_NOW ); - - if ( the_module == NULL ) - { - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cerr << "dlerror: " << dlerror() << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); - return NULL; - } - - the_func = (function*) dlsym( the_module, "extern_function" ); - - if ( the_func == NULL ) - { - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cerr << "dlerror: " << dlerror() << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); - return NULL; - } + void *the_module = NULL; + function *the_func = NULL; + + the_module = dlopen( s_name.c_str(), RTLD_NOW ); + + if ( the_module == NULL ) + { + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cerr << "dlerror: " << dlerror() << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + return NULL; + } + + the_func = (function*) dlsym( the_module, "extern_function" ); + + if ( the_func == NULL ) + { + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cerr << "dlerror: " << dlerror() << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + return NULL; + } #ifdef VERBOSE - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cout << MODULEC << s_name << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cout << MODULEC << s_name << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); #endif - dynmod *mod = new dynmod; // encapsulates the function and module handler. - mod->the_func = the_func ; // the function to execute - mod->the_module = the_module; // the module handler to close if function - // is not needed anymore. - pthread_mutex_lock ( &mut_map_mods ); - map_mods->add_elem ( mod, s_name ); - pthread_mutex_unlock( &mut_map_mods ); + dynmod *mod = new dynmod; // encapsulates the function and module handler. + mod->the_func = the_func ; // the function to execute + mod->the_module = the_module; // the module handler to close if function + // is not needed anymore. + pthread_mutex_lock ( &mut_map_mods ); + map_mods->add_elem ( mod, s_name ); + pthread_mutex_unlock( &mut_map_mods ); - // DO NOT CLOSE AS LONG THERE EXIST A POINTER TO THE FUNCTION - // dlclose( module ); +// DO NOT CLOSE AS LONG THERE EXIST A POINTER TO THE FUNCTION +// dlclose( module ); - return mod; + return mod; } dynmod* modl::get_module( string s_name ) { - pthread_mutex_lock ( &mut_map_mods ); - dynmod* mod = map_mods->get_elem( s_name ); - pthread_mutex_unlock( &mut_map_mods ); + pthread_mutex_lock ( &mut_map_mods ); + dynmod* mod = map_mods->get_elem( s_name ); + pthread_mutex_unlock( &mut_map_mods ); - return ! mod ? cache_module( s_name ) : mod; + return ! mod ? cache_module( s_name ) : mod; } #endif @@ -9,20 +9,20 @@ using namespace std; -class modl +class modl { private: - hmap<dynmod*,string>* map_mods; - pthread_mutex_t mut_map_mods; + hmap<dynmod*,string>* map_mods; + pthread_mutex_t mut_map_mods; - static void dlclose_( dynmod* mod ); - dynmod* cache_module ( string s_name ); + static void dlclose_( dynmod* mod ); + dynmod* cache_module ( string s_name ); public: - modl(); - ~modl(); + modl(); + ~modl(); - dynmod* get_module ( string s_name ); + dynmod* get_module ( string s_name ); }; @@ -17,14 +17,11 @@ #define CFILENO "Failed opening config file " #define CONNECT "Receiving connection " #define CONTACT "Contact: www.yChat.org, Mail@yChat.org " -#define DESCRIP "yChat; Copyright (C) 2003 Paul C. Buetow, Volker Richer\n(C) 2005 Paul C. Buetow" +#define DESCRIP "yChat++ Copyright (C) 2003 Paul C. Buetow, Volker Richer " #define DOWNMSG "Shutting down " -#define LOGINPR "Login procedure succeeded for nick " +#define LOGINPR "Login procedure succeeded for nick " #define MODULEC "Caching module " #define NEWROOM "Adding room " -#define POOLER1 "Pool: Did not allocate all threads (" -#define POOLER2 "Pool: Max pool size reached (" -#define POOLFLL "Pool: Allocating new threads (" #define REQUEST "Request string " #define SEPERAT "----------------------------------------- " #define SOCKCRT "Creating server socket " @@ -34,6 +31,6 @@ #define TECACHE "Caching template " #define THREADS "Starting thread job " #define THREADE "Exiting thread job " -#define VERSION "Version: yChat 0.5.2-LEGACYRELEASE" +#define VERSION "Version: 0.4" #endif @@ -1,4 +1,4 @@ -// class mutx implementation. +// class mutx implementation. #ifndef s_mutx_CXX #define s_mutx_CXX @@ -9,12 +9,12 @@ using namespace std; mutx::mutx() { - pthread_mutex_init( &mut_stdout, NULL ); + pthread_mutex_init( &mut_stdout, NULL ); } mutx::~mutx() { - pthread_mutex_destroy( &mut_stdout ); + pthread_mutex_destroy( &mut_stdout ); } #endif @@ -7,15 +7,15 @@ using namespace std; -class mutx +class mutx { public: - // this mutex is needed for sync stdout and sdterr of different threads. - pthread_mutex_t mut_stdout; + // this mutex is needed for sync stdout and sdterr of different threads. + pthread_mutex_t mut_stdout; - // public methods. - explicit mutx( ); // simple constructor. - ~mutx( ); // simple constructor. + // public methods. + explicit mutx( ); // simple constructor. + ~mutx( ); // simple constructor. }; #endif @@ -9,22 +9,23 @@ using namespace std; name::name( string s_name ) { - set_name( s_name ); + set_name( s_name ); } name::~name() -{} +{ +} string name::get_name() const { - return s_name; + return s_name; } void name::set_name( string s_name ) { - this->s_name = s_name; + this->s_name = s_name; } @@ -7,23 +7,21 @@ using namespace std; -class name +class name { protected: - // private members: - string s_name; // object's name. - + // private members: + string s_name; // object's name. + public: - virtual string get_name ( ) const; - virtual void set_name ( string s_name ); + virtual string get_name ( ) const; + virtual void set_name ( string s_name ); - // public methods: - explicit name( ) - { } - ; // a standard constructor. - explicit name( string s_name ); // a standard constructor. - ~name( ); + // public methods: + explicit name( ) { }; // a standard constructor. + explicit name( string s_name ); // a standard constructor. + ~name( ); }; @@ -1,144 +1,153 @@ -#ifndef POOL_CPP -#define POOL_CPP +// class pool implementation. + +#ifndef POOL_CXX +#define POOL_CXX #include "pool.h" +#include "s_conf.h" +#include "s_mutx.h" +#include "s_tool.h" +#include "thrd.h" + using namespace std; pool::pool() { - pthread_mutex_init(&mut_threads, 0); - pthread_mutex_init(&mut_queue_tasks, 0); - pthread_mutex_init(&mut_num_avail_threads, 0); - pthread_cond_init(&cond_new_task, 0); - - i_num_total_threads = 0; - i_num_avail_threads = s_tool::string2int( s_conf::get - ().get_val( "THRDPOOL" ) ); - increase_pool(i_num_avail_threads); + i_thrd_pool_size = s_tool::string2int( s_conf::get().get_val( "THRDPOOL" ) ); + i_thrd_pool_queue = s_tool::string2int( s_conf::get().get_val( "THRDQUEU" ) ); + + tpool_init( &thread_pool, i_thrd_pool_size, i_thrd_pool_queue, 0 ); } pool::~pool() { - pthread_mutex_lock(&mut_queue_tasks); - while (!queue_tasks.empty()) - { - delete queue_tasks.front(); - queue_tasks.pop(); - } - pthread_mutex_unlock(&mut_queue_tasks); - - pthread_mutex_destroy(&mut_threads); - pthread_mutex_destroy(&mut_queue_tasks); - pthread_mutex_destroy(&mut_num_avail_threads); - pthread_cond_destroy(&cond_new_task); + // tpool_destroy ... } -int -pool::increase_pool(int i_num) +void +pool::tpool_init( tpool_t *tpoolp, int num_worker_threads, int max_queue_size, int do_not_block_when_full ) { -#ifdef VERBOSE - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cout << POOLFLL + s_tool::int2string(i_num) +","+s_tool::int2string(i_num_total_threads)+")" << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); -#endif + int i, rtn; + tpool_t tpool; + + // allocate a pool data structure + if (( tpool = (tpool_t) malloc( sizeof( struct tpool ) ) ) == NULL ) + { + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cerr << "malloc" << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + exit(-1); + } + + // initialize th fields + tpool->num_threads = num_worker_threads; + tpool->max_queue_size = max_queue_size; + tpool->do_not_block_when_full = do_not_block_when_full; + + if ( ( tpool->threads = (pthread_t*) malloc( sizeof( pthread_t ) *num_worker_threads ) ) == NULL ) + { + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cerr << "malloc" << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + exit(-1); + } + + tpool->cur_queue_size = 0; + tpool->queue_head = NULL; + tpool->queue_tail = NULL; + tpool->queue_closed = 0; + tpool->shutdown = 0; + + if ( ( rtn = pthread_mutex_init( &(tpool->queue_lock), NULL ) ) != 0 ) + { + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cerr << "pthread_mutex_init " << strerror( rtn ) << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + exit(-1); + } + + else if ( ( rtn = pthread_cond_init( &(tpool->queue_not_empty), NULL ) ) != 0 ) + { + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cerr << "pthread_cond_init " << strerror( rtn ) << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + exit(-1); + } + + else if ( ( rtn = pthread_cond_init( &(tpool->queue_not_full), NULL ) ) != 0 ) + { + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cerr << "pthread_cond_init " << strerror( rtn ) << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + exit(-1); + } + + else if ( ( rtn = pthread_cond_init( &(tpool->queue_empty), NULL ) ) != 0 ) + { + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cerr << "pthread_cond_init " << strerror( rtn ) << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); + exit(-1); + } + // create threads + for ( i = 0; i < num_worker_threads; i++ ) + pthread_create( &(tpool->threads[i]) , NULL, tpool_thread, (void*)tpool ); + + *tpoolp = tpool; +} - int i_max_pool_size = s_tool::string2int( s_conf::get - ().get_val( "THRDPMAX" ) ); +void* +pool::tpool_thread( void* arg ) +{ + tpool_t tpool = (tpool_t) arg; + tpool_work_t *my_workp; - for ( int i = 0; i < i_num; ++i ) - { - if ( i_max_pool_size != 0 && i_num_total_threads >= i_max_pool_size ) - { -#ifdef VERBOSE - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cout << POOLER2+s_tool::int2string(i_max_pool_size)+")" << endl; - cout << POOLER1+s_tool::int2string(i)+")" << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); -#endif + while( true ) + { + pthread_mutex_lock( &(tpool->queue_lock) ); - return i; - } + while ( (tpool->cur_queue_size == 0) && (!tpool->shutdown) ) + pthread_cond_wait( &(tpool->queue_not_empty), &(tpool->queue_lock) ); - ++i_num_total_threads; - pthread_t p_pthread; - pthread_create(&p_pthread, 0, wait_for_task, (void*) this ); + if (tpool->shutdown) + { + pthread_mutex_unlock( &(tpool->queue_lock) ); + pthread_exit( NULL ); } - return i_num; -} - -void -pool::add_task( void(*p_func)(void*), void* p_void ) -{ - pthread_mutex_lock(&mut_queue_tasks); - queue_tasks.push(new task(p_func, p_void)); - pthread_mutex_unlock(&mut_queue_tasks); + my_workp = tpool->queue_head; + tpool->cur_queue_size--; - pthread_cond_signal(&cond_new_task); + if ( tpool->cur_queue_size == 0) + tpool->queue_head = tpool->queue_tail = NULL; -} + else + tpool->queue_head = my_workp->next; -void* -pool::wait_for_task( void* p_void ) -{ - pool* p_pool = static_cast<pool*>(p_void); - - for (;;) - { - pthread_mutex_lock(&p_pool->mut_threads); - pthread_cond_wait(&p_pool->cond_new_task, &p_pool->mut_threads); - - pthread_mutex_lock(&p_pool->mut_num_avail_threads); - if ( --p_pool->i_num_avail_threads < 5 ) - { - int i_size = 9 - p_pool->i_num_avail_threads; - i_size = p_pool->increase_pool(i_size); - p_pool->i_num_avail_threads += i_size; - } - pthread_mutex_unlock(&p_pool->mut_num_avail_threads); - - pthread_mutex_lock(&p_pool->mut_queue_tasks); - task* p_task = p_pool->queue_tasks.front(); - p_pool->queue_tasks.pop(); - pthread_mutex_unlock(&p_pool->mut_queue_tasks); - - pthread_mutex_unlock(&p_pool->mut_threads); - - (*(p_task->p_func))(p_task->p_void); - delete p_task; - - pthread_mutex_lock(&p_pool->mut_num_avail_threads); - p_pool->i_num_avail_threads++; - pthread_mutex_unlock(&p_pool->mut_num_avail_threads); - } + if ( ( ! tpool->do_not_block_when_full ) && + ( tpool->cur_queue_size == ( tpool->max_queue_size - 1 ) ) ) + pthread_cond_signal( &(tpool->queue_not_full) ); - return 0; -} + if ( tpool->cur_queue_size == 0 ) + pthread_cond_signal( &(tpool->queue_empty) ); -void -pool::run(void* p_void) -{ - add_task(run_func, p_void); + pthread_mutex_unlock( &(tpool->queue_lock) ); + (*(my_workp->routine))(my_workp->arg); + free((void*)my_workp); + } } -void -pool::run_func(void *p_void) +void pool::run_func( void *v_pointer ) { #ifdef VERBOSE - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); cout << THREADS << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); #endif // recasting the client thread object. - thrd *t = (thrd*) p_void; + thrd *t = (thrd*) v_pointer; // start parsing the client request and sending response's back. t-> run (); @@ -146,35 +155,60 @@ pool::run_func(void *p_void) // close the client socket. t->~thrd(); - free(p_void); + free(v_pointer); #ifdef VERBOSE - - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); cout << THREADE << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); #endif } -bool -pool::allow_user_login() +int +pool::tpool_add_work( tpool_t tpool, void(*routine)(void*), void* arg ) /// { - pthread_mutex_lock(&mut_num_avail_threads); - if ( i_num_avail_threads < 2 ) - { - int i_max_pool_size = s_tool::string2int( s_conf::get - ().get_val( "THRDPMAX" ) ); - if ( i_max_pool_size != 0 && i_max_pool_size == i_num_total_threads ) - { - pthread_mutex_unlock(&mut_num_avail_threads); - return false; - } - } - pthread_mutex_unlock(&mut_num_avail_threads); - - return true; + tpool_work_t *workp; + pthread_mutex_lock( &(tpool->queue_lock) ); + + if( ( tpool->cur_queue_size == tpool->max_queue_size ) && + tpool->do_not_block_when_full ) + { + pthread_mutex_unlock( &(tpool->queue_lock) ); + return -1; + } + + while( ( tpool->cur_queue_size == tpool->max_queue_size ) && + ( ! ( tpool->shutdown || tpool->queue_closed ) ) ) + pthread_cond_wait( &(tpool->queue_not_full), &(tpool->queue_lock) ); + + if( tpool->shutdown || tpool->queue_closed ) + { + pthread_mutex_unlock( &tpool->queue_lock ); + return -1; + } + + // allocate work structure: + workp = (tpool_work_t*) malloc( sizeof( tpool_work_t ) ); + + workp->routine = routine; + workp->arg = arg; + workp->next = NULL; + + if( tpool->cur_queue_size == 0 ) + { + tpool->queue_tail = tpool->queue_head = workp; + pthread_cond_signal( &(tpool->queue_not_empty) ); + } + + else + { + tpool->queue_tail->next = workp; + tpool->queue_tail = workp; + } + + tpool->cur_queue_size++; + pthread_mutex_unlock( &(tpool->queue_lock) ); + return 1; } #endif @@ -1,52 +1,77 @@ -#include "incl.h" -#include "thrd.h" -#include "s_tool.h" -#include "s_conf.h" -#include "s_mutx.h" +// class pool declaration. #ifndef POOL_H #define POOL_H -#include <queue> +#include "incl.h" using namespace std; -class pool +class pool { private: - struct task - { - void(*p_func)(void*); - void *p_void; + typedef struct tpool_work + { + void (*routine)(void*); /// + void *arg; + struct tpool_work *next; + } + tpool_work_t; + + typedef struct tpool + { + // pool characteristics: + int num_threads; + int max_queue_size; + int do_not_block_when_full; + + // pool state + pthread_t *threads; + int cur_queue_size; + + tpool_work_t *queue_head; + tpool_work_t *queue_tail; + + pthread_mutex_t queue_lock; + pthread_cond_t queue_not_empty; + pthread_cond_t queue_not_full; + pthread_cond_t queue_empty; + + int queue_closed; + int shutdown; + } + *tpool_t; + + int i_thrd_pool_size; + int i_thrd_pool_queue; + + tpool_t thread_pool; - task(void(*p_func)(void*), void *p_void) - { - this->p_func = p_func; - this->p_void = p_void; - } - }; + virtual void + tpool_init( tpool_t *tpoolp, int num_worker_threads, int max_queue_size, int do_not_block_when_full ); - pthread_mutex_t mut_threads; - pthread_mutex_t mut_queue_tasks; - pthread_mutex_t mut_num_avail_threads; - pthread_cond_t cond_new_task; + virtual int + tpool_add_work( tpool_t tpool, void(*routine)(void*), void* arg ); - int i_num_avail_threads; - int i_num_total_threads; +// virtual void +// tpool_destroy( tpool_t tpoolp, int finish ); - queue<task*> queue_tasks; + static void* + tpool_thread( void* arg); - int increase_pool(int i_num); - void add_task( void(*p_func)(void*), void* p_void ); - static void* wait_for_task(void *p_void); - static void run_func(void *p_void); + static void + run_func( void *v_pointer ); + // public methods: public: - pool(); - ~pool(); + explicit pool( ); + ~pool(); - void run(void* p_void); - bool allow_user_login(); + // inline (speed)! + void run( void *arg ) + { + tpool_add_work( thread_pool, run_func, arg ); + } }; #endif @@ -15,145 +15,134 @@ 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: "; reqp::reqp( ) -{} +{ +} string reqp::get_url( thrd* p_thrd, string s_req, map_string &map_params ) { - auto unsigned int pos; - string s_ret ( "" ); - string s_vars( "" ); - auto int i_request; - - i_request= ( s_req.find("GET",0) != string::npos ) ? RQ_GET : RQ_POST; - - pos = s_req.find( "HTTP", 0 ); + auto unsigned int pos; + string s_ret ( "" ); + string s_vars( "" ); + auto int i_request; - if( i_request == RQ_GET ) - s_ret.append( s_req.substr( 5, pos-6 ) ); - else - s_ret.append( s_req.substr( 6, pos-7 ) ); + i_request= ( s_req.find("GET",0) != string::npos ) ? RQ_GET : RQ_POST; - // remove ".." from the request. - do - { - pos = s_ret.find( "../", 0 ); + pos = s_req.find( "HTTP", 0 ); - if ( pos == string::npos ) - break; + if( i_request == RQ_GET ) + s_ret.append( s_req.substr( 5, pos-6 ) ); + else + s_ret.append( s_req.substr( 6, pos-7 ) ); - s_ret.replace( pos, pos+2, "" ); - } - while( true ); + // remove ".." from the request. + do + { + pos = s_ret.find( "../", 0 ); - // do not add the string behind "?" tp s_ret and add all params behind "?" to map_params. - if( i_request == RQ_GET ) - pos = s_ret.find( "?", 0 ); - else - pos = s_req.find("\r\n\r\n", 0); + if ( pos == string::npos ) + break; - auto string s_params( "" ); - if ( pos != string::npos ) - { - if( i_request == RQ_GET ) - s_params.append( s_ret.substr( pos+1, s_ret.length() -pos-1 ) ); + s_ret.replace( pos, pos+2, "" ); + } + while( true ); - else - s_params = s_req.substr( pos+4, s_req.length() -pos-1 ); + // do not add the string behind "?" tp s_ret and add all params behind "?" to map_params. + if( i_request == RQ_GET ) + pos = s_ret.find( "?", 0 ); + else + pos = s_req.find("\r\n\r\n", 0); - s_ret = s_ret.substr( 0, pos ); - } + auto string s_params( "" ); + if ( pos != string::npos ) + { + if( i_request == RQ_GET ) + s_params.append( s_ret.substr( pos+1, s_ret.length() -pos-1 ) ); - if ( i_request == RQ_POST && s_params.empty() ) + else + s_params = s_req.substr( pos+4, s_req.length() -pos-1 ); + + s_ret = s_ret.substr( 0, pos ); + } + + if ( i_request == RQ_POST && s_params.empty() ) + { + char c_req[READBUF]; + read ( p_thrd->get_sock() , c_req, READBUF ); + s_params = string( strstr( c_req, "event" ) ); + } + + auto unsigned int pos2; + do + { + pos = s_params.find( "=", 0 ); + if ( pos == string::npos ) + break; + + pos2 = s_params.find( "&", 0 ); + if ( pos2 == string::npos ) { - char c_req[READBUF]; - - if ( read ( p_thrd->get_sock() , c_req, READBUF ) <= 0 ) - return "NOBYTE"; - - s_params = string( strstr( c_req, "event" ) ); + auto string sValue( s_params.substr(pos+1, s_params.length()-pos-1) ); + auto string tmpstr( url_decode(sValue) ); + map_params[ s_params.substr( 0, pos ) ] = tmpstr; + break; } - auto unsigned int pos2; - do - { - pos = s_params.find( "=", 0 ); - if ( pos == string::npos ) - break; - - pos2 = s_params.find( "&", 0 ); - if ( pos2 == string::npos ) - { - auto string sValue( s_params.substr(pos+1, s_params.length()-pos-1) ); - auto string tmpstr( url_decode(sValue) ); - map_params[ s_params.substr( 0, pos ) ] = tmpstr; - break; - } - - auto string s_temp= s_params.substr( pos+1, pos2-pos-1 ); - map_params[ s_params.substr( 0, pos ) ] = url_decode(s_temp); - - s_params = s_params.substr( pos2+1, s_params.length()-pos2-1 ); - } - while( true ); + auto string s_temp= s_params.substr( pos+1, pos2-pos-1 ); + map_params[ s_params.substr( 0, pos ) ] = url_decode(s_temp); + + s_params = s_params.substr( pos2+1, s_params.length()-pos2-1 ); + } + while( true ); #ifdef VERBOSE - - pthread_mutex_lock ( &s_mutx::get - ().mut_stdout ); - cout << REQUEST << s_ret << endl; - pthread_mutex_unlock( &s_mutx::get - ().mut_stdout ); + pthread_mutex_lock ( &s_mutx::get().mut_stdout ); + cout << REQUEST << s_ret << endl; + pthread_mutex_unlock( &s_mutx::get().mut_stdout ); #endif - if ( s_ret.empty() ) - s_ret = s_conf::get - ().get_val( "STARTMPL" ); - - map_params["request"] = s_ret; + map_params["request"] = s_ret; - return s_ret; + return s_ret; } string reqp::get_content_type( string s_file ) { - string s_ext=s_tool::getExtension( s_file ); + string s_ext=s_tool::getExtension( s_file ); - if(s_ext=="") - s_ext="DEFAULT"; + if(s_ext=="") + s_ext="DEFAULT"; - return s_conf::get - ().get_val( "CT_"+s_ext ); + 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"); - if(pos!=string::npos) - 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)); + 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; + map_params[key]=value; - } - s_req=s_req.substr(s_line.size()+1); - pos=s_req.find("\n"); - } + } + s_req=s_req.substr(s_line.size()+1); + pos=s_req.find("\n"); + } } @@ -161,148 +150,132 @@ reqp::parse_headers( string s_req, map_string &map_params ) int reqp::htoi(string *s) { - int value; - int c; + int value; + int c; + + c=s->c_str()[0]; + if(isupper(c)) + c=tolower(c); - c=s->c_str()[0]; - if(isupper(c)) - c=tolower(c); + value=(c>='0' && c<='9'?c-'0':c-'a'+10)*16; - value=(c>='0' && c<='9'?c-'0':c-'a'+10)*16; + c=s->c_str()[1]; + if(isupper(c)) + c=tolower(c); - c=s->c_str()[1]; - if(isupper(c)) - c=tolower(c); - - value+=c>='0' && c<='9'?c-'0':c-'a'+10; - return value; + value+=c>='0' && c<='9'?c-'0':c-'a'+10; + return value; } string reqp::url_decode( string s_str ) { - auto string sDest=""; - int len = s_str.size(); - - for(int i=0;i<len;i++) - { - char ch = s_str.at(i); - if(ch=='+') - { - sDest+=" "; - } - else if(ch=='%') - { - auto string sTmp=s_str.substr(i+1,2); - ch=(char)htoi(&sTmp); - sDest+=ch; - i+=2; - - } - else - - sDest+=ch; - } - return sDest; + auto string sDest=""; + int len = s_str.size(); + + for(int i=0;i<len;i++) + { + char ch = s_str.at(i); + if(ch=='+') + { + sDest+=" "; + } + else if(ch=='%') + { + auto string sTmp=s_str.substr(i+1,2); + ch=(char)htoi(&sTmp); + sDest+=ch; + i+=2; + + } + else + + sDest+=ch; + } + return sDest; } string reqp::get_from_header( string s_req, string s_hdr ) { - auto unsigned int pos[2]; - pos[0] = s_req.find( s_hdr, 0 ); - pos[1] = s_req.find( "\n", pos[0] ); + auto unsigned int pos[2]; + pos[0] = s_req.find( s_hdr, 0 ); + pos[1] = s_req.find( "\n", pos[0] ); - auto int i_length = s_hdr.length(); - return s_req.substr( pos[0]+i_length, pos[1]-pos[0]-i_length-1 ); + auto int i_length = s_hdr.length(); + return s_req.substr( pos[0]+i_length, pos[1]-pos[0]-i_length-1 ); } string 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"]. - - 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"); - - // check the event variable. + // store all request informations in map_params. store the url in + // map_params["request"]. + get_url( p_thrd, s_req, map_params ); + 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("\n\n"); + + // check the event variable. + + string s_event( map_params["event"] ); + if ( ! s_event.empty() ) + { + // login procedure. + if ( s_event == "login" ) + { + s_chat::get().login( map_params ); + } - string s_event( map_params["event"] ); - if ( ! s_event.empty() ) + else { - // login procedure. - if ( s_event == "login" ) - { - s_chat::get - ().login( 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; - 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" ) - { - string s_msg(s_html::get - ().parse( map_params ) ); - p_user->msg_post( &s_msg); - s_sock::get - ().chat_stream( p_thrd->get_sock(), p_user, map_params ); - } - - // if a request for the online list of the active room. - else if ( s_event == "online" ) - s_html::get - ().online_list( p_user, map_params ); - } + 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; + 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" ) + { + string s_msg(s_html::get().parse( map_params ) ); + p_user->msg_post( &s_msg); + s_sock::get().chat_stream( p_thrd->get_sock(), p_user, map_params ); + } + + // if a request for the online list of the active room. + else if ( s_event == "online" ) + s_html::get().online_list( p_user, map_params ); } + } - // parse and get the requested html-template and also use - // the values stored in map_params for %%KEY%% substituations. - s_rep.append( s_html::get - ().parse( map_params ) ); + // parse and get the requested html-template and also use + // the values stored in map_params for %%KEY%% substituations. + s_rep.append( s_html::get().parse( map_params ) ); - // return the parsed html-template. - return s_rep; + // return the parsed html-template. + return s_rep; } #endif @@ -1,4 +1,4 @@ -// class reqp declaration. this class parses the client requests. +// class reqp declaration. this class parses the client requests. #ifndef REQP_H #define REQP_H @@ -6,7 +6,7 @@ #define RQ_GET 1 #define RQ_POST 2 -#include <map> +#include <map> #include "incl.h" #include "thrd.h" @@ -14,34 +14,34 @@ using namespace std; typedef map<string, string, less<string> > map_string; -class reqp +class reqp { private: - static string HTTP_CODEOK, - HTTP_CODENF, - HTTP_SERVER, - HTTP_CONTAC, - 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. - virtual string get_url( thrd* p_thrd, string s_req, map_string &map_params ); - // returns a specific value of the client's http request header. - // ( s.t. like the User-Agent, Referer etc... ). - virtual string get_from_header( string s_req, string s_hdr ); - - virtual int htoi( string *s ); + static string HTTP_CODEOK, + HTTP_CODENF, + HTTP_SERVER, + HTTP_CONTAC, + 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. + virtual string get_url( thrd* p_thrd, string s_req, map_string &map_params ); + // returns a specific value of the client's http request header. + // ( s.t. like the User-Agent, Referer etc... ). + virtual string get_from_header( string s_req, string s_hdr ); + + virtual int htoi( string *s ); public: - // public methods. - 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 ); + // public methods. + 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 ); }; #endif @@ -8,9 +8,11 @@ using namespace std; room::room( string s_name ) : name( s_name ) -{} +{ +} room::~room() -{} +{ +} #endif @@ -13,22 +13,22 @@ using namespace std; class room : public base<user>, public name { private: - + public: - void add_user( user* p_user ) - { - p_user->set_p_room( this ); - add_elem( p_user ); - } - - user* get_user( string &s_name, bool &b_found ) - { - return static_cast<user*>( get_elem( s_name, b_found ) ); - } - - // public methods: + void add_user( user* p_user ) + { + p_user->set_p_room( this ); + add_elem( p_user ); + } + + user* get_user( string &s_name, bool &b_found ) + { + return static_cast<user*>( get_elem( s_name, b_found ) ); + } + + // public methods: explicit room( string s_name ); // a constructor. - ~room(); // room destructor. + ~room(); // room destructor. }; #endif @@ -5,22 +5,21 @@ using namespace std; -class s_chat +class s_chat { private: - static chat* obj; + static chat* obj; public: - static void init() - { - obj = new chat(); - } + static void init() + { + obj = new chat(); + } - static chat& get - () - { - return *obj; - } + static chat& get() + { + return *obj; + } }; @@ -5,22 +5,21 @@ using namespace std; -class s_conf +class s_conf { private: - static conf* obj; + static conf* obj; public: - static void init() - { - obj = new conf( CONFILE ); - } + static void init() + { + obj = new conf( CONFILE ); + } - static conf& get - () - { - return *obj; - } + static conf& get() + { + return *obj; + } }; @@ -5,22 +5,21 @@ using namespace std; -class s_html +class s_html { private: - static html* obj; + static html* obj; public: - static void init() - { - obj = new html(); - } + static void init() + { + obj = new html(); + } - static html& get - () - { - return *obj; - } + static html& get() + { + return *obj; + } }; @@ -5,23 +5,21 @@ #include "s_conf.h" using namespace std; -class s_lang +class s_lang { private: - static lang* obj; + static lang* obj; public: - static void init() - { - obj = new lang( s_conf::get - ().get_val( "LANGUAGE" ) ); - } + static void init() + { + obj = new lang( s_conf::get().get_val( "LANGUAGE" ) ); + } - static lang& get - () - { - return *obj; - } + static lang& get() + { + return *obj; + } }; @@ -5,22 +5,21 @@ using namespace std; -class s_modl +class s_modl { private: - static modl* obj; + static modl* obj; public: - static void init() - { - obj = new modl(); - } + static void init() + { + obj = new modl(); + } - static modl& get - () - { - return *obj; - } + static modl& get() + { + return *obj; + } }; @@ -5,22 +5,21 @@ using namespace std; -class s_mutx +class s_mutx { private: - static mutx* obj; + static mutx* obj; public: - static void init() - { - obj = new mutx(); - } + static void init() + { + obj = new mutx(); + } - static mutx& get - () - { - return *obj; - } + static mutx& get() + { + return *obj; + } }; @@ -5,22 +5,21 @@ using namespace std; -class s_sman +class s_sman { private: - static sman* obj; + static sman* obj; public: - static void init() - { - obj = new sman(); - } + static void init() + { + obj = new sman(); + } - static sman& get - () - { - return *obj; - } + static sman& get() + { + return *obj; + } }; @@ -5,22 +5,21 @@ using namespace std; -class s_sock +class s_sock { private: - static sock* obj; + static sock* obj; public: - static void init() - { - obj = new sock(); - } + static void init() + { + obj = new sock(); + } - static sock& get - () - { - return *obj; - } + static sock& get() + { + return *obj; + } }; @@ -1,122 +1,111 @@ #ifndef s_tool_CXX #define s_tool_CXX -#include <ctype.h> +#include <ctype.h> #include <time.h> #include "s_tool.h" bool s_tool::is_alpha_numeric( string &s_digit ) { - auto const char *digit = s_digit.c_str(); - auto int i_len = strlen( digit ); + auto const char *digit = s_digit.c_str(); + auto int i_len = strlen( digit ); - for( int i=0; i<i_len; i++ ) - { - if ( ! isalnum( *digit ) ) - return false; - digit++; - } + for( int i=0; i<i_len; i++ ) + { + if ( ! isalnum( *digit ) ) + return false; + digit++; + } - return true; + 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; -} + 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); -string -s_tool::getExtension( string s_file ) -{ - int pos = s_file.find_last_of("."); - if(pos != string::npos) - { - string s_ext=s_file.substr(pos+1, s_file.size()-(pos+1)); - for(int i = 0;i<s_ext.size();i++) - s_ext[i]=toupper(s_ext[i]); - return s_ext; - } - return ""; + 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::int2string( int i_num ) +string +s_tool::getExtension( string s_file ) { - char buf[64]; - sprintf(buf, "%d", i_num); - return buf; + int pos = s_file.find_last_of("."); + if(pos != string::npos) + { + string s_ext=s_file.substr(pos+1, s_file.size()-(pos+1)); + for(int i = 0;i<s_ext.size();i++) + s_ext[i]=toupper(s_ext[i]); + return s_ext; + } + return ""; } int s_tool::string2int( string s_digit ) { - auto const char *digit = s_digit.c_str(); - int result = 0; - - // Convert each digit char and add into result. - while (*digit >= '0' && *digit <='9') - { - result = (result * 10) + (*digit - '0'); - digit++; - } - - // Check that there were no non-digits at end. - if (*digit != 0) - { - return -1; - } - - return result; + auto const char *digit = s_digit.c_str(); + int result = 0; + + // Convert each digit char and add into result. + while (*digit >= '0' && *digit <='9') { + result = (result * 10) + (*digit - '0'); + digit++; + } + + // Check that there were no non-digits at end. + if (*digit != 0) { + return -1; + } + + return result; } long s_tool::unixtime() { - return (long) time( NULL ); + return (long) time( NULL ); } void s_tool::strip_html( string *s_str ) { - auto int i_pos; - - if((i_pos=s_str->find("<",0))==string::npos) - return; - while(true) - { - - s_str->replace(i_pos,1,"<"); - - if((i_pos=s_str->find("<",0))==string::npos) - return; - - } - - + auto int i_pos; + + if((i_pos=s_str->find("<",0))==string::npos) + return; + while(true) + { + + s_str->replace(i_pos,1,"<"); + + if((i_pos=s_str->find("<",0))==string::npos) + return; + + } + + } #endif @@ -1,20 +1,19 @@ #ifndef s_tool_H #define s_tool_H -#include "incl.h" +#include "incl.h" using namespace std; class s_tool { public: - static bool is_alpha_numeric( string &s_digit ); - static int string2int( string s_digit ); - static string int2string( int i_num ); - static string trim( string s_str ); - static long unixtime(); - static void strip_html( string *s_str); - static string getExtension( string s_file ); + 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 ); }; #endif @@ -4,36 +4,32 @@ #include "sess.h" sess::sess( string s_id ) -{ - this->sess_id=s_id; +{ + this->sess_id=s_id; } -string sess::getId() -{ - return this->sess_id; -} +string sess::getId(){ return this->sess_id; } -void sess::invalidate() -{ - this->sess_id="0"; - this->sess_values.clear(); +void sess::invalidate() { + this->sess_id="0"; + this->sess_values.clear(); } void sess::setValue( string s_key, void *lpvalue ) { - this->sess_values[s_key]=lpvalue; + this->sess_values[s_key]=lpvalue; } void *sess::getValue( string s_key ) { - return this->sess_values[s_key]; + return this->sess_values[s_key]; } string sess::dump() { - string s_ret=string("Session Dump of Session ") + this->getId(); - map<string, void*>::const_iterator it; - for(it=this->sess_values.begin();it!=this->sess_values.end();it++) - s_ret=s_ret + "\nkey: " + it->first; - return s_ret; + string s_ret=string("Session Dump of Session ") + this->getId(); + map<string, void*>::const_iterator it; + for(it=this->sess_values.begin();it!=this->sess_values.end();it++) + s_ret=s_ret + "\nkey: " + it->first; + return s_ret; } #endif @@ -14,15 +14,15 @@ typedef map<string, void *> sess_map; class sess : public cont, name { -private: - sess_map sess_values; - string sess_id; -public: - sess(string s_id); - string getId(); - void setValue(string s_key, void *lpvalue); - void *getValue( string s_key ); - void invalidate(); - string dump(); + private: + sess_map sess_values; + string sess_id; + public: + sess(string s_id); + string getId(); + void setValue(string s_key, void *lpvalue); + void *getValue( string s_key ); + void invalidate(); + string dump(); }; #endif @@ -5,45 +5,44 @@ sman::sman() { - this->sessions=new hmap<sess *, string>(80); - this->sessioncount=0; + this->sessions=new hmap<sess *, string>(80); + this->sessioncount=0; } sman::~sman() { - delete this->sessions; + delete this->sessions; } string sman::generateId( int len ) { - string valid_chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"; - string s_ret=""; - srand(time(0)+160682); - for(int i=0;i<len;i++) - { - int i_char=rand() % 64; - s_ret+=valid_chars[i_char]; - } - return s_ret; + string valid_chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"; + string s_ret=""; + srand(time(0)+160682); + for(int i=0;i<len;i++) + { + int i_char=rand() % 64; + s_ret+=valid_chars[i_char]; + } + return s_ret; } sess *sman::createSession( ) { - string new_id=this->generateId(s_tool::string2int( s_conf::get - ().get_val( "SESSION_LENGTH" ) ) ); + string new_id=this->generateId(s_tool::string2int( s_conf::get().get_val( "SESSION_LENGTH" ) ) ); - sess *new_sess= new sess( new_id ); + sess *new_sess= new sess( new_id ); - this->sessioncount++; - this->sessions->add_elem( new_sess, new_id ); - - return new_sess; + this->sessioncount++; + this->sessions->add_elem( new_sess, new_id ); + + return new_sess; } sess *sman::getSession( string s_id ) { - return this->sessions->get_elem( s_id ); + return this->sessions->get_elem( s_id ); } void sman::destroySession( string s_id ) { - this->sessioncount--; - this->sessions->del_elem( s_id ); + this->sessioncount--; + this->sessions->del_elem( s_id ); } #endif @@ -10,23 +10,19 @@ using namespace std; -class sman -{ - -private: - hmap<sess *, string> *sessions; - string generateId( int len ); - int sessioncount; -public: - sman(); - ~sman(); - sess *getSession( string s_id ); - int getSessionCount( ) - { - return this->sessioncount; - } - sess *createSession( ); - void destroySession( string s_id ); +class sman{ + + private: + hmap<sess *, string> *sessions; + string generateId( int len ); + int sessioncount; + public: + sman(); + ~sman(); + sess *getSession( string s_id ); + int getSessionCount( ) { return this->sessioncount; } + sess *createSession( ); + void destroySession( string s_id ); }; @@ -20,226 +20,216 @@ using namespace std; sock::sock() { - this->b_run = true; - 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" )); + this->b_run = true; + 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) ); + 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 - { - 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: + do + { 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) ); - - // remove the user from its room. - string s_user( p_user->get_name() ); - 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->~user(); + 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) ); + + // remove the user from its room. + string s_user( p_user->get_name() ); + 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->~user(); } int sock::make_socket( uint16_t i_port ) { - int sock; - struct sockaddr_in name; + int sock; + struct sockaddr_in name; - // create the server socket. - sock = socket (PF_INET, SOCK_STREAM, 0); - if (sock < 0) - { - cerr << "Sock: socket error" << endl; + // create the server socket. + sock = socket (PF_INET, SOCK_STREAM, 0); + if (sock < 0) + { + cerr << "Sock: socket error" << endl; - if ( ++i_port > MAXPORT ) - exit(-1); + if ( ++i_port > MAXPORT ) + exit(-1); - cerr << SOCKERR << i_port << endl; - return make_socket( i_port ); - } + cerr << SOCKERR << i_port << endl; + return make_socket( i_port ); + } - // give the server socket a name. - name.sin_family = AF_INET; - name.sin_port = htons (i_port); - name.sin_addr.s_addr = htonl (INADDR_ANY); - int optval=1; + // give the server socket a name. + name.sin_family = AF_INET; + name.sin_port = htons (i_port); + name.sin_addr.s_addr = htonl (INADDR_ANY); + int optval=1; - setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(int)); + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&optval, sizeof(int)); - if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) - { - cerr << "Sock: bind error" << endl; + if (bind (sock, (struct sockaddr *) &name, sizeof (name)) < 0) + { + cerr << "Sock: bind error" << endl; - if ( ++i_port > MAXPORT ) - exit(-1); + if ( ++i_port > MAXPORT ) + exit(-1); - cout << SOCKERR << i_port << endl; - return make_socket( i_port ); - } + cout << SOCKERR << i_port << endl; + return make_socket( i_port ); + } - return sock; + return sock; } int sock::read_write( thrd* p_thrd, int i_sock ) { - char c_req[2048]; + char c_req[2048]; - int i_bytes; - i_bytes = read (i_sock, c_req, 2048); + int i_bytes; + i_bytes = read (i_sock, c_req, 2048); - if (i_bytes < 0) - { - cerr << "Sock: read error " << endl; - } + if (i_bytes < 0) + { + cerr << "Sock: read error " << endl; + } - else - { - // stores the request params. - map_string map_params; - - // 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); + else + { + // stores the request params. + map_string map_params; - getpeername( i_sock, (struct sockaddr *)&client, &size); + // 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); - map_params["REMOTE_ADDR"]=inet_ntoa(client.sin_addr); - map_params["REMOTE_PORT"]=ntohs( client.sin_port); + 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); + 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( i_sock, s_rep.c_str(), s_rep.size(), 0 ); + send( i_sock, s_rep.c_str(), s_rep.size(), 0 ); - // dont need those vals anymore. - map_params.clear(); - - return 0; - } + // dont need those vals anymore. + map_params.clear(); - return -1; + return 0; + } + + return -1; } int sock::start() { - auto int i_port = s_tool::string2int( s_conf::get - ().get_val( "SRVRPORT" ) ); + auto int i_port = s_tool::string2int( s_conf::get().get_val( "SRVRPORT" ) ); - int sock; - fd_set active_fd_set, read_fd_set; - int i; - struct sockaddr_in clientname; - size_t size; + int sock; + fd_set active_fd_set, read_fd_set; + int i; + struct sockaddr_in clientname; + size_t size; #ifdef VERBOSE - - cout << SOCKCRT << "localhost:" << i_port << endl; + cout << SOCKCRT << "localhost:" << i_port << endl; #endif - // create the server socket and set it up to accept connections. - sock = make_socket ( i_port ); + // create the server socket and set it up to accept connections. + sock = make_socket ( i_port ); - if (listen (sock, 1) < 0) - { - cerr << "Sock: listen error" << endl; - exit( EXIT_FAILURE ); - } + if (listen (sock, 1) < 0) + { + cerr << "Sock: listen error" << endl; + exit( EXIT_FAILURE ); + } #ifdef VERBOSE - cout << SOCKRDY << endl; + cout << SOCKRDY << endl; #endif - // initialize the set of active sockets. - FD_ZERO (&active_fd_set); - FD_SET (sock, &active_fd_set); + // initialize the set of active sockets. + FD_ZERO (&active_fd_set); + FD_SET (sock, &active_fd_set); - while( b_run ) + while( b_run ) + { + // block until input arrives on one or more active sockets. + read_fd_set = active_fd_set; + if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) { - // block until input arrives on one or more active sockets. - read_fd_set = active_fd_set; - if (select (FD_SETSIZE, &read_fd_set, NULL, NULL, NULL) < 0) - { - cerr << "Sock: select error" << endl; - exit( EXIT_FAILURE ); - } + cerr << "Sock: select error" << endl; + exit( EXIT_FAILURE ); + } - // service all the sockets with input pending. - for ( i = 0; i < FD_SETSIZE; i++ ) - if ( FD_ISSET (i, &read_fd_set) ) - { - if ( i == sock ) - { - // connection request on original socket. - i_req++; - int new_sock; - size = sizeof (clientname); - new_sock = accept (sock, - (struct sockaddr *) &clientname, - &size); - - if (new_sock < 0) - { - cerr << "Sock: accept error" << endl; - close ( new_sock ); - } + // service all the sockets with input pending. + for ( i = 0; i < FD_SETSIZE; i++ ) + if ( FD_ISSET (i, &read_fd_set) ) + { + if ( i == sock ) + { + // connection request on original socket. + i_req++; + int new_sock; + size = sizeof (clientname); + new_sock = accept (sock, + (struct sockaddr *) &clientname, + &size); + + if (new_sock < 0) + { + cerr << "Sock: accept error" << endl; + close ( new_sock ); + } #ifdef VERBOSE - cout << CONNECT << i_req << " " + cout << CONNECT << i_req << " " << inet_ntoa( clientname.sin_addr ) << ":" << ntohs ( clientname.sin_port ) << endl; #endif + + FD_SET (new_sock, &active_fd_set); + } - FD_SET (new_sock, &active_fd_set); - } - - else - { - thrd_pool->run( (void*) new thrd( i ) ); - FD_CLR( i, &active_fd_set ); - } - } - } + else + { + thrd_pool->run( (void*) new thrd( i ) ); + FD_CLR( i, &active_fd_set ); + } + } + } } #endif @@ -22,37 +22,31 @@ #include "logd.h" using namespace std; -class sock +class sock { private: - // total number of server requests. - unsigned long long int i_req; + // total number of server requests. + unsigned long long int i_req; - 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 ); + 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 ); public: - // small inline methods: - bool get_run() const - { - return b_run; - } - bool set_run( bool b_run ) - { - this->b_run = b_run; - } - - // public methods. - explicit sock( ); // simple constructor. - virtual int read_write( thrd* p_thrd, int filedes ); - virtual int start(); - - // the chat stream there all the chat messages will sent through. - static void chat_stream( int i_sock, user* p_user, map_string &map_params ); + // small inline methods: + bool get_run() const { return b_run; } + bool set_run( bool b_run ) { this->b_run = b_run; } + + // public methods. + explicit sock( ); // simple constructor. + virtual int read_write( thrd* p_thrd, int filedes ); + virtual int start(); + + // the chat stream there all the chat messages will sent through. + static void chat_stream( int i_sock, user* p_user, map_string &map_params ); }; @@ -10,7 +10,7 @@ using namespace std; thrd::thrd( int i_sock ) { - this->i_sock = i_sock; + this->i_sock = i_sock; } thrd::~thrd() @@ -22,8 +22,7 @@ thrd::~thrd() void thrd::run() { - s_sock::get - ().read_write( this, i_sock ); + s_sock::get().read_write( this, i_sock ); } #endif @@ -7,23 +7,20 @@ using namespace std; -class thrd +class thrd { private: - int i_sock; + int i_sock; public: - // small inline methods: - int get_sock() - { - return i_sock; - } + // small inline methods: + int get_sock() { return i_sock; } - // public methods: - explicit thrd( int i_sock ); - ~thrd(); // destructor. - virtual void run(); + // public methods: + explicit thrd( int i_sock ); + ~thrd(); // destructor. + virtual void run(); }; #endif @@ -12,162 +12,159 @@ using namespace std; user::user( string s_name ) : name( s_name ) { - this -> b_online = true; - this -> l_time = s_tool::unixtime(); - this -> s_col1 = s_conf::get - ().get_val( "USERCOL1" ); - - pthread_mutex_init( &mut_b_online, NULL); - pthread_mutex_init( &mut_i_sock , NULL); - pthread_mutex_init( &mut_l_time , NULL); - pthread_mutex_init( &mut_p_room , NULL); - pthread_mutex_init( &mut_s_mess , NULL); - pthread_cond_init ( &cond_message, NULL); - pthread_mutex_init( &mut_message , NULL); + this -> b_online = true; + this -> l_time = s_tool::unixtime(); + this -> s_col1 = s_conf::get().get_val( "USERCOL1" ); + + pthread_mutex_init( &mut_b_online, NULL); + pthread_mutex_init( &mut_i_sock , NULL); + pthread_mutex_init( &mut_l_time , NULL); + pthread_mutex_init( &mut_p_room , NULL); + pthread_mutex_init( &mut_s_mess , NULL); + pthread_cond_init ( &cond_message, NULL); + pthread_mutex_init( &mut_message , NULL); } user::~user() { - pthread_mutex_destroy( &mut_b_online ); - pthread_mutex_destroy( &mut_i_sock ); - pthread_mutex_destroy( &mut_l_time ); - pthread_mutex_destroy( &mut_p_room ); - pthread_mutex_destroy( &mut_s_mess ); - pthread_cond_destroy ( &cond_message ); - pthread_mutex_destroy( &mut_message ); + pthread_mutex_destroy( &mut_b_online ); + pthread_mutex_destroy( &mut_i_sock ); + pthread_mutex_destroy( &mut_l_time ); + pthread_mutex_destroy( &mut_p_room ); + pthread_mutex_destroy( &mut_s_mess ); + pthread_cond_destroy ( &cond_message ); + pthread_mutex_destroy( &mut_message ); } void user::get_data( map_string *p_map_data ) { - string s_req = (*p_map_data)["!get"]; + string s_req = (*p_map_data)["!get"]; - // get the nick and the color of the user. - if ( s_req == "nick" ) - (*p_map_data)[get_name()] = get_col1(); + // get the nick and the color of the user. + if ( s_req == "nick" ) + (*p_map_data)[get_name()] = get_col1(); } string user::get_mess( ) { - string s_ret( "" ); - pthread_mutex_lock ( &mut_s_mess ); - s_ret.append( s_mess ); - s_mess = *new string(""); - pthread_mutex_unlock( &mut_s_mess ); + string s_ret( "" ); + pthread_mutex_lock ( &mut_s_mess ); + s_ret.append( s_mess ); + s_mess = *new string(""); + pthread_mutex_unlock( &mut_s_mess ); - return s_ret; + return s_ret; } bool user::get_online( ) { - bool b_ret; - pthread_mutex_lock ( &mut_b_online ); - b_ret = b_online; - pthread_mutex_unlock( &mut_b_online ); - return b_ret; + bool b_ret; + pthread_mutex_lock ( &mut_b_online ); + b_ret = b_online; + pthread_mutex_unlock( &mut_b_online ); + return b_ret; } void user::set_online( bool b_online ) { - pthread_mutex_lock ( &mut_b_online ); - this -> b_online = b_online; - pthread_mutex_unlock( &mut_b_online ); + pthread_mutex_lock ( &mut_b_online ); + this -> b_online = b_online; + pthread_mutex_unlock( &mut_b_online ); } room* user::get_p_room( ) { - room* p_return; - pthread_mutex_lock ( &mut_p_room ); - p_return = p_room; - pthread_mutex_unlock( &mut_p_room ); - return p_return; + room* p_return; + pthread_mutex_lock ( &mut_p_room ); + p_return = p_room; + pthread_mutex_unlock( &mut_p_room ); + return p_return; } void user::set_p_room( room* p_room ) { - pthread_mutex_lock ( &mut_p_room ); - this -> p_room = p_room; - pthread_mutex_unlock( &mut_p_room ); + pthread_mutex_lock ( &mut_p_room ); + this -> p_room = p_room; + pthread_mutex_unlock( &mut_p_room ); } int user::get_sock( ) { - int i_ret; - pthread_mutex_lock ( &mut_i_sock ); - i_ret = i_sock; - pthread_mutex_unlock( &mut_i_sock ); - return i_ret; + int i_ret; + pthread_mutex_lock ( &mut_i_sock ); + i_ret = i_sock; + pthread_mutex_unlock( &mut_i_sock ); + return i_ret; } void user::set_sock( int i_sock ) { - pthread_mutex_lock ( &mut_i_sock ); - this -> i_sock = i_sock; - pthread_mutex_unlock( &mut_i_sock ); + pthread_mutex_lock ( &mut_i_sock ); + this -> i_sock = i_sock; + pthread_mutex_unlock( &mut_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 ); + 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 ); } void user::renew_stamp( ) { - pthread_mutex_lock ( &mut_l_time ); - l_time = s_tool::unixtime(); - pthread_mutex_unlock( &mut_l_time ); + pthread_mutex_lock ( &mut_l_time ); + l_time = s_tool::unixtime(); + pthread_mutex_unlock( &mut_l_time ); } void user::msg_post( string *p_msg ) { - pthread_mutex_lock ( &mut_s_mess ); - s_mess.append( *p_msg ); - pthread_mutex_unlock( &mut_s_mess ); + pthread_mutex_lock ( &mut_s_mess ); + s_mess.append( *p_msg ); + pthread_mutex_unlock( &mut_s_mess ); - pthread_cond_signal( &cond_message ); + pthread_cond_signal( &cond_message ); } void user::get_user_list( string &s_list, string &s_seperator ) { - s_list.append( "<font color=\"" ) - .append( get_col1() ) - .append( "\">" ) - .append( get_name() ) - .append( "</font>\n" ) - .append( s_seperator ); - + s_list.append( "<font color=\"" ) + .append( get_col1() ) + .append( "\">" ) + .append( get_name() ) + .append( "</font>\n" ) + .append( s_seperator ); + } #endif @@ -13,93 +13,72 @@ class room; class user : public name { private: - // private members: - bool b_away; // true if user is away. - bool b_online; // true if user is online. - int i_sock; // user's stream socket descriptor. - 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. - string s_mess; // message string which has to be sent to the user. - room* p_room; // pointer to the user's room. - - pthread_mutex_t mut_b_online; - pthread_mutex_t mut_i_sock; - pthread_mutex_t mut_l_time; - pthread_mutex_t mut_s_mess; - pthread_mutex_t mut_p_room; - + // private members: + bool b_away; // true if user is away. + bool b_online; // true if user is online. + int i_sock; // user's stream socket descriptor. + 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. + string s_mess; // message string which has to be sent to the user. + room* p_room; // pointer to the user's room. + + pthread_mutex_t mut_b_online; + pthread_mutex_t mut_i_sock; + pthread_mutex_t mut_l_time; + pthread_mutex_t mut_s_mess; + pthread_mutex_t mut_p_room; + public: - pthread_cond_t cond_message; - pthread_mutex_t mut_message; - - // 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; - } - void set_rang ( rang r_rang ) - { - r_oldr = this -> r_rang; - this -> r_rang = r_rang; - } - - bool new_msgs ( ) - { - return s_mess.empty(); - } - // public methods: - explicit user( string s_name ); // a standard constructor. - ~user(); // user destructor. - - // gets specific data of this user und stores it in - // (*p_map_string)["nick"]. this method will be used - // every time data has to be got from every user of a room - // or even of the system. - virtual void get_data( map_string *p_map_data ); - - virtual bool get_online(); - virtual void set_online( bool b_online ); - virtual room* get_p_room(); - virtual void set_p_room( room* p_room ); - virtual int get_sock ( ); - virtual void set_sock ( int i_sock ); - - // executes a command. - virtual void command( string &s_command ); - - // gets the message and clears s_mess; - virtual string get_mess(); - - // actualizes the user's timestamp. - virtual void renew_stamp(); - - // Here are starting methods which are mainly needed by the data<type> class. - - // 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 ); + pthread_cond_t cond_message; + pthread_mutex_t mut_message; + + // 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; } + void set_rang ( rang r_rang ) { r_oldr = this -> r_rang; + this -> r_rang = r_rang; } + + bool new_msgs ( ) { return s_mess.empty(); } + // public methods: + explicit user( string s_name ); // a standard constructor. + ~user(); // user destructor. + + // gets specific data of this user und stores it in + // (*p_map_string)["nick"]. this method will be used + // every time data has to be got from every user of a room + // or even of the system. + virtual void get_data( map_string *p_map_data ); + + virtual bool get_online(); + virtual void set_online( bool b_online ); + virtual room* get_p_room(); + virtual void set_p_room( room* p_room ); + virtual int get_sock ( ); + virtual void set_sock ( int i_sock ); + + // executes a command. + virtual void command( string &s_command ); + + // gets the message and clears s_mess; + virtual string get_mess(); + + // actualizes the user's timestamp. + virtual void renew_stamp(); + + // Here are starting methods which are mainly needed by the data<type> class. + + // 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 |
