+++ /dev/null
-#!/usr/bin/perl -w
-#
-# Generate sudo_defs_table and associated defines
-#
-# Input should be formatted thusly:
-#
-# var_name
-# TYPE
-# description (or NULL)
-# array of struct def_values if TYPE == T_TUPLE
-
-# Deal with optional -o (output) argument
-if ($#ARGV > 0 && $ARGV[0] eq "-o") {
- shift;
- $header = $cfile = shift;
- $header .= '.h';
- $cfile .= '.c';
-}
-die "usage: $0 [input_file]\n" unless $#ARGV == -1 || $#ARGV == 0;
-
-$infile = $ARGV[0] || "def_data.in";
-if (!defined($header)) {
- $header = $infile;
- $header =~ s/(\.in)?$/.h/;
-}
-if (!defined($cfile)) {
- $cfile = $infile;
- $cfile =~ s/(\.in)?$/.c/;
-}
-
-open(IN, "<$infile") || die "$0: can't open $infile: $!\n";
-open(HEADER, ">$header") || die "$0: can't open $header: $!\n";
-open(CFILE, ">$cfile") || die "$0: can't open $cfile: $!\n";
-
-$count = 0;
-@tuple_values = ( "never" );
-@records = ();
-while(<IN>) {
- chomp;
- s/\s*#.*$//;
- next if /^\s*$/;
-
- if (/^\S/) {
- # Store previous record and begin new one
- $records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var);
-
- $var = $_;
- $type = '';
- $desc = undef;
- $values = undef;
- $callback = undef;
- $field = 0;
- } else {
- $field++;
- s/^\s+//;
- s/\s+$//;
- if ($field == 1) {
- # type
- $type = $_;
- } elsif ($field == 2) {
- # description
- if ($_ eq "NULL") {
- $desc = "NULL";
- } else {
- # Strip leading and trailing double quote and escape the rest
- s/^"//;
- s/"$//;
- s/"/\\"/g;
- $desc = "\"$_\"";
- }
- } elsif ($field == 3 || $field == 4) {
- if (s/^\*//) {
- $callback = $_;
- } else {
- die "$0: syntax error near line $.\n" if $type !~ /^T_TUPLE/;
- $values = [ split ];
- foreach $v (@$values) {
- push(@tuple_values, $v) unless grep(/^$v$/, @tuple_values);
- }
- }
- } else {
- die "$0: syntax error near line $.\n";
- }
- }
-}
-$records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var);
-
-# Print out value arrays
-for ($i = 0; $i < $count; $i++) {
- if (defined($records[$i]->[3])) {
- die "Values list specified for non-tupple\n" unless
- $records[$i]->[1] =~ /^T_TUPLE/;
- printf CFILE "static struct def_values def_data_%s[] = {\n", $records[$i]->[0];
- foreach (@{$records[$i]->[3]}) {
- print CFILE " { \"$_\", $_ },\n";
- }
- print CFILE " { NULL, 0 },\n";
- print CFILE "};\n\n";
- }
-}
-
-# Print each record
-print CFILE "struct sudo_defs_types sudo_defs_table[] = {\n {\n";
-for ($i = 0; $i < $count; $i++) {
- &print_record($records[$i], $i);
-}
-print CFILE "\tNULL, 0, NULL\n }\n};\n";
-
-# Print out def_tuple
-if (@tuple_values) {
- print HEADER "\nenum def_tupple {\n";
- for ($i = 0; $i <= $#tuple_values; $i++) {
- printf HEADER "\t%s%s\n", $tuple_values[$i],
- $i != $#tuple_values ? "," : "";
- }
- print HEADER "};\n";
-}
-
-close(IN);
-close(HEADER);
-close(CFILE);
-
-sub print_record {
- my ($rec, $recnum) = @_;
- my ($i, $v, $defname);
- # each variable gets a macro to access its value
- for ($rec->[1]) {
- if (/^T_U?INT/) { $v = "ival"; }
- elsif (/^T_STR/) { $v = "str"; }
- elsif (/^T_FLAG/) { $v = "flag"; }
- elsif (/^T_MODE/) { $v = "mode"; }
- elsif (/^T_LIST/) { $v = "list"; }
- elsif (/^T_LOGFAC/) { $v = "ival"; }
- elsif (/^T_LOGPRI/) { $v = "ival"; }
- elsif (/^T_TUPLE/) { $v = "tuple"; }
- elsif (/^T_FLOAT/) { $v = "fval"; }
- else { die "$0: unknown defaults type: $_\n"; }
- }
- printf HEADER "#define %-23s (sudo_defs_table[$recnum].sd_un.${v})\n",
- "def_$rec->[0]";
-
- $defname = "I_" . uc($rec->[0]);
- printf HEADER "#define %-24s%d", $defname, $recnum;
- #print HEADER "\t/* $rec->[2] */" if defined($rec->[2]);
- print HEADER "\n";
-
- print CFILE "\t\"$rec->[0]\", $rec->[1],\n\t$rec->[2],\n";
- if (defined($rec->[3])) {
- printf CFILE "\tdef_data_$rec->[0],\n";
- } else {
- printf CFILE "\tNULL,\n";
- }
- printf CFILE "\t$rec->[4],\n" if defined($rec->[4]);
- print CFILE " }, {\n";
-}