1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * The USB Monitor, inspired by Dave Harding's USBMon. |
4 | * |
5 | * This is the 's' or 'stat' reader which debugs usbmon itself. |
6 | * Note that this code blows through locks, so make sure that |
7 | * /dbg/usbmon/0s is well protected from non-root users. |
8 | * |
9 | */ |
10 | |
11 | #include <linux/kernel.h> |
12 | #include <linux/slab.h> |
13 | #include <linux/export.h> |
14 | #include <linux/usb.h> |
15 | #include <linux/fs.h> |
16 | #include <linux/uaccess.h> |
17 | |
18 | #include "usb_mon.h" |
19 | |
20 | #define STAT_BUF_SIZE 80 |
21 | |
22 | struct snap { |
23 | int slen; |
24 | char str[STAT_BUF_SIZE]; |
25 | }; |
26 | |
27 | static int mon_stat_open(struct inode *inode, struct file *file) |
28 | { |
29 | struct mon_bus *mbus; |
30 | struct snap *sp; |
31 | |
32 | sp = kmalloc(size: sizeof(struct snap), GFP_KERNEL); |
33 | if (sp == NULL) |
34 | return -ENOMEM; |
35 | |
36 | mbus = inode->i_private; |
37 | |
38 | sp->slen = snprintf(buf: sp->str, STAT_BUF_SIZE, |
39 | fmt: "nreaders %d events %u text_lost %u\n" , |
40 | mbus->nreaders, mbus->cnt_events, mbus->cnt_text_lost); |
41 | |
42 | file->private_data = sp; |
43 | return 0; |
44 | } |
45 | |
46 | static ssize_t mon_stat_read(struct file *file, char __user *buf, |
47 | size_t nbytes, loff_t *ppos) |
48 | { |
49 | struct snap *sp = file->private_data; |
50 | |
51 | return simple_read_from_buffer(to: buf, count: nbytes, ppos, from: sp->str, available: sp->slen); |
52 | } |
53 | |
54 | static int mon_stat_release(struct inode *inode, struct file *file) |
55 | { |
56 | struct snap *sp = file->private_data; |
57 | file->private_data = NULL; |
58 | kfree(objp: sp); |
59 | return 0; |
60 | } |
61 | |
62 | const struct file_operations mon_fops_stat = { |
63 | .owner = THIS_MODULE, |
64 | .open = mon_stat_open, |
65 | .llseek = no_llseek, |
66 | .read = mon_stat_read, |
67 | /* .write = mon_stat_write, */ |
68 | /* .poll = mon_stat_poll, */ |
69 | /* .unlocked_ioctl = mon_stat_ioctl, */ |
70 | .release = mon_stat_release, |
71 | }; |
72 | |