blob: c4e7471d96e798d579ff421822ad679c656b644c [file] [log] [blame]
Lorenz Brunc7b036b2023-06-01 12:23:57 +02001package kmod
2
3import (
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.
13func 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.
35func 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}