2006-01-08 12:01:43 +03:00
# include <linux/slab.h>
# include <linux/string.h>
# include <linux/module.h>
2006-03-24 14:18:42 +03:00
# include <linux/err.h>
# include <asm/uaccess.h>
2006-01-08 12:01:43 +03:00
/**
2006-03-25 14:06:43 +03:00
* __kzalloc - allocate memory . The memory is set to zero .
2006-01-08 12:01:43 +03:00
* @ size : how many bytes of memory are required .
* @ flags : the type of memory to allocate .
*/
2006-03-25 14:06:43 +03:00
void * __kzalloc ( size_t size , gfp_t flags )
2006-01-08 12:01:43 +03:00
{
2006-03-25 14:06:39 +03:00
void * ret = ____kmalloc ( size , flags ) ;
2006-01-08 12:01:43 +03:00
if ( ret )
memset ( ret , 0 , size ) ;
return ret ;
}
2006-03-25 14:06:43 +03:00
EXPORT_SYMBOL ( __kzalloc ) ;
2006-01-08 12:01:43 +03:00
/*
* kstrdup - allocate space for and copy an existing string
*
* @ s : the string to duplicate
* @ gfp : the GFP mask used in the kmalloc ( ) call when allocating memory
*/
char * kstrdup ( const char * s , gfp_t gfp )
{
size_t len ;
char * buf ;
if ( ! s )
return NULL ;
len = strlen ( s ) + 1 ;
2006-03-25 14:06:39 +03:00
buf = ____kmalloc ( len , gfp ) ;
2006-01-08 12:01:43 +03:00
if ( buf )
memcpy ( buf , s , len ) ;
return buf ;
}
EXPORT_SYMBOL ( kstrdup ) ;
2006-03-24 14:18:42 +03:00
/*
* strndup_user - duplicate an existing string from user space
*
* @ s : The string to duplicate
* @ n : Maximum number of bytes to copy , including the trailing NUL .
*/
char * strndup_user ( const char __user * s , long n )
{
char * p ;
long length ;
length = strnlen_user ( s , n ) ;
if ( ! length )
return ERR_PTR ( - EFAULT ) ;
if ( length > n )
return ERR_PTR ( - EINVAL ) ;
p = kmalloc ( length , GFP_KERNEL ) ;
if ( ! p )
return ERR_PTR ( - ENOMEM ) ;
if ( copy_from_user ( p , s , length ) ) {
kfree ( p ) ;
return ERR_PTR ( - EFAULT ) ;
}
p [ length - 1 ] = ' \0 ' ;
return p ;
}
EXPORT_SYMBOL ( strndup_user ) ;