1 /****************************************************************************
2  * fs/driver/fs_unregisterdriver.c
3  *
4  * Copyright (c) 2023 Huawei Device Co., Ltd. All rights reserved.
5  * Based on NuttX originally from nuttx source (nuttx/fs/ and nuttx/drivers/)
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ****************************************************************************/
20 
21 /****************************************************************************
22  * Included Files
23  ****************************************************************************/
24 
25 #include "vfs_config.h"
26 #include "fs/driver.h"
27 #include "vnode.h"
28 #include "string.h"
29 #include "errno.h"
30 
31 /****************************************************************************
32  * Public Functions
33  ****************************************************************************/
34 
35 /****************************************************************************
36  * Name: unregister_driver
37  *
38  * Description:
39  *   Remove the character driver vnode at 'path' from the pseudo-file system
40  *
41  ****************************************************************************/
42 
unregister_driver(const char *path)43 int unregister_driver(const char *path)
44 {
45   struct Vnode *vnode = NULL;
46   int ret;
47   if (path == NULL)
48     {
49       return -EINVAL;
50     }
51   VnodeHold();
52   ret = VnodeLookup(path, &vnode, V_DUMMY);
53   if (ret != OK)
54     {
55       VnodeDrop();
56       return ret;
57     }
58   if (vnode->type != VNODE_TYPE_CHR && vnode->type != VNODE_TYPE_BLK)
59     {
60       VnodeDrop();
61       return -EPERM;
62     }
63   ret = VnodeFree(vnode);
64   VnodeDrop();
65 
66   return ret;
67 }
68