blob: c4e7471d96e798d579ff421822ad679c656b644c [file] [log] [blame]
package kmod
import (
"errors"
"fmt"
"syscall"
"unsafe"
"golang.org/x/sys/unix"
)
// LoadModule loads a kernel module into the kernel.
func LoadModule(file syscall.Conn, params string, flags uintptr) error {
sc, err := file.SyscallConn()
if err != nil {
return fmt.Errorf("failed getting SyscallConn handle: %w", err)
}
paramsRaw, err := unix.BytePtrFromString(params)
if err != nil {
return errors.New("invalid null byte in params")
}
ctrlErr := sc.Control(func(fd uintptr) {
_, _, err = unix.Syscall(unix.SYS_FINIT_MODULE, fd, uintptr(unsafe.Pointer(paramsRaw)), flags)
})
if ctrlErr != nil {
return fmt.Errorf("unable to get control handle: %w", ctrlErr)
}
if err != unix.Errno(0) {
return err
}
return nil
}
// UnloadModule unloads a kernel module from the kernel.
func UnloadModule(name string, flags uintptr) error {
nameRaw, err := unix.BytePtrFromString(name)
if err != nil {
return errors.New("invalid null byte in name")
}
_, _, err = unix.Syscall(unix.SYS_DELETE_MODULE, uintptr(unsafe.Pointer(nameRaw)), flags, 0)
if err != unix.Errno(0) {
return err
}
return err
}