aboutsummaryrefslogtreecommitdiffstats
path: root/tools/make-sminmpec.pl
diff options
context:
space:
mode:
authorJoão Valverde <joao.valverde@tecnico.ulisboa.pt>2017-06-24 14:25:41 +0100
committerJoão Valverde <j@v6e.pt>2017-06-26 22:40:50 +0000
commit7466880e8a09aa7a9bb797b70fa44bca397881d9 (patch)
tree1634c5d6e433a4803ecd5543a4cb6420e7c886d7 /tools/make-sminmpec.pl
parent3071f9dd7409bd5b0432dd8f1bebbeeee1b6c755 (diff)
Parse enterprise-numbers at run time
"enterprise-numbers" is converted to tab-separated values and renamed "enterprises". Unused fields are stripped. PENs are stored in a hash table loaded at run-time. User "enterprises" file is loaded from the personal config dir. Misc make-sminmpec.pl improvements and fixes. Note: names of type "Entity (formerly ...)" have the formerly part commented out for a cleaner output. Change-Id: I60c533afbe3e399077fbf432088064471ad3e1e2 Reviewed-on: https://code.wireshark.org/review/22246 Petri-Dish: João Valverde <j@v6e.pt> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Peter Wu <peter@lekensteyn.nl> Reviewed-by: João Valverde <j@v6e.pt>
Diffstat (limited to 'tools/make-sminmpec.pl')
-rwxr-xr-xtools/make-sminmpec.pl104
1 files changed, 27 insertions, 77 deletions
diff --git a/tools/make-sminmpec.pl b/tools/make-sminmpec.pl
index 339532f459..a30e717f71 100755
--- a/tools/make-sminmpec.pl
+++ b/tools/make-sminmpec.pl
@@ -1,5 +1,5 @@
#!/usr/bin/perl -w
-# create the sminmpec.c file from
+# create the enterprises file from
# http://www.iana.org/assignments/enterprise-numbers
#
# Wireshark - Network traffic analyzer
@@ -23,9 +23,9 @@
use strict;
use File::Spec;
-my ($vol, $script_dir, $file) = File::Spec->splitpath( __FILE__ );
-my $epan_dir = File::Spec->catpath($vol, $script_dir, '../epan');
-chdir($epan_dir) || die("Can't find $epan_dir");
+my ($vol, $script_dir) = File::Spec->splitpath( __FILE__ );
+my $root_dir = File::Spec->catpath($vol, $script_dir, "..");
+chdir($root_dir) || die("Can't find $root_dir");
my $in = shift;
@@ -54,100 +54,50 @@ if($in =~ m/^http:/i) {
if ($result->code eq 200) {
warn "done fetching $in\n";
@in_lines = split /\n/, $result->content;
- open ENFILE, "> enterprise-numbers";
-
- for (@in_lines) {
- chomp;
- print ENFILE "$_\n";
- }
-
- close ENFILE;
- } elsif ($result->code eq 304) {
- warn "enterprise-numbers was up-to-date\n";
- open IN, "< enterprise-numbers";
- @in_lines = <IN>;
- close IN;
} else {
die "request for $in failed with result code:" . $result->code;
}
-
} else {
open IN, "< $in";
@in_lines = <IN>;
close IN;
}
-
my $body = '';
my $code;
-my $prev_code = -1; ## Assumption: First code in enterprise file is 0;
-
-sub escape_non_ascii {
- my $val = unpack 'C', $_[0];
- return sprintf '\0%.3o',$val;
-}
-
+my $name;
+my $last_updated = "(last updated ???)";
+my $end_of_document = 0;
for(@in_lines) {
- s/[\000-\037]//g;
- s/\\/\\\\/g;
- s/"/\\"/g;
- s/([\x80-\xFF])/escape_non_ascii($1)/ge;
+ chomp;
if (/^(\d+)/) {
- $code = sprintf("%5d", $1);
- } if (/^ (\S.*)/ ) {
- my $name = $1;
- if ($code < $prev_code) {
- print STDERR ("Input 'Codes' not sorted in ascending order (or duplicate codes)): $prev_code $code\n");
- exit 1;
- }
- while ($code > ($prev_code+1)) {
- $prev_code = sprintf("%5d", $prev_code+1);
- $body .= " { $prev_code, sminmpec_unknown }, /* (Added by Wireshark) */\n";
- }
- $prev_code = $code;
- $body .= " { $code, \"$name\" },\n";
- $smi_total++;
+ $code = sprintf("%d", $1);
+ } elsif (/^ ?(\S.*)/ ) { # up to three spaces because of formatting errors in the source
+ $name = $1;
+ next if (/^\s*\(?\s*unassigned/i);
+ $name =~ s/\s+$//;
+ $name =~ s/ \((formerly .*)\)/\t# $1/;
+ $body .= "\n$code\t$name";
+ } elsif (/\(last updated/i) {
+ $last_updated = $_;
+ } elsif (/^ *End of Document/) {
+ $end_of_document = 1;
}
}
-# If this happens check what IANA is serving.
-# XXX We already overwrote enterprise-numbers above.
-if ($smi_total < $smi_total) { die "Too few SMI entries ($smi_total)\n"; }
+die "\"End of Document\" not found. Truncated source file?" unless ($end_of_document);
-open OUT, "> sminmpec.c";
+open OUT, "> enterprises";
print OUT <<"_SMINMPEC";
-/*
- * THIS FILE IS AUTOGENERATED, DO NOT EDIT
- * generated from http://www.iana.org/assignments/enterprise-numbers
- * run "tools/make-sminmpec.pl <infile> <outfile>" to regenerate
- *
- * Note 1: "Gaps" in the iana enterprise-numbers list have been "filled in"
- * with "(Unknown)" as the name so that direct (indexed) access to
- * the list is possible.
- *
- * Note 2: We should probably parse "enterprise-numbers" at program start
- * instead of generating this file.
- */
-#include "config.h"
-
-#include <glib.h>
-
-#include <epan/value_string.h>
-#include <epan/sminmpec.h>
-
-static const gchar sminmpec_unknown[] = "(Unknown)";
-
-const value_string sminmpec_values[] = {
-$body { 0, NULL}
-};
-
-#define array_length(x) (sizeof x / sizeof x[0])
-
-value_string_ext sminmpec_values_ext = VALUE_STRING_EXT_INIT(sminmpec_values);
-
+#
+# generated from http://www.iana.org/assignments/enterprise-numbers
+# run "tools/make-sminmpec.pl [infile]" to regenerate
+#
+# $last_updated
+$body
_SMINMPEC
close OUT;