Annotation of qemu/roms/ipxe/contrib/rom-o-matic/utils.php, revision 1.1

1.1     ! root        1: <? // -*- Mode: PHP; -*-
        !             2: 
        !             3: /**
        !             4:  * Copyright (C) 2009 Marty Connor <[email protected]>.
        !             5:  * Copyright (C) 2009 Entity Cyber, Inc.
        !             6:  *
        !             7:  * This program is free software; you can redistribute it and/or
        !             8:  * modify it under the terms of the GNU General Public License as
        !             9:  * published by the Free Software Foundation; either version 2 of the
        !            10:  * License, or any later version.
        !            11:  *
        !            12:  * This program is distributed in the hope that it will be useful, but
        !            13:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            15:  * General Public License for more details.
        !            16:  *
        !            17:  * You should have received a copy of the GNU General Public License
        !            18:  * along with this program; if not, write to the Free Software
        !            19:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            20:  */
        !            21: 
        !            22: // Include table of user-configurable iPXE options
        !            23: require_once "flag-table.php";
        !            24: 
        !            25: // Include user-shadowable globals
        !            26: require_once "globals.php";
        !            27: 
        !            28: // Allow user to shadow globals
        !            29: if ( is_file ( 'local-config.php' ) ) {
        !            30:     include_once "local-config.php";
        !            31: }
        !            32: 
        !            33: ////
        !            34: // General utility functions
        !            35: ////
        !            36: 
        !            37: /**
        !            38:  * Remove undesirable characters from a given string
        !            39:  *
        !            40:  * Certain characters have the potential to be used for
        !            41:  * malicious purposes by web-based attackers.  This routine
        !            42:  * filters out such characters.
        !            43:  *
        !            44:  * @param string $s supplied string
        !            45:  *
        !            46:  * @return string returned string with unwanted characters
        !            47:  *                removed
        !            48:  */
        !            49: function cleanstring ( $s )
        !            50: {
        !            51:     $len = strlen ( $s );
        !            52:     if ( $len > 80 ) {
        !            53:         $s = substr ( $s, 0, 80 );
        !            54:     }
        !            55: 
        !            56:     $s      = trim ( $s );
        !            57:     $pos    = 0;
        !            58:     $result = "";
        !            59: 
        !            60:     while ( $pos < $len ) {
        !            61:         $ltr = ord ( ucfirst ( $s[$pos] ) );
        !            62:         if ( ( $ltr >= ord ( "A" ) ) && ( $ltr <= ord ( "Z" ) ) ||
        !            63:              ( $ltr >= ord ( "0" ) ) && ( $ltr <= ord ( "9" ) ) ||
        !            64:              ( $ltr == ord ( "." ) ) && ( strlen ( $result ) > 0 ) ||
        !            65:              ( $ltr == ord ( "_" ) ) ||
        !            66:              ( $ltr == ord ( "+" ) ) ||
        !            67:              ( $ltr == ord ( ":" ) ) ||
        !            68:              ( $ltr == ord ( "/" ) ) ||
        !            69:              ( $ltr == ord ( "-" ) ) ) {
        !            70:             $result .= $s[$pos];
        !            71:         }
        !            72:         $pos++;
        !            73:     }
        !            74:     return $result;
        !            75: }
        !            76: 
        !            77: /**
        !            78:  * Return URL of the currently running script, minus the filename
        !            79:  *
        !            80:  * @return string the URL of the currently running script, minus the filename
        !            81:  */
        !            82: function curDirURL ()
        !            83: {
        !            84:         $dir = dirname ( $_SERVER['PHP_SELF'] );
        !            85: 
        !            86:         if ( $dir == "." || $dir == "/" ) {
        !            87:                 $dir = "";
        !            88:         }
        !            89: 
        !            90:         $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
        !            91:         $port = ( isset($_SERVER["SERVER_PORT"] ) &&
        !            92:                           ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) ||
        !            93:                                 ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
        !            94: 
        !            95:         $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
        !            96: 
        !            97:         $dest = ( $isHTTPS ? 'https://' : 'http://' ) .
        !            98:                 $_SERVER["SERVER_NAME"] . $dir . "/";
        !            99: 
        !           100:         return $dest;
        !           101: }
        !           102: 
        !           103: /**
        !           104:  * Extract NIC families and associated ROM PCI IDs from the src/bin/NIC file.
        !           105:  *
        !           106:  * $src_dir must contain the path of the iPXE src directory for this build
        !           107:  *
        !           108:  * @return array[0] array $new_nics
        !           109:  * @return array[1] array $roms
        !           110:  */
        !           111: function parse_nic_file ()
        !           112: {
        !           113:     global $src_dir;
        !           114: 
        !           115:     $fd = fopen ( "$src_dir/bin/NIC", "r" );
        !           116:     if ( ! $fd ) {
        !           117:         die ( "Missing src/bin/NIC file.  'make bin/NIC'" );
        !           118:     }
        !           119: 
        !           120:     $nics = array ();
        !           121:     $roms = array ();
        !           122:     $nic = "";
        !           123: 
        !           124:     while ( !feof ( $fd ) ) {
        !           125: 
        !           126:         $line = trim ( fgets ( $fd, 200 ) );
        !           127: 
        !           128:         $first_eight_chars = substr ( $line, 0, 8 );
        !           129:         settype ( $first_eight_chars, "string" );
        !           130: 
        !           131:         if ( strpos ( $first_eight_chars, "family" ) === 0 ) {
        !           132: 
        !           133:             // get pathname of NIC driver
        !           134:             list ( $dummy, $nic ) = split( "[ \t]+", $line );
        !           135:             settype ( $nic, "string" );
        !           136: 
        !           137:             // extract filename name of driver from pathname
        !           138:             $nic = substr ( $nic, strrpos ( $nic, "/" ) + 1,
        !           139:                           strlen ( $nic ) - strrpos ( $nic, "/" ) + 1 );
        !           140: 
        !           141:             $nics[$nic] = $nic;
        !           142: 
        !           143:             // For each ISA NIC, there can only be one ROM variant
        !           144:             $roms[$nic] = $nic;
        !           145:         }
        !           146: 
        !           147:         // If the first 8 digits of the line are hex digits
        !           148:         // add this rom to the current nic family.
        !           149: 
        !           150:         if (    ( strlen ( $first_eight_chars ) == 8 )
        !           151:              && ( ctype_xdigit ( $first_eight_chars ) )
        !           152:              && ( $nic != "" ) ) {
        !           153: 
        !           154:             $roms[$first_eight_chars] = $nic;
        !           155:         }
        !           156:     }
        !           157:     fclose ( $fd );
        !           158: 
        !           159:     // put most NICs in nice alpha order for menu
        !           160:     ksort ( $nics );
        !           161: 
        !           162:     // add special cases to the top
        !           163: 
        !           164:        $new_nics = array ( "all-drivers" => "ipxe",
        !           165:                                                "undionly" => "undionly",
        !           166:                                                "undi" => "undi",
        !           167:     );
        !           168: 
        !           169:        foreach ( $nics as $key => $value ) {
        !           170:                // skip the undi driver
        !           171:                if ( $key != "undi" ) {
        !           172:                        $new_nics[$key] = $value;
        !           173:                }
        !           174:        }
        !           175: 
        !           176:        return array ( $new_nics, $roms );
        !           177: }
        !           178: 
        !           179: ////
        !           180: // HTML form utility functions
        !           181: ////
        !           182: 
        !           183: /**
        !           184:  * Return html code to create hidden form input fields
        !           185:  *
        !           186:  * @param string $flag  name of form variable to set
        !           187:  * @param string $value value to give form variable
        !           188:  *
        !           189:  * @return string html code for given hidden form input field
        !           190:  */
        !           191: function hidden ( $flag, $value )
        !           192: {
        !           193:     $value = htmlentities ( $value );
        !           194:     return "<input type=\"hidden\" value=\"$value\" name=\"$flag\"></input>";
        !           195: }
        !           196: 
        !           197: /**
        !           198:  * Return html code to create checkbox form input fields
        !           199:  *
        !           200:  * @param string $flag  name of form variable to set
        !           201:  * @param string $value "on" means box should be checked
        !           202:  *
        !           203:  * @return string html code for given hidden form input field
        !           204:  */
        !           205: function checkbox ( $flag, $value )
        !           206: {
        !           207:     return "<input type=\"checkbox\" value=\"on\" name=\"$flag\"" .
        !           208:         ($value == "on" ? " checked>" : ">" );
        !           209: }
        !           210: 
        !           211: /**
        !           212:  * Return html code to create text form input fields
        !           213:  *
        !           214:  * @param string $flag  name of form variable to set
        !           215:  * @param string $value initial contents of field
        !           216:  * @param string $size  size in characters of text box
        !           217:  *
        !           218:  * @return string html code for given text input field
        !           219:  */
        !           220: function textbox ( $flag, $value, $size )
        !           221: {
        !           222:     $value = htmlentities ( $value );
        !           223:     return "<input type=\"text\" size=\"$size\" value=\"$value\" name=\"$flag\">";
        !           224: }
        !           225: 
        !           226: /**
        !           227:  * Return html code to create textarea form fields
        !           228:  *
        !           229:  * @param string $flag  name of form variable to set
        !           230:  * @param string $value initial contents of textarea
        !           231:  * @param string $rows  height of text area in rows
        !           232:  * @param string $cols  width of text area in columns
        !           233:  *
        !           234:  * @return string html code for given textarea input field
        !           235:  */
        !           236: function textarea ( $flag, $value, $rows, $cols )
        !           237: {
        !           238:     $value = htmlentities ( $value );
        !           239:     return "<textarea name=\"$flag\" rows=\"$rows\" cols=\"$cols\">"
        !           240:             . $value . "</textarea>";
        !           241: }
        !           242: 
        !           243: /**
        !           244:  * Return html code to create select (menu) form fields
        !           245:  *
        !           246:  * Use array of strings as menu choices
        !           247:  *
        !           248:  * @param string $flag    name of form variable to set
        !           249:  * @param array  $options array of strings representing choices
        !           250:  * @param string $value   value of choice to select in menu
        !           251:  *
        !           252:  * @return string html code for given select (menu) input field
        !           253:  */
        !           254: function menubox ( $name, $options, $value )
        !           255: {
        !           256:     $s="<select name=\"$name\">";
        !           257: 
        !           258:        foreach ( $options as $ignore => $option ) {
        !           259:         if ( !$value ) $value = $option;
        !           260:         $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
        !           261:             htmlentities ( $option ) . "</option>";
        !           262:     }
        !           263:     return $s . "</select>";
        !           264: }
        !           265: 
        !           266: /**
        !           267:  * Return html code to create select (menu) form fields
        !           268:  *
        !           269:  * Use indices of array of strings as menu choices rather than
        !           270:  * the values pointed to by the indicies.
        !           271:  *
        !           272:  * @param string $flag    name of form variable to set
        !           273:  * @param array  $options array of strings representing choices
        !           274:  * @param string $value   value of choice to select in menu
        !           275:  *
        !           276:  * @return string html code for given select (menu) input field
        !           277:  */
        !           278: function keys_menubox ( $name, $options, $value )
        !           279: {
        !           280:     $s="<select name=\"$name\">";
        !           281: 
        !           282:     foreach ( $options as $option => $ignore ) {
        !           283:         if ( !$value ) $value = $option;
        !           284:         $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
        !           285:             htmlentities ( $option ) . "</option>";
        !           286:     }
        !           287:     return $s . "</select>";
        !           288: }
        !           289: 
        !           290: ////
        !           291: // Flag (compile option) handling functions
        !           292: ////
        !           293: 
        !           294: /**
        !           295:  * Return default compile options (flags)
        !           296:  *
        !           297:  * Initial compile options are in a global called $flag_table.
        !           298:  * Create and return an array containing the ones we want.
        !           299:  *
        !           300:  * @return array default compile options (flags)
        !           301:  */
        !           302: function default_flags ()
        !           303: {
        !           304:     global $flag_table;
        !           305: 
        !           306:     $flags = array ();
        !           307: 
        !           308:     foreach ( $flag_table as $key => $props ) {
        !           309: 
        !           310:         $flag  = $props["flag"];
        !           311:         $type  = $props["type"];
        !           312: 
        !           313:         // Fields like headers have no "value" property
        !           314:         if ( isset ( $props["value"] ) ) {
        !           315:             $flags[$flag] = $props["value"];
        !           316:         }
        !           317:     }
        !           318:     return $flags;
        !           319: }
        !           320: 
        !           321: /**
        !           322:  * Return combination of default and user compile options (flags)
        !           323:  *
        !           324:  * Initial compile options are in a global called $flag_table.
        !           325:  * Compile options may have been changed via form input. We return
        !           326:  * an array with either the default value of each option or a user
        !           327:  * supplied value from form input.
        !           328:  *
        !           329:  * @return array combined default and user supplied compile options (flags)
        !           330:  */
        !           331: function get_flags ()
        !           332: {
        !           333:     global $flag_table;
        !           334: 
        !           335:     $flags = default_flags ();
        !           336: 
        !           337:     if ( ! isset ( $_POST["use_flags"] ) )
        !           338:         return $flags;
        !           339: 
        !           340:     foreach ( $flag_table as $key => $props ) {
        !           341: 
        !           342:         $flag = $props["flag"];
        !           343:         $type = $props["type"];
        !           344: 
        !           345:         if ( isset ( $_POST["$flag"] ) ) {
        !           346:             $flags[$flag] = $_POST["$flag"];
        !           347:             if ( $type == "integer-hex" ) {
        !           348:                 if ( strtolower ( substr ( $flags[$flag], 0, 2 ) ) != "0x" ) {
        !           349:                     $flags[$flag] = "0x" . $flags[$flag];
        !           350:                 }
        !           351:             }
        !           352:         } else if ( $type == "on/off" ) {
        !           353:                        // Unchecked checkboxes don't pass any POST value
        !           354:                        // so we must check for them specially.  At this
        !           355:                        // point we know that there is no $_POST value set
        !           356:                        // for this option.  If it is a checkbox, this means
        !           357:                        // it is unchecked, so record that in $flags so we
        !           358:                        // can later generate an #undef for this option.
        !           359:             $flags[$flag] = "off";
        !           360:         }
        !           361:     }
        !           362:     return $flags;
        !           363: }
        !           364: 
        !           365: /**
        !           366:  * Output given value in appropriate format for iPXE config file
        !           367:  *
        !           368:  * iPXE config/*.h files use C pre-processor syntax.  Output the given
        !           369:  * compile option in a format appropriate to its type
        !           370:  *
        !           371:  * @param string $key   index into $flag_table for given compile option
        !           372:  * @param string $value value we wish to set compile option to
        !           373:  *
        !           374:  * @return string code to set compile option to given value
        !           375:  */
        !           376: function pprint_flag ( $key, $value )
        !           377: {
        !           378:     global $flag_table;
        !           379: 
        !           380:     // Determine type of given compile option (flag)
        !           381:     $type = $flag_table[$key]["type"];
        !           382:     $s = "";
        !           383: 
        !           384:     if ( $type == "on/off" && $value == "on" ) {
        !           385:         $s = "#define $key";
        !           386:     } else if ( $type == "on/off" && $value != "on" ) {
        !           387:         $s = "#undef $key";
        !           388:     } else if ( $type == "string" ) {
        !           389:         $s = ( "#define $key \"" . cleanstring ( $value ) . "\"" );
        !           390:     } else if ($type == "qstring" ) {
        !           391:         $s = ( "#define $key \\\"" . cleanstring ( $value ) . "\\\"" );
        !           392:     } else {
        !           393:         $s = "#define $key " . cleanstring ( $value );
        !           394:     }
        !           395: 
        !           396:     return $s;
        !           397: }
        !           398: 
        !           399: /**
        !           400:  * Output html code to display all compile options as a table
        !           401:  *
        !           402:  * @param array $flags array of compile options
        !           403:  *
        !           404:  * @return void
        !           405:  */
        !           406: function echo_flags ( $flags )
        !           407: {
        !           408:     global $flag_table;
        !           409: 
        !           410:     echo "<table>\n";
        !           411: 
        !           412:        foreach ( $flag_table as $key => $props ) {
        !           413: 
        !           414:         // Hide parameters from users that should not be changed.
        !           415:         $hide_from_user = isset ( $props["hide_from_user"] ) ? $props["hide_from_user"] : "no";
        !           416: 
        !           417:         $flag = $props["flag"];
        !           418:         $type = $props["type"];
        !           419: 
        !           420:         $value = isset ( $flags[$flag] ) ? $flags[$flag] : '';
        !           421: 
        !           422:         if ( $hide_from_user == "yes" ) {
        !           423: 
        !           424:             // Hidden flags cannot not be set by the user.  We use hidden form
        !           425:             // fields to keep them at their default values.
        !           426:             if ( $type != "header" ) {
        !           427:                 echo hidden ( $flag, $value );
        !           428:             }
        !           429: 
        !           430:         } else {
        !           431: 
        !           432:             // Flag (iPXE compile option) should be displayed to user
        !           433: 
        !           434:             if ( $type == "header" ) {
        !           435: 
        !           436:                 $label = $props["label"];
        !           437:                 echo "<td colspan=2><hr><h3>$label</h3><hr></td>";
        !           438: 
        !           439:             } else if ($type == "on/off" ) {
        !           440: 
        !           441:                 echo "<td>", checkbox ( $flag, $value ), "</td><td><strong>$flag</strong></td>";
        !           442: 
        !           443:             } else {   // don't display checkbox for non-on/off flags
        !           444: 
        !           445:                 echo "<td>&nbsp;</td><td><strong>$flag: </strong>";
        !           446: 
        !           447:                 if ($type == "choice" ) {
        !           448:                     $options = $props["options"];
        !           449:                     echo menubox($flag, $options, $value);
        !           450: 
        !           451:                 } else {
        !           452: 
        !           453:                     echo textbox($flag, $value, ($type == "integer" ||
        !           454:                                                  $type == "integer-hex"
        !           455:                                                      ? 7 : 25));
        !           456:                 }
        !           457:                 echo "</td>";
        !           458:             }
        !           459:             echo "</tr>\n";
        !           460: 
        !           461:             if ( $type != "header" ) {
        !           462:                                echo "<tr><td>&nbsp;</td>";
        !           463:                                echo "<td>\n";
        !           464:                                if ( is_file ( "doc/$flag.html" ) ) {
        !           465:                                        include_once "doc/$flag.html";
        !           466:                                }
        !           467:                                echo "\n</td></tr>\n";
        !           468:             }
        !           469:         }
        !           470:     }
        !           471:     echo "</table>";
        !           472: }
        !           473: 
        !           474: /**
        !           475:  * Return an array of configuration sections used in all compile options
        !           476:  *
        !           477:  * $flag_table, the global list of compile options contains a 'cfgsec'
        !           478:  * property for each flag we are interested in.  We return a list of
        !           479:  * all the unique cfgsec options we find in $flag_table.
        !           480:  *
        !           481:  * @return array an array of strings representing all unique cfgsec values
        !           482:  *               found in $flag_table
        !           483:  */
        !           484: function get_flag_cfgsecs ()
        !           485: {
        !           486:     global $flag_table;
        !           487:     $cfgsecs = array ();
        !           488: 
        !           489:     foreach ( $flag_table as $key => $props ) {
        !           490:         if ( isset ( $props['cfgsec'] ) ) {
        !           491:             $cfgsec = $props["cfgsec"];
        !           492:             $cfgsecs[$cfgsec] = $cfgsec;
        !           493:         }
        !           494:     }
        !           495:     return $cfgsecs;
        !           496: }
        !           497: 
        !           498: ////
        !           499: // File and directory handling functions
        !           500: ////
        !           501: 
        !           502: /**
        !           503:  * Create a copy of a given source directory to a given destination
        !           504:  *
        !           505:  * Since we are going to modify the source directory, we create a copy
        !           506:  * of the directory with a unique name in the given destination directory.
        !           507:  * We supply a prefix for the tempnam call to prepend to the random filename
        !           508:  * it generates.
        !           509:  *
        !           510:  * @param string $src    source directory
        !           511:  * @param string $dst    destination directory
        !           512:  * @param string $prefix string to append to directory created
        !           513:  *
        !           514:  * @return string absolute path to destination directory
        !           515:  */
        !           516: function mktempcopy ( $src, $dst, $prefix )
        !           517: {
        !           518:     if ( $src[0] != "/" ) {
        !           519:         $src = dirname ( $_SERVER['SCRIPT_FILENAME'] ) . "/" . $src;
        !           520:     }
        !           521: 
        !           522:     // Create a file in the given destination directory with a unique name
        !           523:     $dir = tempnam ( $dst, $prefix );
        !           524: 
        !           525:     // Delete the file just created, since it would interfere with the copy we
        !           526:     // are about to do.  We only care that the dir name we copy to is unique.
        !           527:     unlink ( $dir );
        !           528: 
        !           529:     exec ( "/bin/cp -a '$src' '$dir' 2>&1", $cpytxt, $status );
        !           530: 
        !           531:     if ( $status != 0 ) {
        !           532:         die ( "src directory copy failed!" );
        !           533:     }
        !           534:     return $dir;
        !           535: }
        !           536: 
        !           537: /**
        !           538:  * Write iPXE config files based on value of given flags
        !           539:  *
        !           540:  * iPXE compile options are stored in src/config/*.h .
        !           541:  * We write out a config file for each set of options.
        !           542:  *
        !           543:  * @param string $config_dir directory to write .h files to
        !           544:  * @param array  $flags array of compile options for this build
        !           545:  *
        !           546:  * @return void
        !           547:  */
        !           548: function write_ipxe_config_files ( $config_dir, $flags )
        !           549: {
        !           550:     global $flag_table;
        !           551: 
        !           552:     $cfgsecs = get_flag_cfgsecs ();
        !           553: 
        !           554:     foreach ( $cfgsecs as $cfgsec ) {
        !           555: 
        !           556:         $fname = $config_dir . "/" . $cfgsec . ".h";
        !           557: 
        !           558:         $fp = fopen ( $fname, "wb" );
        !           559:         if ( $fp <= 0 ) {
        !           560:             die ( "Unable to open $fname file for output!" );
        !           561:         }
        !           562: 
        !           563:         $ifdef_secname = "CONFIG_" . strtoupper ( $cfgsec ) . "_H";
        !           564: 
        !           565:         fwrite ( $fp, "#ifndef ${ifdef_secname}\n" );
        !           566:         fwrite ( $fp, "#define ${ifdef_secname}\n" );
        !           567:         fwrite ( $fp, "#include <config/defaults.h>\n" );
        !           568: 
        !           569:         foreach ( $flags as $key => $value ) {
        !           570:             // When the flag matches this section name, write it out
        !           571:             if ( $flag_table[$key]["cfgsec"] == $cfgsec ) {
        !           572:                 fwrite ( $fp, pprint_flag ( $key, $value ) . "\n" );
        !           573:             }
        !           574:         }
        !           575:         fwrite ( $fp, "#endif /* ${ifdef_secname} */\n" );
        !           576:         fclose ( $fp );
        !           577:     }
        !           578: }
        !           579: 
        !           580: /**
        !           581:  * Output a string to a file
        !           582:  *
        !           583:  * Output a given string to a given pathname. The file will be created if
        !           584:  * necessary, and the string will replace the file's contents in all cases.
        !           585:  *
        !           586:  * @param string $fname pathname of file to output string to
        !           587:  * @param string $ftext text to output to file
        !           588:  *
        !           589:  * @return void
        !           590:  */
        !           591: function write_file_from_string ( $fname, $ftext )
        !           592: {
        !           593:         $fp = fopen ( $fname, "wb" );
        !           594:         if ( ! $fp ) {
        !           595:             die ( "Unable to open $fname file for output!" );
        !           596:         }
        !           597:         fwrite ( $fp, $ftext );
        !           598:         fclose ( $fp );
        !           599: }
        !           600: 
        !           601: /**
        !           602:  * Delete a file or recursively delete a directory tree
        !           603:  *
        !           604:  * @param   string   $file_or_dir_name  name of file or directory to delete
        !           605:  * @return  bool     Returns TRUE on success, FALSE on failure
        !           606:  */
        !           607: function rm_file_or_dir ( $file_or_dir_name )
        !           608: {
        !           609:     if ( ! file_exists ( $file_or_dir_name ) ) {
        !           610:         return false;
        !           611:     }
        !           612: 
        !           613:     if ( is_file ( $file_or_dir_name ) || is_link ( $file_or_dir_name ) ) {
        !           614:         return unlink ( $file_or_dir_name );
        !           615:     }
        !           616: 
        !           617:     $dir = dir ( $file_or_dir_name );
        !           618:     while ( ( $dir_entry = $dir->read () ) !== false ) {
        !           619: 
        !           620:         if ( $dir_entry == '.' || $dir_entry == '..') {
        !           621:             continue;
        !           622:         }
        !           623:         rm_file_or_dir ( $file_or_dir_name . '/' . $dir_entry );
        !           624:     }
        !           625:     $dir->close();
        !           626: 
        !           627:     return rmdir ( $file_or_dir_name );
        !           628: }
        !           629: 
        !           630: ////
        !           631: // Debugging functions
        !           632: ////
        !           633: 
        !           634: /**
        !           635:  * Emit html code to display given array of compile options (flags)
        !           636:  *
        !           637:  * @param array  $flags array of compile options for this build
        !           638:  *
        !           639:  * @return void
        !           640:  */
        !           641: function show_flags ( $flags )
        !           642: {
        !           643:     echo ( "\$flags contains " . count ( $flags ) . " elements:" . "<br>" );
        !           644: 
        !           645:        foreach ( $flags as $key => $flag ) {
        !           646:         echo ( "\$flags[" . $key . "]=" . "\"$flag\"" . "<br>" );
        !           647:     }
        !           648: }
        !           649: 
        !           650: /**
        !           651:  * Emit HTML code to display default array of compile options (flags)
        !           652:  *
        !           653:  * $flag_table contains default compile options and properties.  This
        !           654:  * routine outputs HTML code to display all properties of $flag_table.
        !           655:  *
        !           656:  * @return void
        !           657:  */
        !           658: function dump_flag_table ()
        !           659: {
        !           660:     global $flag_table;
        !           661: 
        !           662:     echo ( "\$flag_table contains " . count ( $flag_table ) . " elements:" . "<br>" );
        !           663: 
        !           664:        foreach ( $flag_table as $key => $props ) {
        !           665:         print ( "flag_table[" . $key . "] = " . "<br>" );
        !           666: 
        !           667:                foreach ( $props as $key2 => $props2 ) {
        !           668:             print ( "&nbsp;&nbsp;&nbsp;" . $key2 . " = " . $props2 . "<br>" );
        !           669:         }
        !           670:     }
        !           671: }
        !           672: 
        !           673: // Parse src/bin/NIC file
        !           674: list ( $nics, $roms ) = parse_nic_file ();
        !           675: 
        !           676: // For emacs:
        !           677: // Local variables:
        !           678: //  c-basic-offset: 4
        !           679: //  c-indent-level: 4
        !           680: //  tab-width: 4
        !           681: // End:
        !           682: 
        !           683: ?>

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.