static ssize_t proc_mpc_write(struct file *file, const char __user *buff, size_t nbytes, loff_t *ppos) { char *page, *p; unsigned len; if (nbytes == 0) return 0; if (nbytes >= PAGE_SIZE) nbytes = PAGE_SIZE-1; page = (char *)__get_free_page(GFP_KERNEL); if (!page) return -ENOMEM; for (p = page, len = 0; len < nbytes; p++, len++) { if (get_user(*p, buff++)) { free_page((unsigned long)page); return -EFAULT; } if (*p == '\0' || *p == '\n') break; } *p = '\0'; if (!parse_qos(page)) printk("mpoa: proc_mpc_write: could not parse '%s'\n", page); free_page((unsigned long)page); return len; }
static ssize_t proc_mpc_write(struct file *file, const char *buff, size_t nbytes, loff_t *ppos) { int incoming, error, retval; char *page, c; const char *tmp; if (nbytes < 0) return -EINVAL; if (nbytes == 0) return 0; if (nbytes > PAGE_SIZE) nbytes = PAGE_SIZE-1; error = verify_area(VERIFY_READ, buff, nbytes); if (error) return error; page = (char *)__get_free_page(GFP_KERNEL); if (page == NULL) return -ENOMEM; incoming = 0; tmp = buff; while(incoming < nbytes){ if (get_user(c, tmp++)) return -EFAULT; incoming++; if (c == '\0' || c == '\n') break; } retval = copy_from_user(page, buff, incoming); if (retval != 0) { printk("mpoa: proc_mpc_write: copy_from_user() failed\n"); return -EFAULT; } *ppos += incoming; page[incoming] = '\0'; retval = parse_qos(page, incoming); if (retval == 0) printk("mpoa: proc_mpc_write: could not parse '%s'\n", page); free_page((unsigned long)page); return nbytes; }