From 7507223941a2cd0a89102f1ec86d0c44128eca93 Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Sat, 20 Nov 2010 04:31:38 -0700 Subject: [PATCH] Policy: Include config.h first in all .cc Also fixes a few unsafe function uses hidden by earlier lack of these includes safety checks. --- compat/debug.cc | 1 + compat/drand48.c | 2 +- contrib/rredir.c | 2 +- helpers/basic_auth/MSNT/allowusers.cc | 1 + helpers/basic_auth/MSNT/denyusers.cc | 1 + helpers/basic_auth/MSNT/msntauth.cc | 3 +-- helpers/basic_auth/NIS/nis_support.cc | 2 +- helpers/basic_auth/RADIUS/radius-util.cc | 2 +- helpers/negotiate_auth/kerberos/base64.cc | 3 ++- lib/dirent.c | 4 +++- lib/encrypt.c | 2 ++ lib/getfullhostname.c | 1 + lib/getopt.c | 2 ++ lib/libTrie/src/Trie.cc | 1 + lib/libTrie/src/TrieNode.cc | 1 + lib/libTrie/test/trie-c.c | 1 + lib/libTrie/test/trie.cc | 1 + lib/smblib/md4.c | 2 ++ lib/smblib/smb-errors.c | 2 ++ lib/smblib/smbdes.c | 2 ++ lib/sspwin32.c | 1 + lib/tests/testMain.cc | 2 ++ lib/win32lib.c | 1 + src/AsyncEngine.cc | 1 + src/CompletionDispatcher.cc | 1 + src/ConfigParser.cc | 1 + src/DescriptorSet.cc | 2 +- src/DiskIO/Blocking/BlockingFile.cc | 2 +- src/DiskIO/Blocking/BlockingIOStrategy.cc | 2 ++ src/DiskIO/Blocking/DiskIOBlocking.cc | 2 ++ src/DiskIO/ReadRequest.cc | 1 + src/DiskIO/WriteRequest.cc | 1 + src/EventLoop.cc | 1 + src/RemovalPolicy.cc | 2 ++ src/SquidConfig.cc | 1 + src/StoreSwapLogData.cc | 1 + src/adaptation/ecap/MinimalAdapter.cc | 2 +- src/adaptation/icap/History.cc | 2 +- src/base/AsyncCallQueue.cc | 1 + src/cbdata.cc | 1 + src/cf_gen.cc | 2 -- src/fs/coss/StoreFScoss.cc | 1 + src/fs/diskd/StoreFSdiskd.cc | 1 + src/fs/ufs/StoreFSufs.cc | 1 + src/tests/stub_cache_manager.cc | 2 +- src/tests/stub_client_side_request.cc | 1 + src/tests/stub_errorpage.cc | 1 + src/tests/stub_main_cc.cc | 2 ++ src/tests/testStoreSupport.cc | 1 + src/url.cc | 1 + src/wordlist.cc | 1 + tools/purge/conffile.cc | 3 ++- tools/purge/convert.cc | 6 ++++-- tools/purge/socket.cc | 2 ++ 54 files changed, 71 insertions(+), 18 deletions(-) diff --git a/compat/debug.cc b/compat/debug.cc index a008677e6a..c60d88b8b9 100644 --- a/compat/debug.cc +++ b/compat/debug.cc @@ -1,3 +1,4 @@ +#include "config.h" #include "compat/debug.h" /* default off */ diff --git a/compat/drand48.c b/compat/drand48.c index febb86bada..704a0a6fe4 100644 --- a/compat/drand48.c +++ b/compat/drand48.c @@ -1,4 +1,4 @@ - +#include "config.h" /* borrowed from libc/misc/drand48.c in Linux libc-5.4.46 this quick * hack by Martin Hamilton to make Squid build on diff --git a/contrib/rredir.c b/contrib/rredir.c index 5ce5041a90..9650e0a662 100644 --- a/contrib/rredir.c +++ b/contrib/rredir.c @@ -1,4 +1,4 @@ -/* $Id$ +#include "config.h" /* * From: richard@hekkihek.hacom.nl (Richard Huveneers) diff --git a/helpers/basic_auth/MSNT/allowusers.cc b/helpers/basic_auth/MSNT/allowusers.cc index d16f75f56c..e6783080b0 100644 --- a/helpers/basic_auth/MSNT/allowusers.cc +++ b/helpers/basic_auth/MSNT/allowusers.cc @@ -1,3 +1,4 @@ +#include "config.h" /* * allowusers.c diff --git a/helpers/basic_auth/MSNT/denyusers.cc b/helpers/basic_auth/MSNT/denyusers.cc index 1f91860fc1..4bf86cbe71 100644 --- a/helpers/basic_auth/MSNT/denyusers.cc +++ b/helpers/basic_auth/MSNT/denyusers.cc @@ -1,3 +1,4 @@ +#include "config.h" /* * denyusers.c diff --git a/helpers/basic_auth/MSNT/msntauth.cc b/helpers/basic_auth/MSNT/msntauth.cc index ab9f04dc72..a213f3b890 100644 --- a/helpers/basic_auth/MSNT/msntauth.cc +++ b/helpers/basic_auth/MSNT/msntauth.cc @@ -1,4 +1,3 @@ - /* * MSNT - Microsoft Windows NT domain squid authenticator module * Version 2.0 by Stellar-X Pty Ltd, Antonino Iannella @@ -30,7 +29,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - +#include "config.h" #include "rfc1738.h" #include "util.h" diff --git a/helpers/basic_auth/NIS/nis_support.cc b/helpers/basic_auth/NIS/nis_support.cc index 34137d18c2..9f33d83a5e 100644 --- a/helpers/basic_auth/NIS/nis_support.cc +++ b/helpers/basic_auth/NIS/nis_support.cc @@ -1,7 +1,7 @@ /* * Written By Rabellino Sergio (rabellino@di.unito.it) For Solaris 2.x */ - +#include "config.h" #include #include #include diff --git a/helpers/basic_auth/RADIUS/radius-util.cc b/helpers/basic_auth/RADIUS/radius-util.cc index bcc28f8d8b..5a4ba44bf7 100644 --- a/helpers/basic_auth/RADIUS/radius-util.cc +++ b/helpers/basic_auth/RADIUS/radius-util.cc @@ -36,7 +36,7 @@ char util_sccsid[] = "@(#)util.c 1.5 Copyright 1992 Livingston Enterprises Inc\n" " 2.1 Copyright 1997 Cistron Internet Services B.V."; -#include "config.h" +#include "config.h" #if HAVE_SYS_SOCKET_H #include diff --git a/helpers/negotiate_auth/kerberos/base64.cc b/helpers/negotiate_auth/kerberos/base64.cc index 32c2b8c873..38e7bc0f81 100644 --- a/helpers/negotiate_auth/kerberos/base64.cc +++ b/helpers/negotiate_auth/kerberos/base64.cc @@ -2,10 +2,11 @@ * Markus Moeller has modified the following code from Squid */ +#include "config.h" +#include "base64.h" #include #include #include -#include "base64.h" static void ska_base64_init(void); diff --git a/lib/dirent.c b/lib/dirent.c index e5516e3629..df96de8928 100644 --- a/lib/dirent.c +++ b/lib/dirent.c @@ -48,10 +48,12 @@ * */ -#include "util.h" +#include "config.h" /* The following code section is part of the native Windows Squid port */ #if defined(_SQUID_MSWIN_) + +#include "util.h" #include #include #include diff --git a/lib/encrypt.c b/lib/encrypt.c index f90c4e5b12..2746bf2e04 100644 --- a/lib/encrypt.c +++ b/lib/encrypt.c @@ -1,3 +1,5 @@ +#include "config.h" + /* encrypt.c - providing 56 bit DES encryption * Copyright (C) 1991 Jochen Obalek * diff --git a/lib/getfullhostname.c b/lib/getfullhostname.c index 792f02bde4..3a8915cf39 100644 --- a/lib/getfullhostname.c +++ b/lib/getfullhostname.c @@ -31,6 +31,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * */ +#include "config.h" #include "getfullhostname.h" diff --git a/lib/getopt.c b/lib/getopt.c index 1574e4d79f..6500e6d9e8 100644 --- a/lib/getopt.c +++ b/lib/getopt.c @@ -1,3 +1,5 @@ +#include "config.h" + /* * Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. diff --git a/lib/libTrie/src/Trie.cc b/lib/libTrie/src/Trie.cc index 01e1b19142..5a93709de6 100644 --- a/lib/libTrie/src/Trie.cc +++ b/lib/libTrie/src/Trie.cc @@ -17,6 +17,7 @@ * */ +#include "config.h" #include "Trie.h" #if HAVE_UNISTD_H #include diff --git a/lib/libTrie/src/TrieNode.cc b/lib/libTrie/src/TrieNode.cc index 81dc5e8328..458589d808 100644 --- a/lib/libTrie/src/TrieNode.cc +++ b/lib/libTrie/src/TrieNode.cc @@ -17,6 +17,7 @@ * */ +#include "config.h" #include "TrieNode.h" #include "TrieCharTransform.h" #if HAVE_UNISTD_H diff --git a/lib/libTrie/test/trie-c.c b/lib/libTrie/test/trie-c.c index 649fb2e20c..0f77a7d664 100644 --- a/lib/libTrie/test/trie-c.c +++ b/lib/libTrie/test/trie-c.c @@ -17,6 +17,7 @@ * */ +#include "config.h" #include "Trie.h" #include diff --git a/lib/libTrie/test/trie.cc b/lib/libTrie/test/trie.cc index 468f6a2897..9f8a2b3ae1 100644 --- a/lib/libTrie/test/trie.cc +++ b/lib/libTrie/test/trie.cc @@ -17,6 +17,7 @@ * */ +#include "config.h" #include "Trie.h" #include "TrieCharTransform.h" diff --git a/lib/smblib/md4.c b/lib/smblib/md4.c index ac9d9bd39c..27e4668068 100644 --- a/lib/smblib/md4.c +++ b/lib/smblib/md4.c @@ -1,3 +1,5 @@ +#include "config.h" + /* * Unix SMB/Netbios implementation. * Version 1.9. diff --git a/lib/smblib/smb-errors.c b/lib/smblib/smb-errors.c index 0c0d94c91f..c48ee3195c 100644 --- a/lib/smblib/smb-errors.c +++ b/lib/smblib/smb-errors.c @@ -1,3 +1,5 @@ +#include "config.h" + /* UNIX SMBlib NetBIOS implementation Version 1.0 diff --git a/lib/smblib/smbdes.c b/lib/smblib/smbdes.c index c2d0255ddf..e5b8b30b2c 100644 --- a/lib/smblib/smbdes.c +++ b/lib/smblib/smbdes.c @@ -1,3 +1,5 @@ +#include "config.h" + /* * Unix SMB/Netbios implementation. * Version 1.9. diff --git a/lib/sspwin32.c b/lib/sspwin32.c index 0cb0a37675..ea657eb2e1 100644 --- a/lib/sspwin32.c +++ b/lib/sspwin32.c @@ -33,6 +33,7 @@ * */ +#include "config.h" #include "util.h" #include "libntlmauth/ntlmauth.h" diff --git a/lib/tests/testMain.cc b/lib/tests/testMain.cc index b3288e7acd..08902d88fb 100644 --- a/lib/tests/testMain.cc +++ b/lib/tests/testMain.cc @@ -1,3 +1,5 @@ +#include "config.h" + #include #include #include diff --git a/lib/win32lib.c b/lib/win32lib.c index 69af1de0d6..41ad5b78cd 100644 --- a/lib/win32lib.c +++ b/lib/win32lib.c @@ -34,6 +34,7 @@ * */ +#include "config.h" #include "util.h" /* The following code section is part of an EXPERIMENTAL native */ diff --git a/src/AsyncEngine.cc b/src/AsyncEngine.cc index 8401e9b459..affe914be2 100644 --- a/src/AsyncEngine.cc +++ b/src/AsyncEngine.cc @@ -31,4 +31,5 @@ * */ +#include "config.h" #include "AsyncEngine.h" diff --git a/src/CompletionDispatcher.cc b/src/CompletionDispatcher.cc index d02c68e7da..e52ca5b0d0 100644 --- a/src/CompletionDispatcher.cc +++ b/src/CompletionDispatcher.cc @@ -31,4 +31,5 @@ * */ +#include "config.h" #include "CompletionDispatcher.h" diff --git a/src/ConfigParser.cc b/src/ConfigParser.cc index 2453344c55..9a7511af5d 100644 --- a/src/ConfigParser.cc +++ b/src/ConfigParser.cc @@ -33,6 +33,7 @@ * Copyright (c) 2003, Robert Collins */ +#include "config.h" #include "ConfigParser.h" #include "globals.h" diff --git a/src/DescriptorSet.cc b/src/DescriptorSet.cc index ed3ec30fbd..f6fa19abc9 100644 --- a/src/DescriptorSet.cc +++ b/src/DescriptorSet.cc @@ -3,7 +3,7 @@ * * DEBUG: section 05 Comm */ - +#include "config.h" #include "DescriptorSet.h" // pre-allocates descriptor store and index for Squid_MaxFD descriptors diff --git a/src/DiskIO/Blocking/BlockingFile.cc b/src/DiskIO/Blocking/BlockingFile.cc index d14d8fa531..eb7a4104c8 100644 --- a/src/DiskIO/Blocking/BlockingFile.cc +++ b/src/DiskIO/Blocking/BlockingFile.cc @@ -32,7 +32,7 @@ * * Copyright (c) 2003, Robert Collins */ - +#include "config.h" #include "BlockingFile.h" #include "DiskIO/IORequestor.h" #include "DiskIO/ReadRequest.h" diff --git a/src/DiskIO/Blocking/BlockingIOStrategy.cc b/src/DiskIO/Blocking/BlockingIOStrategy.cc index eb873b1ef6..9a619734ef 100644 --- a/src/DiskIO/Blocking/BlockingIOStrategy.cc +++ b/src/DiskIO/Blocking/BlockingIOStrategy.cc @@ -34,8 +34,10 @@ * Copyright (c) 2003, Robert Collins */ +#include "config.h" #include "BlockingIOStrategy.h" #include "BlockingFile.h" + bool BlockingIOStrategy::shedLoad() { diff --git a/src/DiskIO/Blocking/DiskIOBlocking.cc b/src/DiskIO/Blocking/DiskIOBlocking.cc index a1976ec23e..489a500cfb 100644 --- a/src/DiskIO/Blocking/DiskIOBlocking.cc +++ b/src/DiskIO/Blocking/DiskIOBlocking.cc @@ -30,3 +30,5 @@ * * Copyright (c) 2003 Robert Collins */ + +#include "config.h" diff --git a/src/DiskIO/ReadRequest.cc b/src/DiskIO/ReadRequest.cc index 353e20dbf3..91eaf59ebb 100644 --- a/src/DiskIO/ReadRequest.cc +++ b/src/DiskIO/ReadRequest.cc @@ -31,6 +31,7 @@ * Copyright (c) 2003 Robert Collins */ +#include "config.h" #include "ReadRequest.h" CBDATA_CLASS_INIT(ReadRequest); diff --git a/src/DiskIO/WriteRequest.cc b/src/DiskIO/WriteRequest.cc index 758f02ef73..df47385e4c 100644 --- a/src/DiskIO/WriteRequest.cc +++ b/src/DiskIO/WriteRequest.cc @@ -31,6 +31,7 @@ * Copyright (c) 2003 Robert Collins */ +#include "config.h" #include "WriteRequest.h" CBDATA_CLASS_INIT(WriteRequest); diff --git a/src/EventLoop.cc b/src/EventLoop.cc index cae15a65df..b281adbc22 100644 --- a/src/EventLoop.cc +++ b/src/EventLoop.cc @@ -32,6 +32,7 @@ * */ +#include "config.h" #include "EventLoop.h" #include "base/AsyncCallQueue.h" diff --git a/src/RemovalPolicy.cc b/src/RemovalPolicy.cc index 30196368db..de8a58d5f1 100644 --- a/src/RemovalPolicy.cc +++ b/src/RemovalPolicy.cc @@ -33,7 +33,9 @@ * */ +#include "config.h" #include "RemovalPolicy.h" + CBDATA_CLASS_INIT(RemovalPolicy); CBDATA_CLASS_INIT(RemovalPolicyWalker); CBDATA_CLASS_INIT(RemovalPurgeWalker); diff --git a/src/SquidConfig.cc b/src/SquidConfig.cc index 657e58ab62..970e3b4830 100644 --- a/src/SquidConfig.cc +++ b/src/SquidConfig.cc @@ -2,6 +2,7 @@ * $Id$ */ +#include "config.h" // just for the global definition of Config and Config2 #include "structs.h" diff --git a/src/StoreSwapLogData.cc b/src/StoreSwapLogData.cc index 91a2362bf6..24ae521120 100644 --- a/src/StoreSwapLogData.cc +++ b/src/StoreSwapLogData.cc @@ -32,6 +32,7 @@ * */ +#include "config.h" #include "StoreSwapLogData.h" #include "swap_log_op.h" diff --git a/src/adaptation/ecap/MinimalAdapter.cc b/src/adaptation/ecap/MinimalAdapter.cc index 767079a6c3..d49952675b 100644 --- a/src/adaptation/ecap/MinimalAdapter.cc +++ b/src/adaptation/ecap/MinimalAdapter.cc @@ -1,2 +1,2 @@ - +#include "config.h" // TBD diff --git a/src/adaptation/icap/History.cc b/src/adaptation/icap/History.cc index 1b27e34485..92da86c3f8 100644 --- a/src/adaptation/icap/History.cc +++ b/src/adaptation/icap/History.cc @@ -1,5 +1,5 @@ -#include "adaptation/icap/History.h" #include "squid.h" +#include "adaptation/icap/History.h" #include "globals.h" #include "SquidTime.h" diff --git a/src/base/AsyncCallQueue.cc b/src/base/AsyncCallQueue.cc index 20167fa88f..c58e03a10d 100644 --- a/src/base/AsyncCallQueue.cc +++ b/src/base/AsyncCallQueue.cc @@ -6,6 +6,7 @@ * */ +#include "config.h" #include "base/AsyncCallQueue.h" #include "base/AsyncCall.h" diff --git a/src/cbdata.cc b/src/cbdata.cc index 3af8263142..c6cc67f5c2 100644 --- a/src/cbdata.cc +++ b/src/cbdata.cc @@ -48,6 +48,7 @@ * when finished. */ +#include "config.h" #include "cbdata.h" #include "mgr/Registration.h" #include "Store.h" diff --git a/src/cf_gen.cc b/src/cf_gen.cc index 8b0b4464ee..95dbc5eeaf 100644 --- a/src/cf_gen.cc +++ b/src/cf_gen.cc @@ -45,9 +45,7 @@ * administrator. *****************************************************************************/ -//#include "squid.h" #include "config.h" -//#include "SquidTime.h" #include "util.h" #if HAVE_STRING_H diff --git a/src/fs/coss/StoreFScoss.cc b/src/fs/coss/StoreFScoss.cc index 5367bc67d3..fc89f00309 100644 --- a/src/fs/coss/StoreFScoss.cc +++ b/src/fs/coss/StoreFScoss.cc @@ -33,6 +33,7 @@ * Copyright (c) 2003, Robert Collins */ +#include "config.h" #include "StoreFileSystem.h" #include "StoreFScoss.h" #include "mgr/Registration.h" diff --git a/src/fs/diskd/StoreFSdiskd.cc b/src/fs/diskd/StoreFSdiskd.cc index 67e109a80d..4126c12760 100644 --- a/src/fs/diskd/StoreFSdiskd.cc +++ b/src/fs/diskd/StoreFSdiskd.cc @@ -35,6 +35,7 @@ /* TODO: remove this file as unused */ +#include "config.h" #if 0 #include "StoreFileSystem.h" #include "DiskIO/DiskIOModule.h" diff --git a/src/fs/ufs/StoreFSufs.cc b/src/fs/ufs/StoreFSufs.cc index 72bee8e4ed..79c8bf3c69 100644 --- a/src/fs/ufs/StoreFSufs.cc +++ b/src/fs/ufs/StoreFSufs.cc @@ -35,6 +35,7 @@ /*TODO: remove this file as unused*/ +#include "config.h" #if 0 #include "StoreFileSystem.h" #endif diff --git a/src/tests/stub_cache_manager.cc b/src/tests/stub_cache_manager.cc index 5b4099eb73..b744abc637 100644 --- a/src/tests/stub_cache_manager.cc +++ b/src/tests/stub_cache_manager.cc @@ -29,9 +29,9 @@ * */ +#include "squid.h" #include "CacheManager.h" #include "mgr/Registration.h" -#include "squid.h" Mgr::Action::Pointer CacheManager::createNamedAction(char const* action) diff --git a/src/tests/stub_client_side_request.cc b/src/tests/stub_client_side_request.cc index 3c685908d8..7bf75c2b5a 100644 --- a/src/tests/stub_client_side_request.cc +++ b/src/tests/stub_client_side_request.cc @@ -31,6 +31,7 @@ * */ +#include "config.h" #include "client_side_request.h" #include "Store.h" diff --git a/src/tests/stub_errorpage.cc b/src/tests/stub_errorpage.cc index 543af967de..306fa9b57c 100644 --- a/src/tests/stub_errorpage.cc +++ b/src/tests/stub_errorpage.cc @@ -32,6 +32,7 @@ * */ +#include "config.h" #include "errorpage.h" err_type diff --git a/src/tests/stub_main_cc.cc b/src/tests/stub_main_cc.cc index 06496d1717..8a069a8d6a 100644 --- a/src/tests/stub_main_cc.cc +++ b/src/tests/stub_main_cc.cc @@ -33,6 +33,8 @@ * */ +#include "config.h" + void shut_down(int) { /* stub */ } diff --git a/src/tests/testStoreSupport.cc b/src/tests/testStoreSupport.cc index f09c19cb99..3cc320f234 100644 --- a/src/tests/testStoreSupport.cc +++ b/src/tests/testStoreSupport.cc @@ -32,6 +32,7 @@ */ #define SQUID_UNIT_TEST 1 +#include "config.h" #include "testStoreSupport.h" #include "event.h" #include "EventLoop.h" diff --git a/src/url.cc b/src/url.cc index db1ecb3215..0e5d688cb8 100644 --- a/src/url.cc +++ b/src/url.cc @@ -33,6 +33,7 @@ * */ +#include "config.h" #include "URL.h" #include "HttpRequest.h" #include "URLScheme.h" diff --git a/src/wordlist.cc b/src/wordlist.cc index 39918070d3..c580f612a9 100644 --- a/src/wordlist.cc +++ b/src/wordlist.cc @@ -33,6 +33,7 @@ * */ +#include "config.h" #include "wordlist.h" #include "MemBuf.h" diff --git a/tools/purge/conffile.cc b/tools/purge/conffile.cc index 39f8f1a3e1..6848571d14 100644 --- a/tools/purge/conffile.cc +++ b/tools/purge/conffile.cc @@ -1,3 +1,5 @@ +#include "config.h" + // // $Id$ // @@ -46,7 +48,6 @@ #include #include #include -#include int readConfigFile( CacheDirVector& cachedir, const char* fn, FILE* debug ) diff --git a/tools/purge/convert.cc b/tools/purge/convert.cc index 64238121ce..590efa0c15 100644 --- a/tools/purge/convert.cc +++ b/tools/purge/convert.cc @@ -1,3 +1,5 @@ +#include "config.h" + // // $Id$ // @@ -74,7 +76,7 @@ my_inet_ntoa( const struct in_addr& a, HostAddress output ) unsigned char s[sizeof(a.s_addr)]; memcpy( s, &a.s_addr, sizeof(a.s_addr) ); - sprintf( output, "%d.%d.%d.%d", s[0], s[1], s[2], s[3] ); + snprintf(output, sizeof(HostAddress), "%d.%d.%d.%d", s[0], s[1], s[2], s[3] ); } return output; } @@ -87,7 +89,7 @@ my_sock_ntoa( const struct sockaddr_in& a, SockAddress buffer ) // returns: pointer to buffer { HostAddress host; - sprintf( buffer, "%s:%u", + snprintf( buffer, sizeof(SockAddress), "%s:%u", my_inet_ntoa(a.sin_addr,host), ntohs(a.sin_port) ); return buffer; } diff --git a/tools/purge/socket.cc b/tools/purge/socket.cc index 129e6d1c2d..07f90e3361 100644 --- a/tools/purge/socket.cc +++ b/tools/purge/socket.cc @@ -1,3 +1,5 @@ +#include "config.h" + // // $Id$ // -- 2.47.2