Skip to content

Instantly share code, notes, and snippets.

@tianon
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tianon/8907176 to your computer and use it in GitHub Desktop.
Save tianon/8907176 to your computer and use it in GitHub Desktop.
SIOCSIFNAME in Go instead of C
package netlink
// #include <net/if.h>
import "C"
import (
"syscall"
"unsafe"
)
func getIfSocket() (int, error) {
fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
if err == nil {
return fd, err
}
sErr := err
fd, err = syscall.Socket(syscall.AF_PACKET, syscall.SOCK_DGRAM, 0)
if err == nil {
return fd, err
}
fd, err = syscall.Socket(syscall.AF_INET6, syscall.SOCK_DGRAM, 0)
if err == nil {
return fd, err
}
return -1, sErr
}
func NetworkChangeName(oldName, newName string) error {
fd, err := getIfSocket()
if err != nil {
return err
}
defer syscall.Close(fd)
data := [C.IFNAMSIZ * 2]byte{}
copy(data[:C.IFNAMSIZ-1], oldName)
copy(data[C.IFNAMSIZ:C.IFNAMSIZ*2-1], newName)
_, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), syscall.SIOCSIFNAME, uintptr(unsafe.Pointer(&data[0])))
if errno != 0 {
return errno
}
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment