1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * Copyright (c) 2024 Huawei Device Co., Ltd.
4 */
5
6 #include <linux/cdev.h>
7 #include <linux/errno.h>
8 #include <linux/miscdevice.h>
9 #include <linux/module.h>
10 #include <linux/slab.h>
11 #include <linux/uaccess.h>
12
13 #include "dec_misc.h"
14
vfs_deal_policy_cmd(unsigned int cmd,void __user * arg)15 static int vfs_deal_policy_cmd(unsigned int cmd, void __user *arg)
16 {
17 pr_info("vfs dec deal policy cmd:%u\n", cmd);
18 int ret = 0;
19 struct dec_policy_info info = { 0 };
20
21 ret = copy_from_user(&info, arg, sizeof(info));
22 if (ret != 0) {
23 pr_err("copy from user failed\n");
24 return -EFAULT;
25 }
26
27 pr_info("tokenid:%lu path_num:%u persist_flag:%d\n", info.tokenid, info.path_num, info.persist_flag);
28
29 return ret;
30 }
31
vfs_destroy_dec_policy(void __user * arg)32 static int vfs_destroy_dec_policy(void __user *arg)
33 {
34 int ret = 0;
35 uint64_t tokenid;
36
37 ret = copy_from_user(&tokenid, arg, sizeof(tokenid));
38 if (ret != 0) {
39 pr_err("destroy dec policy copy from caller failed\n");
40 return -EFAULT;
41 }
42
43 pr_info("destroy dec policy tokenid:%ld\n", tokenid);
44 return 0;
45 }
46
dec_ioctl(struct file * file,unsigned int cmd,unsigned long arg)47 static long dec_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
48 {
49 pr_info("dec ioctl cmd:%u\n", cmd);
50 int ret = 0;
51
52 switch (cmd) {
53 case SET_DEC_POLICY_CMD:
54 case DEL_DEC_POLICY_CMD:
55 case QUERY_DEC_POLICY_CMD:
56 case CHECK_DEC_POLICY_CMD:
57 case CONSTRAINT_DEC_POLICY_CMD:
58 case DENY_DEC_POLICY_CMD:
59 ret = vfs_deal_policy_cmd(cmd, (void __user *)arg);
60 break;
61 case DESTROY_DEC_POLICY_CMD:
62 ret = vfs_destroy_dec_policy((void __user *)arg);
63 break;
64 default:
65 ret = -EINVAL;
66 break;
67 }
68
69 return 0;
70 }
71
dec_open(struct inode * inode,struct file * filp)72 static int dec_open(struct inode *inode, struct file *filp)
73 {
74 pr_info("dec open\n");
75 return 0;
76 }
77
dec_release(struct inode * inode,struct file * filp)78 static int dec_release(struct inode *inode, struct file *filp)
79 {
80 pr_info("dec close\n");
81 return 0;
82 }
83
84 static const struct file_operations dec_fops = {
85 .owner = THIS_MODULE,
86 .open = dec_open,
87 .release = dec_release,
88 .unlocked_ioctl = dec_ioctl,
89 .compat_ioctl = dec_ioctl,
90 };
91
92 static struct miscdevice dec_misc = {
93 .minor = MISC_DYNAMIC_MINOR,
94 .name = "dec",
95 .fops = &dec_fops,
96 };
97
dec_init(void)98 static int __init dec_init(void)
99 {
100 int err = 0;
101
102 err = misc_register(&dec_misc);
103 if (err < 0) {
104 pr_err("dec device init failed\n");
105 return err;
106 }
107
108 pr_err("dec device init success\n");
109 return 0;
110 }
111
dec_exit(void)112 static void __exit dec_exit(void)
113 {
114 misc_deregister(&dec_misc);
115 pr_info("dec exited");
116 }
117
118 /* module entry points */
119 module_init(dec_init);
120 module_exit(dec_exit);
121
122 MODULE_LICENSE("GPL");
123