+package edu.berkeley.fleet.slipway;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+public class Server {
+
+ public static void main(String[] args) throws Exception {
+ ServerSocket ss = new ServerSocket(3133);
+ while(true) {
+ System.err.println("listening");
+ Socket s = ss.accept();
+ System.err.println("connection");
+ //new Handler(s).start();
+ new Handler(s).run();
+ }
+ }
+
+ public static String pass_string = "password=security_is_for_wimps ";
+
+ static class Handler extends Thread {
+ private Socket socket;
+ boolean closed = false;
+ public Handler(Socket s) { this.socket = s; }
+ public void run() {
+ RandomAccessFile raf = null;
+ FileInputStream fis = null;
+ try {
+
+ final InputStream is = socket.getInputStream();
+ byte[] buf = new byte[1024];
+ StringBuffer sb = new StringBuffer();
+ while(true) {
+ int i = is.read();
+ if (i==-1) return;
+ if (((char)i)=='\n') break;
+ sb.append((char)i);
+ }
+ System.err.println("login string: " + sb.toString());
+ if (!sb.toString().startsWith(pass_string)) return;
+ String file = sb.toString().substring(pass_string.length()).trim();
+
+ System.err.println("unprogramming...");
+ int ret = Runtime.getRuntime().exec(new String[] { "/usr/bin/user_unprogram", "2" }).waitFor();
+ if (ret != 0) {
+ System.err.println("programming error: " + ret);
+ return;
+ }
+ System.err.println("programming...");
+ ret = Runtime.getRuntime().exec(new String[] {
+ "/usr/bin/user_program", "2", "/var/slipway/"+file }).waitFor();
+ if (ret != 0) {
+ System.err.println("programming error: " + ret);
+ return;
+ }
+ System.err.println("done programming.");
+ try { Thread.sleep(2000); } catch(Exception e) { }
+ final OutputStream os = socket.getOutputStream();
+ System.err.println("sending instructions...");
+ raf = new RandomAccessFile("/dev/selectmap2", "rw");
+
+
+ final RandomAccessFile raf2 = raf;
+ new Thread() {
+ public void run() {
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(raf2.getFD());
+ byte[] buf = new byte[1024];
+ while(true) {
+ int numread = is.read(buf, 0, buf.length);
+ if (numread == -1) break;
+ fos.write(buf, 0, numread);
+ fos.flush();
+ }
+ } catch (Exception e) { throw new RuntimeException(e);
+ } finally {
+ if (raf2 != null) {
+ System.err.println("closing...");
+ try { raf2.close(); } catch (Throwable t) { t.printStackTrace(); }
+ try { fos.close(); } catch (Throwable t) { t.printStackTrace(); }
+ closed = true;
+ }
+ }
+ }
+ }.start();
+
+ System.err.println("reading back...");
+ fis = new FileInputStream(raf.getFD());
+ while(true) {
+ long result = 0;
+ int val = 0;
+ for(int i=0; i<6; i++) {
+ while(fis.available()==0) {
+ if (closed) return;
+ System.err.println("sleep");
+ Thread.sleep(10);
+ }
+ val = fis.read();
+ if (val==-1) break;
+ os.write((byte)val);
+ os.flush();
+ result |= ((long)val) << (i * 8);
+ }
+ if (val==-1) break;
+ System.err.print(result);
+ System.err.print(" 0x");
+ System.err.print(Long.toString(result, 16));
+ System.err.println();
+ }
+ System.err.println("done.");
+
+ } catch (Exception e) { throw new RuntimeException(e);
+ } finally {
+ try {
+ if (raf != null) {
+ System.err.println("closing...");
+ raf.close();
+ }
+ if (fis != null) fis.close();
+ } catch (Throwable t) { t.printStackTrace(); }
+ }
+ }
+ }
+
+}
\ No newline at end of file