13873bdc2SAlexander V. Chernikov#!/usr/bin/env python3 23873bdc2SAlexander V. Chernikovimport os 33873bdc2SAlexander V. Chernikovfrom ctypes import CDLL 43873bdc2SAlexander V. Chernikovfrom ctypes import get_errno 53873bdc2SAlexander V. Chernikovfrom ctypes.util import find_library 63873bdc2SAlexander V. Chernikovfrom typing import List 73873bdc2SAlexander V. Chernikovfrom typing import Optional 83873bdc2SAlexander V. Chernikov 93873bdc2SAlexander V. Chernikovimport pytest 103873bdc2SAlexander V. Chernikov 113873bdc2SAlexander V. Chernikov 123873bdc2SAlexander V. Chernikovclass LibCWrapper(object): 133873bdc2SAlexander V. Chernikov def __init__(self): 143873bdc2SAlexander V. Chernikov path: Optional[str] = find_library("c") 153873bdc2SAlexander V. Chernikov if path is None: 163873bdc2SAlexander V. Chernikov raise RuntimeError("libc not found") 173873bdc2SAlexander V. Chernikov self._libc = CDLL(path, use_errno=True) 183873bdc2SAlexander V. Chernikov 193873bdc2SAlexander V. Chernikov def modfind(self, mod_name: str) -> int: 203873bdc2SAlexander V. Chernikov if self._libc.modfind(bytes(mod_name, encoding="ascii")) == -1: 213873bdc2SAlexander V. Chernikov return get_errno() 223873bdc2SAlexander V. Chernikov return 0 233873bdc2SAlexander V. Chernikov 243873bdc2SAlexander V. Chernikov def jail_attach(self, jid: int) -> int: 253873bdc2SAlexander V. Chernikov if self._libc.jail_attach(jid) != 0: 263873bdc2SAlexander V. Chernikov return get_errno() 273873bdc2SAlexander V. Chernikov return 0 283873bdc2SAlexander V. Chernikov 293873bdc2SAlexander V. Chernikov 303873bdc2SAlexander V. Chernikovlibc = LibCWrapper() 313873bdc2SAlexander V. Chernikov 323873bdc2SAlexander V. Chernikov 333873bdc2SAlexander V. Chernikovclass BaseTest(object): 343873bdc2SAlexander V. Chernikov REQUIRED_MODULES: List[str] = [] 353873bdc2SAlexander V. Chernikov 363873bdc2SAlexander V. Chernikov def _check_modules(self): 373873bdc2SAlexander V. Chernikov for mod_name in self.REQUIRED_MODULES: 383873bdc2SAlexander V. Chernikov error_code = libc.modfind(mod_name) 393873bdc2SAlexander V. Chernikov if error_code != 0: 403873bdc2SAlexander V. Chernikov err_str = os.strerror(error_code) 413873bdc2SAlexander V. Chernikov pytest.skip( 423873bdc2SAlexander V. Chernikov "kernel module '{}' not available: {}".format(mod_name, err_str) 433873bdc2SAlexander V. Chernikov ) 443873bdc2SAlexander V. Chernikov 453873bdc2SAlexander V. Chernikov def check_constraints(self): 463873bdc2SAlexander V. Chernikov self._check_modules() 47