/ lib / gssapi / gen-oid.pl
gen-oid.pl
  1  #!/usr/bin/perl
  2  #
  3  # Copyright (c) 2010 Kungliga Tekniska Högskolan
  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  require 'getopts.pl';
 35  
 36  my $output;
 37  my $CFILE, $HFILE;
 38  my $onlybase;
 39  my $header = 0;
 40  my $export_file = 0;
 41  
 42  Getopts('b:he') || die "foo";
 43  
 44  if($opt_b) {
 45      $onlybase = $opt_b;
 46  }
 47  
 48  $export_file = 1 if ($opt_e);
 49  $header = 1 if ($opt_h);
 50  
 51  if ($export_file) {
 52      printf "# Generated file\n";
 53  } else {
 54      printf "/* Generated file */\n";
 55  }
 56  
 57  if ($header) {
 58      printf "#ifndef GSSAPI_GSSAPI_OID\n";
 59      printf "#define GSSAPI_GSSAPI_OID 1\n\n";
 60  } elsif (!$export_file) {
 61      printf "#include \"mech_locl.h\"\n\n";
 62  }
 63  
 64  my %tables;
 65  my %types;
 66  
 67  while(<>) {
 68  
 69      if (/^\w*#(.*)/) {
 70  	my $comment = $1;
 71  
 72  	if ($header) {
 73  	    printf("$comment\n");
 74  	}
 75  
 76      } elsif (/^oid\s+([\w\.]+)\s+(\w+)\s+([\w\.]+)/) {
 77  	my ($base, $name, $oid) = ($1, $2, $3);
 78  
 79  	next if (defined $onlybase and $onlybase ne $base);
 80  
 81  	my $store = "__" . lc($name) . "_oid_desc";
 82  
 83  	# encode oid
 84  
 85  	my @array = split(/\./, $oid);
 86  	my $length = 0;
 87  	my $data = "";
 88  
 89  	my $num;
 90  
 91  	$n = $#array;
 92  	while ($n > 1) {
 93  	    $num = $array[$n];
 94  
 95  	    my $p = int($num % 128);
 96  	    $data = sprintf("\\x%02x", $p) . $data;
 97  
 98  	    $num = int($num / 128);
 99  
100  	    $length += 1;
101  
102  	    while ($num > 0) {
103  		$p = int($num % 128) + 128;
104  		$num = int($num / 128);
105  		$data = sprintf("\\x%02x", $p) . $data;
106  		$length += 1;
107  	    }
108  	    $n--;
109  	}
110  	$num = int($array[0] * 40 + $array[1]);
111  
112  	$data = sprintf("\\x%x", $num) . $data;
113  	$length += 1;
114  
115  	if ($export_file) {
116  	    printf "&$store\n";
117  	} elsif ($header) {
118  	    printf "extern GSSAPI_LIB_VARIABLE gss_OID_desc $store;\n";
119  	    printf "#define $name (&$store)\n\n";
120  	} else {
121  	    printf "/* $name - $oid */\n";
122  	    printf "gss_OID_desc GSSAPI_LIB_VARIABLE $store = { $length, rk_UNCONST(\"$data\") };\n\n";
123  	}
124      } elsif (/^desc\s+([\w]+)\s+(\w+)\s+(\"[^\"]*\")\s+(\"[^\"]*\")/) {
125          my ($type, $oid, $short, $long) = ($1, $2, $3, $4);
126  	my $object = { type=> $type, oid => $oid, short => $short, long => $long };
127  	
128  	$tables{$oid} = \$object;
129  	$types{$type} = 1;
130      }
131  
132  }
133  
134  if (!$header && !$export_file) {
135      foreach my $k (sort keys %types) {
136  	print "struct _gss_oid_name_table _gss_ont_" . $k . "[] = {\n";
137  	foreach my $m (sort values %tables) {
138  	    if ($$m->{type} eq $k) {
139  		printf "  { %s, \"%s\", %s, %s },\n", $$m->{oid}, $$m->{oid}, $$m->{short}, $$m->{long};
140  	    }
141  	}
142  	printf "  { NULL }\n";
143  	printf "};\n\n";
144  	
145      }
146  }
147  
148  if ($header) {
149      printf "#endif /* GSSAPI_GSSAPI_OID */\n";
150  }