Error while building a kernel module with mkdir(2)
Date: Mon, 18 Sep 2023 21:12:57 UTC
Hello! I hope this is the right ML to discuss about this issue. I am trying to build the example kernel module presented in paragraph 2.1 of Designing BSD Rootkits: An Introduction to Kernel Hacking by Joseph Kong However, I get this error: mkdir_hook.c:42:9: error: implicit declaration of function 'mkdir' is invalid in C99 [-Werror,-Wimplicit-function-declaration] return(mkdir(td, syscall_args)); ^ mkdir_hook.c:57:45: error: use of undeclared identifier 'mkdir' sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir; mkdir(2) requires `#include <sys/stat.h>' and I added it (while it was not in the code from the book), but nothing changes. What's still wrong? After this text, I paste the code and the Makefile (written following https://docs.freebsd.org/en/books/arch-handbook/driverbasics/). Bye! Rocky === code: mkdir_hook.c === #include <sys/types.h> #include <sys/param.h> /* defines used in kernel.h */ #include <sys/proc.h> #include <sys/module.h> #include <sys/sysent.h> #include <sys/kernel.h> /* types used in module initialization */ #include <sys/systm.h> /* uprintf */ #include <sys/syscall.h> #include <sys/sysproto.h> #include <sys/stat.h> /* mkdir(2) */ /* mkdir system call hook. */ static int mkdir_hook(struct thread *td, void *syscall_args) { struct mkdir_args /* { char *path; int mode; } */ *uap; uap = (struct mkdir_args *)syscall_args; char path[255]; size_t done; int error; error = copyinstr(uap->path, path, 255, &done); if (error != 0) return(error); /* Print a debug message. */ uprintf("The directory \"%s\" will be created with the following" " permissions: %o\n", path, uap->mode); return(mkdir(td, syscall_args)); } /* The function called at load/unload. */ static int load(struct module *module, int cmd, void *arg) { int error = 0; switch (cmd) { case MOD_LOAD: /* Replace mkdir with mkdir_hook. */ sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir_hook; break; case MOD_UNLOAD: /* Change everything back to normal. */ sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir; break; default: error = EOPNOTSUPP; break; } return(error); } static moduledata_t mkdir_hook_mod = { "mkdir_hook", /* module name */ load, /* event handler */ NULL /* extra data */ }; DECLARE_MODULE(mkdir_hook, mkdir_hook_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE); === Makefile === KMOD=mkdir_hook SRCS=mkdir_hook.c .include <bsd.kmod.mk>