diff --git a/contrib/rom-o-matic/README b/contrib/rom-o-matic/README
deleted file mode 100644
index b68cf77..0000000
--- a/contrib/rom-o-matic/README
+++ /dev/null
@@ -1,62 +0,0 @@
-ROM-o-matic web interface for building iPXE ROMs
-------------------------------------------------
-
-This web application generates iPXE images and sends them to a web
-browser.
-
-Available as part of the iPXE source code distribution, which can be
-downlaoded from http://etherboot.org/
-
-Author:  Marty Connor <mdc@etherboot.org>
-License: GPLv2
-Support: http://etherboot.org/mailman/listinfo/ipxe
-         Please send support questions to the iPXE mailing list
-
-System Requirements
--------------------
-- Apache web server
-- PHP 4+
-- Tools required to build iPXE installed on the server
-  - gcc, mtools, syslinux, perl, etc.
-
-Setup
------
-As distributed, it is expected that the rom-o-matic source code
-directory is in the contrib directory of a iPXE source distribution.
-
-The easiest way to do this is to simply put a iPXE source distribution
-in a web server accessible directory.
-
-If this is not the case, you will need to either edit the file
-
-    "globals.php"
-
-or create a file called
-
-    "local-config.php"
-
-containing the following lines:
-
-<?php
-$src_dir = "../../src";
-?>
-
-Then change the line beginning "$src_dir = " to the path of your iPXE
-source code tree.
-
-To make build times shorter, before you run rom-o-matic for the first time
-you should cd to the ipxe "src" directory and enter the following
-commands:
-
-  $ make
-  $ make bin/NIC
-
-This will pro-compile most object files and will make your rom-o-matic
-builds much faster.
-
-Running rom-o-matic from a web browser
---------------------------------------
-Enter a URL like:
-
-   http://example.com/ipxe-1.x.x/contrib/rom-o-matic
-
diff --git a/contrib/rom-o-matic/bottom.php b/contrib/rom-o-matic/bottom.php
deleted file mode 100644
index 9ba8e31..0000000
--- a/contrib/rom-o-matic/bottom.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-?>
-<hr>
-<h4>
-Resources:
-</h4>
-<ul>
-  <li>
-    Source code for iPXE images is available at
-    <a href="http://www.ipxe.org/download" target="_blank">
-    http://www.ipxe.org/download</a>
-    <br><br>
-  </li>
-  <li>
-    For general information about using iPXE, please visit the
-    <a href="http://www.ipxe.org/" target="_blank">
-    iPXE Project Home Page</a>
-    <br><br>
-  </li>
-  <li>
-    For Email-based support for iPXE please join
-    <a href="http://www.ipxe.org/contact" target="_blank">
-    iPXE Project mailing lists.</a>
-    <br><br>
-  </li>
-  <li>
-    For real-time online iPXE support via IRC please visit the
-    <a href="irc://irc.freenode.net/%23ipxe"> #ipxe channel
-    of irc.freenode.net</a>.
-    <br><br>
-  </li>
-</ul>
-<hr>
-  <font size="-1">
-    <br>
-    Please email <a href="mailto:<?php echo "${webmaster_email}" ?>"><?php echo "${webmaster_email}"?></a>
-    with questions or comments about this website.
-  </font>
-  <br><br>
-<hr>
-</body>
-</html>
diff --git a/contrib/rom-o-matic/build.php b/contrib/rom-o-matic/build.php
deleted file mode 100644
index b2b5bb4..0000000
--- a/contrib/rom-o-matic/build.php
+++ /dev/null
@@ -1,311 +0,0 @@
-<?php // -*- Mode: PHP; -*-
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-// Get utility functions and set globals
-require_once "utils.php";
-
-// Make sure at least $A (action)  was supplied
-if ( ! isset ( $_POST['A'] ) ) {
-
-    // Present user with form to customize build options
-    require_once "customize-flags.php";
-
-    exit ();
-
-// If user chose "Customize" option on form
-} else if ( $_POST['A'] == "Customize" ) {
-
-    // Present user with form to customize build options
-    require_once "customize-flags.php";
-
-    exit ();
-
-// The following conditional includes all other cases except "Get Image"
-// particularly the explicit ($A == "Start Over") case
-} else if ( $_POST['A'] != "Get Image" ) {
-
-    // Note that this method of redirections discards all the
-    // configuration flags, which is intentional in this case.
-
-    $dest = curDirURL ();
-    header ( "Location: $dest" );
-
-    // This next "echo" should normally not be seen, because
-    // the "header" statement above should cause immediate
-    // redirection but just in case...
-
-    echo "Try this link: <a href=\"$dest\">$dest</a>";
-
-    exit ();
-}
-
-// OK, we're going to try to use whatever options have been set
-// to build an image.
-
-// Make sure at least $nic was supplied
-if ( ! isset ( $_POST['nic'] ) ) {
-    die ( "No NIC supplied!" );
-}
-if ( isset ( $nics[$_POST['nic']] ) ) {
-    $nic = $nics[$_POST['nic']];
-} else {
-    die ( "Invalid NIC \"${_POST['nic']}\" supplied!" );
-}
-
-// Fetch flags
-$flags = get_flags ();
-
-// Get requested format
-$ofmt = isset ( $_POST['ofmt'] ) ? $_POST['ofmt'] : "";
-$fmt_extension = isset ( $ofmts[$ofmt] ) ? $ofmts[$ofmt] : 'dsk';
-
-// Handle some special cases
-
-$pci_vendor_code = "";
-$pci_device_code = "";
-
-if ( $nic == 'undionly' && $fmt_extension == "pxe" ) {
-
-    // undionly.pxe can't work because it unloads the PXE stack
-    // that it needs to communicate with, so we set the extension
-    // to .kpxe, which has a chance of working. The extension
-    // .kkpxe is another option.
-
-    $fmt_extension = "kpxe";
-
-} else if ( $fmt_extension == "rom" ) {
-
-    if ( ! isset ( $_POST['pci_vendor_code'] )
-		 || ! isset ( $_POST['pci_device_code'] ) ) {
-		die ( "rom output format selected but PCI code(s) missing!" );
-	}
-
-	$pci_vendor_code = $_POST['pci_vendor_code'];
-	$pci_device_code = $_POST['pci_device_code'];
-
-    if ( $pci_vendor_code == ""
-		 || $pci_device_code == "" ) {
-		die ( "rom output format selected but PCI code(s) missing!" );
-	}
-
-	// Try to be forgiving of 0xAAAA format
-	if ( strtolower ( substr ( $pci_vendor_code, 0, 2 ) ) == "0x"
-		 && strlen ( $pci_vendor_code ) == 6 ) {
-		$pci_vendor_code = substr ( $pci_vendor_code, 2, 4 );
-	}
-	if ( strtolower ( substr ( $pci_device_code, 0, 2 ) ) == "0x"
-		 && strlen ( $pci_device_code ) == 6 ) {
-		$pci_device_code = substr ( $pci_device_code, 2, 4 );
-	}
-
-    // concatenate the pci codes to get the $nic part of the
-    // Make target
-    $pci_codes = strtolower (  $pci_vendor_code . $pci_device_code );
-
-    $nic = $pci_codes;
-    if ( ! isset ( $roms[$pci_codes] ) ) {
-        die (   "Sorry, no network driver supports PCI codes<br>"
-              . "${_POST['pci_vendor_code']}:"
-              . "${_POST['pci_device_code']}" );
-    }
-} else if ( $fmt_extension != "rom"
-            && ( $pci_vendor_code != "" || $pci_device_code != "" ) ) {
-    die (   "'$fmt_extension' format was selected but PCI IDs were"
-          . " also entered.<br>Did you mean to select 'rom' output format"
-          . " instead?" );
-}
-
-/**
- * remove temporary build directory
- *
- * @return bool true if removal is successful, false otherwise
- */
-function rm_build_dir ()
-{
-    global $build_dir;
-    global $keep_build_dir;
-
-    if ( $keep_build_dir !== true ) {
-        rm_file_or_dir ( $build_dir );
-    }
-}
-
-// Arrange for the build directory to always be removed on exit.
-$build_dir = "";
-$keep_build_dir = false;
-register_shutdown_function ( 'rm_build_dir' );
-
-// Make temporary copy of src directory
-$build_dir = mktempcopy ( "$src_dir", "/tmp", "MDCROM" );
-$config_dir = $build_dir . "/config";
-
-// Write config files with supplied flags
-write_ipxe_config_files ( $config_dir, $flags );
-
-// Handle a possible embedded script
-$emb_script_cmd = "";
-$embedded_script = isset ( $_POST['embedded_script'] ) ? $_POST['embedded_script'] : "";
-if ( $embedded_script != "" ) {
-    $emb_script_path = "$build_dir" . "/script0.ipxe";
-
-	if ( substr ( $embedded_script, 0, 5 ) != "#!ipxe" ) {
-		$embedded_script = "#!ipxe\n" . $embedded_script;
-	}
-
-    // iPXE 0.9.7 doesn't like '\r\n" in the shebang...
-    $embedded_script = str_replace ( "\r\n", "\n", $embedded_script );
-
-    write_file_from_string ( $emb_script_path, $embedded_script );
-    $emb_script_cmd = "EMBEDDED_IMAGE=${emb_script_path}";
-}
-
-// Make the requested image.  $status is set to 0 on success
-$make_target = "bin/${nic}.${fmt_extension}";
-$gitversion = exec('git describe --always --abbrev=1 --match "" 2>/dev/null');
-if ($gitversion) {
-	$gitversion = "GITVERSION=$gitversion";
-}
-
-$make_cmd = "make -C '$build_dir' '$make_target' $gitversion $emb_script_cmd 2>&1";
-
-exec ( $make_cmd, $maketxt, $status );
-
-// Uncomment the following section for debugging
-
-/**
-
-echo "<h2>build.php:</h2>";
-echo "<h3>Begin debugging output</h3>";
-
-//echo "<h3>\$_POST variables</h3>";
-//echo "<pre>"; var_dump ( $_POST ); echo "</pre>";
-
-echo "<h3>Build options:</h3>";
-echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
-echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
-echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
-echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
-echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
-
-echo "<h3>Flags:</h3>";
-show_flags ( $flags );
-
-if ( $embedded_script != "" ) {
-    echo "<h3>Embedded script:</h3>";
-    echo "<blockquote>"."<pre>";
-    echo $embedded_script;
-    echo "</pre>"."</blockquote>";
-}
-
-echo "<h3>Make output:</h3>";
-echo "Make command: " . $make_cmd . "<br>";
-echo "Build status = <? echo $status ?>" . "<br>";
-echo "<blockquote>"."<pre>";
-echo htmlentities ( implode ("\n", $maketxt ) );
-echo "</pre>"."</blockquote>";
-// Uncomment the next line if you want to keep the
-// build directory around for inspection after building.
-$keep_build_dir = true;
-die ( "<h3>End debugging output</h3>" );
-
-**/ //   End debugging section
-
-// Send ROM to browser (with extreme prejudice)
-
-if ( $status == 0 ) {
-
-    $fp = fopen("${build_dir}/${make_target}", "rb" );
-    if ( $fp > 0 ) {
-
-        $len = filesize ( "${build_dir}/${make_target}" );
-        if ( $len > 0 ) {
-
-            $buf = fread ( $fp, $len );
-            fclose ( $fp );
-
-            // Delete build directory as soon as it is not needed
-            rm_build_dir ();
-
-            $output_filename = preg_replace('/[^a-z0-9\+\.\-]/i', '', "ipxe-${version}-${nic}.${fmt_extension}");
-
-            // Try to force IE to handle downloading right.
-            Header ( "Cache-control: private");
-            Header ( "Content-Type: application/x-octet-stream; " .
-                     "name=$output_filename");
-            Header ( "Content-Disposition: attachment; " .
-                     "Filename=$output_filename");
-            Header ( "Content-Location: $output_filename");
-            Header ( "Content-Length: $len");
-
-            echo $buf;
-
-            exit ();
-        }
-    }
-}
-
-/*
- * If we reach this point, the build has failed, and we provide
- * debugging information for a potential bug report
- *
- */
-
-// Remove build directory
-rm_build_dir ();
-
-// Announce failure if $status from make was non-zero
-echo "<h2>Build failed.  Status = " . $status . "</h2>";
-echo "<h2>build.php:</h2>";
-echo "<h3>Build options:</h3>";
-echo "<strong>Build directory is:</strong> $build_dir" . "<br><br>";
-echo "\$_POST['ofmt'] = " . "\"${_POST['ofmt']}\"" . "<br>";
-echo "\$_POST['nic'] = " . "\"${_POST['nic']}\"" .  "<br>";
-echo "\$_POST['pci_vendor_code'] = " . "\"${_POST['pci_vendor_code']}\"" . "<br>";
-echo "\$_POST['pci_device_code'] = " . "\"${_POST['pci_device_code']}\"" . "<br>";
-
-echo "<h3>Flags:</h3>";
-show_flags ( $flags );
-
-if ( $embedded_script != "" ) {
-    echo "<h3>Embedded script:</h3>";
-    echo "<blockquote>"."<pre>";
-    echo $embedded_script;
-    echo "</pre>"."</blockquote>";
-}
-
-echo "<h3>Make output:</h3>";
-echo "Make command: " . $make_cmd . "<br>";
-echo "<blockquote>"."<pre>";
-echo htmlentities ( implode ("\n", $maketxt ) );
-echo "</pre>"."</blockquote>";
-
-echo "Please let us know that this happened, and paste the above output into your email message.<br>";
-
-include_once $bottom_inc;
-
-// For emacs:
-//  Local variables:
-//  c-basic-offset: 4
-//  c-indent-level: 4
-//  tab-width: 4
-//  End:
-
-?>
diff --git a/contrib/rom-o-matic/customize-flags.php b/contrib/rom-o-matic/customize-flags.php
deleted file mode 100644
index e283921..0000000
--- a/contrib/rom-o-matic/customize-flags.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php // -*- Mode: PHP; -*-
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-// Get utility functions and set globals
-require_once "utils.php";
-
-// Prepare settable compile options for presentation to user
-$flags = default_flags ();
-
-$build = "<input type=\"submit\" name=\"A\" value=\"Get Image\">";
-$restart = "<input type=\"submit\" name=\"A\" value=\"Start Over\">";
-
-// Begin html output
-include_once $top_inc;
-
-?>
-
-<form action="build.php" method=POST>
-  <input type="hidden" name="version" value = "<?php echo $version ?>">
-  <input type="hidden" name="use_flags" value="1">
-  <h3>
-    Make changes below and press <?php echo $build ?> to create an image, <br>
-    Or press <?php echo $restart ?> to return to the main page.
-  </h3>
-  <hr>
-  <ul>
-  <?php require ( "directions.php" ); ?>
-  </ul>
-  <hr>
-  <?php echo_flags( $flags ); ?>
-  <hr>
-  <h3>Embedded Script:</h3>
-  <?php echo textarea ( "embedded_script", "", "10", "50" ); ?>
-  <br><br>
-  <hr>
-  <center><table width="35%"><tr>
-  <td align="left"> <?php echo $build; ?> </td>
-  <td align="right"> <?php echo $restart ?></td>
-  </tr></table></center>
-</form>
-
-<?php include_once $bottom_inc; ?>
-<?
-// For emacs:
-//
-// Local variables:
-//  c-basic-offset: 4
-//  c-indent-level: 4
-//  tab-width: 4
-// End:
-?>
diff --git a/contrib/rom-o-matic/directions.php b/contrib/rom-o-matic/directions.php
deleted file mode 100644
index 540121e..0000000
--- a/contrib/rom-o-matic/directions.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-?>
-    <li>
-      Choose an output format: <?php echo keys_menubox ( "ofmt", $ofmts,
-      isset ( $_POST['ofmt'] ) ? $_POST['ofmt'] : "") ?>
-      <br><br>
-    </li>
-    <li>
-      Choose a NIC type: <?php echo keys_menubox ( "nic", $nics,
-      isset ( $_POST['nic'] ) ? $_POST['nic'] : "" ) ?>
-      <br><br>
-    </li>
-    <li>
-      <strong>( optional &mdash; for binary ROM image format only )</strong> <br><br>
-      If you choose <em>Binary ROM image</em> as your output format, you must<br>
-      enter <strong>4 hex digits</strong> below for
-      <em>PCI VENDOR CODE</em> and <em>PCI DEVICE CODE</em>  <br>
-      that match the NIC device for which you are making this image.<br><br>
-      Information on how to determine NIC PCI IDs may be found
-      <a href="http://www.ipxe.org/howto/romburning"
-      target="_blank">here</a>.
-      <br><br>
-      PCI VENDOR CODE:  <?php echo textbox ( "pci_vendor_code",
-      isset ( $_POST['pci_vendor_code'] ) ? $_POST['pci_vendor_code']
-              : "", 6 ); ?>
-      &nbsp;&nbsp;
-      PCI DEVICE CODE:  <?php echo textbox ( "pci_device_code",
-      isset ( $_POST['pci_device_code'] ) ? $_POST['pci_device_code']
-              : "", 6 ); ?>
-      <h4>Please note for ROM images:</h4>
-      <ul>
-        <li>
-          If you enter PCI IDs, we will attempt to determine the correct<br>
-          driver to support them, and will ignore any NIC type entered
-          above.<br><br>
-        </li>
-        <li>
-          iPXE does not support all possible PCI IDs for supported
-          NICs.
-          <br><br>
-        </li>
-      </ul>
-    </li>
diff --git a/contrib/rom-o-matic/doc/AUTOBOOT_CMD.html b/contrib/rom-o-matic/doc/AUTOBOOT_CMD.html
deleted file mode 100644
index 444c5e6..0000000
--- a/contrib/rom-o-matic/doc/AUTOBOOT_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-Automatic booting
diff --git a/contrib/rom-o-matic/doc/BANNER_TIMEOUT.html b/contrib/rom-o-matic/doc/BANNER_TIMEOUT.html
deleted file mode 100644
index e135897..0000000
--- a/contrib/rom-o-matic/doc/BANNER_TIMEOUT.html
+++ /dev/null
@@ -1 +0,0 @@
-Tenths of a second for which the shell banner should appear
diff --git a/contrib/rom-o-matic/doc/COMCONSOLE.html b/contrib/rom-o-matic/doc/COMCONSOLE.html
deleted file mode 100644
index e7036c0..0000000
--- a/contrib/rom-o-matic/doc/COMCONSOLE.html
+++ /dev/null
@@ -1,3 +0,0 @@
-Serial Console I/O port address.  Common addresses are:<br>
-COM1 =>	0x3f8, COM2 => 0x2f8, COM3 => 0x3e8, COM4 => 0x2e8
-
diff --git a/contrib/rom-o-matic/doc/COMDATA.html b/contrib/rom-o-matic/doc/COMDATA.html
deleted file mode 100644
index a27e275..0000000
--- a/contrib/rom-o-matic/doc/COMDATA.html
+++ /dev/null
@@ -1 +0,0 @@
-Serial Console Data bits
diff --git a/contrib/rom-o-matic/doc/COMPARITY.html b/contrib/rom-o-matic/doc/COMPARITY.html
deleted file mode 100644
index 14f3595..0000000
--- a/contrib/rom-o-matic/doc/COMPARITY.html
+++ /dev/null
@@ -1 +0,0 @@
-Serial Console Parity: 0=None, 1=Odd, 2=Even
diff --git a/contrib/rom-o-matic/doc/COMPRESERVE.html b/contrib/rom-o-matic/doc/COMPRESERVE.html
deleted file mode 100644
index 6e41a10..0000000
--- a/contrib/rom-o-matic/doc/COMPRESERVE.html
+++ /dev/null
@@ -1 +0,0 @@
-Keep settings from a previous user of the serial port
\ No newline at end of file
diff --git a/contrib/rom-o-matic/doc/COMSPEED.html b/contrib/rom-o-matic/doc/COMSPEED.html
deleted file mode 100644
index 32b6859..0000000
--- a/contrib/rom-o-matic/doc/COMSPEED.html
+++ /dev/null
@@ -1 +0,0 @@
-Serial Console Baud rate
diff --git a/contrib/rom-o-matic/doc/COMSTOP.html b/contrib/rom-o-matic/doc/COMSTOP.html
deleted file mode 100644
index ae3fd24..0000000
--- a/contrib/rom-o-matic/doc/COMSTOP.html
+++ /dev/null
@@ -1 +0,0 @@
-Serial Console Stop bits
diff --git a/contrib/rom-o-matic/doc/CONFIG_CMD.html b/contrib/rom-o-matic/doc/CONFIG_CMD.html
deleted file mode 100644
index 1256c06..0000000
--- a/contrib/rom-o-matic/doc/CONFIG_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-Option configuration console
diff --git a/contrib/rom-o-matic/doc/CONSOLE_PC_BIOS.html b/contrib/rom-o-matic/doc/CONSOLE_PC_BIOS.html
deleted file mode 100644
index 144eea3..0000000
--- a/contrib/rom-o-matic/doc/CONSOLE_PC_BIOS.html
+++ /dev/null
@@ -1 +0,0 @@
-Enable Default BIOS console
diff --git a/contrib/rom-o-matic/doc/CONSOLE_SERIAL.html b/contrib/rom-o-matic/doc/CONSOLE_SERIAL.html
deleted file mode 100644
index f35e2ff..0000000
--- a/contrib/rom-o-matic/doc/CONSOLE_SERIAL.html
+++ /dev/null
@@ -1 +0,0 @@
-Enable Serial port console
diff --git a/contrib/rom-o-matic/doc/CRYPTO_80211_WEP.html b/contrib/rom-o-matic/doc/CRYPTO_80211_WEP.html
deleted file mode 100644
index 26fdf8a..0000000
--- a/contrib/rom-o-matic/doc/CRYPTO_80211_WEP.html
+++ /dev/null
@@ -1 +0,0 @@
-Wireless WEP encryption support
diff --git a/contrib/rom-o-matic/doc/CRYPTO_80211_WPA.html b/contrib/rom-o-matic/doc/CRYPTO_80211_WPA.html
deleted file mode 100644
index b218a1e..0000000
--- a/contrib/rom-o-matic/doc/CRYPTO_80211_WPA.html
+++ /dev/null
@@ -1 +0,0 @@
-Wireless WPA encryption support
diff --git a/contrib/rom-o-matic/doc/CRYPTO_80211_WPA2.html b/contrib/rom-o-matic/doc/CRYPTO_80211_WPA2.html
deleted file mode 100644
index 947597d..0000000
--- a/contrib/rom-o-matic/doc/CRYPTO_80211_WPA2.html
+++ /dev/null
@@ -1 +0,0 @@
-Wireless WPA2 encryption support
diff --git a/contrib/rom-o-matic/doc/DHCP_CMD.html b/contrib/rom-o-matic/doc/DHCP_CMD.html
deleted file mode 100644
index a0c31c7..0000000
--- a/contrib/rom-o-matic/doc/DHCP_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-DHCP management commands
diff --git a/contrib/rom-o-matic/doc/DNS_RESOLVER.html b/contrib/rom-o-matic/doc/DNS_RESOLVER.html
deleted file mode 100644
index 1029b9c..0000000
--- a/contrib/rom-o-matic/doc/DNS_RESOLVER.html
+++ /dev/null
@@ -1 +0,0 @@
-DNS resolver
diff --git a/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_FTP.html b/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_FTP.html
deleted file mode 100644
index 7686d5d..0000000
--- a/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_FTP.html
+++ /dev/null
@@ -1 +0,0 @@
-File Transfer Protocol
diff --git a/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_HTTP.html b/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_HTTP.html
deleted file mode 100644
index c28d888..0000000
--- a/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_HTTP.html
+++ /dev/null
@@ -1 +0,0 @@
-Hypertext Transfer Protocol
diff --git a/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_TFTP.html b/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_TFTP.html
deleted file mode 100644
index f2b31b1..0000000
--- a/contrib/rom-o-matic/doc/DOWNLOAD_PROTO_TFTP.html
+++ /dev/null
@@ -1 +0,0 @@
-Trivial File Transfer Protocol
diff --git a/contrib/rom-o-matic/doc/IFMGMT_CMD.html b/contrib/rom-o-matic/doc/IFMGMT_CMD.html
deleted file mode 100644
index 0e2b2a5..0000000
--- a/contrib/rom-o-matic/doc/IFMGMT_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-Interface management commands
diff --git a/contrib/rom-o-matic/doc/IMAGE_BZIMAGE.html b/contrib/rom-o-matic/doc/IMAGE_BZIMAGE.html
deleted file mode 100644
index d85e5d0..0000000
--- a/contrib/rom-o-matic/doc/IMAGE_BZIMAGE.html
+++ /dev/null
@@ -1 +0,0 @@
-Linux bzImage image support
diff --git a/contrib/rom-o-matic/doc/IMAGE_CMD.html b/contrib/rom-o-matic/doc/IMAGE_CMD.html
deleted file mode 100644
index 6f5acb5..0000000
--- a/contrib/rom-o-matic/doc/IMAGE_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-Image management commands
diff --git a/contrib/rom-o-matic/doc/IMAGE_ELF.html b/contrib/rom-o-matic/doc/IMAGE_ELF.html
deleted file mode 100644
index 5e39e8b..0000000
--- a/contrib/rom-o-matic/doc/IMAGE_ELF.html
+++ /dev/null
@@ -1 +0,0 @@
-ELF image support
diff --git a/contrib/rom-o-matic/doc/IMAGE_MULTIBOOT.html b/contrib/rom-o-matic/doc/IMAGE_MULTIBOOT.html
deleted file mode 100644
index 6a092a2..0000000
--- a/contrib/rom-o-matic/doc/IMAGE_MULTIBOOT.html
+++ /dev/null
@@ -1 +0,0 @@
-MultiBoot image support
diff --git a/contrib/rom-o-matic/doc/IMAGE_NBI.html b/contrib/rom-o-matic/doc/IMAGE_NBI.html
deleted file mode 100644
index eb78e03..0000000
--- a/contrib/rom-o-matic/doc/IMAGE_NBI.html
+++ /dev/null
@@ -1 +0,0 @@
-NBI image support
diff --git a/contrib/rom-o-matic/doc/IMAGE_PXE.html b/contrib/rom-o-matic/doc/IMAGE_PXE.html
deleted file mode 100644
index bdca384..0000000
--- a/contrib/rom-o-matic/doc/IMAGE_PXE.html
+++ /dev/null
@@ -1 +0,0 @@
-PXE image support
diff --git a/contrib/rom-o-matic/doc/IMAGE_SCRIPT.html b/contrib/rom-o-matic/doc/IMAGE_SCRIPT.html
deleted file mode 100644
index 8741672..0000000
--- a/contrib/rom-o-matic/doc/IMAGE_SCRIPT.html
+++ /dev/null
@@ -1 +0,0 @@
-iPXE script image support
diff --git a/contrib/rom-o-matic/doc/IWMGMT_CMD.html b/contrib/rom-o-matic/doc/IWMGMT_CMD.html
deleted file mode 100644
index 0d5bd4a..0000000
--- a/contrib/rom-o-matic/doc/IWMGMT_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-Wireless interface management commands
diff --git a/contrib/rom-o-matic/doc/NMB_RESOLVER.html b/contrib/rom-o-matic/doc/NMB_RESOLVER.html
deleted file mode 100644
index a0bdc17..0000000
--- a/contrib/rom-o-matic/doc/NMB_RESOLVER.html
+++ /dev/null
@@ -1 +0,0 @@
-NMB resolver
diff --git a/contrib/rom-o-matic/doc/NVO_CMD.html b/contrib/rom-o-matic/doc/NVO_CMD.html
deleted file mode 100644
index 5346f3f..0000000
--- a/contrib/rom-o-matic/doc/NVO_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-Non-volatile option storage commands
diff --git a/contrib/rom-o-matic/doc/ROUTE_CMD.html b/contrib/rom-o-matic/doc/ROUTE_CMD.html
deleted file mode 100644
index 8114c26..0000000
--- a/contrib/rom-o-matic/doc/ROUTE_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-Routing table management commands
diff --git a/contrib/rom-o-matic/doc/SANBOOT_CMD.html b/contrib/rom-o-matic/doc/SANBOOT_CMD.html
deleted file mode 100644
index 2e9d840..0000000
--- a/contrib/rom-o-matic/doc/SANBOOT_CMD.html
+++ /dev/null
@@ -1 +0,0 @@
-SAN boot commands
diff --git a/contrib/rom-o-matic/flag-table.php b/contrib/rom-o-matic/flag-table.php
deleted file mode 100644
index fe81c80..0000000
--- a/contrib/rom-o-matic/flag-table.php
+++ /dev/null
@@ -1,531 +0,0 @@
-<?php // -*- Mode: PHP; -*-
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-$ofmts = array
-	( "Floppy bootable image (.dsk)" => "dsk",
-	  "SYSLINUX-based bootable floppy image (.sdsk)" => "sdsk",
-	  "ISO bootable image (.iso)" => "iso",
-	  "ISO bootable image with legacy floppy emulation (.liso)" => "liso",
-	  "Linux kernel (SYSLINUX/GRUB/LILO) loadable image (.lkrn)" => "lkrn",
-	  "USB Keychain disk image (.usb)" => "usb",
-	  "ROM binary (flashable) image (.rom)" => "rom",
-	  "ROM binary (flashable) for problem PMM BIOSES  (.hrom)" => "hrom",
-	  "PXE bootstrap loader image [Unload PXE stack] (.pxe)" => "pxe",
-	  "PXE bootstrap loader keep [Keep PXE stack method 1] (.kpxe)" => "kpxe",
-	  "PXE bootstrap loader keep [Keep PXE stack method 2] (.kkpxe)" => "kkpxe",
-	);
-
-$flag_table = array (
-
-	// Begin General Options:
-
-	"HDR_MISC_OPTIONS"
-	=> array (
-	   "flag" => "HDR_MISC_OPTIONS",
-	   "hide_from_user" => "yes",  // Hide even the header
-	   "type" => "header",
-	   "label" => "Miscellaneous Options"
-		),
-
-	"PRODUCT_NAME"
-	=> array (
-	   "flag" => "PRODUCT_NAME",
-	   "hide_from_user" => "yes",
-	   "type" => "string",
-	   "value" => "",
-	   "cfgsec" => "general"
-	   ),
-
-	"PRODUCT_SHORT_NAME"
-	=> array (
-	   "flag" => "PRODUCT_SHORT_NAME",
-	   "hide_from_user" => "yes",
-	   "type" => "string",
-	   "value" => "iPXE",
-	   "cfgsec" => "general"
-	   ),
-
-	// End General Options:
-
-	// Begin Console Options:
-
-	"HDR_CONSOLE_OPTIONS"
-	=> array (
-	   "flag" => "HDR_CONSOLE_OPTIONS",
-	   "type" => "header",
-	   "label" => "Console Options"
-		),
-
-	"CONSOLE_PCBIOS"
-	=> array (
-	   "flag" => "CONSOLE_PCBIOS",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "console"
-	   ),
-
-	"CONSOLE_SERIAL"
-	=> array (
-	   "flag" => "CONSOLE_SERIAL",
-	   "type" => "on/off",
-	   "value" => "off",
-	   "cfgsec" => "console"
-	   ),
-
-	"BANNER_TIMEOUT"
-	=> array (
-	   "flag" => "BANNER_TIMEOUT",
-	   "type" => "integer",
-	   "value" => "20",
-	   "cfgsec" => "general"
-	   ),
-
-        "KEYBOARD_MAP"
-        => array (
-           "flag" => "KEYBOARD_MAP",
-           "type" => "choice",
-	   "options" => array("al","az","bg","by","cf","cz","de","dk","es","et","fi","fr",
-	      "gr","hu","il","it","lt","mk","mt","nl","no","pl","pt","ro","ru","sg","sr",
-	      "th","ua","uk","us","wo"),
-           "value" => "us",
-           "cfgsec" => "console"
-           ),
-
-	"LOG_LEVEL"
-	=> array (
-	   "flag" => "LOG_LEVEL",
-	   "type" => "choice",
-	   "options" => array("LOG_NONE","LOG_EMERG","LOG_ALERT","LOG_CRIT","LOG_ERR",
-	      "LOG_WARNING","LOG_NOTICE","LOG_INFO","LOG_DEBUG","LOG_ALL"),
-	   "value" => "LOG_NONE",
-	   "cfgsec" => "console"
-	   ),
-
-	// End Console Options
-
-	// Begin Network Protocol Options:
-
-	"HDR_NETWORK_PROTOCOL_OPTIONS"
-	=> array (
-	   "flag" => "HDR_NETWORK_PROTOCOL_OPTIONS",
-	   "hide_from_user" => "yes",  // Hide even the header
-	   "type" => "header",
-	   "label" => "Network Protocol Options"
-		),
-
-	"NET_PROTO_IPV4"
-	=> array (
-	   "flag" => "NET_PROTO_IPV4",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "hide_from_user" => "yes",
-	   "cfgsec" => "general"
-	   ),
-
-	// End Network Protocol Options
-
-	// Begin Serial Port configuration
-
-	"HDR_SERIAL_PORT_OPTIONS"
-	=> array (
-	   "flag" => "HDR_SERIAL_PORT_OPTIONS",
-	   "type" => "header",
-	   "label" => "Serial Port Options"
-		),
-
-	"COMCONSOLE"
-	=> array (
-	   "flag" => "COMCONSOLE",
-	   "type" => "integer-hex", // e.g. 0x378
-	   "value" => "0x3F8",
-	   "cfgsec" => "serial"
-		),
-
-	"COMPRESERVE"
-	=> array (
-	   "flag" => "COMPRESERVE",
-	   "type" => "on/off",
-	   "value" => "off",
-	   "cfgsec" => "serial"
-	   ),
-
-	"COMSPEED"
-	=> array (
-	   "flag" => "COMSPEED",
-	   "type" => "integer",
-	   "value" => "115200",
-	   "cfgsec" => "serial"
-	   ),
-
-	"COMDATA"
-	=> array (
-	   "flag" => "COMDATA",
-	   "type" => "integer",
-	   "value" => "8",
-	   "cfgsec" => "serial"
-	   ),
-
-	"COMPARITY"
-	=> array (
-	   "flag" => "COMPARITY",
-	   "type" => "integer",
-	   "value" => "0",
-	   "cfgsec" => "serial"
-	   ),
-
-	"COMSTOP"
-	=> array (
-	   "flag" => "COMSTOP",
-	   "type" => "integer",
-	   "value" => "1",
-	   "cfgsec" => "serial"
-	   ),
-
-	// End Serial Options
-
-	// Begin Download Protocols
-
-	"HDR_DOWNLOAD_PROTOCOLS"
-	=> array (
-	   "flag" => "HDR_DOWNLOAD_PROTOCOLS",
-	   "type" => "header",
-	   "label" => "Download Protocols"
-		),
-
-	"DOWNLOAD_PROTO_TFTP"
-	=> array (
-	   "flag" => "DOWNLOAD_PROTO_TFTP",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"DOWNLOAD_PROTO_HTTP"
-	=> array (
-	   "flag" => "DOWNLOAD_PROTO_HTTP",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"DOWNLOAD_PROTO_HTTPS"
-	=> array (
-	   "flag" => "DOWNLOAD_PROTO_HTTPS",
-	   "type" => "on/off",
-	   "value" => "off",
-	   "cfgsec" => "general"
-	   ),
-
-	"DOWNLOAD_PROTO_FTP"
-	=> array (
-	   "flag" => "DOWNLOAD_PROTO_FTP",
-	   "type" => "on/off",
-	   "value" => "off",
-	   "cfgsec" => "general"
-	   ),
-
-	// End Download Protocols
-
-	// Begin SAN boot protocols
-
-	"HDR_SANBOOT_PROTOCOLS"
-	=> array (
-	   "flag" => "HDR_SANBOOT_PROTOCOLS",
-	   "type" => "header",
-	   "label" => "SAN Boot Protocols"
-		),
-
-	"SANBOOT_PROTO_ISCSI"
-	=> array (
-	   "flag" => "SANBOOT_PROTO_ISCSI",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"SANBOOT_PROTO_AOE"
-	=> array (
-	   "flag" => "SANBOOT_PROTO_AOE",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	// End SAN boot protocols
-
-	// Begin Name resolution modules
-
-	"HDR_NAME_RESOLUTION_MODULES"
-	=> array (
-	   "flag" => "HDR_NAME_RESOLUTION_MODULES",
-	   "type" => "header",
-	   "label" => "Name Resolution Modules"
-	   ),
-
-	"DNS_RESOLVER"
-	=> array (
-	   "flag" => "DNS_RESOLVER",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-		),
-
-	"NMB_RESOLVER"
-	=> array (
-	   "flag" => "NMB_RESOLVER",
-	   "type" => "on/off",
-	   "value" => "off",
-	   "hide_from_user" => "yes",
-	   "cfgsec" => "general"
-		),
-
-	// End Name resolution modules
-
-	// Begin Image types
-
-	"HDR_IMAGE_TYPES"
-	=> array (
-	   "flag" => "HDR_IMAGE_TYPES",
-	   "type" => "header",
-	   "label" => "Image Types",
-	   ),
-
-	"IMAGE_ELF"
-	=> array (
-	   "flag" => "IMAGE_ELF",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"IMAGE_NBI"
-	=> array (
-	   "flag" => "IMAGE_NBI",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-		),
-
-	"IMAGE_MULTIBOOT"
-	=> array (
-	   "flag" => "IMAGE_MULTIBOOT",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"IMAGE_PXE"
-	=> array (
-	   "flag" => "IMAGE_PXE",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"IMAGE_SCRIPT"
-	=> array (
-	   "flag" => "IMAGE_SCRIPT",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"IMAGE_BZIMAGE"
-	=> array (
-	   "flag" => "IMAGE_BZIMAGE",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"IMAGE_COMBOOT"
-	=> array (
-	   "flag" => "IMAGE_COMBOOT",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	// End Image types
-
-	// Begin Command-line commands to include
-
-	"HDR_COMMAND_LINE_OPTIONS"
-	=> array (
-	   "flag" => "HDR_COMMAND_LINE_OPTIONS",
-	   "type" => "header",
-	   "label" => "Command Line Options",
-	   ),
-
-	"AUTOBOOT_CMD"
-	=> array (
-	   "flag" => "AUTOBOOT_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"NVO_CMD"
-	=> array (
-	   "flag" => "NVO_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"CONFIG_CMD"
-	=> array (
-	   "flag" => "CONFIG_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"IFMGMT_CMD"
-	=> array (
-	   "flag" => "IFMGMT_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"IWMGMT_CMD"
-	=> array (
-	   "flag" => "IWMGMT_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"ROUTE_CMD"
-	=> array (
-	   "flag" => "ROUTE_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"IMAGE_CMD"
-	=> array (
-	   "flag" => "IMAGE_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"DHCP_CMD"
-	=> array (
-	   "flag" => "DHCP_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-		),
-
-	"SANBOOT_CMD"
-	=> array (
-	   "flag" => "SANBOOT_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-		),
-
-	"LOGIN_CMD"
-	=> array (
-	   "flag" => "LOGIN_CMD",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-		),
-
-	"TIME_CMD"
-	=> array (
-	   "flag" => "TIME_CMD",
-	   "type" => "on/off",
-	   "value" => "off",
-	   "cfgsec" => "general"
-		),
-
-	"DIGEST_CMD"
-	=> array (
-	   "flag" => "DIGEST_CMD",
-	   "type" => "on/off",
-	   "value" => "off",
-	   "cfgsec" => "general"
-		),
-
-	// End Command-line commands to include
-
-	// Begin Wireless options
-
-	"HDR_WIRELESS_OPTIONS"
-	=> array (
-	   "flag" => "HDR_WIRELESS_OPTIONS",
-	   "type" => "header",
-	   "label" => "Wireless Interface Options",
-	   ),
-
-	"CRYPTO_80211_WEP"
-	=> array (
-	   "flag" => "CRYPTO_80211_WEP",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"CRYPTO_80211_WPA"
-	=> array (
-	   "flag" => "CRYPTO_80211_WPA",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	"CRYPTO_80211_WPA2"
-	=> array (
-	   "flag" => "CRYPTO_80211_WPA2",
-	   "type" => "on/off",
-	   "value" => "on",
-	   "cfgsec" => "general"
-	   ),
-
-	// End Wireless options
-
-	// Obscure options required to compile
-	"NETDEV_DISCARD_RATE"
-	=> array (
-	   "flag" => "NETDEV_DISCARD_RATE",
-	   "type" => "integer",
-	   "value" => "0",
-	   "cfgsec" => "general",
-	   "hide_from_user" => true
-	   )
-
-	// End Obscure options
-);
-
-// For emacs:
-// Local variables:
-//	c-basic-offset: 4
-//	c-indent-level: 4
-//	tab-width: 4
-// End:
-
-?>
diff --git a/contrib/rom-o-matic/globals.php b/contrib/rom-o-matic/globals.php
deleted file mode 100644
index 822e4bc..0000000
--- a/contrib/rom-o-matic/globals.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php // -*- Mode: PHP; -*-
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-// Directory containing iPXE source code tree
-$src_dir = "../../src";
-
-// Compute iPXE version based on source tree
-exec ( "make -C '$src_dir' version 2>&1", $make_output, $status );
-$version = ( $status == 0 && count ( $make_output  ) > 1 )
-           ? trim ( $make_output[count ( $make_output ) - 2] )
-           : "";
-
-// Email address of person responsible for this website
-$webmaster_email = "webmaster@example.com";
-
-// Files that header and footer text
-$top_inc = "top.php";
-$bottom_inc = "bottom.php";
-
-// Descriptive strings
-$header_title = "ROM-o-matic for iPXE $version";
-$html_tagline = "ROM-o-matic dynamically generates iPXE images";
-$html_title   = "ROM-o-matic for iPXE $version";
-$description  = "a dynamic iPXE image generator";
-
-// For emacs:
-// Local variables:
-//  c-basic-offset: 4
-//  c-indent-level: 4
-//  tab-width: 4
-// End:
-
-?>
diff --git a/contrib/rom-o-matic/index.php b/contrib/rom-o-matic/index.php
deleted file mode 100644
index 26585c9..0000000
--- a/contrib/rom-o-matic/index.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php // -*- Mode: PHP; -*-
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-// Get utility functions and set globals
-require_once "utils.php";
-
-// Begin html output
-include_once $top_inc;
-
-?>
-<form action="build.php" method=POST>
-  <input type="hidden" name="version" value = "<?php echo $version ?>">
-  <h3>To create an image:</h3>
-  <ol>
-    <?php require ( "directions.php" ); ?>
-    <li>
-      Generate and download an image:
-      <input type="submit" name="A" value="Get Image">
-      <br><br>
-    </li>
-    <li>
-      (optional) Customize image configuration options:
-      <input type="submit" name="A" value="Customize">
-      <br><br>
-    </li>
-  </ol>
-</form>
-
-<?php include_once $bottom_inc ?>
diff --git a/contrib/rom-o-matic/top.php b/contrib/rom-o-matic/top.php
deleted file mode 100644
index 42a8e2d..0000000
--- a/contrib/rom-o-matic/top.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-
-<?php
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-?>
-
-<html>
-<head>
-  <link rev="made" href="mailto:<?php echo "${webmaster_email}" ?>">
-  <meta name="keywords" content="rom, etherboot, ipxe, open source, rom-o-matic.net">
-  <title><?php echo $header_title ?></title>
-  <meta name="description" content="<?php echo $description ?>">
-</head>
-<h1>
-<?php echo "$html_title" ?>&nbsp;
-</h1>
-<hr>
-<h2>
-<?php echo "$html_tagline" ?>
-</h2>
-</form>
-<hr>
diff --git a/contrib/rom-o-matic/utils.php b/contrib/rom-o-matic/utils.php
deleted file mode 100644
index e0e62f4..0000000
--- a/contrib/rom-o-matic/utils.php
+++ /dev/null
@@ -1,684 +0,0 @@
-<?php // -*- Mode: PHP; -*-
-
-/**
- * Copyright (C) 2009 Marty Connor <mdc@etherboot.org>.
- * Copyright (C) 2009 Entity Cyber, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of the
- * License, or any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-// Include table of user-configurable iPXE options
-require_once "flag-table.php";
-
-// Include user-shadowable globals
-require_once "globals.php";
-
-// Allow user to shadow globals
-if ( is_file ( 'local-config.php' ) ) {
-    include_once "local-config.php";
-}
-
-////
-// General utility functions
-////
-
-/**
- * Remove undesirable characters from a given string
- *
- * Certain characters have the potential to be used for
- * malicious purposes by web-based attackers.  This routine
- * filters out such characters.
- *
- * @param string $s supplied string
- *
- * @return string returned string with unwanted characters
- *                removed
- */
-function cleanstring ( $s )
-{
-    $len = strlen ( $s );
-    if ( $len > 80 ) {
-        $s = substr ( $s, 0, 80 );
-    }
-
-    $s      = trim ( $s );
-    $pos    = 0;
-    $result = "";
-
-    while ( $pos < $len ) {
-        $ltr = ord ( ucfirst ( $s[$pos] ) );
-        if ( ( $ltr >= ord ( "A" ) ) && ( $ltr <= ord ( "Z" ) ) ||
-             ( $ltr >= ord ( "0" ) ) && ( $ltr <= ord ( "9" ) ) ||
-             ( $ltr == ord ( "." ) ) && ( strlen ( $result ) > 0 ) ||
-             ( $ltr == ord ( "_" ) ) ||
-             ( $ltr == ord ( "+" ) ) ||
-             ( $ltr == ord ( ":" ) ) ||
-             ( $ltr == ord ( "/" ) ) ||
-             ( $ltr == ord ( "-" ) ) ) {
-            $result .= $s[$pos];
-        }
-        $pos++;
-    }
-    return $result;
-}
-
-/**
- * Return URL of the currently running script, minus the filename
- *
- * @return string the URL of the currently running script, minus the filename
- */
-function curDirURL ()
-{
-        $dir = dirname ( $_SERVER['PHP_SELF'] );
-
-        if ( $dir == "." || $dir == "/" ) {
-                $dir = "";
-        }
-
-        $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
-        $port = ( isset($_SERVER["SERVER_PORT"] ) &&
-                          ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) ||
-                                ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
-
-        $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
-
-        $dest = ( $isHTTPS ? 'https://' : 'http://' ) .
-                $_SERVER["SERVER_NAME"] . $dir . "/";
-
-        return $dest;
-}
-
-/**
- * Extract NIC families and associated ROM PCI IDs from the src/bin/NIC file.
- *
- * $src_dir must contain the path of the iPXE src directory for this build
- *
- * @return array[0] array $new_nics
- * @return array[1] array $roms
- */
-function parse_nic_file ()
-{
-    global $src_dir;
-
-    $fd = fopen ( "$src_dir/bin/NIC", "r" );
-    if ( ! $fd ) {
-        die ( "Missing src/bin/NIC file.  'make bin/NIC'" );
-    }
-
-    $nics = array ();
-    $roms = array ();
-    $nic = "";
-
-    while ( !feof ( $fd ) ) {
-
-        $line = trim ( fgets ( $fd, 200 ) );
-
-        $first_eight_chars = substr ( $line, 0, 8 );
-        settype ( $first_eight_chars, "string" );
-
-        if ( strpos ( $first_eight_chars, "family" ) === 0 ) {
-
-            // get pathname of NIC driver
-            #list ( $dummy, $nic ) = split( "[ \t]+", $line );
-            list ( $dummy, $nic ) = explode("\t", $line);
-            settype ( $nic, "string" );
-
-            // extract filename name of driver from pathname
-            $nic = substr ( $nic, strrpos ( $nic, "/" ) + 1,
-			   strlen ( $nic ) - strrpos ( $nic, "/" ) + 1 );
-
-            $nics[$nic] = $nic;
-
-            // For each ISA NIC, there can only be one ROM variant
-            $roms[$nic] = $nic;
-        }
-
-        // If the first 8 digits of the line are hex digits
-        // add this rom to the current nic family.
-
-        if (    ( strlen ( $first_eight_chars ) == 8 )
-             && ( ctype_xdigit ( $first_eight_chars ) )
-             && ( $nic != "" ) ) {
-
-            $roms[$first_eight_chars] = $nic;
-        }
-    }
-    fclose ( $fd );
-
-    // put most NICs in nice alpha order for menu
-    ksort ( $nics );
-
-    // add special cases to the top
-
-	$new_nics = array ( "all-drivers" => "ipxe",
-						"undionly" => "undionly",
-						"undi" => "undi",
-    );
-
-	foreach ( $nics as $key => $value ) {
-		// skip the undi driver
-		if ( $key != "undi" ) {
-			$new_nics[$key] = $value;
-		}
-	}
-
-	return array ( $new_nics, $roms );
-}
-
-////
-// HTML form utility functions
-////
-
-/**
- * Return html code to create hidden form input fields
- *
- * @param string $flag  name of form variable to set
- * @param string $value value to give form variable
- *
- * @return string html code for given hidden form input field
- */
-function hidden ( $flag, $value )
-{
-    $value = htmlentities ( $value );
-    return "<input type=\"hidden\" value=\"$value\" name=\"$flag\"></input>";
-}
-
-/**
- * Return html code to create checkbox form input fields
- *
- * @param string $flag  name of form variable to set
- * @param string $value "on" means box should be checked
- *
- * @return string html code for given hidden form input field
- */
-function checkbox ( $flag, $value )
-{
-    return "<input type=\"checkbox\" value=\"on\" name=\"$flag\"" .
-        ($value == "on" ? " checked>" : ">" );
-}
-
-/**
- * Return html code to create text form input fields
- *
- * @param string $flag  name of form variable to set
- * @param string $value initial contents of field
- * @param string $size  size in characters of text box
- *
- * @return string html code for given text input field
- */
-function textbox ( $flag, $value, $size )
-{
-    $value = htmlentities ( $value );
-    return "<input type=\"text\" size=\"$size\" value=\"$value\" name=\"$flag\">";
-}
-
-/**
- * Return html code to create textarea form fields
- *
- * @param string $flag  name of form variable to set
- * @param string $value initial contents of textarea
- * @param string $rows  height of text area in rows
- * @param string $cols  width of text area in columns
- *
- * @return string html code for given textarea input field
- */
-function textarea ( $flag, $value, $rows, $cols )
-{
-    $value = htmlentities ( $value );
-    return "<textarea name=\"$flag\" rows=\"$rows\" cols=\"$cols\">"
-            . $value . "</textarea>";
-}
-
-/**
- * Return html code to create select (menu) form fields
- *
- * Use array of strings as menu choices
- *
- * @param string $flag    name of form variable to set
- * @param array  $options array of strings representing choices
- * @param string $value   value of choice to select in menu
- *
- * @return string html code for given select (menu) input field
- */
-function menubox ( $name, $options, $value )
-{
-    $s="<select name=\"$name\">";
-
-	foreach ( $options as $ignore => $option ) {
-        if ( !$value ) $value = $option;
-        $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
-            htmlentities ( $option ) . "</option>";
-    }
-    return $s . "</select>";
-}
-
-/**
- * Return html code to create select (menu) form fields
- *
- * Use indices of array of strings as menu choices rather than
- * the values pointed to by the indicies.
- *
- * @param string $flag    name of form variable to set
- * @param array  $options array of strings representing choices
- * @param string $value   value of choice to select in menu
- *
- * @return string html code for given select (menu) input field
- */
-function keys_menubox ( $name, $options, $value )
-{
-    $s="<select name=\"$name\">";
-
-    foreach ( $options as $option => $ignore ) {
-        if ( !$value ) $value = $option;
-        $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
-            htmlentities ( $option ) . "</option>";
-    }
-    return $s . "</select>";
-}
-
-////
-// Flag (compile option) handling functions
-////
-
-/**
- * Return default compile options (flags)
- *
- * Initial compile options are in a global called $flag_table.
- * Create and return an array containing the ones we want.
- *
- * @return array default compile options (flags)
- */
-function default_flags ()
-{
-    global $flag_table;
-
-    $flags = array ();
-
-    foreach ( $flag_table as $key => $props ) {
-
-        $flag  = $props["flag"];
-        $type  = $props["type"];
-
-        // Fields like headers have no "value" property
-        if ( isset ( $props["value"] ) ) {
-            $flags[$flag] = $props["value"];
-        }
-    }
-    return $flags;
-}
-
-/**
- * Return combination of default and user compile options (flags)
- *
- * Initial compile options are in a global called $flag_table.
- * Compile options may have been changed via form input. We return
- * an array with either the default value of each option or a user
- * supplied value from form input.
- *
- * @return array combined default and user supplied compile options (flags)
- */
-function get_flags ()
-{
-    global $flag_table;
-
-    $flags = default_flags ();
-
-    if ( ! isset ( $_POST["use_flags"] ) )
-        return $flags;
-
-    foreach ( $flag_table as $key => $props ) {
-
-        $flag = $props["flag"];
-        $type = $props["type"];
-
-        if ( isset ( $_POST["$flag"] ) ) {
-            $flags[$flag] = $_POST["$flag"];
-            if ( $type == "integer-hex" ) {
-                if ( strtolower ( substr ( $flags[$flag], 0, 2 ) ) != "0x" ) {
-                    $flags[$flag] = "0x" . $flags[$flag];
-                }
-            }
-        } else if ( $type == "on/off" ) {
-			// Unchecked checkboxes don't pass any POST value
-			// so we must check for them specially.  At this
-			// point we know that there is no $_POST value set
-			// for this option.  If it is a checkbox, this means
-			// it is unchecked, so record that in $flags so we
-			// can later generate an #undef for this option.
-            $flags[$flag] = "off";
-        }
-    }
-    return $flags;
-}
-
-/**
- * Output given value in appropriate format for iPXE config file
- *
- * iPXE config/*.h files use C pre-processor syntax.  Output the given
- * compile option in a format appropriate to its type
- *
- * @param string $key   index into $flag_table for given compile option
- * @param string $value value we wish to set compile option to
- *
- * @return string code to set compile option to given value
- */
-function pprint_flag ( $key, $value )
-{
-    global $flag_table;
-
-    // Determine type of given compile option (flag)
-    $type = $flag_table[$key]["type"];
-    $s = "";
-
-    if ( $type == "on/off" && $value == "on" ) {
-        $s = "#define $key";
-    } else if ( $type == "on/off" && $value != "on" ) {
-        $s = "#undef $key";
-    } else if ( $type == "string" ) {
-        $s = ( "#define $key \"" . cleanstring ( $value ) . "\"" );
-    } else if ($type == "qstring" ) {
-        $s = ( "#define $key \\\"" . cleanstring ( $value ) . "\\\"" );
-    } else {
-        $s = "#define $key " . cleanstring ( $value );
-    }
-
-    return $s;
-}
-
-/**
- * Output html code to display all compile options as a table
- *
- * @param array $flags array of compile options
- *
- * @return void
- */
-function echo_flags ( $flags )
-{
-    global $flag_table;
-
-    echo "<table>\n";
-
-	foreach ( $flag_table as $key => $props ) {
-
-        // Hide parameters from users that should not be changed.
-        $hide_from_user = isset ( $props["hide_from_user"] ) ? $props["hide_from_user"] : "no";
-
-        $flag = $props["flag"];
-        $type = $props["type"];
-
-        $value = isset ( $flags[$flag] ) ? $flags[$flag] : '';
-
-        if ( $hide_from_user == "yes" ) {
-
-            // Hidden flags cannot not be set by the user.  We use hidden form
-            // fields to keep them at their default values.
-            if ( $type != "header" ) {
-                echo hidden ( $flag, $value );
-            }
-
-        } else {
-
-            // Flag (iPXE compile option) should be displayed to user
-
-            if ( $type == "header" ) {
-
-                $label = $props["label"];
-                echo "<td colspan=2><hr><h3>$label</h3><hr></td>";
-
-            } else if ($type == "on/off" ) {
-
-                echo "<td>", checkbox ( $flag, $value ), "</td><td><strong>$flag</strong></td>";
-
-            } else {   // don't display checkbox for non-on/off flags
-
-                echo "<td>&nbsp;</td><td><strong>$flag: </strong>";
-
-                if ($type == "choice" ) {
-                    $options = $props["options"];
-                    echo menubox($flag, $options, $value);
-
-                } else {
-
-                    echo textbox($flag, $value, ($type == "integer" ||
-                                                 $type == "integer-hex"
-                                                     ? 7 : 25));
-                }
-                echo "</td>";
-            }
-            echo "</tr>\n";
-
-            if ( $type != "header" ) {
-				echo "<tr><td>&nbsp;</td>";
-				echo "<td>\n";
-				if ( is_file ( "doc/$flag.html" ) ) {
-					include_once "doc/$flag.html";
-				}
-				echo "\n</td></tr>\n";
-            }
-        }
-    }
-    echo "</table>";
-}
-
-/**
- * Return an array of configuration sections used in all compile options
- *
- * $flag_table, the global list of compile options contains a 'cfgsec'
- * property for each flag we are interested in.  We return a list of
- * all the unique cfgsec options we find in $flag_table.
- *
- * @return array an array of strings representing all unique cfgsec values
- *               found in $flag_table
- */
-function get_flag_cfgsecs ()
-{
-    global $flag_table;
-    $cfgsecs = array ();
-
-    foreach ( $flag_table as $key => $props ) {
-        if ( isset ( $props['cfgsec'] ) ) {
-            $cfgsec = $props["cfgsec"];
-            $cfgsecs[$cfgsec] = $cfgsec;
-        }
-    }
-    return $cfgsecs;
-}
-
-////
-// File and directory handling functions
-////
-
-/**
- * Create a copy of a given source directory to a given destination
- *
- * Since we are going to modify the source directory, we create a copy
- * of the directory with a unique name in the given destination directory.
- * We supply a prefix for the tempnam call to prepend to the random filename
- * it generates.
- *
- * @param string $src    source directory
- * @param string $dst    destination directory
- * @param string $prefix string to append to directory created
- *
- * @return string absolute path to destination directory
- */
-function mktempcopy ( $src, $dst, $prefix )
-{
-    if ( $src[0] != "/" ) {
-        $src = dirname ( $_SERVER['SCRIPT_FILENAME'] ) . "/" . $src;
-    }
-
-    // Create a file in the given destination directory with a unique name
-    $dir = tempnam ( $dst, $prefix );
-
-    // Delete the file just created, since it would interfere with the copy we
-    // are about to do.  We only care that the dir name we copy to is unique.
-    unlink ( $dir );
-
-    exec ( "/bin/cp -a '$src' '$dir' 2>&1", $cpytxt, $status );
-
-    if ( $status != 0 ) {
-        die ( "src directory copy failed!" );
-    }
-    return $dir;
-}
-
-/**
- * Write iPXE config files based on value of given flags
- *
- * iPXE compile options are stored in src/config/*.h .
- * We write out a config file for each set of options.
- *
- * @param string $config_dir directory to write .h files to
- * @param array  $flags array of compile options for this build
- *
- * @return void
- */
-function write_ipxe_config_files ( $config_dir, $flags )
-{
-    global $flag_table;
-
-    $cfgsecs = get_flag_cfgsecs ();
-
-    foreach ( $cfgsecs as $cfgsec ) {
-
-        $fname = $config_dir . "/" . $cfgsec . ".h";
-
-        $fp = fopen ( $fname, "wb" );
-        if ( $fp <= 0 ) {
-            die ( "Unable to open $fname file for output!" );
-        }
-
-        $ifdef_secname = "CONFIG_" . strtoupper ( $cfgsec ) . "_H";
-
-        fwrite ( $fp, "#ifndef ${ifdef_secname}\n" );
-        fwrite ( $fp, "#define ${ifdef_secname}\n" );
-        fwrite ( $fp, "#include <config/defaults.h>\n" );
-
-        foreach ( $flags as $key => $value ) {
-            // When the flag matches this section name, write it out
-            if ( $flag_table[$key]["cfgsec"] == $cfgsec ) {
-                fwrite ( $fp, pprint_flag ( $key, $value ) . "\n" );
-            }
-        }
-        fwrite ( $fp, "#endif /* ${ifdef_secname} */\n" );
-        fclose ( $fp );
-    }
-}
-
-/**
- * Output a string to a file
- *
- * Output a given string to a given pathname. The file will be created if
- * necessary, and the string will replace the file's contents in all cases.
- *
- * @param string $fname pathname of file to output string to
- * @param string $ftext text to output to file
- *
- * @return void
- */
-function write_file_from_string ( $fname, $ftext )
-{
-        $fp = fopen ( $fname, "wb" );
-        if ( ! $fp ) {
-            die ( "Unable to open $fname file for output!" );
-        }
-        fwrite ( $fp, $ftext );
-        fclose ( $fp );
-}
-
-/**
- * Delete a file or recursively delete a directory tree
- *
- * @param   string   $file_or_dir_name  name of file or directory to delete
- * @return  bool     Returns TRUE on success, FALSE on failure
- */
-function rm_file_or_dir ( $file_or_dir_name )
-{
-    if ( ! file_exists ( $file_or_dir_name ) ) {
-        return false;
-    }
-
-    if ( is_file ( $file_or_dir_name ) || is_link ( $file_or_dir_name ) ) {
-        return unlink ( $file_or_dir_name );
-    }
-
-    $dir = dir ( $file_or_dir_name );
-    while ( ( $dir_entry = $dir->read () ) !== false ) {
-
-        if ( $dir_entry == '.' || $dir_entry == '..') {
-            continue;
-        }
-        rm_file_or_dir ( $file_or_dir_name . '/' . $dir_entry );
-    }
-    $dir->close();
-
-    return rmdir ( $file_or_dir_name );
-}
-
-////
-// Debugging functions
-////
-
-/**
- * Emit html code to display given array of compile options (flags)
- *
- * @param array  $flags array of compile options for this build
- *
- * @return void
- */
-function show_flags ( $flags )
-{
-    echo ( "\$flags contains " . count ( $flags ) . " elements:" . "<br>" );
-
-	foreach ( $flags as $key => $flag ) {
-        echo ( "\$flags[" . $key . "]=" . "\"$flag\"" . "<br>" );
-    }
-}
-
-/**
- * Emit HTML code to display default array of compile options (flags)
- *
- * $flag_table contains default compile options and properties.  This
- * routine outputs HTML code to display all properties of $flag_table.
- *
- * @return void
- */
-function dump_flag_table ()
-{
-    global $flag_table;
-
-    echo ( "\$flag_table contains " . count ( $flag_table ) . " elements:" . "<br>" );
-
-	foreach ( $flag_table as $key => $props ) {
-        print ( "flag_table[" . $key . "] = " . "<br>" );
-
-		foreach ( $props as $key2 => $props2 ) {
-            print ( "&nbsp;&nbsp;&nbsp;" . $key2 . " = " . $props2 . "<br>" );
-        }
-    }
-}
-
-// Parse src/bin/NIC file
-list ( $nics, $roms ) = parse_nic_file ();
-
-// For emacs:
-// Local variables:
-//  c-basic-offset: 4
-//  c-indent-level: 4
-//  tab-width: 4
-// End:
-
-?>
