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