phpfwconfsys-submits Mailing List for phpFWConfigSystem
Status: Planning
Brought to you by:
piotrbanasik
You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
|
Feb
|
Mar
|
Apr
(12) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2003 |
Jan
(9) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <pio...@us...> - 2003-01-09 00:12:48
|
Update of /cvsroot/phpfwconfsys/Daemon-Alpha/keys In directory sc8-pr-cvs1:/tmp/cvs-serv12862 Modified Files: genkeys.sh private.key public.key Log Message: updated the gen script to make 2048 keys .. probably an overkill but why not Index: genkeys.sh =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/keys/genkeys.sh,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** genkeys.sh 8 Jan 2003 23:59:31 -0000 1.1 --- genkeys.sh 9 Jan 2003 00:12:44 -0000 1.2 *************** *** 5,9 **** echo You will be asked to enter a passprase twice echo ! openssl genrsa -out private.key -des3 echo echo --- 5,9 ---- echo You will be asked to enter a passprase twice echo ! openssl genrsa -out private.key -des3 2048 echo echo Index: private.key =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/keys/private.key,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** private.key 8 Jan 2003 23:59:31 -0000 1.1 --- private.key 9 Jan 2003 00:12:44 -0000 1.2 *************** *** 1,12 **** -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED ! DEK-Info: DES-EDE3-CBC,86D007BDC0C220CE ! QExvkKCbMs8CwCAQsYVU75bJi5Zie6D+9qiRPoQx2EWbE7BPlfzcqHrW26zw/A71 ! 3+XmtC52NQ9JNE8IKkdDLcWMXqjuolrxvZZKA/D6RJhVlWxpnKdUFQ/IA+/wR1a6 ! XlGrxnNxw0lPP1Ozr6wWK+2V1vObpohfo5o25LmLIHt+N6lNIo/4VnFxFCVfxrtz ! uVl4fsSvcqoPpPHF8Q70P7YoIcdpJITzpPyXr+z2XHKzS8Go7CH+ik7eaa6Oynfc ! ETJSkCuRqpbOXpeVlI+Tl04xIycqqiiMZ/5NhwwnpgV82OLB45hHCDf5fVc8LCcC ! 1hw0bAwwOLzZQgefBG22mZIjbeg/WB0ZvxGmcQ2sX0hqRoYl8RtkUVFmL4oNrsBW ! Ysse6a14GL9ojKlQY8e8v0xscJwXw8xNeRXNQKvp19U= -----END RSA PRIVATE KEY----- --- 1,30 ---- -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED ! DEK-Info: DES-EDE3-CBC,A80E2DC36B7CD48B ! Sc+74BWerLSjhXGE9FxKmfCQNn/D6RTrH7klecMOmw1aSVq26hVkvqqilQ9AXHCv ! Di0JTB4jrhJK4YuM9fSKAHNhkHLRECRcHbAwqeA8VbV0fbDwTlIEt1eJj4i5M8rj ! 0gH6HsLOYsEmom8cZVKlDNpkTLNnIoQkj5xlje4MBcp5Gfe2JyaxC7oMI/3L5jZM ! l1q9tPWjovV+kKH7C1CXSiXa9ec/hJLQJEewqYYVqjmxQXK2EBONZAWitljhAeuU ! /VAcSEG3sWbr1gB2jHYEyn2VQtpwZbHGTUQcyGy/dxvtSK+aObJiTf56mGC71zVt ! NO2N/2lNj7FV5XX47TOSgtkZHvvK6TAWt7Y1R4XDPuJH0f0c1q8uFszylqgIOPoR ! dqBox3k1Ruh7Jp4sdmHw7KtczFmMQg8fBaCKYK6ZlpiBZ0abz/k/E3HoCZ2d5p5+ ! gUCgNvcbH6hAVcjhjBfDbV8pd62X9aHNVMXiXCo7yqVy942dsX+7ly+jzVVN5z8c ! C7eEk7fXd2wE4NRhRjOkJqu2dls3eCPOq84NrtiX2vWw8LquR78qxFlUfINI9Cuh ! wMprUJAHOzy/KGp41FekKQY+ID4iY3VyBK+MuoEo1y6WEbAgPfBa4esCvtK0t9Jq ! HbJ2EPrBOAkFMIBAyCD0jNCwyjUAhJ17JlSWUI7kwR/Q9fT++Jg0TXg3w0zumpPs ! OZsv1HEysVdpmuXfh0wKTEZO8TwN52kXZnO2O19nU/zCJ76pBmYAfLyJ3sgCjefS ! ptRJkfifi0kuvM8ur4xgXZQQyBd2q8YkksqEKGLzI2wgdkHzQQG/HdQt2dQd0Ond ! iPEp9MPo58p7HbPAd77mBnssQXK7c7q1H4W/sfsPqg25SuoJX9TzLQWIUN7Sr9sp ! 0EpSvHDX+KlNdCTb7B9siwZ+1ipt3vJ4N9IKvx5Dmw4pAxuFBiAJpi75SEZVzSuH ! yzLL23/zX4x0hiaxjU0qyJAkSTJBIhgkbsLBrMKpmtriPBG3XgI2eQ3DsE+Iu2EC ! lqcpcqtdpynbDsTTjpXgKteJ2vqbjS9kIU1M/kRvLv3AyBOapsfRXYOYpXMDBwPU ! QMa5+BSb4lr++bQxa2/foUgG5qu7nX6bhhE81ErWqyxLOnxF13It0MClyo9hqVET ! 1mDwc5CSWZJx70Y7y0KGCsCEiKMvHPV9XnXq5lEXN95Stc1iwBJdZowDBttZ//Ul ! 5YMiQYx5Qk2ZI9prJosD51HPO8McORjHZFtDK/7Hfm+Dib/tRfNCP6+966LUewDY ! dWyR1+hlhCu1r7t6IIKKZ6D6N82RDFB93c8RKP7929PDC0jjX5U2g79nPCiOKrRa ! +rp538em2foW8BjPQxPw9lmPwzmQp1xDRpsh4QJ7Z8JmNqcz9KELWaRlEQ+kyWg0 ! JY8VZdIdBgJ7QC/sB8PhQu7/Ti8OJfkh6VUxXh6jO5ghkZYk1ZQmQOht7vLWdIyY ! 8Zn1BUMDW9JEtv2mul5eBEXZ+Bc1t/BIhgoX0RYV2Nl/+m0h/hvpc825enA717Gj ! BaMyenLFZlXTP2rCvS7j0zfBVXGjlZoEPo/NzkP55kL5sUqdNSe/fA== -----END RSA PRIVATE KEY----- Index: public.key =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/keys/public.key,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** public.key 8 Jan 2003 23:59:31 -0000 1.1 --- public.key 9 Jan 2003 00:12:44 -0000 1.2 *************** *** 1,4 **** -----BEGIN PUBLIC KEY----- ! MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALUcaitOLbuvkIM7EQsK1fyJHpKd/MOG ! oPM2/F2tR6/L/FaWjvPpaez8am1rrreFmn+N8Iwh+ERTCPhyxc5GJHUCAwEAAQ== -----END PUBLIC KEY----- --- 1,9 ---- -----BEGIN PUBLIC KEY----- ! MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmajZWjGex/iDo8cd6k3j ! MyVSYOf+W2RPA3UVxhVU7YQstB1wUDeLAl25CDR1IkD2ZHm3vThmedju0/deZjlg ! ZT8N561ag+5laqBxk2lNc03yTXbdWk5Vw+5RojxgtqIQdIPph1mD8GPnSvasiqXJ ! qC1uWLseJFxb1wYUB9W8whxLKgx4M8J8KZXeWCtRM1+xmvtVWTHkuBHK0ACK8J5N ! m6nipryknpGTxl349a2edMXj7raY+q8QWW7/fiaT4Z7Jwig5VN3lGz8D4pTI2Qit ! pE7dGnI6r6H3JMbee2UyQ4WDQ608Iv1hT1pueziEIu+1uEkujewvCN53Y8CQq7mO ! nwIDAQAB -----END PUBLIC KEY----- |
From: <pio...@us...> - 2003-01-08 23:59:34
|
Update of /cvsroot/phpfwconfsys/Daemon-Alpha/keys In directory sc8-pr-cvs1:/tmp/cvs-serv9197/keys Added Files: genkeys.sh private.key public.key Log Message: added a key generation script and two sample keys for use in secure transations later --- NEW FILE: genkeys.sh --- #!/bin/bash echo echo echo Generating private key... echo You will be asked to enter a passprase twice echo openssl genrsa -out private.key -des3 echo echo echo Generating public key... echo Please enter the same passprase as you entered above echo openssl rsa -in private.key -pubout -out public.key --- NEW FILE: private.key --- -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,86D007BDC0C220CE QExvkKCbMs8CwCAQsYVU75bJi5Zie6D+9qiRPoQx2EWbE7BPlfzcqHrW26zw/A71 3+XmtC52NQ9JNE8IKkdDLcWMXqjuolrxvZZKA/D6RJhVlWxpnKdUFQ/IA+/wR1a6 XlGrxnNxw0lPP1Ozr6wWK+2V1vObpohfo5o25LmLIHt+N6lNIo/4VnFxFCVfxrtz uVl4fsSvcqoPpPHF8Q70P7YoIcdpJITzpPyXr+z2XHKzS8Go7CH+ik7eaa6Oynfc ETJSkCuRqpbOXpeVlI+Tl04xIycqqiiMZ/5NhwwnpgV82OLB45hHCDf5fVc8LCcC 1hw0bAwwOLzZQgefBG22mZIjbeg/WB0ZvxGmcQ2sX0hqRoYl8RtkUVFmL4oNrsBW Ysse6a14GL9ojKlQY8e8v0xscJwXw8xNeRXNQKvp19U= -----END RSA PRIVATE KEY----- --- NEW FILE: public.key --- -----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALUcaitOLbuvkIM7EQsK1fyJHpKd/MOG oPM2/F2tR6/L/FaWjvPpaez8am1rrreFmn+N8Iwh+ERTCPhyxc5GJHUCAwEAAQ== -----END PUBLIC KEY----- |
From: <pio...@us...> - 2003-01-08 23:58:19
|
Update of /cvsroot/phpfwconfsys/Daemon-Alpha/keys In directory sc8-pr-cvs1:/tmp/cvs-serv8924/keys Log Message: Directory /cvsroot/phpfwconfsys/Daemon-Alpha/keys added to the repository |
From: <pio...@us...> - 2003-01-08 04:39:55
|
Update of /cvsroot/phpfwconfsys/Daemon-Alpha In directory sc8-pr-cvs1:/tmp/cvs-serv10131 Modified Files: Daemon.Class.php DaemonSession.Class.php Server.Class.php Socket.Class.php Utility.php Log Message: added vim fold markers to the code Index: Daemon.Class.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/Daemon.Class.php,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Daemon.Class.php 8 Jan 2003 02:50:54 -0000 1.2 --- Daemon.Class.php 8 Jan 2003 04:39:51 -0000 1.3 *************** *** 17,21 **** var $Session; ! function Daemon($settings) { $this->DaemonSettings = $settings; --- 17,21 ---- var $Session; ! function Daemon($settings) // {{{ { $this->DaemonSettings = $settings; *************** *** 45,51 **** return; } ! } ! function Start() { dprint("Daemon::Start()"); --- 45,51 ---- return; } ! } //}}} ! function Start() // {{{ { dprint("Daemon::Start()"); *************** *** 54,66 **** $this->Server = new Server($this->Socket, &$a, $PreforkCount); $this->Server->Start(); ! } ! function Hook_SIGUSR1() { dprint("Daemon::Hook_SIGUSR1()"); $this->Active = false; ! } ! function HandleConnection($Sock) { dprint("Daemon::HandleConnection(&$Sock)"); --- 54,66 ---- $this->Server = new Server($this->Socket, &$a, $PreforkCount); $this->Server->Start(); ! } // }}} ! function Hook_SIGUSR1() // {{{ { dprint("Daemon::Hook_SIGUSR1()"); $this->Active = false; ! } // }}} ! function HandleConnection($Sock) // {{{ { dprint("Daemon::HandleConnection(&$Sock)"); *************** *** 107,116 **** $this->Session->Close(); return true; ! } ! function Shutdown() { $this->Socket->Close(); ! } } --- 107,116 ---- $this->Session->Close(); return true; ! } // }}} ! function Shutdown() // {{{ { $this->Socket->Close(); ! } // }}} } Index: DaemonSession.Class.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/DaemonSession.Class.php,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** DaemonSession.Class.php 8 Jan 2003 02:50:54 -0000 1.1 --- DaemonSession.Class.php 8 Jan 2003 04:39:51 -0000 1.2 *************** *** 23,27 **** var $CharData = ""; ! function DaemonSession(&$daemon, &$sock) { $this->Socket =& $sock; --- 23,27 ---- var $CharData = ""; ! function DaemonSession(&$daemon, &$sock) //{{{ { $this->Socket =& $sock; *************** *** 35,47 **** $this->State = "none"; ! } ! function SocketWrite($msg) { $r = $this->Socket->Write($msg); if ($r === false) $this->Error = true; ! } ! function SocketError($msg) { dprint("DaemonSession::SocketError($msg)"); --- 35,47 ---- $this->State = "none"; ! } // }}} ! function SocketWrite($msg) // {{{ { $r = $this->Socket->Write($msg); if ($r === false) $this->Error = true; ! } // }}} ! function SocketError($msg) // {{{ { dprint("DaemonSession::SocketError($msg)"); *************** *** 49,62 **** $this->Socket->Close(); $this->Daemon->Active = false; ! } ! function CloseClientStack() { foreach($this->ClientElementStack as $e) { $this->SocketWrite("</$e>\n"); } ! } ! function XMLError() { dprint("DaemonSession::XMLError()"); --- 49,62 ---- $this->Socket->Close(); $this->Daemon->Active = false; ! } // }}} ! function CloseClientStack() // {{{ { foreach($this->ClientElementStack as $e) { $this->SocketWrite("</$e>\n"); } ! } // }}} ! function XMLError() // {{{ { dprint("DaemonSession::XMLError()"); *************** *** 66,72 **** $this->SendToClient("Error",$s,array( id=>200 )); dprint($s); ! } ! function RcvData($data) { $r = xml_parse($this->XMLParser,$data); --- 66,72 ---- $this->SendToClient("Error",$s,array( id=>200 )); dprint($s); ! } // }}} ! function RcvData($data) // {{{ { $r = xml_parse($this->XMLParser,$data); *************** *** 74,91 **** if ($this->Error) { return false; } return true; ! } ! function EndOfData() { $r = xml_parse($this->XMLParser,"",true); if (!$r) $this->XMLError(); ! } ! function Handle_CharData($parser, $data) { $this->CharData .= $data; ! } ! function SendToClient($element, $data="", $args=array()) { dprint("DaemonSession::SendToClient($element, $data, $args)"); --- 74,91 ---- if ($this->Error) { return false; } return true; ! } // }}} ! function EndOfData() // {{{ { $r = xml_parse($this->XMLParser,"",true); if (!$r) $this->XMLError(); ! } // }}} ! function Handle_CharData($parser, $data) // {{{ { $this->CharData .= $data; ! } // }}} ! function SendToClient($element, $data="", $args=array()) // {{{ { dprint("DaemonSession::SendToClient($element, $data, $args)"); *************** *** 106,112 **** $this->SocketWrite($out); dprint("Sent:\n$out"); ! } ! function Handle_StartElement($parser, $name, $attrs) { dprint("Daemon::StartElement($parser, $name, $attrs)"); --- 106,112 ---- $this->SocketWrite($out); dprint("Sent:\n$out"); ! } // }}} ! function Handle_StartElement($parser, $name, $attrs) // {{{ { dprint("Daemon::StartElement($parser, $name, $attrs)"); *************** *** 115,118 **** --- 115,119 ---- while($once = true) { $once = false; + // First Element in the document (aka document element) {{{ if (count($this->ElementStack) == 0) { // first element *************** *** 132,136 **** --- 133,139 ---- break; } + // }}} + // Inside the SESSION element {{{ if ($this->ElementStack[0] == "SESSION") { if ($name == "ECHO") { *************** *** 148,158 **** break; } } array_push($this->ElementStack,$name); dprint("ElementStack: ".implode(", ",$this->ElementStack)); ! } ! function Handle_EndElement($parser, $name) { dprint("Daemon::EndElement($parser, $name)"); --- 151,162 ---- break; } + // }}} } array_push($this->ElementStack,$name); dprint("ElementStack: ".implode(", ",$this->ElementStack)); ! } // }}} ! function Handle_EndElement($parser, $name) // {{{ { dprint("Daemon::EndElement($parser, $name)"); *************** *** 186,196 **** } } ! } ! function Close() { $this->CloseClientStack(); xml_parser_free($this->XMLParser); ! } } --- 190,200 ---- } } ! } // }}} ! function Close() // {{{ { $this->CloseClientStack(); xml_parser_free($this->XMLParser); ! } // }}} } Index: Server.Class.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/Server.Class.php,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Server.Class.php 8 Jan 2003 02:50:54 -0000 1.3 --- Server.Class.php 8 Jan 2003 04:39:51 -0000 1.4 *************** *** 15,19 **** var $SIGNALHooks = array(); ! function Server($socket, &$handler, $prefork=10) { // assume the socket is already bound to and set to listen --- 15,19 ---- var $SIGNALHooks = array(); ! function Server($socket, &$handler, $prefork=10) // {{{ { // assume the socket is already bound to and set to listen *************** *** 21,27 **** $this->Socket = &$socket; $this->Handler = &$handler; ! } ! function Start() { dprint("Server::Start()"); --- 21,27 ---- $this->Socket = &$socket; $this->Handler = &$handler; ! } // }}} ! function Start() // {{{ { dprint("Server::Start()"); *************** *** 40,58 **** $this->Sentinel(); ! } ! function AddHook($sig, $handler) { @$this->SIGNALHooks[$sig] = $handler; ! } ! function RemoveHook($sig) { if (isset($this->SIGNALHooks[$sig])) { $this->SIGNALHooks[$sig] = null; } ! } ! function Sentinel() { dprint("Server::Sentinel()"); --- 40,58 ---- $this->Sentinel(); ! } // }}} ! function AddHook($sig, $handler) // {{{ { @$this->SIGNALHooks[$sig] = $handler; ! } // }}} ! function RemoveHook($sig) // {{{ { if (isset($this->SIGNALHooks[$sig])) { $this->SIGNALHooks[$sig] = null; } ! } // }}} ! function Sentinel() // {{{ { dprint("Server::Sentinel()"); *************** *** 74,82 **** } dprint("Server::Sentinel(): Reached End"); ! } ! ! function Parent_Handler($sig) ! { dprint("Server::Parent_Handler($sig)"); switch ($sig) --- 74,81 ---- } dprint("Server::Sentinel(): Reached End"); ! } // }}} ! function Parent_Handler($sig) // {{{ ! { dprint("Server::Parent_Handler($sig)"); switch ($sig) *************** *** 87,93 **** break; } ! } ! function Child_Handler($sig) { dprint("Server::Child_Handler($sig)"); --- 86,92 ---- break; } ! } // }}} ! function Child_Handler($sig) // {{{ { dprint("Server::Child_Handler($sig)"); *************** *** 119,125 **** } ! } ! function ForkWorker() { dprint("Server::ForkWorker()"); --- 118,124 ---- } ! } // }}} ! function ForkWorker() // {{{ { dprint("Server::ForkWorker()"); *************** *** 142,155 **** $this->StartListen(); } ! } ! function AddChild($pid) { array_push($this->Children,$pid); dprint("Child: $pid Added to Children List"); dprint("Children: ".implode(", ",$this->Children)); ! } ! function RemoveChild($pid) { dprint("RemoveChild($pid)"); --- 141,154 ---- $this->StartListen(); } ! } // }}} ! function AddChild($pid) // {{{ { array_push($this->Children,$pid); dprint("Child: $pid Added to Children List"); dprint("Children: ".implode(", ",$this->Children)); ! } // }}} ! function RemoveChild($pid) // {{{ { dprint("RemoveChild($pid)"); *************** *** 163,169 **** dprint("Removed PID: $pid from Children List"); dprint("Children: ".implode(", ",$this->Children)); ! } ! function Handle(&$Sock) { if (is_array($this->Handler)) { --- 162,168 ---- dprint("Removed PID: $pid from Children List"); dprint("Children: ".implode(", ",$this->Children)); ! } // }}} ! function Handle(&$Sock) // {{{ { if (is_array($this->Handler)) { *************** *** 176,182 **** $func(&$Sock); } ! } ! function StartListen() { $ChildSock =& $this->Socket->Accept(); --- 175,181 ---- $func(&$Sock); } ! } // }}} ! function StartListen() // {{{ { $ChildSock =& $this->Socket->Accept(); *************** *** 194,200 **** dprint("Ending Child Process."); exit; ! } ! function KillChildren($sig=SIGTERM, $wait=false) { dprint("Server::KillChildren($sig, $wait)"); --- 193,199 ---- dprint("Ending Child Process."); exit; ! } // }}} ! function KillChildren($sig=SIGTERM, $wait=false) // {{{ { dprint("Server::KillChildren($sig, $wait)"); *************** *** 208,219 **** } } ! } ! function Shutdown() { dprint("Server::Shutdown()"); $this->Running = false; $this->KillChildren(SIGUSR1,true); ! } } --- 207,218 ---- } } ! } // }}} ! function Shutdown() // {{{ { dprint("Server::Shutdown()"); $this->Running = false; $this->KillChildren(SIGUSR1,true); ! } // }}} } Index: Socket.Class.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/Socket.Class.php,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Socket.Class.php 8 Jan 2003 02:50:54 -0000 1.3 --- Socket.Class.php 8 Jan 2003 04:39:51 -0000 1.4 *************** *** 9,13 **** var $Valid = true; ! function Socket($domain) { echo "Debug: Socket::Socket($domain)\n"; --- 9,13 ---- var $Valid = true; ! function Socket($domain) // {{{ { echo "Debug: Socket::Socket($domain)\n"; *************** *** 30,35 **** } } ! function GetLastSocketError() { $errno = socket_last_error($this->Socket); --- 30,36 ---- } } + // }}} ! function GetLastSocketError() // {{{ { $errno = socket_last_error($this->Socket); *************** *** 38,49 **** return "Error $errno: ($errstr)"; } ! function GetLastErrorNumber() { $errno = socket_last_error($this->Socket); return $errno; } ! ! function Bind($address, $port = -1) { echo "Debug: Socket::Bind($address,$port)\n"; --- 39,52 ---- return "Error $errno: ($errstr)"; } + // }}} ! function GetLastErrorNumber() // {{{ { $errno = socket_last_error($this->Socket); return $errno; } ! // }}} ! ! function Bind($address, $port = -1) // {{{ { echo "Debug: Socket::Bind($address,$port)\n"; *************** *** 65,70 **** return true; } ! function Listen($backlog = 1) { echo "Debug: Socket::Listen($backlog)\n"; --- 68,74 ---- return true; } + // }}} ! function Listen($backlog = 1) // {{{ { echo "Debug: Socket::Listen($backlog)\n"; *************** *** 79,84 **** return true; } ! function &Accept() { echo "Debug: Socket::Accept()\n"; --- 83,89 ---- return true; } + // }}} ! function &Accept() // {{{ { echo "Debug: Socket::Accept()\n"; *************** *** 103,108 **** return new SocketClone($result); } ! function Write($msg) { echo "Debug: Socket::Write($msg)\n"; --- 108,114 ---- return new SocketClone($result); } + // }}} ! function Write($msg) // {{{ { echo "Debug: Socket::Write($msg)\n"; *************** *** 118,123 **** return $result; } ! function Read($num, &$buf, $type=PHP_BINARY_READ) { echo "Debug: Socket::Read($num, $type)\n"; --- 124,130 ---- return $result; } + // }}} ! function Read($num, &$buf, $type=PHP_BINARY_READ) // {{{ { echo "Debug: Socket::Read($num, $type)\n"; *************** *** 139,144 **** return strlen($buf); } ! function Close() { echo "Debug: Socket::Close()\n"; --- 146,152 ---- return strlen($buf); } + // }}} ! function Close() // {{{ { echo "Debug: Socket::Close()\n"; *************** *** 151,154 **** --- 159,163 ---- return true; } + // }}} } Index: Utility.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/Utility.php,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Utility.php 5 Jan 2003 07:12:00 -0000 1.1 --- Utility.php 8 Jan 2003 04:39:51 -0000 1.2 *************** *** 1,16 **** <?php ! function array_swap(&$array, $ind1, $ind2) { $tmp = &$array[$ind1]; $array[$ind1] = &$array[$ind2]; $array[$ind2] = &$tmp; ! } ! function dprint($str) { $pid = posix_getpid(); echo "DBG: ($pid): $str\n"; ! } --- 1,16 ---- <?php ! function array_swap(&$array, $ind1, $ind2) // {{{ { $tmp = &$array[$ind1]; $array[$ind1] = &$array[$ind2]; $array[$ind2] = &$tmp; ! } // }}} ! function dprint($str) // {{{ { $pid = posix_getpid(); echo "DBG: ($pid): $str\n"; ! } // }}} |
From: <pio...@us...> - 2003-01-08 02:50:57
|
Update of /cvsroot/phpfwconfsys/Daemon-Alpha In directory sc8-pr-cvs1:/tmp/cvs-serv379 Modified Files: Config.php Daemon.Class.php Server.Class.php Socket.Class.php Added Files: DaemonSession.Class.php Log Message: - split the Session handling to a new class - added ability to register signal handers in the Server class - SIGUSR1 now gracefuly kills a child - children should not bail on a sys call interrupted error (since its necesary to interrupt the sys calls in order to get signal handlers to work) - basic structure in place to handle xml sessions --- NEW FILE: DaemonSession.Class.php --- <?php /* Error Codes: 100 - Invalid Session Start Tag 101 - Start/End Tag Mismatch 102 - Invalid Element 200 - XML Parse Error */ // the class responsible for the actual management of the transactions between the // server and the client class DaemonSession { var $Socket; var $Daemon; var $XMLParser; var $State; var $Error = false; var $ElementStack = array(); var $ClientElementStack = array(); var $CharData = ""; function DaemonSession(&$daemon, &$sock) { $this->Socket =& $sock; $this->Daemon =& $daemon; $this->XMLParser = xml_parser_create(); xml_set_object($this->XMLParser, $this); xml_set_element_handler($this->XMLParser,"Handle_StartElement","Handle_EndElement"); xml_set_character_data_handler($this->XMLParser,"Handle_CharData"); $this->State = "none"; } function SocketWrite($msg) { $r = $this->Socket->Write($msg); if ($r === false) $this->Error = true; } function SocketError($msg) { dprint("DaemonSession::SocketError($msg)"); dprint("Msg: $msg"); $this->Socket->Close(); $this->Daemon->Active = false; } function CloseClientStack() { foreach($this->ClientElementStack as $e) { $this->SocketWrite("</$e>\n"); } } function XMLError() { dprint("DaemonSession::XMLError()"); $s = sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->XMLParser)), xml_get_current_line_number($this->XMLParser)); $this->SendToClient("Error",$s,array( id=>200 )); dprint($s); } function RcvData($data) { $r = xml_parse($this->XMLParser,$data); if (!$r) { $this->XMLError(); return false; } if ($this->Error) { return false; } return true; } function EndOfData() { $r = xml_parse($this->XMLParser,"",true); if (!$r) $this->XMLError(); } function Handle_CharData($parser, $data) { $this->CharData .= $data; } function SendToClient($element, $data="", $args=array()) { dprint("DaemonSession::SendToClient($element, $data, $args)"); print_r($args); $shorttag = ($data=="")?true:false; $out = "<".strtoupper($element)." "; foreach ($args as $k=>$v) { $out .= "$k=\"$v\" "; } if ($shorttag) { $out .= "/>\n"; } else { $out .= ">"; $out .= $data; $out .= "</".strtoupper($element).">\n"; } $this->SocketWrite($out); dprint("Sent:\n$out"); } function Handle_StartElement($parser, $name, $attrs) { dprint("Daemon::StartElement($parser, $name, $attrs)"); print_r($attrs); while($once = true) { $once = false; if (count($this->ElementStack) == 0) { // first element // open a client session tag on the client side $this->SocketWrite("<CLIENTSESSION>\n"); array_push($this->ClientElementStack,"CLIENTSESSION"); // make sure its SESSION if ($name == "SESSION") { $this->SendToClient("Message","\nAvailible Commands: shutdown, quit, echo\n"); } else { $this->SendToClient("Error","Invalid Session Start Tag", array( id=>100 )); $this->Error = true; } break; } if ($this->ElementStack[0] == "SESSION") { if ($name == "ECHO") { $this->ChatData = ""; } else if ($name == "SHUTDOWN") { } else if ($name == "QUIT") { } else { $this->SendToClient("Error","Invalid Element", array( id=>102 )); $this->Error = true; return; } break; } } array_push($this->ElementStack,$name); dprint("ElementStack: ".implode(", ",$this->ElementStack)); } function Handle_EndElement($parser, $name) { dprint("Daemon::EndElement($parser, $name)"); dprint("ElementStack: ".implode(", ",$this->ElementStack)); $last = array_pop($this->ElementStack); if ($last != $name) { // mismatched start/end tags $this->SendToClient("Error","Mismatched Start/End Element Tags", array( id=>101 )); $this->Error = true; return; } $LastIndex = count($this->ElementStack)-1; dprint("LastIndex: $LastIndex"); if ($LastIndex == -1) { // document element closed .. tell the parser its the end too xml_parse($this->XMLParser,"",true); } if (($LastIndex == 0) && ($this->ElementStack[0] == "SESSION")) { // valid place for elements rooting from session to end if ($name == "ECHO") { $this->SendToClient("Reply",$this->CharData); } if ($name == "QUIT") { $this->Daemon->Active = false; } if ($name == "SHUTDOWN") { posix_kill(posix_getppid(),SIGTERM); } } } function Close() { $this->CloseClientStack(); xml_parser_free($this->XMLParser); } } ?> Index: Config.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/Config.php,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Config.php 7 Jan 2003 13:31:19 -0000 1.3 --- Config.php 8 Jan 2003 02:50:54 -0000 1.4 *************** *** 17,21 **** "Port" => -1, // TCP Port to bind to (ignored when domain is AF_UNIX) "Address" => "/tmp/._phpFWConfigDaemon_", // the IP or path (in case of AF_UNIX) to bind to ! "PreforkCount" => 10 // number of processes to fork and maintain ); --- 17,21 ---- "Port" => -1, // TCP Port to bind to (ignored when domain is AF_UNIX) "Address" => "/tmp/._phpFWConfigDaemon_", // the IP or path (in case of AF_UNIX) to bind to ! "PreforkCount" => 1 // number of processes to fork and maintain ); Index: Daemon.Class.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/Daemon.Class.php,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** Daemon.Class.php 7 Jan 2003 13:31:19 -0000 1.1 --- Daemon.Class.php 8 Jan 2003 02:50:54 -0000 1.2 *************** *** 7,10 **** --- 7,11 ---- include_once("SocketClone.Class.php"); include_once("Server.Class.php"); + include_once("DaemonSession.Class.php"); class Daemon *************** *** 13,18 **** var $Server; var $DaemonSettings; - var $CharData = ""; var $ChildSock; function Daemon($settings) --- 14,19 ---- var $Server; var $DaemonSettings; var $ChildSock; + var $Session; function Daemon($settings) *************** *** 55,128 **** } ! function Handle_CharData($parser, $data) ! { ! $this->CharData .= $data; ! } ! ! function Handle_StartElement($parser, $name, $attrs) ! { ! dprint("Daemon::StartElement($parser, $name, $attrs)"); ! print_r($attrs); ! ! if ($name == "ECHO") { ! xml_set_character_data_handler($parser,"Handle_CharData"); ! $this->CharData = ""; ! } ! ! } ! ! function Handle_EndElement($parser, $name) { ! dprint("Daemon::EndElement($parser, $name)"); ! if ($name == "SHUTDOWN") { ! posix_kill(posix_getppid(),SIGTERM); ! } ! if ($name == "QUIT") { ! $this->Active = false; ! } ! if ($name == "ECHO") { ! xml_set_character_data_handler($parser,""); ! $this->ChildSock->Write("<Result>".$this->CharData."</Result>"); ! } } function HandleConnection($Sock) { $this->ChildSock =& $Sock; - $XML = xml_parser_create(); - xml_set_object($XML,$this); - xml_set_element_handler($XML,"Handle_StartElement","Handle_EndElement"); - - $msg = "<Greeting>\nAvailible Commands: shutdown, quit, echo\n</Greeting>\n"; - $r = $Sock->Write($msg); - if ($r === false) { $Sock->Close(); return false; } $this->Active = true; while ($this->Active) { $len = $Sock->Read(2048, $buf); // Error Occured ! if ($len === false) { xml_parser_free($XML); return false; } // End of Communication if ($len == 0) { ! xml_parse($XML,"",true); break; } echo "Client: $buf"; ! $r = xml_parse($XML,$buf); if (!$r) { ! $s = sprintf("XML error: %s at line %d", ! xml_error_string(xml_get_error_code($XML)), ! xml_get_current_line_number($XML)); ! $e = "<Error>$s</Error>"; ! $Sock->Write($e); ! dprint($s); break; } } ! xml_parser_free($XML); return true; } --- 56,109 ---- } ! function Hook_SIGUSR1() { ! dprint("Daemon::Hook_SIGUSR1()"); ! $this->Active = false; } function HandleConnection($Sock) { + dprint("Daemon::HandleConnection(&$Sock)"); $this->ChildSock =& $Sock; $this->Active = true; + $this->Session = new DaemonSession(&$this, &$Sock); + + $this->Server->AddHook(SIGUSR1,array(&$this,"Hook_SIGUSR1")); while ($this->Active) { $len = $Sock->Read(2048, $buf); + $errno = $Sock->GetLastErrorNumber(); + // Error Occured ! if ( $len == false ) { ! $errno = $Sock->GetLastErrorNumber(); ! if ($errno != 4) { ! // ignoring error 4 (interrupted system call) ! $this->Session->Close(); ! return false; ! } else { ! $len = -1; ! $buf = ""; ! } ! } // End of Communication if ($len == 0) { ! // end of communication ! $this->Session->EndOfData(); break; } echo "Client: $buf"; ! ! $r = $this->Session->RcvData($buf); if (!$r) { ! dprint("Session->RcvData() failed!"); break; } } ! $this->Session->Close(); return true; } Index: Server.Class.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/Server.Class.php,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Server.Class.php 7 Jan 2003 13:31:19 -0000 1.2 --- Server.Class.php 8 Jan 2003 02:50:54 -0000 1.3 *************** *** 13,16 **** --- 13,17 ---- var $Running = true; var $ChildSock = null; + var $SIGNALHooks = array(); function Server($socket, &$handler, $prefork=10) *************** *** 41,44 **** --- 42,57 ---- } + function AddHook($sig, $handler) + { + @$this->SIGNALHooks[$sig] = $handler; + } + + function RemoveHook($sig) + { + if (isset($this->SIGNALHooks[$sig])) { + $this->SIGNALHooks[$sig] = null; + } + } + function Sentinel() { *************** *** 88,91 **** --- 101,121 ---- } break; + case SIGUSR1: + // graceful shutdown + break; + } + if (isset($this->SIGNALHooks[$sig])) { + $handler =& $this->SIGNALHooks[$sig]; + // call the hook + if (is_array($handler)) { + // object ref + $obj = &$handler[0]; + $func = $handler[1]; + $obj->$func(); + } else { + $func = $handler; + $func(); + } + } } *************** *** 107,110 **** --- 137,142 ---- dprint("Installing Child SIGTERM Handler..."); pcntl_signal(SIGTERM,array(&$this,"Child_Handler"),false); + dprint("Installing Child SIGUSR1 Handler..."); + pcntl_signal(SIGUSR1,array(&$this,"Child_Handler"),false); $this->StartListen(); *************** *** 182,186 **** dprint("Server::Shutdown()"); $this->Running = false; ! $this->KillChildren(SIGTERM,true); } --- 214,218 ---- dprint("Server::Shutdown()"); $this->Running = false; ! $this->KillChildren(SIGUSR1,true); } Index: Socket.Class.php =================================================================== RCS file: /cvsroot/phpfwconfsys/Daemon-Alpha/Socket.Class.php,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Socket.Class.php 7 Jan 2003 13:31:19 -0000 1.2 --- Socket.Class.php 8 Jan 2003 02:50:54 -0000 1.3 *************** *** 39,42 **** --- 39,48 ---- } + function GetLastErrorNumber() + { + $errno = socket_last_error($this->Socket); + return $errno; + } + function Bind($address, $port = -1) { |
From: <pio...@us...> - 2003-01-07 14:10:39
|
Update of /cvsroot/phpfwconfsys/Experimental In directory sc8-pr-cvs1:/tmp/cvs-serv17250 Modified Files: tables.sql Log Message: syncmail works like a charm Index: tables.sql =================================================================== RCS file: /cvsroot/phpfwconfsys/Experimental/tables.sql,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** tables.sql 7 Jan 2003 13:58:54 -0000 1.2 --- tables.sql 7 Jan 2003 14:10:35 -0000 1.3 *************** *** 12,14 **** ); ! #test --- 12,14 ---- ); ! |
From: <pio...@us...> - 2003-01-07 13:58:58
|
Update of /cvsroot/phpfwconfsys/Experimental In directory sc8-pr-cvs1:/tmp/cvs-serv12880 Modified Files: tables.sql Log Message: testing syncmail Index: tables.sql =================================================================== RCS file: /cvsroot/phpfwconfsys/Experimental/tables.sql,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** tables.sql 10 Dec 2001 07:53:49 -0000 1.1 --- tables.sql 7 Jan 2003 13:58:54 -0000 1.2 *************** *** 12,13 **** --- 12,14 ---- ); + #test |
From: SourceForge.net <no...@so...> - 2003-01-07 13:32:22
|
Task #52193 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Sample TCP/IP Listner program Complete: 100% Status: Closed Authority : piotrbanasik Assigned to: piotrbanasik Description: Make a sample program that accepts a TCP/IP connection Follow-Ups: ------------------------------------------------------- Date: 2002-04-13 22:54 By: piotrbanasik Comment: started looking into making the daemon in PHP ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52193&group_id=31936&group_project_id=18923 |
From: SourceForge.net <no...@so...> - 2003-01-07 13:31:51
|
Task #52193 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Sample TCP/IP Listner program Complete: 100% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: Make a sample program that accepts a TCP/IP connection Follow-Ups: ------------------------------------------------------- Date: 2002-04-13 22:54 By: piotrbanasik Comment: started looking into making the daemon in PHP ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52193&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 05:54:35
|
Task #52193 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Sample TCP/IP Listner program Complete: 25% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: Make a sample program that accepts a TCP/IP connection Follow-Ups: ------------------------------------------------------- Date: 2002-04-13 22:54 By: piotrbanasik Comment: started looking into making the daemon in PHP ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52193&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 04:37:34
|
Task #52192 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Research Linux TCP/IP Sockets Complete: 100% Status: Closed Authority : piotrbanasik Assigned to: piotrbanasik Description: Figure out how to make a listening socket, how to reply to it, etc ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52192&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 04:36:59
|
Task #52192 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Research Linux TCP/IP Sockets Complete: 100% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: Figure out how to make a listening socket, how to reply to it, etc ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52192&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 04:00:24
|
Task #35895 has been updated. Project: phpFWConfigSystem Subproject: Preliminary Planning Summary: Get this thing rolling.. Complete: 50% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: plan this out, get some proper docs out and start working on it on a local tree to get the core of it drafted. Follow-Ups: ------------------------------------------------------- Date: 2002-04-13 21:00 By: piotrbanasik Comment: I started working on the ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=35895&group_id=31936&group_project_id=12362 |
From: <no...@so...> - 2002-04-14 03:59:33
|
Task #52194 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Research what should be used as the format for the sessions Complete: 0% Status: Open Authority : piotrbanasik Assigned to: nobody Description: Options right now are between token or endline seperated text and XML ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52194&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 03:59:24
|
Task #52193 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Sample TCP/IP Listner program Complete: 25% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: Make a sample program that accepts a TCP/IP connection ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52193&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 03:59:11
|
Task #52194 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Research what should be used as the format for the sessions Complete: 0% Status: Open Authority : piotrbanasik Assigned to: nobody Description: Options right now are between token or endline seperated text and XML ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52194&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 03:58:51
|
Task #52195 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Implement a sample communcation layer Complete: 0% Status: Open Authority : piotrbanasik Assigned to: nobody Description: whatever was decided on in task 52194 .. make it work for the deamon ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52195&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 03:57:30
|
Task #52194 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Research what should be used as the format for the sessions Complete: 0% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: Options right now are between token or endline seperated text and XML ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52194&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 03:55:02
|
Task #52192 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Research Linux TCP/IP Sockets Complete: 75% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: Figure out how to make a listening socket, how to reply to it, etc ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52192&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 03:54:36
|
Task #52193 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Sample TCP/IP Listner program Complete: 0% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: Make a sample program that accepts a TCP/IP connection ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52193&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2002-04-14 03:53:58
|
Task #52192 has been updated. Project: phpFWConfigSystem Subproject: Firewall Control Daemon Summary: Research Linux TCP/IP Sockets Complete: 0% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: Figure out how to make a listening socket, how to reply to it, etc ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=52192&group_id=31936&group_project_id=18923 |
From: <no...@so...> - 2001-12-10 19:02:42
|
Task #35895 has been updated. Project: phpFWConfigSystem Subproject: Preliminary Planning Summary: Get this thing rolling.. Complete: 15% Status: Open Authority : piotrbanasik Assigned to: piotrbanasik Description: plan this out, get some proper docs out and start working on it on a local tree to get the core of it drafted. ------------------------------------------------------- For more info, visit: http://sourceforge.net/pm/task.php?func=detailtask&project_task_id=35895&group_id=31936&group_project_id=12362 |
From: Piotr B. <pi...@t-...> - 2001-08-08 20:58:04
|
boo! |