fs/shmfs: implement read and write interface
To pass LTP posix case mmap/1-2.c Signed-off-by: fangxinyong <fangxinyong@xiaomi.com>
This commit is contained in:
parent
ea52220509
commit
1adef07a79
@ -89,7 +89,45 @@ const struct file_operations g_shmfs_operations =
|
||||
static ssize_t shmfs_read(FAR struct file *filep, FAR char *buffer,
|
||||
size_t buflen)
|
||||
{
|
||||
return -ENOSYS;
|
||||
FAR struct shmfs_object_s *sho;
|
||||
ssize_t nread;
|
||||
off_t startpos;
|
||||
off_t endpos;
|
||||
|
||||
DEBUGASSERT(filep->f_inode != NULL && filep->f_inode->i_private != NULL);
|
||||
|
||||
sho = filep->f_inode->i_private;
|
||||
|
||||
if (filep->f_pos > sho->length)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Handle attempts to read beyond the end of the file. */
|
||||
|
||||
startpos = filep->f_pos;
|
||||
nread = buflen;
|
||||
endpos = startpos + buflen;
|
||||
|
||||
if (endpos > sho->length)
|
||||
{
|
||||
endpos = sho->length;
|
||||
nread = endpos - startpos;
|
||||
}
|
||||
|
||||
/* Copy data from the memory object to the user buffer */
|
||||
|
||||
if (sho->paddr != NULL)
|
||||
{
|
||||
memcpy(buffer, sho->paddr + startpos, nread);
|
||||
filep->f_pos += nread;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUGASSERT(sho->length == 0 && nread == 0);
|
||||
}
|
||||
|
||||
return nread;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -99,7 +137,41 @@ static ssize_t shmfs_read(FAR struct file *filep, FAR char *buffer,
|
||||
static ssize_t shmfs_write(FAR struct file *filep, FAR const char *buffer,
|
||||
size_t buflen)
|
||||
{
|
||||
return -ENOSYS;
|
||||
FAR struct shmfs_object_s *sho;
|
||||
ssize_t nwritten;
|
||||
off_t startpos;
|
||||
off_t endpos;
|
||||
|
||||
DEBUGASSERT(filep->f_inode != NULL && filep->f_inode->i_private != NULL);
|
||||
|
||||
sho = filep->f_inode->i_private;
|
||||
|
||||
/* Handle attempts to write beyond the end of the file */
|
||||
|
||||
startpos = filep->f_pos;
|
||||
nwritten = buflen;
|
||||
endpos = startpos + buflen;
|
||||
|
||||
/* Desn't support shm auto expand, truncate first */
|
||||
|
||||
if (endpos > sho->length)
|
||||
{
|
||||
return -EFBIG;
|
||||
}
|
||||
|
||||
/* Copy data from the user buffer to the memory object */
|
||||
|
||||
if (sho->paddr != NULL)
|
||||
{
|
||||
memcpy(sho->paddr + startpos, buffer, nwritten);
|
||||
filep->f_pos += nwritten;
|
||||
}
|
||||
else
|
||||
{
|
||||
DEBUGASSERT(sho->length == 0 && nwritten == 0);
|
||||
}
|
||||
|
||||
return nwritten;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
Loading…
x
Reference in New Issue
Block a user