Home | History | Annotate | Line # | Download | only in gssapi
      1 #!/usr/bin/perl
      2 #
      3 # Copyright (c) 2010 Kungliga Tekniska Hgskolan
      4 # (Royal Institute of Technology, Stockholm, Sweden).
      5 # All rights reserved.
      6 #
      7 # Redistribution and use in source and binary forms, with or without
      8 # modification, are permitted provided that the following conditions
      9 # are met:
     10 #
     11 # 1. Redistributions of source code must retain the above copyright
     12 #    notice, this list of conditions and the following disclaimer.
     13 #
     14 # 2. Redistributions in binary form must reproduce the above copyright
     15 #    notice, this list of conditions and the following disclaimer in the
     16 #    documentation and/or other materials provided with the distribution.
     17 #
     18 # 3. Neither the name of the Institute nor the names of its contributors
     19 #    may be used to endorse or promote products derived from this software
     20 #    without specific prior written permission.
     21 #
     22 # THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
     23 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25 # ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
     26 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32 # SUCH DAMAGE.
     33 
     34 use Getopt::Std;
     35 
     36 my $output;
     37 my $CFILE, $HFILE;
     38 my $onlybase;
     39 my $header = 0;
     40 
     41 getopts('b:h') || die "USAGE: ./gen-oid [-b BASE] [-h HEADER]";
     42 
     43 if($opt_b) {
     44     $onlybase = $opt_b;
     45 }
     46 
     47 $header = 1 if ($opt_h);
     48 
     49 printf "/* Generated file */\n";
     50 if ($header) {
     51     printf "#ifndef GSSAPI_GSSAPI_OID\n";
     52     printf "#define GSSAPI_GSSAPI_OID 1\n\n";
     53 } else {
     54     printf "#include \"mech_locl.h\"\n\n";
     55 }
     56 
     57 my %tables;
     58 my %types;
     59 
     60 while(<>) {
     61 
     62     if (/^\w*#(.*)/) {
     63 	my $comment = $1;
     64 
     65 	if ($header) {
     66 	    printf("$comment\n");
     67 	}
     68 
     69     } elsif (/^oid\s+([\w\.]+)\s+(\w+)\s+([\w\.]+)/) {
     70 	my ($base, $name, $oid) = ($1, $2, $3);
     71 
     72 	next if (defined $onlybase and $onlybase ne $base);
     73 
     74 	my $store = "__" . lc($name) . "_oid_desc";
     75 
     76 	# encode oid
     77 
     78 	my @array = split(/\./, $oid);
     79 	my $length = 0;
     80 	my $data = "";
     81 
     82 	my $num;
     83 
     84 	$n = $#array;
     85 	while ($n > 1) {
     86 	    $num = $array[$n];
     87 
     88 	    my $p = int($num % 128);
     89 	    $data = sprintf("\\x%02x", $p) . $data;
     90 
     91 	    $num = int($num / 128);
     92 
     93 	    $length += 1;
     94 
     95 	    while ($num > 0) {
     96 		$p = int($num % 128) + 128;
     97 		$num = int($num / 128);
     98 		$data = sprintf("\\x%02x", $p) . $data;
     99 		$length += 1;
    100 	    }
    101 	    $n--;
    102 	}
    103 	$num = int($array[0] * 40 + $array[1]);
    104 
    105 	$data = sprintf("\\x%x", $num) . $data;
    106 	$length += 1;
    107 
    108 	if ($header) {
    109 	    printf "extern GSSAPI_LIB_VARIABLE gss_OID_desc $store;\n";
    110 	    printf "#define $name (&$store)\n\n";
    111 	} else {
    112 	    printf "/* $name - $oid */\n";
    113 	    printf "gss_OID_desc GSSAPI_LIB_VARIABLE $store = { $length, rk_UNCONST(\"$data\") };\n\n";
    114 	}
    115     } elsif (/^desc\s+([\w]+)\s+(\w+)\s+(\"[^\"]*\")\s+(\"[^\"]*\")/) {
    116         my ($type, $oid, $short, $long) = ($1, $2, $3, $4);
    117 	my $object = { type=> $type, oid => $oid, short => $short, long => $long };
    118 	
    119 	$tables{$oid} = \$object;
    120 	$types{$type} = 1;
    121     }
    122 
    123 }
    124 
    125 foreach my $k (sort keys %types) {
    126     if (!$header) {
    127 	print "struct _gss_oid_name_table _gss_ont_" . $k . "[] = {\n";
    128 	foreach my $m (sort {$$a->{oid} cmp $$b->{oid}} values %tables) {
    129 	    if ($$m->{type} eq $k) {
    130 		printf "  { %s, \"%s\", %s, %s },\n", $$m->{oid}, $$m->{oid}, $$m->{short}, $$m->{long};
    131 	    }
    132 	}
    133 	printf "  { NULL, NULL, NULL, NULL }\n";
    134 	printf "};\n\n";
    135 	
    136     }
    137 }
    138 
    139 if ($header) {
    140     printf "#endif /* GSSAPI_GSSAPI_OID */\n";
    141 }
    142