From 8950fb92f8c68ec1521520c37dc8e05b1e07ffbf Mon Sep 17 00:00:00 2001 From: Diederik de Groot Date: Mon, 17 Feb 2020 02:41:01 +0100 Subject: [PATCH] Added simple test implementation of tftpserver Renamed lib/tftpserver.php to lib/tftp.php Fixed error output from lib/tftp.php Note: current simple tftpserver.php test implementation stores/read files from memory (not fs). So you need to put a file, before you can get that file back. Signed-off-by: Diederik de Groot --- lib/{tftpserver.php => tftp.php} | 5 +- tftpserver.php | 136 +++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 1 deletion(-) rename lib/{tftpserver.php => tftp.php} (99%) create mode 100755 tftpserver.php diff --git a/lib/tftpserver.php b/lib/tftp.php similarity index 99% rename from lib/tftpserver.php rename to lib/tftp.php index 6ee394c..9fa0621 100644 --- a/lib/tftpserver.php +++ b/lib/tftp.php @@ -612,7 +612,10 @@ class TFTPServer { while(true) { $read = array($this->_socket); - $r = stream_select($read, $write = null, $excpt = null, 1); + //$r = stream_select($read, $write = null, $excpt = null, 1); + $write = null; + $except = null; + $r = stream_select($read, $write, $excpt, 1); if($r === false) { $this->log_error("server", "select returned false"); diff --git a/tftpserver.php b/tftpserver.php new file mode 100755 index 0000000..b31a3b9 --- /dev/null +++ b/tftpserver.php @@ -0,0 +1,136 @@ +#!/usr/bin/env php + + * + * MIT License: + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +require_once("lib/tftp.php"); + +class TestTFTPServer extends TFTPServer +{ + private $_files = array(); + private $_debug; + + function __construct($server_url, $logger = NULL, $debug = false) + { + parent::__construct($server_url, $logger); + $this->_debug = $debug; + $this->max_put_size = 60000000; + } + + private function log($peer, $level, $message) + { + echo + date("H:i:s") . " " . + $level . " " . + $peer . " " . + $message . "\n"; + } + + public function log_debug($peer, $message) + { + if(!$this->_debug) + return; + + $this->log($peer, "D", $message); + } + + public function log_info($peer, $message) + { + $this->log($peer, "I", $message); + } + + public function log_warning($peer, $message) + { + $this->log($peer, "W", $message); + } + + public function log_error($peer, $message) + { + $this->log($peer, "E", $message); + } + + public function exists($peer, $filename) + { + if($filename == "not_writable" || $filename == "not_readable") + return true; + + return isset($this->_files[$filename]); + } + + public function readable($peer, $filename) + { + if($filename == "not_readable") + return false; + + return isset($this->_files[$filename]); + } + + public function get($peer, $filename, $mode) + { + if(isset($this->_files[$filename])) + return $this->_files[$filename]; + else + return false; + } + + public function writable($peer, $filename) + { + if($filename == "not_writable") + return false; + + return true; + } + + public function put($peer, $filename, $mode, $content) + { + $this->_files[$filename] = $content; + } +} + +$host = "127.0.0.1"; +$port = 1196; +$url = "udp://$host:$port"; + +if(count($_SERVER["argv"]) > 1) { + $server = new TestTFTPServer($url, true); + if(!$server->loop($error)) + die("$error\n"); +} else { + + $pid = pcntl_fork(); + $logger = new Logger_Stdout('LOG_DEBUG'); + if($pid == 0) { + $server = new TestTFTPServer($url, $logger); + if(!$server->loop($error)) + die("$error\n"); + exit(0); + } + usleep(100000); + // kill server + posix_kill($pid, SIGINT); +} + +?> +