pkg/ns: evaluate syscall number at compile-time
authorAngus Lees <gus@inodes.org>
Fri, 13 May 2016 07:32:40 +0000 (17:32 +1000)
committerStefan Junker <mail@stefanjunker.de>
Thu, 19 May 2016 10:06:37 +0000 (12:06 +0200)
Previously this code used a run-time map lookup keyed by
runtime.GOOS/GOARCH.  This version uses conditional compilation to make
this choice at compile time, giving immediate feedback for unsupported
platforms.

ns/consts_linux_386.go [new file with mode: 0644]
ns/consts_linux_amd64.go [new file with mode: 0644]
ns/consts_linux_arm.go [new file with mode: 0644]
ns/ns.go

diff --git a/ns/consts_linux_386.go b/ns/consts_linux_386.go
new file mode 100644 (file)
index 0000000..fd6ed8a
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2015 CNI authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package ns
+
+const setNsNr = 346
diff --git a/ns/consts_linux_amd64.go b/ns/consts_linux_amd64.go
new file mode 100644 (file)
index 0000000..a86a68a
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2015 CNI authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package ns
+
+const setNsNr = 308
diff --git a/ns/consts_linux_arm.go b/ns/consts_linux_arm.go
new file mode 100644 (file)
index 0000000..5beaaf3
--- /dev/null
@@ -0,0 +1,17 @@
+// Copyright 2015 CNI authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package ns
+
+const setNsNr = 375
index ea84822..7253399 100644 (file)
--- a/ns/ns.go
+++ b/ns/ns.go
@@ -21,24 +21,9 @@ import (
        "syscall"
 )
 
-var setNsMap = map[string]uintptr{
-       "386":   346,
-       "amd64": 308,
-       "arm":   375,
-}
-
 // SetNS sets the network namespace on a target file.
 func SetNS(f *os.File, flags uintptr) error {
-       if runtime.GOOS != "linux" {
-               return fmt.Errorf("unsupported OS: %s", runtime.GOOS)
-       }
-
-       trap, ok := setNsMap[runtime.GOARCH]
-       if !ok {
-               return fmt.Errorf("unsupported arch: %s", runtime.GOARCH)
-       }
-
-       _, _, err := syscall.RawSyscall(trap, f.Fd(), flags, 0)
+       _, _, err := syscall.RawSyscall(setNsNr, f.Fd(), flags, 0)
        if err != 0 {
                return err
        }