Lorenz Brun | c7b036b | 2023-06-01 12:23:57 +0200 | [diff] [blame^] | 1 | package kmod |
| 2 | |
| 3 | import ( |
| 4 | "errors" |
| 5 | "fmt" |
| 6 | "syscall" |
| 7 | "unsafe" |
| 8 | |
| 9 | "golang.org/x/sys/unix" |
| 10 | ) |
| 11 | |
| 12 | // LoadModule loads a kernel module into the kernel. |
| 13 | func LoadModule(file syscall.Conn, params string, flags uintptr) error { |
| 14 | sc, err := file.SyscallConn() |
| 15 | if err != nil { |
| 16 | return fmt.Errorf("failed getting SyscallConn handle: %w", err) |
| 17 | } |
| 18 | paramsRaw, err := unix.BytePtrFromString(params) |
| 19 | if err != nil { |
| 20 | return errors.New("invalid null byte in params") |
| 21 | } |
| 22 | ctrlErr := sc.Control(func(fd uintptr) { |
| 23 | _, _, err = unix.Syscall(unix.SYS_FINIT_MODULE, fd, uintptr(unsafe.Pointer(paramsRaw)), flags) |
| 24 | }) |
| 25 | if ctrlErr != nil { |
| 26 | return fmt.Errorf("unable to get control handle: %w", ctrlErr) |
| 27 | } |
| 28 | if err != unix.Errno(0) { |
| 29 | return err |
| 30 | } |
| 31 | return nil |
| 32 | } |
| 33 | |
| 34 | // UnloadModule unloads a kernel module from the kernel. |
| 35 | func UnloadModule(name string, flags uintptr) error { |
| 36 | nameRaw, err := unix.BytePtrFromString(name) |
| 37 | if err != nil { |
| 38 | return errors.New("invalid null byte in name") |
| 39 | } |
| 40 | _, _, err = unix.Syscall(unix.SYS_DELETE_MODULE, uintptr(unsafe.Pointer(nameRaw)), flags, 0) |
| 41 | if err != unix.Errno(0) { |
| 42 | return err |
| 43 | } |
| 44 | return err |
| 45 | } |