12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- // Copyright (c) 2016 Arista Networks, Inc.
- // Use of this source code is governed by the Apache License 2.0
- // that can be found in the COPYING file.
- // Package netns provides a utility function that allows a user to
- // perform actions in a different network namespace
- package netns
- import (
- "fmt"
- )
- const (
- netNsRunDir = "/var/run/netns/"
- selfNsFile = "/proc/self/ns/net"
- )
- // Callback is a function that gets called in a given network namespace.
- // The user needs to check any errors from any calls inside this function.
- type Callback func() error
- // File descriptor interface so we can mock for testing
- type handle interface {
- close() error
- fd() int
- }
- // The file descriptor associated with a network namespace
- type nsHandle int
- // setNsByName wraps setNs, allowing specification of the network namespace by name.
- // It returns the file descriptor mapped to the given network namespace.
- func setNsByName(nsName string) error {
- netPath := netNsRunDir + nsName
- handle, err := getNs(netPath)
- if err != nil {
- return fmt.Errorf("Failed to getNs: %s", err)
- }
- err = setNs(handle)
- handle.close()
- if err != nil {
- return fmt.Errorf("Failed to setNs: %s", err)
- }
- return nil
- }
|