• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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