//@ts-check //@ts-expect-error const { syscall } = require('./syscall.node') const { close, open, modes } = require('./cfiles.js') const errno = require('./errno') const fs = require('fs') const path = require('path') // TBD const SYSCALL_INIT_MODULE = 105 const SYSCALL_FINIT_MODULE = 273 const doProcExists = () => fs.existsSync('/proc') /** * * @param {string} path * @param {string} params * @param {number} flags * @deprecated un tested dangerous */ function finit_module(path, params = "", flags = 0) { const fileDescriptor = open(path, modes.O_RDONLY) const result = syscall(SYSCALL_FINIT_MODULE, fileDescriptor, params, flags) if(result > 0) { throw new Error(errno[result]) } else { if(result == -1) { throw new Error('non number or string argument recived') }else if(result == -2) { throw new Error('unsuported argument length (1-5)') } } } function uname() { if(!doProcExists) { throw "Proc don't exists exception" } const linuxVersionString = fs.readFileSync('/proc/version').toString() return linuxVersionString.split(' ')[2] } /** * @param {string} modulename */ function modprobe(modulename) { const name = uname() if(fs.existsSync(path.join('/lib/modules', name, 'kernel', modulename))) { finit_module(path.join('/lib/modules', name, 'kernel', modulename)) } else { throw new Error("file not found " + path.join('/lib/modules', name, 'kernel', modulename)) } } function lsmod() { if(!doProcExists) { throw "Proc don't exists exception" } return fs.readFileSync('/proc/modules').toString('utf-8').split('\n') } module.exports = { modprobe, uname, finit_module, doProcExists, lsmod }