mirror of
https://github.com/richardghirst/PiBits.git
synced 2024-11-28 12:24:11 +01:00
Allow dev_write to work per-process.
This commit is contained in:
parent
ef87ef88a7
commit
b1bb608d4c
@ -404,21 +404,27 @@ static ssize_t dev_read(struct file *filp,char *buf,size_t count,loff_t *f_pos)
|
||||
|
||||
static ssize_t dev_write(struct file *filp,const char *buf,size_t count,loff_t *f_pos)
|
||||
{
|
||||
char* end_of_line=0;
|
||||
static int idx=0;
|
||||
static char str[32];
|
||||
static const int max_idx = sizeof(str) - 1;
|
||||
char* str = 0;
|
||||
struct process_data* const pdata = filp->private_data;
|
||||
if (0 == pdata) return 0;
|
||||
|
||||
if ((idx+count) > max_idx) count = max_idx-idx;
|
||||
if (copy_from_user(str, buf+idx, count)) {
|
||||
// Read user data into str
|
||||
{
|
||||
char* end_of_line=0;
|
||||
static const int max_idx = sizeof(pdata->cmd_str) - 1;
|
||||
int* const idx = &(pdata->cmd_idx);
|
||||
str = pdata->cmd_str;
|
||||
|
||||
if ((*idx+count) > max_idx) count = max_idx-*idx;
|
||||
if (copy_from_user(str, buf+*idx, count)) {
|
||||
return -EFAULT;
|
||||
}
|
||||
idx+=count;
|
||||
str[idx] = '\0';
|
||||
*idx+=count;
|
||||
str[*idx] = '\0';
|
||||
end_of_line = strchr(str, '\n');
|
||||
if (NULL == end_of_line)
|
||||
{
|
||||
if (31 == idx) {
|
||||
if (31 == *idx) {
|
||||
// Full buf without '\n'
|
||||
printk(KERN_WARNING "ServoBlaster: Failed to parse command (%s)\n", str);
|
||||
return -EINVAL;
|
||||
@ -426,9 +432,10 @@ static ssize_t dev_write(struct file *filp,const char *buf,size_t count,loff_t *
|
||||
return count; // Incomplete line.
|
||||
}
|
||||
|
||||
// We've reached end of command, so terminate string at '\n' and reset idx.
|
||||
// End of command, so terminate string at '\n' and reset idx.
|
||||
*end_of_line = '\0';
|
||||
idx=0;
|
||||
*idx=0;
|
||||
}
|
||||
|
||||
// Process the complete user string.
|
||||
{
|
||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user