procfs - MarekBykowski/readme GitHub Wiki

What it provides

/proc/my_bool
echo 1 > /proc/my_bool → set true
echo 0 > /proc/my_bool → set false
cat /proc/my_bool # prints 0 or 1
// my_bool.c
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h>

#define PROC_NAME "my_bool"

static bool my_bool;

/* ---------- read ---------- */
static ssize_t my_bool_read(struct file *file,
                            char __user *buf,
                            size_t count,
                            loff_t *ppos)
{
        char tmp[4];
        int len;

        /* one-shot read */
        if (*ppos != 0)
                return 0;

        len = scnprintf(tmp, sizeof(tmp), "%d\n", my_bool);

        if (copy_to_user(buf, tmp, len))
                return -EFAULT;

        *ppos = len;
        return len;
}

/* ---------- write ---------- */
static ssize_t my_bool_write(struct file *file,
                             const char __user *buf,
                             size_t count,
                             loff_t *ppos)
{
        int val;

        if (kstrtoint_from_user(buf, count, 0, &val))
                return -EINVAL;

        my_bool = !!val;   /* normalize to 0 or 1 */
        return count;
}

/* ---------- file ops ---------- */
static const struct file_operations my_bool_ops = {
        .read   = my_bool_read,
        .write  = my_bool_write,
        .llseek = noop_llseek,
};

/* ---------- module init ---------- */
static int __init my_bool_init(void)
{
        if (!proc_create(PROC_NAME, 0666, NULL, &my_bool_ops))
                return -ENOMEM;

        pr_info("my_bool loaded\n");
        return 0;
}

/* ---------- module exit ---------- */
static void __exit my_bool_exit(void)
{
        remove_proc_entry(PROC_NAME, NULL);
        pr_info("my_bool unloaded\n");
}

module_init(my_bool_init);
module_exit(my_bool_exit);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simplest procfs boolean driver");
MODULE_AUTHOR("you");
obj-m += my_bool.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean