xref: /kernel/linux/common_modules/dec/dec_misc.c (revision 419b0af8)
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
15static 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
32static 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
47static 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
72static int dec_open(struct inode *inode, struct file *filp)
73{
74    pr_info("dec open\n");
75    return 0;
76}
77
78static int dec_release(struct inode *inode, struct file *filp)
79{
80    pr_info("dec close\n");
81    return 0;
82}
83
84static 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
92static struct miscdevice dec_misc = {
93    .minor = MISC_DYNAMIC_MINOR,
94    .name = "dec",
95    .fops = &dec_fops,
96};
97
98static 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
112static void __exit dec_exit(void)
113{
114    misc_deregister(&dec_misc);
115    pr_info("dec exited");
116}
117
118/* module entry points */
119module_init(dec_init);
120module_exit(dec_exit);
121
122MODULE_LICENSE("GPL");
123