1beacf11bSopenharmony_ci/****************************************************************************
2beacf11bSopenharmony_ci * fs/vfs/fs_stat.c
3beacf11bSopenharmony_ci *
4beacf11bSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. All rights reserved.
5beacf11bSopenharmony_ci * Based on NuttX originally from nuttx source (nuttx/fs/ and nuttx/drivers/)
6beacf11bSopenharmony_ci *
7beacf11bSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
8beacf11bSopenharmony_ci * you may not use this file except in compliance with the License.
9beacf11bSopenharmony_ci * You may obtain a copy of the License at
10beacf11bSopenharmony_ci *
11beacf11bSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
12beacf11bSopenharmony_ci *
13beacf11bSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
14beacf11bSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
15beacf11bSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16beacf11bSopenharmony_ci * See the License for the specific language governing permissions and
17beacf11bSopenharmony_ci * limitations under the License.
18beacf11bSopenharmony_ci *
19beacf11bSopenharmony_ci ****************************************************************************/
20beacf11bSopenharmony_ci
21beacf11bSopenharmony_ci/****************************************************************************
22beacf11bSopenharmony_ci * Included Files
23beacf11bSopenharmony_ci ****************************************************************************/
24beacf11bSopenharmony_ci
25beacf11bSopenharmony_ci#include "vfs_config.h"
26beacf11bSopenharmony_ci
27beacf11bSopenharmony_ci#include "errno.h"
28beacf11bSopenharmony_ci#include "sys/stat.h"
29beacf11bSopenharmony_ci#include "string.h"
30beacf11bSopenharmony_ci#include "stdlib.h"
31beacf11bSopenharmony_ci#include "vnode.h"
32beacf11bSopenharmony_ci/****************************************************************************
33beacf11bSopenharmony_ci * Global Functions
34beacf11bSopenharmony_ci ****************************************************************************/
35beacf11bSopenharmony_ci
36beacf11bSopenharmony_ci/****************************************************************************
37beacf11bSopenharmony_ci * Name: stat
38beacf11bSopenharmony_ci *
39beacf11bSopenharmony_ci * Returned Value:
40beacf11bSopenharmony_ci *   Zero on success; -1 on failure with errno set:
41beacf11bSopenharmony_ci *
42beacf11bSopenharmony_ci *   EACCES  Search permission is denied for one of the directories in the
43beacf11bSopenharmony_ci *           path prefix of path.
44beacf11bSopenharmony_ci *   EFAULT  Bad address.
45beacf11bSopenharmony_ci *   ENOENT  A component of the path path does not exist, or the path is an
46beacf11bSopenharmony_ci *           empty string.
47beacf11bSopenharmony_ci *   ENOMEM  Out of memory
48beacf11bSopenharmony_ci *   ENOTDIR A component of the path is not a directory.
49beacf11bSopenharmony_ci *
50beacf11bSopenharmony_ci ****************************************************************************/
51beacf11bSopenharmony_ci
52beacf11bSopenharmony_ciint stat(const char *path, struct stat *buf)
53beacf11bSopenharmony_ci{
54beacf11bSopenharmony_ci  struct Vnode *vp = NULL;
55beacf11bSopenharmony_ci  int ret;
56beacf11bSopenharmony_ci
57beacf11bSopenharmony_ci  /* Sanity checks */
58beacf11bSopenharmony_ci
59beacf11bSopenharmony_ci  if (!path || !buf)
60beacf11bSopenharmony_ci    {
61beacf11bSopenharmony_ci      ret = -EFAULT;
62beacf11bSopenharmony_ci      goto errout;
63beacf11bSopenharmony_ci    }
64beacf11bSopenharmony_ci
65beacf11bSopenharmony_ci  if (!path[0])
66beacf11bSopenharmony_ci    {
67beacf11bSopenharmony_ci      ret = -ENOENT;
68beacf11bSopenharmony_ci      goto errout;
69beacf11bSopenharmony_ci    }
70beacf11bSopenharmony_ci
71beacf11bSopenharmony_ci  /* Get an vnode for this file */
72beacf11bSopenharmony_ci  VnodeHold();
73beacf11bSopenharmony_ci  ret = VnodeLookup(path, &vp, 0);
74beacf11bSopenharmony_ci  if (ret < 0)
75beacf11bSopenharmony_ci    {
76beacf11bSopenharmony_ci      VnodeDrop();
77beacf11bSopenharmony_ci      goto errout;
78beacf11bSopenharmony_ci    }
79beacf11bSopenharmony_ci
80beacf11bSopenharmony_ci  /* The way we handle the stat depends on the type of vnode that we
81beacf11bSopenharmony_ci   * are dealing with.
82beacf11bSopenharmony_ci   */
83beacf11bSopenharmony_ci
84beacf11bSopenharmony_ci  if (vp->vop != NULL && vp->vop->Getattr != NULL)
85beacf11bSopenharmony_ci    {
86beacf11bSopenharmony_ci      vp->useCount++;
87beacf11bSopenharmony_ci      VnodeDrop();
88beacf11bSopenharmony_ci      ret = vp->vop->Getattr(vp, buf);
89beacf11bSopenharmony_ci      VnodeHold();
90beacf11bSopenharmony_ci      vp->useCount--;
91beacf11bSopenharmony_ci      VnodeDrop();
92beacf11bSopenharmony_ci    }
93beacf11bSopenharmony_ci  else
94beacf11bSopenharmony_ci    {
95beacf11bSopenharmony_ci      VnodeDrop();
96beacf11bSopenharmony_ci      ret = -ENOSYS;
97beacf11bSopenharmony_ci      goto errout;
98beacf11bSopenharmony_ci    }
99beacf11bSopenharmony_ci
100beacf11bSopenharmony_ci  if (ret < 0)
101beacf11bSopenharmony_ci    {
102beacf11bSopenharmony_ci      goto errout;
103beacf11bSopenharmony_ci    }
104beacf11bSopenharmony_ci
105beacf11bSopenharmony_ci  return OK;
106beacf11bSopenharmony_ci
107beacf11bSopenharmony_ci /* Failure conditions always set the errno appropriately */
108beacf11bSopenharmony_ci
109beacf11bSopenharmony_cierrout:
110beacf11bSopenharmony_ci  set_errno(-ret);
111beacf11bSopenharmony_ci  return VFS_ERROR;
112beacf11bSopenharmony_ci}
113