mirror of
https://github.com/apache/nuttx.git
synced 2026-08-01 20:28:58 +00:00
fs/dirent: add d_ino member to struct dirent
Add the POSIX d_ino (file serial number) member to struct dirent and
populate it on every readdir() path, so portable callers (e.g. scp in
dropbear) that read dp->d_ino observe a meaningful, non-zero inode
number:
- include/dirent.h: declare d_ino in struct dirent and drop the
outdated comment claiming the field is unimplemented.
- include/nuttx/fs/hostfs.h: add d_ino to struct nuttx_dirent_s so
the hostfs ABI can carry the inode number across the VFS boundary.
- arch/sim/src/sim/posix/sim_hostfs.c: forward the host's
ent->d_ino into entry->d_ino.
- fs/vfs/fs_dir.c (read_pseudodir): copy the in-memory inode's
i_ino into entry->d_ino for the pseudo filesystem.
- fs/yaffs/yaffs_vfs.c: forward yaffs's dirent->d_ino into
entry->d_ino.
- fs/rpmsgfs: extend struct rpmsgfs_readdir_s with an 'ino' field
and propagate it across the RPC in both rpmsgfs_server (fills it
from the underlying entry) and rpmsgfs_client (writes it back to
the caller's nuttx_dirent_s).
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
parent
50377d0909
commit
2ea2655bc6
7 changed files with 10 additions and 1 deletions
|
|
@ -443,6 +443,8 @@ int host_readdir(void *dirp, struct nuttx_dirent_s *entry)
|
|||
strncpy(entry->d_name, ent->d_name, sizeof(entry->d_name) - 1);
|
||||
entry->d_name[sizeof(entry->d_name) - 1] = 0;
|
||||
|
||||
entry->d_ino = ent->d_ino;
|
||||
|
||||
/* Map the type */
|
||||
|
||||
if (ent->d_type == DT_REG)
|
||||
|
|
|
|||
|
|
@ -166,6 +166,7 @@ begin_packed_struct struct rpmsgfs_readdir_s
|
|||
{
|
||||
struct rpmsgfs_header_s header;
|
||||
int32_t fd;
|
||||
uint32_t ino;
|
||||
uint32_t type;
|
||||
char name[0];
|
||||
} end_packed_struct;
|
||||
|
|
|
|||
|
|
@ -209,6 +209,7 @@ static int rpmsgfs_readdir_handler(FAR struct rpmsg_endpoint *ept,
|
|||
{
|
||||
strlcpy(entry->d_name, rsp->name, sizeof(entry->d_name));
|
||||
entry->d_type = rsp->type;
|
||||
entry->d_ino = rsp->ino;
|
||||
}
|
||||
|
||||
rpmsg_post(ept, &cookie->sem);
|
||||
|
|
|
|||
|
|
@ -622,6 +622,7 @@ static int rpmsgfs_readdir_handler(FAR struct rpmsg_endpoint *ept,
|
|||
size = MIN(size - len, strlen(entry->d_name) + 1);
|
||||
msg->type = entry->d_type;
|
||||
strlcpy(msg->name, entry->d_name, size);
|
||||
msg->ino = entry->d_ino;
|
||||
len += size;
|
||||
ret = 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -376,6 +376,8 @@ static int read_pseudodir(FAR struct fs_dirent_s *dir,
|
|||
entry->d_type = DTYPE_DIRECTORY;
|
||||
}
|
||||
|
||||
entry->d_ino = pdir->next->i_ino;
|
||||
|
||||
/* Now get the inode to visit next time that readdir() is called */
|
||||
|
||||
inode_lock();
|
||||
|
|
|
|||
|
|
@ -107,11 +107,12 @@
|
|||
* of char containing at least {NAME_MAX} plus one elements.
|
||||
*
|
||||
* POSIX also requires the field d_ino (type ino_t) that provides the file
|
||||
* serial number. This functionality is not implemented in NuttX.
|
||||
* serial number.
|
||||
*/
|
||||
|
||||
struct dirent
|
||||
{
|
||||
ino_t d_ino; /* File serial number */
|
||||
uint8_t d_type; /* Type of file */
|
||||
char d_name[NAME_MAX + 1]; /* File name */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -150,6 +150,7 @@ struct nuttx_timespec
|
|||
|
||||
struct nuttx_dirent_s
|
||||
{
|
||||
nuttx_ino_t d_ino;
|
||||
uint8_t d_type; /* type of file */
|
||||
char d_name[CONFIG_NAME_MAX + 1]; /* filename */
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue