Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Sep 2023 23:12:57 +0200
From:      Rocky Hotas <rockyhotas@post.com>
To:        freebsd-hackers@FreeBSD.org
Subject:   Error while building a kernel module with mkdir(2)
Message-ID:  <trinity-2c27b4d2-a301-466b-941e-2577e4886a49-1695071577376@3c-app-mailcom-lxa16>

next in thread | raw e-mail | index | archive | help
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>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?trinity-2c27b4d2-a301-466b-941e-2577e4886a49-1695071577376>