8bpp): // on debian, apt-get install tightvnc-java will put them in // /usr/share/tightvnc-java define("VNCJAVA_PATH", "tightvnc-java"); define("VNCJAR", "VncViewer.jar"); define("VNCCLASS", "VncViewer.class"); // maximum count of qemu instances. define("MAX_QEMUS", 8); // size of the java applet, must match the default resolution of the image. //define("APPLET_WIDTH", "800"); //define("APPLET_HEIGHT", "600"); define("APPLET_WIDTH", "1024"); define("APPLET_HEIGHT", "768"); // vnc protocol base port. define("VNCPORTBASE", 5900); // timeout before the demo session is killed, as argument to /bin/sleep define("SESSION_TIMEOUT", "10m"); // path to qemu binary //define("QEMU_BIN", "/usr/bin/qemu"); define("QEMU_BIN", "/usr/local/bin/qemu"); // default arguments: no network, emulate tablet, readonly image file. define("QEMU_ARGS","-net none -usbdevice wacom-tablet -k en-us -snapshot"); //define("QEMU_ARGS","-net none -usbdevice wacom-tablet -k fr -snapshot"); // absolute path to the image. define("QEMU_IMAGE_PATH","/home/revol/haiku/trunk/generated.x86/haiku.image"); // qemu 0.8.2 needs "", qemu 0.9.1 needs ":" define("QEMU_VNC_PREFIX", ":"); // name of session and pid files in /tmp define("QEMU_SESSFILE_TMPL", "qemu-haiku-session-"); define("QEMU_PIDFILE_TMPL", "qemu-haiku-pid-"); // name of session variable holding the qemu slot; not yet used correctly define("QEMU_IDX_VAR", "QEMU_HAIKU_SESSION_VAR"); session_start(); if (isset($_GET['frame'])) { } ?> Haiku Test "; } else echo ""; function dbg($str) { echo "
$str
\n"; } function err($str) { echo "
$str
\n"; } function make_qemu_sessionfile_name($idx) { return "/tmp/" . QEMU_SESSFILE_TMPL . $idx; } function make_qemu_pidfile_name($idx) { return "/tmp/" . QEMU_PIDFILE_TMPL . $idx; } function find_qemu_slot() { for ($idx = 0; $idx < MAX_QEMUS; $idx++) { $pidfile = make_qemu_pidfile_name($idx); $sessfile = make_qemu_sessionfile_name($idx); dbg("checking \"$pidfile\", \"$sessfile\"..."); if (!file_exists($pidfile) && !file_exists($sessfile)) { file_put_contents($sessfile, session_id()); $sid = file_get_contents($sessfile); if ($sid != session_id()) continue; $_SESSION[QEMU_IDX_VAR] = $idx; return $idx; } } return -1; } function qemu_slot() { return $_SESSION[QEMU_IDX_VAR]; } function vnc_display() { return qemu_slot(); } function vnc_port() { return VNCPORTBASE + vnc_display(); } function is_my_session_valid() { if (!isset($_SESSION[QEMU_IDX_VAR])) return 0; $idx = $_SESSION[QEMU_IDX_VAR]; $sessfile = make_qemu_sessionfile_name($idx); if (!file_exists($sessfile)) return 0; $qemusession=file_get_contents($sessfile); // has expired if ($qemusession != session_id()) { return 0; } return 1; } function start_qemu() { $idx = find_qemu_slot(); if ($idx < 0) { err("No available qemu slot, please try later."); return $idx; } $pidfile = make_qemu_pidfile_name($idx); $cmd = QEMU_BIN . " " . QEMU_ARGS . " -vnc " . QEMU_VNC_PREFIX . vnc_display() . " -pidfile " . $pidfile . " " . QEMU_IMAGE_PATH; if (file_exists($pidfile)) unlink($pidfile); dbg("Starting " . $cmd . "..."); $descriptorspec = array( // 0 => array("pipe", "r"), // stdin // 1 => array("pipe", "w"), // stdout // 2 => array("pipe", "w") // stderr ); //$cmd="/bin/ls"; //passthru($cmd, $ret); //dbg("ret=$ret"); $cmd .= " &"; $process = proc_open($cmd, $descriptorspec, $pipes); sleep(1); proc_close($process); dbg("Started QEMU."); $sessfile = make_qemu_sessionfile_name($idx); $cmd = "(sleep " . SESSION_TIMEOUT . "; kill -9 `cat " . $pidfile . "`; rm " . $pidfile . " " . $sessfile . ") &"; $process = proc_open($cmd, $descriptorspec, $wkpipes); sleep(1); proc_close($process); dbg("Started timed kill."); dbg("Ready for a " . SESSION_TIMEOUT . " session."); } function output_applet_code() { $w = APPLET_WIDTH; $h = APPLET_HEIGHT; $port = vnc_port(); $vncjpath = VNCJAVA_PATH; $jar = VNCJAR; $class = VNCCLASS; echo " There should be a java applet here... make sure you have a JVM and it's enabled! "; } dbg("Checking if session is running..."); if (is_my_session_valid()) { dbg("Session running"); $qemuidx = qemu_slot(); } else if ($closing != 1) { dbg("Need to start qemu"); $qemuidx = start_qemu(); } if ($qemuidx >= 0) { if ($closing) { dbg("closing..."); unlink(make_qemu_sessionfile_name($qemuidx)); //unlink(make_qemu_sessionfile_name($qemuidx)); sleep(1); //echo ""; } else { dbg("Waiting for vnc server..."); sleep(5); output_applet_code(); } } ?>