Major code reorganization
[people/meteger/rom-o-matic/.git] / configinfo.php
1 <? // -*- Mode: PHP; -*-
2
3 require_once "flag_table.php";
4
5 // Some debugging calls:
6 // dump_flag_table ();
7 // dump_flag_codes ();
8 // dump_flag_table_keys_sorted ();
9 // exit ();
10
11 // Include shadow-able globals
12 require_once "globals.php";
13
14 // Allow shadowing of globals
15 include_once "local-config.php";
16
17 // echo "$version<br>"; exit ();
18
19 function value_key ($ofmt) 
20 {
21         // Here we decide which $flag_table key is associated with
22         // the variable we want to retrieve.  The reason for this is
23         // that we might want to return a different value based on 
24         // what kind of build we are doing.  In particular, if we ever
25         // Support EFI or LinuxBIOS builds, we might want to return
26         // different values than for PC BIOS builds. In which 
27         // case we could do someting like:
28     //    return (strpos ($ofmt, "LinuxBIOS" ) === false 
29     //            ? "value" : "valuelnx" );
30
31         // For now, we return the key "value", since that is the 
32         // slot that contains the usual value associated with this key
33     return ( "value" );
34 }
35
36 function snarf_file ( $fname ) 
37 {
38     $len = filesize ( $fname );
39     if ( $len > 0 ) {
40         $fp = fopen ( $fname, "rb" );
41         if ( $fp > 0 ) {
42             $buf = fread ( $fp, $len );
43             fclose ( $fp );
44             if ( $buf ) 
45                 return ($buf);
46         }
47     }
48     die ( "Unable to get $fname" );
49     return 0;
50 }
51
52 function get_nics () 
53 {
54     global $version, $src_dir;
55
56     $nic = ( isset ( $_GET['nic'] ) ? $_GET['nic'] : '' );
57
58     $fd = fopen( "$src_dir/bin/NIC", "r" );
59
60     if ( $fd < 1 ) {
61         trigger_error ( "Missing NIC Config Info" );
62         exit ();
63     }
64
65     $nics = array ();
66     $family = "";
67
68     while ( !feof ( $fd ) ) {
69
70         $line = trim ( fgets ( $fd, 200 ) );
71
72         if ( strpos ( $line, "family" ) === 0 ) {
73
74             list ( $dummy, $family ) = split( "[ \t]+", $line );
75             settype ( $family, "string" );
76
77         } else if ( $line != "" && $line[0] != '#' ) {
78
79             list ( $rom, $pci_ids ) = split ( "[ \t]+", $line );
80             settype ( $rom, "string" );
81
82             if ( $pci_ids == "-" ) 
83                                 $pci_ids = "";
84
85             $fam_name = substr ( $family, strrpos ( $family, "/" ) + 1, 
86                          strlen ( $family ) - strrpos ( $family, "/" ) + 1 );
87             $option = ( $pci_ids ? "$fam_name:$rom -- [$pci_ids]" : "$fam_name:$rom" );
88
89             // * Kludge - fix incoming $nic if any.
90             if ( $nic == $rom ) 
91                                 $nic = $option;
92
93             // ISA drivers are per-family, PCI are per-ROM. If ever decide
94             // to cache the drivers, can use this key.
95             $nics[$option] = ( $pci_ids ? "PCI:" . $rom : "ISA:" . $family );
96
97             // echo $nics array for debugging
98             // echo "\$nics[$option] "." -> ".$nics[$option]."<br>";
99         }
100     }
101
102     $nics["gpxe:all-drivers"] = "PCI:gpxe";
103     fclose ( $fd );
104     ksort ( $nics );
105     return( $nics );
106 }
107
108 function get_nicfile () 
109 {
110     global $ofmts;
111
112     $nic = $_GET['nic'];
113     $ofmt = $_GET['ofmt'];
114
115     $n = strpos ( $nic, " " );
116     $family = substr ( $nic, 0, strpos ( $nic,":" ) );
117
118     $rom = ( $n > 0 ? 
119          substr ( $nic, strpos ( $nic, ":" ) + 1, 
120               $n - ( strlen ( $family ) + 1 ) ) :  
121          $family );
122
123     $ftype = $ofmts[$ofmt];
124     if ( $ftype == "" ) $ftype = "dsk"; 
125
126     // if .rom format is requested, return rom name,
127     //   since .rom images are PCI ID specific, and 
128     //   rules only exist to build bin/$rom for Binary
129     //    ROM images types
130     if ( $ftype == "rom" )
131         $retval = cleanstring ( $rom . "." . $ftype );
132     else
133         $retval = cleanstring ( $family . "." . $ftype );
134
135     // Let's take a look at what was chosen.
136     //  echo "strpos ( \$nic, \":\" ) ->" . strpos ( $nic, ":" ) . "<br>";
137     //  echo "\$n ->" . "$n" . "<br>";
138     //  echo "\$nic ->" . "|$nic|" . "<br>";
139     //  echo "\$rom ->" . "|$rom|" . "<br>";
140     //  echo "\$family ->" . "|$family|" . "<br>";
141     //  echo "\$ftype ->" . "|$ftype|" . "<br>";
142     //  echo "\$retval ->" . "|$retval|" . "<br>";
143     //  exit();
144
145     return ( $retval );
146 }
147
148 function hidden ( $flag, $value ) 
149 {
150     $value = htmlentities ( $value );
151     return "<input type=\"hidden\" value=\"$value\" name=\"$flag\"></input>";
152 }
153
154 function checkbox ( $flag, $value ) 
155 {
156     return "<input type=\"checkbox\" value=\"on\" name=\"$flag\"" .
157         ($value == "on" ? " checked>" : ">" );
158 }
159
160 function textbox ( $flag, $value, $size ) 
161 {
162     $value = htmlentities ( $value );
163     return "<input type=\"text\" size=\"$size\" value=\"$value\" name=\"$flag\">";
164 }
165  
166 function menubox ( $name, $options, $value ) 
167 {
168     $s="<select name=\"$name\">";
169     reset ( $options );
170
171     while ( list ( $ignore, $option ) = each ( $options ) ) {
172         $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
173             htmlentities ( $option ) . "</option>";
174     }
175     return $s . "</select>";
176 }
177
178 function keys_menubox ( $name, $options, $value ) 
179 {
180     $s="<select name=\"$name\">";
181     reset ( $options );
182
183     while ( list ( $option, $ignore ) = each ( $options ) ) {
184         if ( !$value ) $value = $option;
185         $s .= "<option" . ( $option == $value ? " selected>" : ">" ) .
186             htmlentities ( $option ) . "</option>";
187     }
188     return $s . "</select>";
189 }  
190
191 function encode_flags ( $flags ) 
192 {
193         // Encode flags to keep size down, so can use GET's instead of POST's
194         // Note that the value may need to be urlencoded.
195
196     global $flag_table;
197
198     $s = "";
199     reset ( $flags );
200
201     while ( list ( $flag, $value ) = each ( $flags ) ) {
202         $prop = $flag_table[$flag];
203         $type = $prop["type"];
204         $s .= $prop["code"];
205
206         if ( $type != "on/off" ) {
207             $n = strlen ( $value );
208             $nstr = strval ( $n );
209
210             if ( $n < 10 ) 
211                 $nstr = "0" . $nstr;
212
213             if ( $n >= 80 ) 
214                 die ( "Value too long!" );
215
216             $s .= $nstr . $value;
217         }
218     }
219     return $s;
220 }
221
222 function decode_flags_into ( $s, $flags ) 
223 {
224     global $flag_codes;
225     $len = strlen ( $s );
226
227     $pos = 0;
228     while ( $pos < $len ) {
229
230         $code = substr ( $s, $pos, 2 );
231         $pos += 2;
232         $prop = $flag_codes[$code];
233         $flag = $prop["flag"];
234         $value = "on";
235         $type = $prop["type"];
236
237         if ( $prop["type"] != "on/off" ) {
238             $n = intval ( substr ( $s, $pos, 2 ) );
239             $pos += 2;
240             $value = substr ( $s, $pos, $n );
241             $pos += $n;
242         }
243         $flags[$flag] = $value;
244     }
245     return $flags;
246 }
247
248 function default_flags () 
249 {
250     global $flag_table;
251
252     if ( isset ( $_GET["F"] ) )
253         $F = $_GET["F"];
254
255     if ( isset ( $_GET["nic"] ) )
256         $nic = $_GET["nic"];
257
258     if ( isset ( $_GET["nicfile"] ) )
259         $nicfile = $_GET["nicfile"];
260
261     if ( isset ( $_GET["ofmt"] ) )
262         $ofmt = $_GET["ofmt"];
263
264     if ( isset ( $_GET["arch"] ) )
265         $arch = $_GET["arch"];
266
267     $flags = array ();
268     if ( isset ( $F ) && $F != "ignore" && isset ( $arch ) &&
269          ( ( isset ( $nic ) && isset ( $ofmt ) ) || isset ( $nicfile ) ) ) {
270         $vkey = value_key($ofmt);
271
272         reset($flag_table);
273         while ( list ( $key, $props ) = each ( $flag_table ) ) {
274
275             $farch = isset ( $props["arch"] ) ? $props["arch"] : "";
276
277             if ( isset ( $arch ) && ( $farch == "all" || $farch == $arch ) ) {
278
279                 $flag = $props["flag"];
280                 $type = $props["type"];
281                 $value = ( isset ( $props[$vkey] ) ? $props[$vkey] : $props["value"] );
282                 if ( $type != "on/off" || $value == "on" ) {
283                     $flags[$flag] = $value;
284                 }
285             }
286         }
287         $flags = decode_flags_into ( $F, $flags );
288     }
289     return $flags;
290 }
291
292 function get_flags () 
293 {
294     global $flag_table;
295     $flags = default_flags();
296
297     // echo "<p>Flags in get_flags(): </p>";
298     // show_flags($flags);
299
300     reset ( $flag_table );
301     while ( list ( $key, $props ) = each ( $flag_table ) ) {
302
303         $flag = $props["flag"];
304         if ( isset ( $_GET["$flag"] ) ) {
305             $flags[$flag] = $_GET["$flag"];
306         }
307     }
308     return $flags;
309 }
310
311 function echo_flags ( $flags )
312 {
313     global $version;
314     global $flag_table;
315
316     $arch = isset ( $_GET['arch'] ) ? $_GET['arch'] : '';
317
318     echo "<table>\n";
319
320     reset($flag_table);
321     while ( list ( $index, $props ) = each ( $flag_table ) ) {
322
323         $farch = isset ( $props["arch"] ) ? $props["arch"] : "";
324
325         // Hide parameters from users that should not be changed.
326
327         $hide_from_user = isset ( $props["hide_from_user"] ) ? $props["hide_from_user"] : "no";
328
329         $flag = $props["flag"];
330         $type = $props["type"];
331
332         $value = isset ( $flags[$flag] ) ? $flags[$flag] : '';
333
334         if ( $hide_from_user == "yes" ) {
335
336             // Hidden flags cannot not be set by the user.  We use hidden form
337             // fields to keep them at their default values.
338             if ( $type != "header" && ( $farch == "all" || $farch == $arch ) ) {
339                 echo hidden ( $flag, $value );
340             }
341
342         } else {
343
344             if ( $type == "header" || $farch == "all" || $farch == $arch ) {
345       
346                 if ( $type == "header" ) {
347   
348                     $label = $props["label"];
349                     echo "<td colspan=2><hr><h3>$label</h3><hr></td>";
350   
351                 } else if ($type == "on/off" ) {
352   
353                     echo "<td>", checkbox($flag, $value), "</td><td><b>$flag</b></td>";
354   
355                 } else {        // no checkbox
356   
357                     echo "<td>&nbsp;</td><td><b>$flag: </b>";
358   
359                     if ($type == "choice" ) {
360                         $options = $props["options"];
361                         echo menubox($flag, $options, $value);
362                     }
363   
364                     else {
365                         echo textbox($flag, $value, ($type == "integer" ? 5 : 25));
366                     }
367   
368                     echo "</td>";
369   
370                 }
371   
372                 echo "</tr>\n";
373   
374                 if ( $type != "header" ) {
375
376                     echo "<tr><td>&nbsp;</td>";
377                     echo "<td>\n";
378                     include_once "doc/$flag.html";
379                     echo "\n</td></tr>\n";
380
381                 }
382             }
383         }
384     }
385     echo "</table>";
386 }
387
388 function pprint_flag ( $key, $value )
389 {
390     global $flag_table;
391
392     $type = $flag_table[$key]["type"];
393     $s = "";
394
395     if ( $type == "on/off" && $value == "on" ) {
396         $s = "#define $key";
397     } else if ( $type == "on/off" && $value != "on" ) {
398         $s = "#undef $key";
399     } else if ( $type == "string" ) {
400         if ( $value != "" ) $s = ( "#define $key \"" . cleanstring($value) . "\"" );
401     } else if ($type == "qstring" ) {
402         if ( $value != "" ) $s = ( "#define $key \\\"" . cleanstring($value) . "\\\"" );
403     } else {
404         $s = "#define $key " . cleanstring($value);
405     }
406     // print ($s . "<br>" );
407
408     return $s;
409 }
410
411 function pprint_flags ( $flags ) 
412 {
413     $s = "";
414     reset ($flags);
415
416     while (list($key, $value) = each($flags)) {
417         $f = pprint_flag($key, $value);
418         if ($f != "" )
419             $s .= $f . " ";
420     }
421     return $s;
422 }
423
424 function get_cfgsecs ()
425 {
426     global $flag_table;
427     $cfgsecs = array ();
428
429     foreach ( $flag_table as $key => $props ) {
430         if ( isset ( $props['cfgsec'] ) ) {
431             $cfgsec = $props["cfgsec"];
432             $cfgsecs[$cfgsec] = $cfgsec;
433         }
434     }
435     return ( $cfgsecs );
436 }
437
438 function write_config_file ( $fname, $arch, $flags ) 
439 {
440     global $flag_table;
441
442     $cfgsecs = get_cfgsecs ();
443
444     $fp = fopen ( $fname, "wb" );
445     if ( $fp <= 0 ) {
446         die ( "Unable to open $fname file for output!" );
447     }
448
449     foreach ( $cfgsecs as $cfgsec ) {
450
451         fwrite ( $fp, "/* @BEGIN ${cfgsec}.h \n*/ \n\n" );
452
453         foreach ( $flags as $key => $value ) {
454
455             // When the flag matches this section name, write it out
456             if ( $flag_table[$key]["cfgsec"] == $cfgsec ) {
457                 fwrite ( $fp, pprint_flag ( $key, $value ) . "\n" );
458             } 
459
460         }
461         fwrite ( $fp, "\n/* @END ${cfgsec}.h \n*/ \n\n" );
462     }
463     fclose($fp);
464 }
465
466 function cleanstring ($s) 
467 {
468     $len = strlen($s);
469     if ($len > 80) {
470         $s = substr ($s, 0, 80);
471     }
472     $s = trim($s);
473     $pos = 0;
474     $result = "";
475     while($pos < $len) {
476         $ltr = ord( ucfirst( $s[$pos]));
477         if ( ($ltr >= ord( "A" )) && ($ltr <= ord( "Z" )) || 
478              ($ltr >= ord( "0" )) && ($ltr <= ord( "9" )) || 
479              ($ltr == ord( "." )) && (strlen($result) > 0) ||
480              ($ltr == ord( "_" )) ||
481              ($ltr == ord( "+" )) ||
482              ($ltr == ord( ":" )) ||
483              ($ltr == ord( "/" )) ||
484              ($ltr == ord( "-" )) ) {
485             $result .= $s[$pos];
486         }
487         $pos++;
488     }
489     return $result;
490 }
491
492 function copydir ( $src, $dst ) 
493 {
494     if ( !mkdir ( $dst, 0700 ) ) {
495         die ( "mkdir failed" );
496     }
497
498     $dp = opendir ( $src );
499     if ( $dp < 1 ) {
500         die ( "opendir failed" );
501     }
502
503     while ( $file = readdir ( $dp ) ) {
504
505         if ( is_dir ( "$src/$file" ) ) {
506
507             if ($file[0] != "." ) {
508                 copydir ( "$src/$file", "$dst/$file" );
509             }
510         } else {
511
512             copy ( "$src/$file", "$dst/$file" );
513         }
514     }
515     closedir ( $dp );
516 }
517
518 function mktempcopy ( $src, $dst ) 
519 {
520     if ( $src[0] != "/" ) {
521         $src = dirname($_SERVER['SCRIPT_FILENAME']) . "/" . $src;
522     }
523
524     $dir = tempnam ( $dst, "ROM" );
525     unlink( $dir );
526
527     //  copydir ( $src, $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 function deltempdir ($dir) 
538 {
539     $dp = opendir ( $dir );
540     if ($dp < 1) {
541         die ( "opendir failed" );
542     }
543
544     while ( $file = readdir ( $dp ) ) {
545
546         if ( is_dir ( "$dir/$file" ) ) {
547             if ($file[0] != "." ) {
548                 deltempdir ( "$dir/$file" );
549             }
550         } else {
551             unlink( "$dir/$file" );
552         }
553     }
554     closedir ( $dp );
555
556     if ( !rmdir ( "$dir" ) ) {
557         die ( "rmdir failed" );
558     }
559 }
560
561 function debug_info () 
562 {
563     $F = $_GET['F'];
564     $nic = $_GET['nic'];
565     $ofmt = $_GET['ofmt'];
566
567     $s = "F=\"" . htmlentities($F) . "\"<br>\n";
568     $s .= "nic=\"" . htmlentities($nic) . "\"<br>\n";
569     $s .= "ofmt=\"" . htmlentities($ofmt) . "\"<br>\n";
570
571     return $s;
572 }
573
574 function showflags ($flags) 
575 {
576     reset($flags);
577     while (list ($key, $flag) = each ($flags)) {
578         print ( "flag[".$key."]="."\"$flag\""."<br>" );
579     }
580 }
581
582 function dump_flag_table () 
583 {
584     global $flag_table;
585     reset ( $flag_table );
586
587     while ( list ( $key, $props ) = each ( $flag_table ) ) {
588         print ( "flag_table[" . $key . "] = " . "<br>" );
589
590         while ( list ( $key2, $props2 ) = each ( $props ) ) {
591             print ( "&nbsp;&nbsp;&nbsp;" . $key2 . " = " . $props2 . "<br>" );
592         }
593     }
594 }
595
596 function dump_flag_table_keys_sorted () 
597 {
598     global $flag_table;
599     reset ( $flag_table );
600     ksort ( $flag_table );
601
602     while ( list ( $key, $props ) = each ( $flag_table ) ) {
603         print ( $key . ".html<br>" );
604     }
605 }
606
607 function dump_flag_codes () 
608 {
609     global $flag_codes;
610     reset ( $flag_codes );
611
612     while ( list ( $key, $props ) = each ( $flag_codes ) ) {
613         print ( "flag_codes[" . $key . "] = " . "<br>" );
614
615         while ( list ( $key2, $props2 ) = each ( $props ) ) {
616             print ( "&nbsp;&nbsp;&nbsp;" . $key2 . " = " . $props2 . "<br>" );
617         }
618     }
619 }
620
621 function curPageURL () 
622 {
623     $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
624
625     $port = ( isset($_SERVER["SERVER_PORT"] ) && 
626           ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) || 
627             ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
628
629     $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
630
631     $url = ( $isHTTPS ? 'https://' : 'http://' ) .
632         $_SERVER["SERVER_NAME"] . $port . $_SERVER["REQUEST_URI"];
633
634     return $url;
635 }
636
637 function curDirURL () 
638 {
639         $dir = dirname ( $_SERVER['PHP_SELF'] );
640
641         if ( $dir == "." || $dir == "/" ) {
642                 $dir = "";
643         }
644
645         $isHTTPS = ( isset ( $_SERVER["HTTPS"] ) && $_SERVER["HTTPS"] == "on" );
646         $port = ( isset($_SERVER["SERVER_PORT"] ) && 
647                           ( ( !$isHTTPS && $_SERVER["SERVER_PORT"] != "80" ) || 
648                                 ( $isHTTPS  && $_SERVER["SERVER_PORT"] != "443" ) ) );
649
650         $port = ( $port ) ? ':' . $_SERVER["SERVER_PORT"] : '';
651
652         $dest = ( $isHTTPS ? 'https://' : 'http://' ) .
653                 $_SERVER["SERVER_NAME"] . $dir . "/";
654
655         return $dest;
656 }
657
658 // For emacs:
659 // Local variables:
660 //  c-basic-offset: 4
661 //  c-indent-level: 4
662 //  tab-width: 4
663 // End:
664
665 ?>