|
Lines 4145-4156
Link Here
|
| 4145 |
*/ |
4145 |
*/ |
| 4146 |
|
4146 |
|
| 4147 |
static ssize_t proc_read( struct file *file, |
4147 |
static ssize_t proc_read( struct file *file, |
| 4148 |
char *buffer, |
4148 |
char __user *buffer, |
| 4149 |
size_t len, |
4149 |
size_t len, |
| 4150 |
loff_t *offset); |
4150 |
loff_t *offset); |
| 4151 |
|
4151 |
|
| 4152 |
static ssize_t proc_write( struct file *file, |
4152 |
static ssize_t proc_write( struct file *file, |
| 4153 |
const char *buffer, |
4153 |
const char __user *buffer, |
| 4154 |
size_t len, |
4154 |
size_t len, |
| 4155 |
loff_t *offset ); |
4155 |
loff_t *offset ); |
| 4156 |
static int proc_close( struct inode *inode, struct file *file ); |
4156 |
static int proc_close( struct inode *inode, struct file *file ); |
|
Lines 4355-4377
Link Here
|
| 4355 |
* to supply the data. |
4355 |
* to supply the data. |
| 4356 |
*/ |
4356 |
*/ |
| 4357 |
static ssize_t proc_read( struct file *file, |
4357 |
static ssize_t proc_read( struct file *file, |
| 4358 |
char *buffer, |
4358 |
char __user *buffer, |
| 4359 |
size_t len, |
4359 |
size_t len, |
| 4360 |
loff_t *offset ) |
4360 |
loff_t *offset ) |
| 4361 |
{ |
4361 |
{ |
| 4362 |
int i; |
4362 |
loff_t pos = *offset; |
| 4363 |
int pos; |
|
|
| 4364 |
struct proc_data *priv = (struct proc_data*)file->private_data; |
4363 |
struct proc_data *priv = (struct proc_data*)file->private_data; |
| 4365 |
|
4364 |
|
| 4366 |
if( !priv->rbuffer ) return -EINVAL; |
4365 |
if (!priv->rbuffer) |
|
|
4366 |
return -EINVAL; |
| 4367 |
|
4367 |
|
| 4368 |
pos = *offset; |
4368 |
if (pos < 0) |
| 4369 |
for( i = 0; i+pos < priv->readlen && i < len; i++ ) { |
4369 |
return -EINVAL; |
| 4370 |
if (put_user( priv->rbuffer[i+pos], buffer+i )) |
4370 |
if (pos >= priv->readlen) |
| 4371 |
return -EFAULT; |
4371 |
return 0; |
| 4372 |
} |
4372 |
if (len > priv->readlen - pos) |
| 4373 |
*offset += i; |
4373 |
len = priv->readlen - pos; |
| 4374 |
return i; |
4374 |
if (copy_to_user(buffer, priv->rbuffer + pos, len)) |
|
|
4375 |
return -EFAULT; |
| 4376 |
*offset = pos + len; |
| 4377 |
return len; |
| 4375 |
} |
4378 |
} |
| 4376 |
|
4379 |
|
| 4377 |
/* |
4380 |
/* |
|
Lines 4379-4406
Link Here
|
| 4379 |
* to supply the data. |
4382 |
* to supply the data. |
| 4380 |
*/ |
4383 |
*/ |
| 4381 |
static ssize_t proc_write( struct file *file, |
4384 |
static ssize_t proc_write( struct file *file, |
| 4382 |
const char *buffer, |
4385 |
const char __user *buffer, |
| 4383 |
size_t len, |
4386 |
size_t len, |
| 4384 |
loff_t *offset ) |
4387 |
loff_t *offset ) |
| 4385 |
{ |
4388 |
{ |
| 4386 |
int i; |
4389 |
loff_t pos = *offset; |
| 4387 |
int pos; |
|
|
| 4388 |
struct proc_data *priv = (struct proc_data*)file->private_data; |
4390 |
struct proc_data *priv = (struct proc_data*)file->private_data; |
| 4389 |
|
4391 |
|
| 4390 |
if ( !priv->wbuffer ) { |
4392 |
if (!priv->wbuffer) |
| 4391 |
return -EINVAL; |
4393 |
return -EINVAL; |
| 4392 |
} |
|
|
| 4393 |
|
| 4394 |
pos = *offset; |
| 4395 |
|
4394 |
|
| 4396 |
for( i = 0; i + pos < priv->maxwritelen && |
4395 |
if (pos < 0) |
| 4397 |
i < len; i++ ) { |
4396 |
return -EINVAL; |
| 4398 |
if (get_user( priv->wbuffer[i+pos], buffer + i )) |
4397 |
if (pos >= priv->maxwritelen) |
| 4399 |
return -EFAULT; |
4398 |
return 0; |
| 4400 |
} |
4399 |
if (len > priv->maxwritelen - pos) |
| 4401 |
if ( i+pos > priv->writelen ) priv->writelen = i+file->f_pos; |
4400 |
len = priv->maxwritelen - pos; |
| 4402 |
*offset += i; |
4401 |
if (copy_from_user(priv->wbuffer + pos, buffer, len)) |
| 4403 |
return i; |
4402 |
return -EFAULT; |
|
|
4403 |
if (pos + len > priv->writelen) |
| 4404 |
priv->writelen = pos + len; |
| 4405 |
*offset = pos + len; |
| 4406 |
return len; |
| 4404 |
} |
4407 |
} |
| 4405 |
|
4408 |
|
| 4406 |
static int proc_status_open( struct inode *inode, struct file *file ) { |
4409 |
static int proc_status_open( struct inode *inode, struct file *file ) { |