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.
8 # Parse the header files for OpenBSD and generate a Go usable sysctl MIB.
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.
17 if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
18 print STDERR "GOARCH or GOOS not defined in environment\n";
36 uvm/uvm_swap_encrypt.h
67 #debug # Special handling required
69 #machdep # Arch specific
72 #vfs # Special handling required
118 #vfsgenctl # Special handling required
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"
137 "net.inet.ip.ifq" => "net.ifq",
138 "net.inet.pfsync" => "net.pfsync",
139 "net.mpls.ifq" => "net.ifq"
148 print STDERR "$_[0]\n" if $debug;
151 # Walk the MIB and build a sysctl name to OID mapping.
153 my ($node, $name, $oid) = @_;
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}) {
164 $ctlname = $node_map{$nodename};
165 foreach my $part (split /\./, $ctlname) {
166 $node = \%{@{$$node{$part}}[2]};
171 &build_sysctl($node, $nodename, \@nodeoid);
172 } elsif ($node[1] ne '') {
173 $sysctl{$nodename} = \@nodeoid;
178 foreach my $ctl (@ctls) {
183 foreach my $header (@headers) {
184 &debug("Processing $header...");
185 open HEADER, "/usr/include/$header" ||
186 print STDERR "Failed to open $header\n";
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') {
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";
204 $ctlname = "$nodename";
205 $ctlname =~ s/^(fs|net|kern)_/$1\./;
207 if (exists $ctl_map{$ctlname}) {
208 $ctlname = $ctl_map{$ctlname};
210 if (not exists $ctls{$ctlname}) {
211 &debug("Ignoring $ctlname...");
215 # Walk down from the top of the MIB.
217 foreach my $part (split /\./, $ctlname) {
218 if (not exists $$node{$part}) {
219 &debug("Missing node $part");
220 $$node{$part} = [ 0, '', {} ];
222 $node = \%{@{$$node{$part}}[2]};
226 # Populate current node with entries.
228 while (defined($_) && $_ !~ /^}/) {
230 $i++ if $_ =~ /{.*}/;
231 next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/;
232 $$node{$1} = [ $i, $2, {} ];
239 &build_sysctl(\%mib, "", []);
242 // mksysctl_openbsd.pl
243 // MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
245 // +build $ENV{'GOARCH'},$ENV{'GOOS'}
249 type mibentry struct {
254 var sysctlMib = []mibentry {
257 foreach my $name (sort keys %sysctl) {
258 my @oid = @{$sysctl{$name}};
259 print "\t{ \"$name\", []_C_int{ ", join(', ', @oid), " } }, \n";