summaryrefslogtreecommitdiff
path: root/source/module/monitor_proc.c
diff options
context:
space:
mode:
authorzy <[email protected]>2023-11-27 22:22:30 -0500
committerzy <[email protected]>2023-11-27 22:22:30 -0500
commit5e650478fb4b8ae27f63f584b1dd5c8597fc142a (patch)
tree7f1e7f4fc15edd971b14c564b99b992d04e9cbb0 /source/module/monitor_proc.c
parentfd459340a717933b5124f686f3c4f2ca0d3f32dc (diff)
/proc work
Diffstat (limited to 'source/module/monitor_proc.c')
-rw-r--r--source/module/monitor_proc.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/source/module/monitor_proc.c b/source/module/monitor_proc.c
new file mode 100644
index 0000000..9ac983b
--- /dev/null
+++ b/source/module/monitor_proc.c
@@ -0,0 +1,87 @@
+#include "monitor_proc.h"
+
+#include <linux/kernel.h>
+#include <linux/proc_fs.h>
+#include <linux/types.h>
+#include <linux/uaccess.h>
+
+char *proc_dir = "variable_monitor";
+int def_interval_ns = DEFAULT_INTERVAL_NS;
+int dump_reset_sec = DEFAULT_DUMP_RESET_SEC;
+
+static ssize_t read_proc(struct file *file, char __user *buf, size_t count,
+ loff_t *offset, int *var) {
+ char temp_buf[32];
+ size_t len = sprintf(temp_buf, "%d\n", *var);
+
+ return simple_read_from_buffer(buf, count, offset, temp_buf, len);
+}
+
+static ssize_t write_proc(struct file *file, const char __user *buf,
+ size_t count, loff_t *offset, int *var) {
+ char temp_buf[32];
+ if (count > sizeof(temp_buf) - 1)
+ return -EINVAL;
+
+ if (copy_from_user(temp_buf, buf, count))
+ return -EFAULT;
+
+ temp_buf[count] = '\0';
+ sscanf(temp_buf, "%d", var);
+
+ return count;
+}
+
+static ssize_t read_proc_def_interval_ns(struct file *file, char __user *buf,
+ size_t count, loff_t *offset) {
+ return read_proc(file, buf, count, offset, &def_interval_ns);
+}
+
+static ssize_t read_proc_dump_reset_sec(struct file *file, char __user *buf,
+ size_t count, loff_t *offset) {
+ return read_proc(file, buf, count, offset, &dump_reset_sec);
+}
+
+static ssize_t write_proc_def_interval_ns(struct file *file,
+ const char __user *buf, size_t count,
+ loff_t *offset) {
+ return write_proc(file, buf, count, offset, &def_interval_ns);
+}
+
+static ssize_t write_proc_dump_reset_sec(struct file *file,
+ const char __user *buf, size_t count,
+ loff_t *offset) {
+ return write_proc(file, buf, count, offset, &dump_reset_sec);
+}
+
+static const struct proc_ops proc_def_interval_ns_ops = {
+ .proc_read = read_proc_def_interval_ns,
+ .proc_write = write_proc_def_interval_ns,
+};
+
+static const struct proc_ops proc_dump_reset_sec_ops = {
+ .proc_read = read_proc_dump_reset_sec,
+ .proc_write = write_proc_dump_reset_sec,
+};
+
+int monitor_proc_init(void) {
+ struct proc_dir_entry *dir;
+
+ dir = proc_mkdir(proc_dir, NULL);
+ if (!dir) {
+ pr_err("variable_monitor: failed to create /proc directory\n");
+ return -ENOMEM;
+ }
+
+ proc_create("def_interval_ns", 0666, dir, &proc_def_interval_ns_ops);
+ proc_create("dump_reset_sec", 0666, dir, &proc_dump_reset_sec_ops);
+
+ return 0;
+}
+
+int monitor_proc_exit(void) {
+ remove_proc_entry("def_interval_ns", NULL);
+ remove_proc_entry("dump_reset_sec", NULL);
+ remove_proc_entry(proc_dir, NULL);
+ return 0;
+} \ No newline at end of file