diff --git a/fs/driver/CMakeLists.txt b/fs/driver/CMakeLists.txt index d54c2ae03bc..61debb9c780 100644 --- a/fs/driver/CMakeLists.txt +++ b/fs/driver/CMakeLists.txt @@ -31,6 +31,7 @@ if(NOT CONFIG_DISABLE_MOUNTPOINT) SRCS fs_registerblockdriver.c fs_unregisterblockdriver.c + fs_finddriver.c fs_findblockdriver.c fs_openblockdriver.c fs_closeblockdriver.c diff --git a/fs/driver/Make.defs b/fs/driver/Make.defs index 626d5e22ccc..e7df3c9d402 100644 --- a/fs/driver/Make.defs +++ b/fs/driver/Make.defs @@ -29,8 +29,7 @@ ifneq ($(CONFIG_DISABLE_MOUNTPOINT),y) CSRCS += fs_registerblockdriver.c fs_unregisterblockdriver.c CSRCS += fs_findblockdriver.c fs_openblockdriver.c fs_closeblockdriver.c CSRCS += fs_blockpartition.c fs_findmtddriver.c fs_closemtddriver.c -CSRCS += fs_blockmerge.c - +CSRCS += fs_blockmerge.c fs_finddriver.c ifeq ($(CONFIG_MTD),y) CSRCS += fs_registermtddriver.c fs_unregistermtddriver.c diff --git a/fs/driver/fs_finddriver.c b/fs/driver/fs_finddriver.c new file mode 100644 index 00000000000..081c27e60b8 --- /dev/null +++ b/fs/driver/fs_finddriver.c @@ -0,0 +1,78 @@ +/**************************************************************************** + * fs/driver/fs_finddriver.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include "inode/inode.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: find_driver + * + * Description: + * Returns the pointer of a registered driver specified by 'pathname' + * + * Input Parameters: + * pathname - the full path to the driver's device node in file system + * + * Returned Value: + * Pointer to driver's registered private pointer or NULL if not found. + * + ****************************************************************************/ + +FAR void *find_driver(FAR const char *pathname) +{ + struct inode_search_s desc; + FAR void *drvr = NULL; + + DEBUGASSERT(pathname != NULL); + + /* Find the inode registered with this pathname */ + + SETUP_SEARCH(&desc, pathname, false); + + /* Get the search results */ + + inode_lock(); + if (inode_find(&desc) < 0) + { + ferr("ERROR: Failed to find %s\n", pathname); + } + else + { + drvr = desc.node->i_private; + inode_release(desc.node); + } + + inode_unlock(); + RELEASE_SEARCH(&desc); + + return drvr; +} diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h index f54d0bd324a..2b738f01eb4 100644 --- a/include/nuttx/fs/fs.h +++ b/include/nuttx/fs/fs.h @@ -1369,6 +1369,22 @@ int fdlist_close(FAR struct fdlist *list, int fd); int nx_close(int fd); +/**************************************************************************** + * Name: find_driver + * + * Description: + * Returns the pointer of a registered driver specified by 'pathname' + * + * Input Parameters: + * pathname - the full path to the driver's device node in file system + * + * Returned Value: + * Pointer to driver's registered private pointer or NULL if not found. + * + ****************************************************************************/ + +FAR void *find_driver(FAR const char *pathname); + /**************************************************************************** * Name: open_blockdriver *