2005-04-16 15:20:36 -07:00
/*
* Copyright ( C ) 2000 - 2003 Jeff Dike ( jdike @ addtoit . com )
* Licensed under the GPL
*/
# include "linux/sched.h"
# include "linux/shm.h"
2007-10-16 23:29:24 -07:00
# include "linux/ipc.h"
2008-08-18 04:01:47 -04:00
# include "linux/syscalls.h"
2005-04-16 15:20:36 -07:00
# include "asm/mman.h"
# include "asm/uaccess.h"
# include "asm/unistd.h"
2006-03-31 02:30:22 -08:00
/*
* The prototype on i386 is :
*
* int clone ( int flags , void * child_stack , int * parent_tidptr , struct user_desc * newtls , int * child_tidptr )
*
* and the " newtls " arg . on i386 is read by copy_thread directly from the
* register saved on the stack .
2005-04-16 15:20:36 -07:00
*/
long sys_clone ( unsigned long clone_flags , unsigned long newsp ,
2006-03-31 02:30:22 -08:00
int __user * parent_tid , void * newtls , int __user * child_tid )
2005-04-16 15:20:36 -07:00
{
long ret ;
2005-06-25 14:55:21 -07:00
if ( ! newsp )
newsp = UPT_SP ( & current - > thread . regs . regs ) ;
2006-03-31 02:30:22 -08:00
2005-04-16 15:20:36 -07:00
current - > thread . forking = 1 ;
2005-06-25 14:55:21 -07:00
ret = do_fork ( clone_flags , newsp , & current - > thread . regs , 0 , parent_tid ,
child_tid ) ;
2005-04-16 15:20:36 -07:00
current - > thread . forking = 0 ;
2006-03-31 02:30:22 -08:00
return ret ;
2005-04-16 15:20:36 -07:00
}
long sys_sigaction ( int sig , const struct old_sigaction __user * act ,
struct old_sigaction __user * oact )
{
struct k_sigaction new_ka , old_ka ;
int ret ;
if ( act ) {
old_sigset_t mask ;
if ( ! access_ok ( VERIFY_READ , act , sizeof ( * act ) ) | |
__get_user ( new_ka . sa . sa_handler , & act - > sa_handler ) | |
__get_user ( new_ka . sa . sa_restorer , & act - > sa_restorer ) )
return - EFAULT ;
__get_user ( new_ka . sa . sa_flags , & act - > sa_flags ) ;
__get_user ( mask , & act - > sa_mask ) ;
siginitset ( & new_ka . sa . sa_mask , mask ) ;
}
ret = do_sigaction ( sig , act ? & new_ka : NULL , oact ? & old_ka : NULL ) ;
if ( ! ret & & oact ) {
if ( ! access_ok ( VERIFY_WRITE , oact , sizeof ( * oact ) ) | |
__put_user ( old_ka . sa . sa_handler , & oact - > sa_handler ) | |
__put_user ( old_ka . sa . sa_restorer , & oact - > sa_restorer ) )
return - EFAULT ;
__put_user ( old_ka . sa . sa_flags , & oact - > sa_flags ) ;
__put_user ( old_ka . sa . sa_mask . sig [ 0 ] , & oact - > sa_mask ) ;
}
return ret ;
}