github.com/mfpierre/corectl@v0.5.6/Godeps/_workspace/src/golang.org/x/sys/unix/mksysctl_openbsd.pl (about)

     1  #!/usr/bin/env perl
     2  
     3  # Copyright 2011 The Go Authors. All rights reserved.
     4  # Use of this source code is governed by a BSD-style
     5  # license that can be found in the LICENSE file.
     6  
     7  #
     8  # Parse the header files for OpenBSD and generate a Go usable sysctl MIB.
     9  #
    10  # Build a MIB with each entry being an array containing the level, type and
    11  # a hash that will contain additional entries if the current entry is a node.
    12  # We then walk this MIB and create a flattened sysctl name to OID hash.
    13  #
    14  
    15  use strict;
    16  
    17  if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
    18  	print STDERR "GOARCH or GOOS not defined in environment\n";
    19  	exit 1;
    20  }
    21  
    22  my $debug = 0;
    23  my %ctls = ();
    24  
    25  my @headers = qw (
    26  	sys/sysctl.h
    27  	sys/socket.h
    28  	sys/tty.h
    29  	sys/malloc.h
    30  	sys/mount.h
    31  	sys/namei.h
    32  	sys/sem.h
    33  	sys/shm.h
    34  	sys/vmmeter.h
    35  	uvm/uvm_param.h
    36  	uvm/uvm_swap_encrypt.h
    37  	ddb/db_var.h
    38  	net/if.h
    39  	net/if_pfsync.h
    40  	net/pipex.h
    41  	netinet/in.h
    42  	netinet/icmp_var.h
    43  	netinet/igmp_var.h
    44  	netinet/ip_ah.h
    45  	netinet/ip_carp.h
    46  	netinet/ip_divert.h
    47  	netinet/ip_esp.h
    48  	netinet/ip_ether.h
    49  	netinet/ip_gre.h
    50  	netinet/ip_ipcomp.h
    51  	netinet/ip_ipip.h
    52  	netinet/pim_var.h
    53  	netinet/tcp_var.h
    54  	netinet/udp_var.h
    55  	netinet6/in6.h
    56  	netinet6/ip6_divert.h
    57  	netinet6/pim6_var.h
    58  	netinet/icmp6.h
    59  	netmpls/mpls.h
    60  );
    61  
    62  my @ctls = qw (
    63  	kern
    64  	vm
    65  	fs
    66  	net
    67  	#debug				# Special handling required
    68  	hw
    69  	#machdep			# Arch specific
    70  	user
    71  	ddb
    72  	#vfs				# Special handling required
    73  	fs.posix
    74  	kern.forkstat
    75  	kern.intrcnt
    76  	kern.malloc
    77  	kern.nchstats
    78  	kern.seminfo
    79  	kern.shminfo
    80  	kern.timecounter
    81  	kern.tty
    82  	kern.watchdog
    83  	net.bpf
    84  	net.ifq
    85  	net.inet
    86  	net.inet.ah
    87  	net.inet.carp
    88  	net.inet.divert
    89  	net.inet.esp
    90  	net.inet.etherip
    91  	net.inet.gre
    92  	net.inet.icmp
    93  	net.inet.igmp
    94  	net.inet.ip
    95  	net.inet.ip.ifq
    96  	net.inet.ipcomp
    97  	net.inet.ipip
    98  	net.inet.mobileip
    99  	net.inet.pfsync
   100  	net.inet.pim
   101  	net.inet.tcp
   102  	net.inet.udp
   103  	net.inet6
   104  	net.inet6.divert
   105  	net.inet6.ip6
   106  	net.inet6.icmp6
   107  	net.inet6.pim6
   108  	net.inet6.tcp6
   109  	net.inet6.udp6
   110  	net.mpls
   111  	net.mpls.ifq
   112  	net.key
   113  	net.pflow
   114  	net.pfsync
   115  	net.pipex
   116  	net.rt
   117  	vm.swapencrypt
   118  	#vfsgenctl			# Special handling required
   119  );
   120  
   121  # Node name "fixups"
   122  my %ctl_map = (
   123  	"ipproto" => "net.inet",
   124  	"net.inet.ipproto" => "net.inet",
   125  	"net.inet6.ipv6proto" => "net.inet6",
   126  	"net.inet6.ipv6" => "net.inet6.ip6",
   127  	"net.inet.icmpv6" => "net.inet6.icmp6",
   128  	"net.inet6.divert6" => "net.inet6.divert",
   129  	"net.inet6.tcp6" => "net.inet.tcp",
   130  	"net.inet6.udp6" => "net.inet.udp",
   131  	"mpls" => "net.mpls",
   132  	"swpenc" => "vm.swapencrypt"
   133  );
   134  
   135  # Node mappings
   136  my %node_map = (
   137  	"net.inet.ip.ifq" => "net.ifq",
   138  	"net.inet.pfsync" => "net.pfsync",
   139  	"net.mpls.ifq" => "net.ifq"
   140  );
   141  
   142  my $ctlname;
   143  my %mib = ();
   144  my %sysctl = ();
   145  my $node;
   146  
   147  sub debug() {
   148  	print STDERR "$_[0]\n" if $debug;
   149  }
   150  
   151  # Walk the MIB and build a sysctl name to OID mapping.
   152  sub build_sysctl() {
   153  	my ($node, $name, $oid) = @_;
   154  	my %node = %{$node};
   155  	my @oid = @{$oid};
   156  
   157  	foreach my $key (sort keys %node) {
   158  		my @node = @{$node{$key}};
   159  		my $nodename = $name.($name ne '' ? '.' : '').$key;
   160  		my @nodeoid = (@oid, $node[0]);
   161  		if ($node[1] eq 'CTLTYPE_NODE') {
   162  			if (exists $node_map{$nodename}) {
   163  				$node = \%mib;
   164  				$ctlname = $node_map{$nodename};
   165  				foreach my $part (split /\./, $ctlname) {
   166  					$node = \%{@{$$node{$part}}[2]};
   167  				}
   168  			} else {
   169  				$node = $node[2];
   170  			}
   171  			&build_sysctl($node, $nodename, \@nodeoid);
   172  		} elsif ($node[1] ne '') {
   173  			$sysctl{$nodename} = \@nodeoid;
   174  		}
   175  	}
   176  }
   177  
   178  foreach my $ctl (@ctls) {
   179  	$ctls{$ctl} = $ctl;
   180  }
   181  
   182  # Build MIB
   183  foreach my $header (@headers) {
   184  	&debug("Processing $header...");
   185  	open HEADER, "/usr/include/$header" ||
   186  	    print STDERR "Failed to open $header\n";
   187  	while (<HEADER>) {
   188  		if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ ||
   189  		    $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ ||
   190  		    $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) {
   191  			if ($1 eq 'CTL_NAMES') {
   192  				# Top level.
   193  				$node = \%mib;
   194  			} else {
   195  				# Node.
   196  				my $nodename = lc($2);
   197  				if ($header =~ /^netinet\//) {
   198  					$ctlname = "net.inet.$nodename";
   199  				} elsif ($header =~ /^netinet6\//) {
   200  					$ctlname = "net.inet6.$nodename";
   201  				} elsif ($header =~ /^net\//) {
   202  					$ctlname = "net.$nodename";
   203  				} else {
   204  					$ctlname = "$nodename";
   205  					$ctlname =~ s/^(fs|net|kern)_/$1\./;
   206  				}
   207  				if (exists $ctl_map{$ctlname}) {
   208  					$ctlname = $ctl_map{$ctlname};
   209  				}
   210  				if (not exists $ctls{$ctlname}) {
   211  					&debug("Ignoring $ctlname...");
   212  					next;
   213  				}
   214  
   215  				# Walk down from the top of the MIB.
   216  				$node = \%mib;
   217  				foreach my $part (split /\./, $ctlname) {
   218  					if (not exists $$node{$part}) {
   219  						&debug("Missing node $part");
   220  						$$node{$part} = [ 0, '', {} ];
   221  					}
   222  					$node = \%{@{$$node{$part}}[2]};
   223  				}
   224  			}
   225  
   226  			# Populate current node with entries.
   227  			my $i = -1;
   228  			while (defined($_) && $_ !~ /^}/) {
   229  				$_ = <HEADER>;
   230  				$i++ if $_ =~ /{.*}/;
   231  				next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/;
   232  				$$node{$1} = [ $i, $2, {} ];
   233  			}
   234  		}
   235  	}
   236  	close HEADER;
   237  }
   238  
   239  &build_sysctl(\%mib, "", []);
   240  
   241  print <<EOF;
   242  // mksysctl_openbsd.pl
   243  // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
   244  
   245  // +build $ENV{'GOARCH'},$ENV{'GOOS'}
   246  
   247  package unix;
   248  
   249  type mibentry struct {
   250  	ctlname string
   251  	ctloid []_C_int
   252  }
   253  
   254  var sysctlMib = []mibentry {
   255  EOF
   256  
   257  foreach my $name (sort keys %sysctl) {
   258  	my @oid = @{$sysctl{$name}};
   259  	print "\t{ \"$name\", []_C_int{ ", join(', ', @oid), " } }, \n";
   260  }
   261  
   262  print <<EOF;
   263  }
   264  EOF