コード例 #1
0
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;
}
コード例 #2
0
ファイル: mpoa_proc.c プロジェクト: dmgerman/original
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;
}