aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/isdn/hysdn/hysdn_procconf.c29
1 files changed, 8 insertions, 21 deletions
diff --git a/drivers/isdn/hysdn/hysdn_procconf.c b/drivers/isdn/hysdn/hysdn_procconf.c
index 15906d005b05..484299b031f8 100644
--- a/drivers/isdn/hysdn/hysdn_procconf.c
+++ b/drivers/isdn/hysdn/hysdn_procconf.c
@@ -207,30 +207,17 @@ hysdn_conf_write(struct file *file, const char __user *buf, size_t count, loff_t
207/* read conf file -> output card info data */ 207/* read conf file -> output card info data */
208/*******************************************/ 208/*******************************************/
209static ssize_t 209static ssize_t
210hysdn_conf_read(struct file *file, char __user *buf, size_t count, loff_t * off) 210hysdn_conf_read(struct file *file, char __user *buf, size_t count, loff_t *off)
211{ 211{
212 char *cp; 212 char *cp;
213 int i;
214 213
215 if (file->f_mode & FMODE_READ) { 214 if (!(file->f_mode & FMODE_READ))
216 if (!(cp = file->private_data)) 215 return -EPERM; /* no permission to read */
217 return (-EFAULT); /* should never happen */ 216
218 i = strlen(cp); /* get total string length */ 217 if (!(cp = file->private_data))
219 if (*off < i) { 218 return -EFAULT; /* should never happen */
220 /* still bytes to transfer */ 219
221 cp += *off; /* point to desired data offset */ 220 return simple_read_from_buffer(buf, count, off, cp, strlen(cp));
222 i -= *off; /* remaining length */
223 if (i > count)
224 i = count; /* limit length to transfer */
225 if (copy_to_user(buf, cp, i))
226 return (-EFAULT); /* copy error */
227 *off += i; /* adjust offset */
228 } else
229 return (0);
230 } else
231 return (-EPERM); /* no permission to read */
232
233 return (i);
234} /* hysdn_conf_read */ 221} /* hysdn_conf_read */
235 222
236/******************/ 223/******************/