rpmsgfs: synchronous message transfer format

Signed-off-by: wangyongrong <wangyongrong@xiaomi.com>
This commit is contained in:
wangyongrong 2023-11-08 15:28:12 +08:00 committed by Xiang Xiao
parent e59c95bc9b
commit 540e7f475f
3 changed files with 144 additions and 57 deletions

View File

@ -115,19 +115,35 @@ begin_packed_struct struct rpmsgfs_ioctl_s
#define rpmsgfs_sync_s rpmsgfs_close_s
#define rpmsgfs_dup_s rpmsgfs_close_s
begin_packed_struct struct rpmsgfs_stat_priv_s
{
uint32_t dev; /* Device ID of device containing file */
uint32_t mode; /* File type, attributes, and access mode bits */
uint32_t rdev; /* Device ID (if file is character or block special) */
uint16_t ino; /* File serial number */
uint16_t nlink; /* Number of hard links to the file */
int64_t size; /* Size of file/directory, in bytes */
int64_t atim_sec; /* Time of last access, seconds */
int64_t atim_nsec; /* Time of last access, nanoseconds */
int64_t mtim_sec; /* Time of last modification, seconds */
int64_t mtim_nsec; /* Time of last modification, nanoseconds */
int64_t ctim_sec; /* Time of last status change, seconds */
int64_t ctim_nsec; /* Time of last status change, nanoseconds */
uint64_t blocks; /* Number of blocks allocated */
int16_t uid; /* User ID of file */
int16_t gid; /* Group ID of file */
int16_t blksize; /* Block size used for filesystem I/O */
uint16_t reserved; /* Reserved space */
} end_packed_struct;
begin_packed_struct struct rpmsgfs_fstat_s
{
struct rpmsgfs_header_s header;
struct rpmsgfs_header_s header;
struct rpmsgfs_stat_priv_s buf;
union
{
struct stat buf;
uint32_t reserved[16];
};
union
{
int32_t fd;
char pathname[0];
int32_t fd;
char pathname[0];
};
} end_packed_struct;
@ -158,12 +174,15 @@ begin_packed_struct struct rpmsgfs_readdir_s
begin_packed_struct struct rpmsgfs_statfs_s
{
struct rpmsgfs_header_s header;
union
{
struct statfs buf;
uint32_t reserved[16];
};
uint32_t type; /* Type of filesystem */
uint32_t reserved; /* Reserved space */
uint64_t namelen; /* Maximum length of filenames */
uint64_t bsize; /* Optimal block size for transfers */
uint64_t blocks; /* Total data blocks in the file system of this size */
uint64_t bfree; /* Free blocks in the file system */
uint64_t bavail; /* Free blocks avail to non-superuser */
uint64_t files; /* Total file nodes in the file system */
uint64_t ffree; /* Free file nodes in the file system */
char pathname[0];
} end_packed_struct;
@ -183,18 +202,13 @@ begin_packed_struct struct rpmsgfs_mkdir_s
begin_packed_struct struct rpmsgfs_fchstat_s
{
struct rpmsgfs_header_s header;
int32_t flags;
struct rpmsgfs_header_s header;
struct rpmsgfs_stat_priv_s buf;
int32_t flags;
union
{
struct stat buf;
uint32_t reserved[16];
};
union
{
int32_t fd;
char pathname[0];
int32_t fd;
char pathname[0];
};
} end_packed_struct;

View File

@ -219,14 +219,14 @@ static int rpmsgfs_statfs_handler(FAR struct rpmsg_endpoint *ept,
cookie->result = header->result;
if (cookie->result >= 0)
{
buf->f_type = rsp->buf.f_type;
buf->f_namelen = rsp->buf.f_namelen;
buf->f_bsize = rsp->buf.f_bsize;
buf->f_blocks = rsp->buf.f_blocks;
buf->f_bfree = rsp->buf.f_bfree;
buf->f_bavail = rsp->buf.f_bavail;
buf->f_files = rsp->buf.f_files;
buf->f_ffree = rsp->buf.f_ffree;
buf->f_type = rsp->type;
buf->f_namelen = rsp->namelen;
buf->f_bsize = rsp->bsize;
buf->f_blocks = rsp->blocks;
buf->f_bfree = rsp->bfree;
buf->f_bavail = rsp->bavail;
buf->f_files = rsp->files;
buf->f_ffree = rsp->ffree;
}
rpmsg_post(ept, &cookie->sem);
@ -247,19 +247,22 @@ static int rpmsgfs_stat_handler(FAR struct rpmsg_endpoint *ept,
cookie->result = header->result;
if (cookie->result >= 0)
{
buf->st_dev = rsp->buf.st_dev;
buf->st_ino = rsp->buf.st_ino;
buf->st_mode = rsp->buf.st_mode;
buf->st_nlink = rsp->buf.st_nlink;
buf->st_uid = rsp->buf.st_uid;
buf->st_gid = rsp->buf.st_gid;
buf->st_rdev = rsp->buf.st_rdev;
buf->st_size = rsp->buf.st_size;
buf->st_atime = rsp->buf.st_atime;
buf->st_mtime = rsp->buf.st_mtime;
buf->st_ctime = rsp->buf.st_ctime;
buf->st_blksize = rsp->buf.st_blksize;
buf->st_blocks = rsp->buf.st_blocks;
buf->st_dev = rsp->buf.dev;
buf->st_ino = rsp->buf.ino;
buf->st_mode = rsp->buf.mode;
buf->st_nlink = rsp->buf.nlink;
buf->st_uid = rsp->buf.uid;
buf->st_gid = rsp->buf.gid;
buf->st_rdev = rsp->buf.rdev;
buf->st_size = rsp->buf.size;
buf->st_atim.tv_sec = rsp->buf.atim_sec;
buf->st_atim.tv_nsec = rsp->buf.atim_nsec;
buf->st_mtim.tv_sec = rsp->buf.mtim_sec;
buf->st_mtim.tv_nsec = rsp->buf.mtim_nsec;
buf->st_ctim.tv_sec = rsp->buf.ctim_sec;
buf->st_ctim.tv_nsec = rsp->buf.ctim_nsec;
buf->st_blksize = rsp->buf.blksize;
buf->st_blocks = rsp->buf.blocks;
}
rpmsg_post(ept, &cookie->sem);
@ -909,9 +912,24 @@ int rpmsgfs_client_fchstat(FAR void *handle, int fd,
{
struct rpmsgfs_fchstat_s msg =
{
.flags = flags,
.buf = *buf,
.fd = fd,
.buf.dev = buf->st_dev,
.buf.ino = buf->st_ino,
.buf.mode = buf->st_mode,
.buf.nlink = buf->st_nlink,
.buf.uid = buf->st_uid,
.buf.gid = buf->st_gid,
.buf.rdev = buf->st_rdev,
.buf.size = buf->st_size,
.buf.atim_sec = buf->st_atim.tv_sec,
.buf.atim_nsec = buf->st_atim.tv_nsec,
.buf.mtim_sec = buf->st_mtim.tv_sec,
.buf.mtim_nsec = buf->st_mtim.tv_nsec,
.buf.ctim_sec = buf->st_ctim.tv_sec,
.buf.ctim_nsec = buf->st_ctim.tv_nsec,
.buf.blksize = buf->st_blksize,
.buf.blocks = buf->st_blocks,
.flags = flags,
.fd = fd,
};
return rpmsgfs_send_recv(handle, RPMSGFS_FCHSTAT, true,

View File

@ -547,7 +547,22 @@ static int rpmsgfs_fstat_handler(FAR struct rpmsg_endpoint *ept,
ret = file_fstat(filep, &buf);
if (ret >= 0)
{
msg->buf = buf;
msg->buf.dev = buf.st_dev;
msg->buf.ino = buf.st_ino;
msg->buf.mode = buf.st_mode;
msg->buf.nlink = buf.st_nlink;
msg->buf.uid = buf.st_uid;
msg->buf.gid = buf.st_gid;
msg->buf.rdev = buf.st_rdev;
msg->buf.size = buf.st_size;
msg->buf.atim_sec = buf.st_atim.tv_sec;
msg->buf.atim_nsec = buf.st_atim.tv_nsec;
msg->buf.mtim_sec = buf.st_mtim.tv_sec;
msg->buf.mtim_nsec = buf.st_mtim.tv_nsec;
msg->buf.ctim_sec = buf.st_ctim.tv_sec;
msg->buf.ctim_nsec = buf.st_ctim.tv_nsec;
msg->buf.blksize = buf.st_blksize;
msg->buf.blocks = buf.st_blocks;
}
}
@ -677,7 +692,14 @@ static int rpmsgfs_statfs_handler(FAR struct rpmsg_endpoint *ept,
}
else
{
msg->buf = buf;
msg->type = buf.f_type;
msg->namelen = buf.f_namelen;
msg->bsize = buf.f_bsize;
msg->blocks = buf.f_blocks;
msg->bfree = buf.f_bfree;
msg->bavail = buf.f_bavail;
msg->files = buf.f_files;
msg->ffree = buf.f_ffree;
}
msg->header.result = ret;
@ -746,7 +768,22 @@ static int rpmsgfs_stat_handler(FAR struct rpmsg_endpoint *ept,
ret = nx_stat(msg->pathname, &buf, 1);
if (ret >= 0)
{
msg->buf = buf;
msg->buf.dev = buf.st_dev;
msg->buf.ino = buf.st_ino;
msg->buf.mode = buf.st_mode;
msg->buf.nlink = buf.st_nlink;
msg->buf.uid = buf.st_uid;
msg->buf.gid = buf.st_gid;
msg->buf.rdev = buf.st_rdev;
msg->buf.size = buf.st_size;
msg->buf.atim_sec = buf.st_atim.tv_sec;
msg->buf.atim_nsec = buf.st_atim.tv_nsec;
msg->buf.mtim_sec = buf.st_mtim.tv_sec;
msg->buf.mtim_nsec = buf.st_mtim.tv_nsec;
msg->buf.ctim_sec = buf.st_ctim.tv_sec;
msg->buf.ctim_nsec = buf.st_ctim.tv_nsec;
msg->buf.blksize = buf.st_blksize;
msg->buf.blocks = buf.st_blocks;
}
msg->header.result = ret;
@ -765,7 +802,23 @@ static int rpmsgfs_fchstat_handler(FAR struct rpmsg_endpoint *ept,
filep = rpmsgfs_get_file(priv, msg->fd);
if (filep != NULL)
{
buf = msg->buf;
buf.st_dev = msg->buf.dev;
buf.st_ino = msg->buf.ino;
buf.st_mode = msg->buf.mode;
buf.st_nlink = msg->buf.nlink ;
buf.st_uid = msg->buf.uid ;
buf.st_gid = msg->buf.gid;
buf.st_rdev = msg->buf.rdev;
buf.st_size = msg->buf.size;
buf.st_atim.tv_sec = msg->buf.atim_sec;
buf.st_atim.tv_nsec = msg->buf.atim_nsec;
buf.st_mtim.tv_sec = msg->buf.mtim_sec;
buf.st_mtim.tv_nsec = msg->buf.mtim_nsec;
buf.st_ctim.tv_sec = msg->buf.ctim_sec;
buf.st_ctim.tv_nsec = msg->buf.ctim_nsec;
buf.st_blksize = msg->buf.blksize;
buf.st_blocks = msg->buf.blocks;
ret = file_fchstat(filep, &buf, msg->flags);
}
@ -783,7 +836,7 @@ static int rpmsgfs_chstat_handler(FAR struct rpmsg_endpoint *ept,
if (msg->flags & CH_STAT_MODE)
{
ret = chmod(msg->pathname, msg->buf.st_mode);
ret = chmod(msg->pathname, msg->buf.mode);
if (ret < 0)
{
ret = -get_errno();
@ -793,7 +846,7 @@ static int rpmsgfs_chstat_handler(FAR struct rpmsg_endpoint *ept,
if (msg->flags & (CH_STAT_UID | CH_STAT_GID))
{
ret = chown(msg->pathname, msg->buf.st_uid, msg->buf.st_gid);
ret = chown(msg->pathname, msg->buf.uid, msg->buf.gid);
if (ret < 0)
{
ret = -get_errno();
@ -805,7 +858,8 @@ static int rpmsgfs_chstat_handler(FAR struct rpmsg_endpoint *ept,
{
if (msg->flags & CH_STAT_ATIME)
{
times[0] = msg->buf.st_atim;
times[0].tv_sec = msg->buf.atim_sec;
times[0].tv_nsec = msg->buf.atim_nsec;
}
else
{
@ -815,7 +869,8 @@ static int rpmsgfs_chstat_handler(FAR struct rpmsg_endpoint *ept,
if (msg->flags & CH_STAT_MTIME)
{
times[1] = msg->buf.st_mtim;
times[1].tv_sec = msg->buf.mtim_sec;
times[1].tv_nsec = msg->buf.mtim_nsec;
}
else
{