<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>mr795 new document title</title>
</head>
<body>
<p>// -*- java -*-</p>
<div></div>
<div>import java.io.*;</div>
<div>import RAMDisk;</div>
<div>import FileSystem;</div>
<div>import FileBlockDevice;</div>
<div></div>
<div>/**</div>
<div>&nbsp;* FileSystem testbench</div>
<div>&nbsp;*</div>
<div>&nbsp;* Provides a simple command line interface to test the FileSystem.</div>
<div>&nbsp;* If run from the command line, running with no arguments will</div>
<div>&nbsp;* cause it to run from a RAM disk, if an argument is passed this</div>
<div>&nbsp;* will be assumed to be a filename of a file to store the device</div>
<div>&nbsp;* in. If the file is created the FileSystem will be called with&nbsp;</div>
<div>&nbsp;* createFS = true</div>
<div>&nbsp;*</div>
<div>&nbsp;* If the argument 'floppy' is passed, it will attempt to use the</div>
<div>&nbsp;* floppy drive. This only works under Linux. Passing 'floppy_new'</div>
<div>&nbsp;* will use the floppy drive and attempt to format a new filesystem.</div>
<div>&nbsp;*</div>
<div>&nbsp;* This is not guaranteed to all function properly. If you find a bug,</div>
<div>&nbsp;* please email me!</div>
<div>&nbsp;*</div>
<div>&nbsp;* Comments: sdh300@ecs.soton.ac.uk</div>
<div>&nbsp;*</div>
<div>&nbsp;* @author:  Simon Howard</div>
<div>&nbsp;*</div>
<div>&nbsp;*/</div>
<div></div>
<div>public class FSTest {</div>
<div></div>
<div>&nbsp;static InputStreamReader isr = new InputStreamReader(System.in);</div>
<div>&nbsp;static BufferedReader br = new BufferedReader(isr);</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; public static String gets() {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String s = br.readLine();</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return s;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch(IOException ie) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return null;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; private BlockDevice b;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; private FileSystem f;</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; public FSTest() {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Creating block device");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = new RAMDisk();</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Creating filesystem");</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // create filesystem for the moment</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // todo: write a blockdevice class that writes to a file</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = new FileSystem(b, true);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; public FSTest(String blockfile) {</div>
<div></div>
<div>&nbsp; int blocksize = -1;</div>
<div>&nbsp; boolean format = false;</div>
<div></div>
<div>&nbsp; if (blockfile.equals("floppy")</div>
<div>&nbsp; &nbsp; &nbsp; || blockfile.equals("floppy_new")) {</div>
<div>&nbsp; &nbsp;System.out.println("Floppy mode");</div>
<div>&nbsp; &nbsp;if (!System.getProperty("os.name").equals("Linux"))</div>
<div>&nbsp; &nbsp; System.err.println("\"Heres a nickel son, go " +</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"buy yourself a real " +</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"operating system\"\n" +&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"(FLOPPY MODE ONLY WORKS" +</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;"UNDER LINUX)"</div>
<div>&nbsp; &nbsp; &nbsp;);</div>
<div></div>
<div>&nbsp; &nbsp;if (blockfile.equals("floppy_new"))</div>
<div>&nbsp; &nbsp; format = true;</div>
<div></div>
<div>&nbsp; &nbsp;blockfile = "/dev/fd0";</div>
<div>&nbsp; &nbsp;blocksize = 512;</div>
<div>&nbsp; } else {</div>
<div></div>
<div>&nbsp; &nbsp;// find out if the file exists&nbsp;</div>
<div>&nbsp; &nbsp;</div>
<div>&nbsp; &nbsp;File file = new File(blockfile);</div>
<div>&nbsp; &nbsp;format |= file.length() &lt;= 0;</div>
<div>&nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // create blockdevice</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Using " + blockfile + " for block device");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = blocksize &gt; 0&nbsp;</div>
<div>&nbsp; &nbsp;? new FileBlockDevice(blockfile, blocksize)&nbsp;</div>
<div>&nbsp; &nbsp;: new FileBlockDevice(blockfile);</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // create filesystem</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // if newfile then create a new file system</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // otherwise use the existing one</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.print("Creating filesystem object");</div>
<div>&nbsp; if (format)</div>
<div>&nbsp; &nbsp;System.out.println(", formatting new FileSystem");</div>
<div>&nbsp; else&nbsp;</div>
<div>&nbsp; &nbsp;System.out.println();</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = new FileSystem(b, format);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; private void ls() {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] files = f.dir();</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (files == null) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("no files found");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i=0; i&lt;files.length; ++i)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(files[i]);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; private void read(String file) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int handle = f.open(file, 'r');</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (handle &lt; 0) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("file not found");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int length = f.length(handle);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; byte[] b = new byte[500];</div>
<div></div>
<div>&nbsp; for (;;) {</div>
<div>&nbsp; &nbsp;int bytes = f.read(handle, b, b.length);</div>
<div></div>
<div>&nbsp; &nbsp;if (bytes &lt;= 0)</div>
<div>&nbsp; &nbsp; break;</div>
<div>&nbsp; &nbsp;</div>
<div>&nbsp; &nbsp;for (int i=bytes; i&lt;b.length; ++i)</div>
<div>&nbsp; &nbsp; b[i] = 0;</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String s = new String(b);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.print(s);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.close(handle);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; private void more(String file) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int handle = f.open(file, 'r');</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (handle &lt; 0) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("file not found");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int length = f.length(handle);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; byte[] b = new byte[500];</div>
<div>&nbsp; int line = 0;</div>
<div></div>
<div>&nbsp;mainloop:</div>
<div>&nbsp; for (;;) {</div>
<div>&nbsp; &nbsp;int bytes = f.read(handle, b, b.length);</div>
<div></div>
<div>&nbsp; &nbsp;if (bytes &lt;= 0)</div>
<div>&nbsp; &nbsp; break;</div>
<div>&nbsp; &nbsp;</div>
<div>&nbsp; &nbsp;for (int i=bytes; i&lt;b.length; ++i)</div>
<div>&nbsp; &nbsp; b[i] = 0;</div>
<div></div>
<div>&nbsp; &nbsp;for (int i=0; i&lt;bytes; ++i) {</div>
<div>&nbsp; &nbsp; System.out.print(((char)b[i]));</div>
<div>&nbsp; &nbsp; if (b[i] == '\n') {</div>
<div>&nbsp; &nbsp; &nbsp;if (++line &gt; 20) {</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; System.out.print("-- more --");</div>
<div>&nbsp; &nbsp; &nbsp;&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; int c = 0;</div>
<div>&nbsp; &nbsp; &nbsp; try {&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp;c = isr.read();</div>
<div>&nbsp; &nbsp; &nbsp; } catch(IOException ie) {</div>
<div>&nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; System.out.println();</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; if (c == 'q' )</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp;break mainloop;</div>
<div>&nbsp; &nbsp; &nbsp;&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; line = 0;</div>
<div>&nbsp; &nbsp; &nbsp;}</div>
<div>&nbsp; &nbsp; }</div>
<div>&nbsp; &nbsp;}</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.close(handle);</div>
<div></div>
<div>&nbsp; System.out.println();</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; private void write(String file, boolean append) {</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int handle = f.open(file, append ? 'a' : 'w');</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (handle &lt; 0) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("cant open for write");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (;;) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String s = gets();</div>
<div></div>
<div>&nbsp; &nbsp;//System.out.println("&gt; " + s);</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (s == null)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; byte[] b = (s + "\n").getBytes();</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.write(handle, b, b.length);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.close(handle);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp;private void write(String file) {</div>
<div>&nbsp; write(file, false);</div>
<div>&nbsp;}</div>
<div></div>
<div>&nbsp;private void append(String file) {</div>
<div>&nbsp; write(file, true);</div>
<div>&nbsp;}</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; private void rm(String file) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.delete(file);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; private void length(String file) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int handle = f.open(file, 'r');</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (handle &lt; 0) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("file not found");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println(f.length(handle));</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp;private void insert(String filename) {</div>
<div>&nbsp; File file = new File(filename);</div>
<div>&nbsp; FileInputStream is;</div>
<div></div>
<div>&nbsp; try {</div>
<div>&nbsp; &nbsp;is = new FileInputStream(file);</div>
<div>&nbsp; } catch (IOException ie) {</div>
<div>&nbsp; &nbsp;System.out.println("file not found");</div>
<div>&nbsp; &nbsp;return;</div>
<div>&nbsp; }&nbsp;</div>
<div></div>
<div>&nbsp; int fd = f.open(filename, 'w');</div>
<div></div>
<div>&nbsp; if (fd &lt; 0) {</div>
<div>&nbsp; &nbsp;try {</div>
<div>&nbsp; &nbsp; is.close();</div>
<div>&nbsp; &nbsp;} catch(Exception ie) {</div>
<div>&nbsp; &nbsp;}</div>
<div></div>
<div>&nbsp; &nbsp;System.out.println("cant open file for write on " +&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; "FileSystem");</div>
<div>&nbsp; &nbsp;return;</div>
<div>&nbsp; }</div>
<div></div>
<div>&nbsp; byte[] buf = new byte[1024];</div>
<div></div>
<div>&nbsp; for (;;) {</div>
<div>&nbsp; &nbsp;int bytes;</div>
<div></div>
<div>&nbsp; &nbsp;try {</div>
<div>&nbsp; &nbsp; bytes = is.read(buf);</div>
<div>&nbsp; &nbsp;} catch(IOException ie) {</div>
<div>&nbsp; &nbsp; break;</div>
<div>&nbsp; &nbsp;}</div>
<div></div>
<div>&nbsp; &nbsp;if (bytes &lt;= 0)</div>
<div>&nbsp; &nbsp; break;</div>
<div></div>
<div>&nbsp; &nbsp;f.write(fd, buf, bytes);</div>
<div>&nbsp; }</div>
<div></div>
<div>&nbsp; f.close(fd);</div>
<div></div>
<div>&nbsp; try {</div>
<div>&nbsp; &nbsp;is.close();</div>
<div>&nbsp; } catch (IOException ie) {</div>
<div>&nbsp; &nbsp;</div>
<div>&nbsp; }</div>
<div>&nbsp;}</div>
<div></div>
<div>&nbsp;// extract file from filesystem</div>
<div></div>
<div>&nbsp;private void extract(String filename) {</div>
<div>&nbsp; File file = new File(filename);</div>
<div>&nbsp; FileOutputStream os;</div>
<div></div>
<div>&nbsp; try {</div>
<div>&nbsp; &nbsp;os = new FileOutputStream(file);</div>
<div>&nbsp; } catch (IOException ie) {</div>
<div>&nbsp; &nbsp;System.out.println("cant open file for write");</div>
<div>&nbsp; &nbsp;return;</div>
<div>&nbsp; }&nbsp;</div>
<div></div>
<div>&nbsp; int fd = f.open(filename, 'r');</div>
<div></div>
<div>&nbsp; if (fd &lt; 0) {</div>
<div>&nbsp; &nbsp;try {</div>
<div>&nbsp; &nbsp; os.close();</div>
<div>&nbsp; &nbsp;} catch(Exception ie) {</div>
<div>&nbsp; &nbsp;}</div>
<div></div>
<div>&nbsp; &nbsp;System.out.println("cant open file for read on " +&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; "FileSystem");</div>
<div>&nbsp; &nbsp;return;</div>
<div>&nbsp; }</div>
<div></div>
<div>&nbsp; byte[] buf = new byte[1024];</div>
<div></div>
<div>&nbsp; for (;;) {</div>
<div>&nbsp; &nbsp;int bytes;</div>
<div></div>
<div>&nbsp; &nbsp;bytes = f.read(fd, buf, 1024);</div>
<div></div>
<div>&nbsp; &nbsp;if (bytes &lt;= 0)</div>
<div>&nbsp; &nbsp; break;</div>
<div></div>
<div>&nbsp; &nbsp;try {</div>
<div>&nbsp; &nbsp; os.write(buf, 0, bytes);</div>
<div>&nbsp; &nbsp;} catch(IOException ie) {</div>
<div>&nbsp; &nbsp; break;</div>
<div>&nbsp; &nbsp;}</div>
<div>&nbsp; }</div>
<div></div>
<div>&nbsp; f.close(fd);</div>
<div></div>
<div>&nbsp; try {</div>
<div>&nbsp; &nbsp;os.close();</div>
<div>&nbsp; } catch (IOException ie) {</div>
<div>&nbsp; &nbsp;</div>
<div>&nbsp; }&nbsp;</div>
<div>&nbsp;}</div>
<div></div>
<div>&nbsp;private void remount() {</div>
<div>&nbsp; f = null;</div>
<div>&nbsp; System.runFinalization();</div>
<div>&nbsp; f = new FileSystem(b, false);</div>
<div>&nbsp;}</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; public void commandLine() {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (;;) {</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.print("% ");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String s = gets();</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (s == null)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int i = s.indexOf(' ');</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String command, arg;</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (i &gt;= 0) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command = s.substring(0, i);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arg = s.substring(i+1, s.length());</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; command = s;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arg = null;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (command.equals("")) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (command.charAt(0) == '!') {</div>
<div>&nbsp; &nbsp; String os_cmd = command.substring(1, command.length());</div>
<div>&nbsp; &nbsp; try {</div>
<div>&nbsp; &nbsp; &nbsp;Process proc = Runtime.getRuntime().exec(os_cmd);&nbsp;</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp;InputStream in = proc.getInputStream();&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp;</div>
<div>&nbsp; &nbsp; &nbsp;int charIn;&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp;</div>
<div>&nbsp; &nbsp; &nbsp;while((charIn = in.read()) &gt; 0) {</div>
<div>&nbsp; &nbsp; &nbsp; System.out.print((char)charIn);&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp;}&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp;</div>
<div>&nbsp; &nbsp; &nbsp;in.close();</div>
<div></div>
<div>&nbsp; &nbsp; } catch(IOException ie) {</div>
<div>&nbsp; &nbsp; }</div>
<div>&nbsp; &nbsp;} else if (command.equals("help")</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; || command.equals("?")) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("Commands:");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("help exit");</div>
<div>&nbsp; &nbsp; System.out.println("read write more append");</div>
<div>&nbsp; &nbsp; System.out.println("insert extract");</div>
<div>&nbsp; &nbsp; System.out.println("ls rm length");</div>
<div>&nbsp; &nbsp; System.out.println("remount");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (command.equals("ls")) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ls();</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (command.equals("read")) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (arg == null)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("usage: read &lt;file&gt; -- dump contents of file");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; read(arg);</div>
<div>&nbsp; &nbsp;} else if (command.equals("more")) {</div>
<div>&nbsp; &nbsp; if (arg == null)</div>
<div>&nbsp; &nbsp; &nbsp;System.out.println("usage: more &lt;file&gt; -- display contents of file page by page");</div>
<div>&nbsp; &nbsp; else</div>
<div>&nbsp; &nbsp; &nbsp;more(arg);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (command.equals("write")) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (arg == null)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("usage: write &lt;file&gt; -- write data to file");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; write(arg);</div>
<div>&nbsp; &nbsp;} else if (command.equals("append")) {</div>
<div>&nbsp; &nbsp; if (arg == null)</div>
<div>&nbsp; &nbsp; &nbsp;System.out.println("usage: append &lt;file -- append data to file");</div>
<div>&nbsp; &nbsp; else</div>
<div>&nbsp; &nbsp; &nbsp;append(arg);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (command.equals("rm")) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (arg == null)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("usage: rm &lt;file&gt; -- remove file");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rm(arg);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (command.equals("length")) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (arg == null)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("usage: length &lt;file&gt; -- show length of file");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; length(arg);</div>
<div>&nbsp; &nbsp;} else if (command.equals("insert")) {</div>
<div>&nbsp; &nbsp; if (arg == null)</div>
<div>&nbsp; &nbsp; &nbsp;System.out.println("usage: insert &lt;file&gt; -- insert file into filesystem");</div>
<div>&nbsp; &nbsp; else</div>
<div>&nbsp; &nbsp; &nbsp;insert(arg);</div>
<div>&nbsp; &nbsp;} else if (command.equals("extract")) {</div>
<div>&nbsp; &nbsp; if (arg == null)</div>
<div>&nbsp; &nbsp; &nbsp;System.out.println("usage: extract &lt;file&gt; -- extract file from filesystem");</div>
<div>&nbsp; &nbsp; else</div>
<div>&nbsp; &nbsp; &nbsp;extract(arg);</div>
<div>&nbsp; &nbsp;} else if (command.equals("remount")) {</div>
<div>&nbsp; &nbsp; remount();</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else if (command.equals("exit")) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println("unknown command: '" + command + "'");</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.out.println();</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; public static void main(String[] args) {</div>
<div></div>
<div>&nbsp; try {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FSTest f;</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (args.length &gt; 0) {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = new FSTest(args[0]);</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = new FSTest();</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f.commandLine();</div>
<div>&nbsp; } catch (Exception e) {</div>
<div>&nbsp; &nbsp;System.err.println("Sorry, your code sucks :(");</div>
<div>&nbsp; &nbsp;System.err.println("here is the error:");</div>
<div>&nbsp; &nbsp;e.printStackTrace(System.err);</div>
<div>&nbsp; }</div>
<div></div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; }</div>
<div>}</div>
</body>
</html>