]> The Tcpdump Group git mirrors - tcpdump/blobdiff - makemib
Build fat appropriately for Leopard.
[tcpdump] / makemib
diff --git a/makemib b/makemib
index a5771648e7d68e80f1335efb21f355e6bbc00939..b59e2f105a7566a9223c3844a0f7ee577eb50d00 100755 (executable)
--- a/makemib
+++ b/makemib
@@ -1,20 +1,33 @@
 #!/bin/sh
 #
-# Copyright (c) 1990, 1996, by John Robert LoVerso.
-# All rights reserved.
+# Copyright (c) 1990, 1996
+#      John Robert LoVerso. All rights reserved.
+# SMIv2 parsing copyright (c) 1999
+#      William C. Fenner.
 #
-# Redistribution and use in source and binary forms are permitted
-# provided that the above copyright notice and this paragraph are
-# duplicated in all such forms and that any documentation,
-# advertising materials, and other materials related to such
-# distribution and use acknowledge that the software was developed
-# by John Robert LoVerso.
-# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
 #
-# @(#) $Id: makemib,v 1.1 1999-10-07 23:47:10 mcr Exp $ (jlv
-)
+# 1. Redistributions of source code must retain the above copyright
+#    notices, this list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notices, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# @(#) $Id: makemib,v 1.3 2001-09-17 22:16:52 fenner Exp $ (jlv)
 
 #
 # This script will read either ASN.1-style MIB files or the ".defs" files
@@ -42,15 +55,9 @@ cat << EOF
 
 EOF
 
-# use sed to make the ASN.1 easier to parse
-# I should really just use a recursive descent parser in awk, but...
-sed \
-       -e 's/--\*.*\*--//' \
-       -e 's/--.*//' \
-       -e 's/\([{}]\)/ \1 /g' \
-       $@ \
-| gawk '
+awk '
 BEGIN {
+       debug=0;
        # for sanity, we prep the namespace with objects from RFC-1155
        # (we manually establish the root)
        oid["iso"]=1
@@ -59,10 +66,13 @@ BEGIN {
        oidadd("internet", "dod", 1)
        oidadd("directory", "internet", 1)
        oidadd("mgmt", "internet", 2)
-       oidadd("mib", "mgmt", 1)
+#XXX   oidadd("mib", "mgmt", 1)
+       oidadd("mib-2", "mgmt", 1)
        oidadd("experimental", "internet", 3)
        oidadd("private", "internet", 4)
        oidadd("enterprises", "private", 1)
+       oidadd("ip", "mib-2", 4)
+       oidadd("transmission", "mib-2", 10)
 
        holddesc="none"
 }
@@ -72,30 +82,82 @@ BEGIN {
 # its simple and straightforward output.  It would not be too hard to make
 # tcpdump directly read mosy output, but...
 #
+# Ignore these unless the current file is called something.defs; false
+# positives are too common in DESCRIPTIONs.
 
-NF > 1 && index($2,".")>0 {
+NF > 1 && index($2,".")>0 && FILENAME ~ /\.defs/ {
        # currently ignore items of the form "{ iso.3.6.1 }"
-       if (split($2, p, ".") == 2)
+       if (split($2, p, ".") == 2) {
                oidadd($1, p[1], p[2])
+       }
        next
 }
 
 #
-# this next section is simple and naive, but does the job 100%
+# Must be a MIB file
+# Make it easier to parse - used to be done by sed
+{ sub(/--\*.*\*--/, ""); sub(/--.*/, ""); gsub(/[{}]/, " & "); }
+
+#
+# this next section is simple and naive, but does the job ok
 #
 
+# foo OBJECT IDENTIFIER ::= { baz 17 }
+# or
+# foo OBJECT IDENTIFIER ::=
+# { baz 17 }
 $2$3$4 == "OBJECTIDENTIFIER::=" {
        holddesc="none"
        if (NF == 8)
                oidadd($1, $6, $7)
+       if (NF == 4)
+               holddesc=$1
+       next
 }
-$2 == "OBJECT-TYPE" {
+$1 == "{" && holddesc != "none" && NF == 4 {
+       oidadd(holddesc, $2, $3)
+       holddesc="none"
+}
+#
+# foo OBJECT IDENTIFIER
+#  ::= { bar 1 }
+$2$3 == "OBJECTIDENTIFIER" && $1 != "SYNTAX" && NF == 3 {
+       holddesc=$1
+}
+#
+# foo
+# OBJECT IDENTIFIER ::= { bar 1 }
+# a couple of heuristics to exclude single words in e.g. long
+#  DESCRIPTION clauses
+NF == 1 && $1 ~ "[a-z][a-z]*[A-Z]" && $1 !~ /[(){}.,]/ && holddesc == "none" {
+       holddesc=$1
+}
+$1$2$3 == "OBJECTIDENTIFIER::=" && holddesc != "none" {
+       oidadd(holddesc, $5, $6)
+       holddesc="none"
+}
+#
+# "normal" style
+# foo OBJECT-TYPE ...
+# ...
+#   ::= { baz 5 }
+$2 == "MODULE-IDENTITY" || $2 == "MODULE-COMPLIANCE" ||
+       $2 == "OBJECT-IDENTITY" || $2 == "OBJECT-TYPE" ||
+       $2 == "OBJECT-GROUP" ||
+       $2 == "NOTIFICATION-TYPE" || $2 == "NOTIFICATION-GROUP" {
        holddesc=$1
 }
 $1 == "::=" && holddesc != "none" && NF == 5 {
        oidadd(holddesc, $3, $4)
        holddesc="none"
 }
+#
+# foo ::= { baz 17 }
+$2$3 == "::={" {
+       oidadd($1,$4,$5)
+       holddesc="none"
+}
+
 
 # 
 # End of the road - output the data.
@@ -107,6 +169,12 @@ END {
        print "*mibroot = &_iso_obj;"
 }
 
+function inn(file) {
+       if (file == "" || file == "-")
+               return ""
+       return " in " file
+}
+
 #
 # add a new object to the tree
 #
@@ -114,28 +182,36 @@ END {
 #
 
 function oidadd(new, parent, value) {
+       # Ignore 0.0
+       if (parent == "0" && value == 0)
+               return
+       if (debug)
+               print "/* oidadd" inn(FILENAME) ":", new, "in", parent, "as", value, "line", $0, "*/"
        # use safe C identifiers
        gsub(/[-&\/]/,"",new)
        gsub(/[-&\/]/,"",parent)
        # check if parent missing
-       if (oid[parent] == 0) {
-               printf "/* parse problem: no parent for %s.%s(%d) */\n", \
-                       parent, new, value
+       if (oid[parent] == "") {
+               printf "/* parse problem%s: no parent for %s.%s(%d) */\n", \
+                       inn(FILENAME), parent, new, value
                return
        }
        # check if parent.value already exists
        if (oid[new] > 0 && oid[new] != value) {
-               printf "/* parse problem: dup %s.%s(%d) != old (%d) */\n", \
-                       parent, new, value, oid[new]
+               printf "/* parse problem%s: dup %s.%s(%d) != old (%d) */\n", \
+                       inn(FILENAME), parent, new, value, oid[new]
                return
        }
        # check for new name for parent.value
        if (child[parent] != "") {
                for (sib = child[parent]; sib != ""; sib = sibling[sib])
                        if (oid[sib] == value) {
-                               printf "/* parse problem: new name \"%s\"" \
-                                       " for %s.%s(%d) ignored */\n", \
-                                               new, parent, sib, value
+                               if (new != sib)
+                                       printf "/* parse problem%s: new name" \
+                                               " \"%s\"" \
+                                               " for %s.%s(%d) ignored */\n", \
+                                               inn(FILENAME), new, parent, \
+                                               sib, value
                                return
                        }
        }
@@ -169,5 +245,5 @@ function dump(item, c, s) {
        printf "_%s_obj = {\n\t\"%s\", %d, 0,\n\t%s, %s\n},\n", \
                item, item, oid[item], c, s
 }
-'
+' $@
 exit 0