s4:torture: Adapt KDC canon test to Heimdal upstream changes
[samba.git] / third_party / heimdal / lib / gssapi / 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 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         push(@oidstorage, $store);
116     } elsif (/^desc\s+([\w]+)\s+(\w+)\s+(\"[^\"]*\")\s+(\"[^\"]*\")/) {
117         my ($type, $oid, $short, $long) = ($1, $2, $3, $4);
118         my $object = { type=> $type, oid => $oid, short => $short, long => $long };
119         
120         $tables{$oid} = \$object;
121         $types{$type} = 1;
122     }
123
124 }
125
126 foreach my $k (sort keys %types) {
127     if (!$header) {
128         print "struct _gss_oid_name_table _gss_ont_" . $k . "[] = {\n";
129         foreach my $m (sort {$$a->{oid} cmp $$b->{oid}} values %tables) {
130             if ($$m->{type} eq $k) {
131                 printf "  { %s, \"%s\", %s, %s },\n", $$m->{oid}, $$m->{oid}, $$m->{short}, $$m->{long};
132             }
133         }
134         printf "  { NULL, NULL, NULL, NULL }\n";
135         printf "};\n\n";
136         
137     }
138 }
139
140 if ($header) {
141     printf "#endif /* GSSAPI_GSSAPI_OID */\n";
142 } else {
143     printf "gss_OID _gss_ot_internal[] = {\n";
144     foreach my $k (@oidstorage) {
145         print "  &$k,\n";
146     }
147     printf "};\n\n";
148     printf "size_t _gss_ot_internal_count = sizeof(_gss_ot_internal) / sizeof(_gss_ot_internal[0]);\n";
149 }