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";
37 uvm/uvm_swap_encrypt.h
68 #debug # Special handling required
70 #machdep # Arch specific
73 #vfs # Special handling required
119 #vfsgenctl # Special handling required
124 "ipproto" => "net.inet",
125 "net.inet.ipproto" => "net.inet",
126 "net.inet6.ipv6proto" => "net.inet6",
127 "net.inet6.ipv6" => "net.inet6.ip6",
128 "net.inet.icmpv6" => "net.inet6.icmp6",
129 "net.inet6.divert6" => "net.inet6.divert",
130 "net.inet6.tcp6" => "net.inet.tcp",
131 "net.inet6.udp6" => "net.inet.udp",
132 "mpls" => "net.mpls",
133 "swpenc" => "vm.swapencrypt"
138 "net.inet.ip.ifq" => "net.ifq",
139 "net.inet.pfsync" => "net.pfsync",
140 "net.mpls.ifq" => "net.ifq"
149 print STDERR "$_[0]\n" if $debug;
152 # Walk the MIB and build a sysctl name to OID mapping.
154 my ($node, $name, $oid) = @_;
158 foreach my $key (sort keys %node) {
159 my @node = @{$node{$key}};
160 my $nodename = $name.($name ne '' ? '.' : '').$key;
161 my @nodeoid = (@oid, $node[0]);
162 if ($node[1] eq 'CTLTYPE_NODE') {
163 if (exists $node_map{$nodename}) {
165 $ctlname = $node_map{$nodename};
166 foreach my $part (split /\./, $ctlname) {
167 $node = \%{@{$$node{$part}}[2]};
172 &build_sysctl($node, $nodename, \@nodeoid);
173 } elsif ($node[1] ne '') {
174 $sysctl{$nodename} = \@nodeoid;
179 foreach my $ctl (@ctls) {
184 foreach my $header (@headers) {
185 &debug("Processing $header...");
186 open HEADER, "/usr/include/$header" ||
187 print STDERR "Failed to open $header\n";
189 if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ ||
190 $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ ||
191 $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) {
192 if ($1 eq 'CTL_NAMES') {
197 my $nodename = lc($2);
198 if ($header =~ /^netinet\//) {
199 $ctlname = "net.inet.$nodename";
200 } elsif ($header =~ /^netinet6\//) {
201 $ctlname = "net.inet6.$nodename";
202 } elsif ($header =~ /^net\//) {
203 $ctlname = "net.$nodename";
205 $ctlname = "$nodename";
206 $ctlname =~ s/^(fs|net|kern)_/$1\./;
208 if (exists $ctl_map{$ctlname}) {
209 $ctlname = $ctl_map{$ctlname};
211 if (not exists $ctls{$ctlname}) {
212 &debug("Ignoring $ctlname...");
216 # Walk down from the top of the MIB.
218 foreach my $part (split /\./, $ctlname) {
219 if (not exists $$node{$part}) {
220 &debug("Missing node $part");
221 $$node{$part} = [ 0, '', {} ];
223 $node = \%{@{$$node{$part}}[2]};
227 # Populate current node with entries.
229 while (defined($_) && $_ !~ /^}/) {
231 $i++ if $_ =~ /{.*}/;
232 next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/;
233 $$node{$1} = [ $i, $2, {} ];
240 &build_sysctl(\%mib, "", []);
243 // mksysctl_openbsd.pl
244 // Code generated by the command above; DO NOT EDIT.
246 // +build $ENV{'GOARCH'},$ENV{'GOOS'}
250 type mibentry struct {
255 var sysctlMib = []mibentry {
258 foreach my $name (sort keys %sysctl) {
259 my @oid = @{$sysctl{$name}};
260 print "\t{ \"$name\", []_C_int{ ", join(', ', @oid), " } }, \n";