Welcome to the Linux Foundation Forum!

programming a module

antonellocaroli
antonellocaroli Posts: 1
edited June 2023 in Kernel Development

Hi,

i am trying experimentally to program a kernel module that checks a file on the system, namely in /etc.

If I compile the module dynamically, the code works. But if I compile it statically it doesn't work, it doesn't find the file in /etc

the code goes something like this:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>

MODULE_AUTHOR("my name");
MODULE_DESCRIPTION("file check");
MODULE_LICENSE("GPL");

static int isRegistered(void) {
    struct file *file;
    char buffer[16];
    int registered = 0;

    // Apre il file di configurazione
    file = filp_open("/etc/testfile", O_RDONLY, 0);
    if (IS_ERR(file)) {
        // open error
        return registered;
    }

    // Reads the contents of the file
    if (file->f_op->read(file, buffer, sizeof(buffer), &file->f_pos) > 0) {
        if (strncmp(buffer, "registered", 10) == 0) {
            registered = 1;
        }
    }

    // Closes the file
    filp_close(file, NULL);

    return registered;
}

int check_registration(void) {
    if (!isRegistered()) {
        printk(KERN_ALERT "Not check.\n");
        return -1;
    }

    printk(KERN_INFO "check.\n");
    return 0;
}
EXPORT_SYMBOL_GPL(check_registration);

static int __init registration_check_init(void) {
    /* Does not execute control logic here */
    return 0;
}

static void __exit registration_check_exit(void) {
    printk(KERN_INFO "Registration control form terminated.\n");
}

module_init(registration_check_init);
module_exit(registration_check_exit);

/* Performs control logic */
late_initcall(check_registration);

Answers

  • nieknooijens
    nieknooijens Posts: 2
    edited August 2023

    What do you mean build statically? cause to my knowledge you either build it as a .ko file (dynamically) for insertion later, or you literally bake it into the kernel (statically) in which you need to add it to the kernel source code tree, add kconfig files, select it and rebuild the entire linux kernel.

  • Well, I think there are some minor issues with your code, you can try below code it may resolve your error.

    include <linux/module.h>

    include <linux/kernel.h>

    include <linux/init.h>

    include <linux/fs.h>

    include <linux/uaccess.h>

    MODULE_AUTHOR("my name");
    MODULE_DESCRIPTION("file check");
    MODULE_LICENSE("GPL");

    static int isRegistered(void) {
    // Your existing code for checking the file
    }

    static void check_registration_callback(void) {
    if (!isRegistered()) {
    printk(KERN_ALERT "Not registered.\n");
    } else {
    printk(KERN_INFO "Registered.\n");
    }
    }

    int check_registration(void) {
    return 0;
    }
    EXPORT_SYMBOL_GPL(check_registration);

    static int __init registration_check_init(void) {
    /* Register your callback here */
    on_each_cpu(check_registration_callback, NULL, 1);
    return 0;
    }

    static void __exit registration_check_exit(void) {
    printk(KERN_INFO "Registration control form terminated.\n");
    }

    module_init(registration_check_init);
    module_exit(registration_check_exit);

    Thanks

Categories

Upcoming Training