Skip to content

Instantly share code, notes, and snippets.

@ebfe
Created August 25, 2015 16:27
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 ebfe/75ae79a267ab4724c903 to your computer and use it in GitHub Desktop.
Save ebfe/75ae79a267ab4724c903 to your computer and use it in GitHub Desktop.
package main
// +build freebsd,amd64
import (
"C"
"fmt"
"os"
"syscall"
"unsafe"
)
func ioctl(fd, request uintptr, argp unsafe.Pointer) error {
if _, _, e := syscall.Syscall6(syscall.SYS_IOCTL, fd, request, uintptr(argp), 0, 0, 0); e != 0 {
return e
}
return nil
}
type ifrenameArg struct {
name [syscall.IFNAMSIZ]byte
data uintptr
}
func renameInterface(from, to string) error {
s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
if err != nil {
return err
}
defer func() {
syscall.Close(s)
}()
var ifr ifrenameArg
copy(ifr.name[:], []byte(from))
ifr.data = uintptr(unsafe.Pointer(C.CString(to)))
return ioctl(uintptr(s), syscall.SIOCSIFNAME, unsafe.Pointer(&ifr))
}
func main() {
if len(os.Args) < 3 {
fmt.Fprintf(os.Stderr, "%s <from> <to>\n", os.Args[0])
os.Exit(1)
}
if err := renameInterface(os.Args[1], os.Args[2]); err != nil {
fmt.Fprintf(os.Stderr, "ifrename: %s\n", err)
os.Exit(1)
}
os.Exit(0)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment