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);
|
strncpy(entry->d_name, ent->d_name, sizeof(entry->d_name) - 1);
|
||||||
entry->d_name[sizeof(entry->d_name) - 1] = 0;
|
entry->d_name[sizeof(entry->d_name) - 1] = 0;
|
||||||
|
|
||||||
|
entry->d_ino = ent->d_ino;
|
||||||
|
|
||||||
/* Map the type */
|
/* Map the type */
|
||||||
|
|
||||||
if (ent->d_type == DT_REG)
|
if (ent->d_type == DT_REG)
|
||||||
|
|
|
||||||
|
|
@ -166,6 +166,7 @@ begin_packed_struct struct rpmsgfs_readdir_s
|
||||||
{
|
{
|
||||||
struct rpmsgfs_header_s header;
|
struct rpmsgfs_header_s header;
|
||||||
int32_t fd;
|
int32_t fd;
|
||||||
|
uint32_t ino;
|
||||||
uint32_t type;
|
uint32_t type;
|
||||||
char name[0];
|
char name[0];
|
||||||
} end_packed_struct;
|
} 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));
|
strlcpy(entry->d_name, rsp->name, sizeof(entry->d_name));
|
||||||
entry->d_type = rsp->type;
|
entry->d_type = rsp->type;
|
||||||
|
entry->d_ino = rsp->ino;
|
||||||
}
|
}
|
||||||
|
|
||||||
rpmsg_post(ept, &cookie->sem);
|
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);
|
size = MIN(size - len, strlen(entry->d_name) + 1);
|
||||||
msg->type = entry->d_type;
|
msg->type = entry->d_type;
|
||||||
strlcpy(msg->name, entry->d_name, size);
|
strlcpy(msg->name, entry->d_name, size);
|
||||||
|
msg->ino = entry->d_ino;
|
||||||
len += size;
|
len += size;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -376,6 +376,8 @@ static int read_pseudodir(FAR struct fs_dirent_s *dir,
|
||||||
entry->d_type = DTYPE_DIRECTORY;
|
entry->d_type = DTYPE_DIRECTORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
entry->d_ino = pdir->next->i_ino;
|
||||||
|
|
||||||
/* Now get the inode to visit next time that readdir() is called */
|
/* Now get the inode to visit next time that readdir() is called */
|
||||||
|
|
||||||
inode_lock();
|
inode_lock();
|
||||||
|
|
|
||||||
|
|
@ -107,11 +107,12 @@
|
||||||
* of char containing at least {NAME_MAX} plus one elements.
|
* of char containing at least {NAME_MAX} plus one elements.
|
||||||
*
|
*
|
||||||
* POSIX also requires the field d_ino (type ino_t) that provides the file
|
* 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
|
struct dirent
|
||||||
{
|
{
|
||||||
|
ino_t d_ino; /* File serial number */
|
||||||
uint8_t d_type; /* Type of file */
|
uint8_t d_type; /* Type of file */
|
||||||
char d_name[NAME_MAX + 1]; /* File name */
|
char d_name[NAME_MAX + 1]; /* File name */
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -150,6 +150,7 @@ struct nuttx_timespec
|
||||||
|
|
||||||
struct nuttx_dirent_s
|
struct nuttx_dirent_s
|
||||||
{
|
{
|
||||||
|
nuttx_ino_t d_ino;
|
||||||
uint8_t d_type; /* type of file */
|
uint8_t d_type; /* type of file */
|
||||||
char d_name[CONFIG_NAME_MAX + 1]; /* filename */
|
char d_name[CONFIG_NAME_MAX + 1]; /* filename */
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue