package nfs; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import java.util.HashMap; public class NfsServer { public static final int port = 23232; public static int key=0; private HashMap handles = null; public NfsServer() { handles = new HashMap(); } public DatagramPacket open(RemotePacket rp) { DatagramPacket dp = null; int mapkey=key++; String strkey=null; boolean err=false; InputStream is=null; OutputStream os=null; try { is = new FileInputStream(rp.getArgs()[0]); os = new FileOutputStream(rp.getArgs()[0], true); // in appending mode } catch (FileNotFoundException e) { err=true; } // a fresh handle is needed for avoiding double entries strkey = new String(rp.getArgs()[0]+"_"+mapkey); if (err){ dp = RemotePacket.RemotePacket("ERROR","FILENOTFOUNDEXCEPTION",strkey); }else{ handles.put(strkey, new StreamRef(is,os)); dp = RemotePacket.RemotePacket("HANDLE", strkey); } dp.setAddress(rp.dp.getAddress()); dp.setPort(rp.dp.getPort()); return dp; } public DatagramPacket read(RemotePacket rp) { DatagramPacket dp = null; String handleref = rp.getArgs()[0]; System.out.println("handle:"+handleref); StreamRef sr = handles.get(handleref); if(sr == null) { dp = RemotePacket.RemotePacket("ERROR", "HANDLE NOT IN CACHE", handleref); } else { InputStream is = sr.getIn(); int len = Integer.parseInt(rp.getArgs()[1]); byte [] buffer = new byte[len]; try { int letti = is.read(buffer,0,len); if (letti==-1) // the file is empty letti=0; byte [] buf = new byte[letti]; for(int i=0; i