<?php // Set for readonly mode $PETDISK_READ_ONLY = false; function getParam($paramname) { if (isset($_GET[$paramname])) { return $_GET[$paramname]; } return false; } function fileExists($fileName, $caseSensitive = true) { if (file_exists($fileName)) { return $fileName; } if ($caseSensitive) { return false; } // Handle case insensitive requests $directoryName = dirname($fileName); $fileArray = glob($directoryName . '/*', GLOB_NOSORT); $fileNameLowerCase = strtolower($fileName); foreach ($fileArray as $file) { if (strtolower($file) == $fileNameLowerCase) { return $file; } } return false; } header_remove("X-Powered-By"); $verb = $_SERVER['REQUEST_METHOD']; if ($verb == "GET") { $file = "./"; if (isset($_GET['file'])) { if ($_GET['file'] == "TIME") { $file = "TIME"; } else { $fname = "./".$_GET['file']; $file = fileExists($fname, false); } } if ($file) { if (isset($_GET['l'])) { if ($_GET['l'] == 1) { $fs = 0; if ($file == "TIME") { // length of time field // this will be YYYY-MM-DD HH:mm:ss\n $fs = strlen("YYYY-MM-DD HH:mm:ss\n"); } else { $fs = filesize($file); } $resp = $fs."\r\n"; header('Content-Length: '.strlen($resp)); header('Content-Type: application/octet-stream'); echo $resp; flush(); } } // directory request else if (getParam('d') == 1) { // directory // check for the index of the page requested. $page = -1; if (array_key_exists('p', $_GET)) { $page = $_GET['p']; } $dir = "."; $files = scandir($dir); $filelist = ""; $pagesize = 0; $max_page_size = 512; $dir_pages = array(); $curr_page = 0; foreach ($files as $file) { $file_parts = pathinfo($file); $ext = ""; if (array_key_exists('extension', $file_parts)) { $ext = strtolower($file_parts['extension']); } if ($ext == "prg" || $ext == "seq" || $ext == "d64") { $newentry = strtoupper($file)."\n"; if ($page >= 0 && $pagesize + strlen($newentry) >= $max_page_size) { // end this page and make a new page $dir_pages[$curr_page] = $filelist."\n"; $curr_page++; $filelist = ""; } $filelist = $filelist.strtoupper($file)."\n"; } $pagesize = strlen($filelist); } // last page $dir_pages[$curr_page] = $filelist."\n"; $respbody = "\n"; if ($page == -1) { $respbody = $dir_pages[0]; } else { if ($page <= $curr_page) { $respbody = $dir_pages[$page]; } } header('Content-Length: '.strlen($respbody)); header('Content-Type: application/octet-stream'); echo $respbody; flush(); } else { // requesting a range of bytes $start = getParam('s'); $end = getParam('e'); if ($file == "TIME") { $currentDate = new DateTime(); $currentDate->setTimezone(new DateTimeZone("UTC")); $formattedDate = $currentDate->format("Y-m-d H:i:s\n"); $content_length = strlen($formattedDate); header('Content-Length: '.$content_length); header('Content-Type: application/octet-stream'); echo $formattedDate; flush(); return; } if (fileExists($file)) { $contents = ""; if ($end > 0) { $fp = fopen($file, "r"); fseek($fp, $start, SEEK_SET); $contents = fread($fp, $end-$start); fclose($fp); $content_length = $end-$start; } else { $contents = file_get_contents($file); } header('Content-Length: '.$content_length); header('Content-Type: application/octet-stream'); echo $contents; flush(); } else { error_log("file " . $file . " does not exist"); } } } } else if ($verb == "PUT") { if ($PETDISK_READ_ONLY == true) { // ignore writes for read only mode return; } $fname = $_GET['f']; $new = getParam('n'); // read put data $putdata = ''; if (getParam('b64')) { $base64data = file_get_contents("php://input"); $putdata = base64_decode($base64data); } else { $putdata = file_get_contents("php://input"); } $full_fname = ""; if ($fname) { $full_fname = "./".$fname; } $exists = false; if ($full_fname != "") { $exists = file_exists($full_fname); } // remove existing file if new specified $file_contents = ""; if ($exists == true && $new == 1) { unlink($full_fname); $exists = false; } if (getParam('u') == 1) // update specific block { $start = $_GET['s']; $end = $_GET['e']; // check to see if file is large enough $foundFname = fileExists($fname); if ($foundFname != false) { $fp = fopen($foundFname, "r+"); fseek($fp, $start); fwrite($fp, $putdata, $end-$start); fclose($fp); } else { error_log("file not found: " . $fname); } } else // append block to end of file { if ($exists == true) { $file_contents = file_get_contents($full_fname); } // append new data $file_contents = $file_contents . $putdata; // rewrite file file_put_contents($full_fname, $file_contents); } } ?>