21,600
社区成员
发帖
与我相关
我的任务
分享
static ssize_t reg_read_file(struct file* file, char __user *user_buf, size_t count, loff_t *ppos)
{
ssize_t ret = 0;
int i;
/*buf allocation*/
char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (NULL == buf)
return -ENOMEM;
/*copy reg to buf*/
ret += sprintf(buf, "scull registers\n");
for (i=0; i<ARRAY_SIZE(reg); i++)
{
ret += sprintf(buf+ret, "%4d = %8d\n", i, reg[i]);
}
if (ret >= PAGE_SIZE - 1)
{
ret = PAGE_SIZE - 1;
}
/*copy buf to user buf*/
loff_t pos = *ppos;
if (pos > ret || count==0)
{
kfree(buf);
return 0;
}
if (count > ret - pos)
count = ret - pos;
ret = copy_to_user(user_buf, buf+pos, count);/*ret = left count*/
if (ret == count)
{
kfree(buf);
return -EFAULT;
}
count -= ret;
*ppos = pos + count;
kfree(buf);
return count;
/*free buf*/
}