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
34require 'getopts.pl';
35
36my $output;
37my $CFILE, $HFILE;
38my $onlybase;
39my $header = 0;
40my $export_file = 0;
41
42Getopts('b:he') || die "foo";
43
44if($opt_b) {
45    $onlybase = $opt_b;
46}
47
48$export_file = 1 if ($opt_e);
49$header = 1 if ($opt_h);
50
51if ($export_file) {
52    printf "# Generated file\n";
53} else {
54    printf "/* Generated file */\n";
55}
56
57if ($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
64my %tables;
65my %types;
66
67while(<>) {
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
134if (!$header && !$export_file) {
135    foreach my $k (keys %types) {
136	print "struct _gss_oid_name_table _gss_ont_" . $k . "[] = {\n";
137	foreach my $m (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
148if ($header) {
149    printf "#endif /* GSSAPI_GSSAPI_OID */\n";
150}
151