2009-03-27 21:25:23 +08:00
|
|
|
/*
|
|
|
|
* Copyright (C) 2006 Atmark Techno, Inc.
|
|
|
|
*
|
|
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
|
|
* for more details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/string.h>
|
|
|
|
#include <asm/uaccess.h>
|
|
|
|
|
|
|
|
#include <asm/bug.h>
|
|
|
|
|
|
|
|
long strnlen_user(const char __user *src, long count)
|
|
|
|
{
|
|
|
|
return strlen(src) + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define __do_strncpy_from_user(dst, src, count, res) \
|
|
|
|
do { \
|
|
|
|
char *tmp; \
|
|
|
|
strncpy(dst, src, count); \
|
|
|
|
for (tmp = dst; *tmp && count > 0; tmp++, count--) \
|
|
|
|
; \
|
|
|
|
res = (tmp - dst); \
|
|
|
|
} while (0)
|
|
|
|
|
|
|
|
long __strncpy_from_user(char *dst, const char __user *src, long count)
|
|
|
|
{
|
|
|
|
long res;
|
|
|
|
__do_strncpy_from_user(dst, src, count, res);
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
long strncpy_from_user(char *dst, const char __user *src, long count)
|
|
|
|
{
|
|
|
|
long res = -EFAULT;
|
|
|
|
if (access_ok(VERIFY_READ, src, 1))
|
|
|
|
__do_strncpy_from_user(dst, src, count, res);
|
|
|
|
return res;
|
|
|
|
}
|
2009-08-14 10:06:46 +08:00
|
|
|
|
|
|
|
unsigned long __copy_tofrom_user(void __user *to,
|
|
|
|
const void __user *from, unsigned long size)
|
|
|
|
{
|
|
|
|
memcpy(to, from, size);
|
|
|
|
return 0;
|
|
|
|
}
|