1*3873bdc2SAlexander V. Chernikov#!/usr/bin/env python3 2*3873bdc2SAlexander V. Chernikovimport os 3*3873bdc2SAlexander V. Chernikovfrom ctypes import CDLL 4*3873bdc2SAlexander V. Chernikovfrom ctypes import get_errno 5*3873bdc2SAlexander V. Chernikovfrom ctypes.util import find_library 6*3873bdc2SAlexander V. Chernikovfrom typing import List 7*3873bdc2SAlexander V. Chernikovfrom typing import Optional 8*3873bdc2SAlexander V. Chernikov 9*3873bdc2SAlexander V. Chernikovimport pytest 10*3873bdc2SAlexander V. Chernikov 11*3873bdc2SAlexander V. Chernikov 12*3873bdc2SAlexander V. Chernikovclass LibCWrapper(object): 13*3873bdc2SAlexander V. Chernikov def __init__(self): 14*3873bdc2SAlexander V. Chernikov path: Optional[str] = find_library("c") 15*3873bdc2SAlexander V. Chernikov if path is None: 16*3873bdc2SAlexander V. Chernikov raise RuntimeError("libc not found") 17*3873bdc2SAlexander V. Chernikov self._libc = CDLL(path, use_errno=True) 18*3873bdc2SAlexander V. Chernikov 19*3873bdc2SAlexander V. Chernikov def modfind(self, mod_name: str) -> int: 20*3873bdc2SAlexander V. Chernikov if self._libc.modfind(bytes(mod_name, encoding="ascii")) == -1: 21*3873bdc2SAlexander V. Chernikov return get_errno() 22*3873bdc2SAlexander V. Chernikov return 0 23*3873bdc2SAlexander V. Chernikov 24*3873bdc2SAlexander V. Chernikov def jail_attach(self, jid: int) -> int: 25*3873bdc2SAlexander V. Chernikov if self._libc.jail_attach(jid) != 0: 26*3873bdc2SAlexander V. Chernikov return get_errno() 27*3873bdc2SAlexander V. Chernikov return 0 28*3873bdc2SAlexander V. Chernikov 29*3873bdc2SAlexander V. Chernikov 30*3873bdc2SAlexander V. Chernikovlibc = LibCWrapper() 31*3873bdc2SAlexander V. Chernikov 32*3873bdc2SAlexander V. Chernikov 33*3873bdc2SAlexander V. Chernikovclass BaseTest(object): 34*3873bdc2SAlexander V. Chernikov REQUIRED_MODULES: List[str] = [] 35*3873bdc2SAlexander V. Chernikov 36*3873bdc2SAlexander V. Chernikov def _check_modules(self): 37*3873bdc2SAlexander V. Chernikov for mod_name in self.REQUIRED_MODULES: 38*3873bdc2SAlexander V. Chernikov error_code = libc.modfind(mod_name) 39*3873bdc2SAlexander V. Chernikov if error_code != 0: 40*3873bdc2SAlexander V. Chernikov err_str = os.strerror(error_code) 41*3873bdc2SAlexander V. Chernikov pytest.skip( 42*3873bdc2SAlexander V. Chernikov "kernel module '{}' not available: {}".format(mod_name, err_str) 43*3873bdc2SAlexander V. Chernikov ) 44*3873bdc2SAlexander V. Chernikov 45*3873bdc2SAlexander V. Chernikov def check_constraints(self): 46*3873bdc2SAlexander V. Chernikov self._check_modules() 47