Annotation of embedaddon/sudo/plugins/sudoers/mkdefaults, revision 1.1

1.1     ! misho       1: #!/usr/bin/perl -w
        !             2: #
        !             3: # Generate sudo_defs_table and associated defines
        !             4: #
        !             5: # Input should be formatted thusly:
        !             6: #
        !             7: # var_name
        !             8: #      TYPE
        !             9: #      description (or NULL)
        !            10: #      array of struct def_values if TYPE == T_TUPLE
        !            11: 
        !            12: # Deal with optional -o (output) argument
        !            13: if ($#ARGV > 0 && $ARGV[0] eq "-o") {
        !            14:     shift;
        !            15:     $header = $cfile = shift;
        !            16:     $header .= '.h';
        !            17:     $cfile .= '.c';
        !            18: }
        !            19: die "usage: $0 [input_file]\n" unless $#ARGV == -1 || $#ARGV == 0;
        !            20: 
        !            21: $infile = $ARGV[0] || "def_data.in";
        !            22: if (!defined($header)) {
        !            23:     $header = $infile;
        !            24:     $header =~ s/(\.in)?$/.h/;
        !            25: }
        !            26: if (!defined($cfile)) {
        !            27:     $cfile = $infile;
        !            28:     $cfile =~ s/(\.in)?$/.c/;
        !            29: }
        !            30: 
        !            31: open(IN, "<$infile") || die "$0: can't open $infile: $!\n";
        !            32: open(HEADER, ">$header") || die "$0: can't open $header: $!\n";
        !            33: open(CFILE, ">$cfile") || die "$0: can't open $cfile: $!\n";
        !            34: 
        !            35: $count = 0;
        !            36: @tuple_values = ( "never" );
        !            37: @records = ();
        !            38: while(<IN>) {
        !            39:     chomp;
        !            40:     s/\s*#.*$//;
        !            41:     next if /^\s*$/;
        !            42: 
        !            43:     if (/^\S/) {
        !            44:        # Store previous record and begin new one
        !            45:        $records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var);
        !            46: 
        !            47:        $var = $_;
        !            48:        $type = '';
        !            49:        $desc = undef;
        !            50:        $values = undef;
        !            51:        $callback = undef;
        !            52:        $field = 0;
        !            53:     } else {
        !            54:        $field++;
        !            55:        s/^\s+//;
        !            56:        s/\s+$//;
        !            57:        if ($field == 1) {
        !            58:            # type
        !            59:            $type = $_;
        !            60:        } elsif ($field == 2) {
        !            61:            # description
        !            62:            if ($_ eq "NULL") {
        !            63:                $desc = "NULL";
        !            64:            } else {
        !            65:                # Strip leading and trailing double quote and escape the rest
        !            66:                s/^"//;
        !            67:                s/"$//;
        !            68:                s/"/\\"/g;
        !            69:                $desc = "N_(\"$_\")";
        !            70:            }
        !            71:        } elsif ($field == 3 || $field == 4) {
        !            72:            if (s/^\*//) {
        !            73:                $callback = $_;
        !            74:            } else {
        !            75:                die "$0: syntax error near line $.\n" if $type !~ /^T_TUPLE/;
        !            76:                $values = [ split ];
        !            77:                foreach $v (@$values) {
        !            78:                    push(@tuple_values, $v) unless grep(/^$v$/, @tuple_values);
        !            79:                }
        !            80:            }
        !            81:        } else {
        !            82:            die "$0: syntax error near line $.\n";
        !            83:        }
        !            84:     }
        !            85: }
        !            86: $records[$count++] = [$var, $type, $desc, $values, $callback] if defined($var);
        !            87: 
        !            88: # Print out value arrays
        !            89: for ($i = 0; $i < $count; $i++) {
        !            90:     if (defined($records[$i]->[3])) {
        !            91:        die "Values list specified for non-tuple\n" unless
        !            92:            $records[$i]->[1] =~ /^T_TUPLE/;
        !            93:        printf CFILE "static struct def_values def_data_%s[] = {\n", $records[$i]->[0];
        !            94:        foreach (@{$records[$i]->[3]}) {
        !            95:            print CFILE "    { \"$_\", $_ },\n";
        !            96:        }
        !            97:        print CFILE "    { NULL, 0 },\n";
        !            98:        print CFILE "};\n\n";
        !            99:     }
        !           100: }
        !           101: 
        !           102: # Print each record
        !           103: print CFILE "struct sudo_defs_types sudo_defs_table[] = {\n    {\n";
        !           104: for ($i = 0; $i < $count; $i++) {
        !           105:     &print_record($records[$i], $i);
        !           106: }
        !           107: print CFILE "\tNULL, 0, NULL\n    }\n};\n";
        !           108: 
        !           109: # Print out def_tuple
        !           110: if (@tuple_values) {
        !           111:     print HEADER "\nenum def_tuple {\n";
        !           112:     for ($i = 0; $i <= $#tuple_values; $i++) {
        !           113:        printf HEADER "\t%s%s\n", $tuple_values[$i],
        !           114:            $i != $#tuple_values ? "," : "";
        !           115:     }
        !           116:     print HEADER "};\n";
        !           117: }
        !           118: 
        !           119: close(IN);
        !           120: close(HEADER);
        !           121: close(CFILE);
        !           122: 
        !           123: sub print_record {
        !           124:     my ($rec, $recnum) = @_;
        !           125:     my ($i, $v, $defname);
        !           126:     # each variable gets a macro to access its value
        !           127:     for ($rec->[1]) {
        !           128:        if    (/^T_U?INT/)  { $v = "ival"; }
        !           129:        elsif (/^T_STR/)    { $v = "str"; }
        !           130:        elsif (/^T_FLAG/)   { $v = "flag"; }
        !           131:        elsif (/^T_MODE/)   { $v = "mode"; }
        !           132:        elsif (/^T_LIST/)   { $v = "list"; }
        !           133:        elsif (/^T_LOGFAC/) { $v = "ival"; }
        !           134:        elsif (/^T_LOGPRI/) { $v = "ival"; }
        !           135:        elsif (/^T_TUPLE/)  { $v = "tuple"; }
        !           136:        elsif (/^T_FLOAT/)  { $v = "fval"; }
        !           137:        else { die "$0: unknown defaults type: $_\n"; }
        !           138:     }
        !           139:     printf HEADER "#define %-23s (sudo_defs_table[$recnum].sd_un.${v})\n",
        !           140:        "def_$rec->[0]";
        !           141: 
        !           142:     $defname = "I_" . uc($rec->[0]);
        !           143:     printf HEADER "#define %-24s%d", $defname, $recnum;
        !           144:     #print HEADER "\t/* $rec->[2] */" if defined($rec->[2]);
        !           145:     print HEADER "\n";
        !           146: 
        !           147:     print CFILE "\t\"$rec->[0]\", $rec->[1],\n\t$rec->[2],\n";
        !           148:     if (defined($rec->[3])) {
        !           149:        printf CFILE "\tdef_data_$rec->[0],\n";
        !           150:     } else {
        !           151:        printf CFILE "\tNULL,\n";
        !           152:     }
        !           153:     printf CFILE "\t$rec->[4],\n" if defined($rec->[4]);
        !           154:     print CFILE "    }, {\n";
        !           155: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>