net/socket.c
/*
*Systemcallvectors.
*
*Argumentcheckingcleanedup.Saved20%insize.
*Thisfunctiondoesntneedtosetthekernellockbecause
*itissetbythecallees.
*/
asmlinkagelongsys_socketcall(intcall,unsignedlong__user*args)
{
unsignedlonga[6];
unsignedlonga0,a1;
interr;
if(call<1||call>SYS_RECVMSG)
return-EINVAL;
/*copy_from_usershouldbeSMPsafe.*/
if(copy_from_user(a,args,nargs[call]))
return-EFAULT;
err=audit_socketcall(nargs[call]/sizeof(unsignedlong),a);
if(err)
returnerr;
a0=a[0];
a1=a[1];
switch(call)
{
caseSYS_SOCKET:
err=sys_socket(a0,a1,a[2]);
break;
caseSYS_BIND:
err=sys_bind(a0,(structsockaddr__user*)a1,a[2]);
break;
caseSYS_CONNECT:
err=sys_connect(a0,(structsockaddr__user*)a1,a[2]);
break;
caseSYS_LISTEN:
err=sys_listen(a0,a1);
break;
caseSYS_ACCEPT:
err=sys_accept(a0,(structsockaddr__user*)a1,(int__user*)a[2]);
break;
caseSYS_GETSOCKNAME:
err=sys_getsockname(a0,(structsockaddr__user*)a1,(int__user*)a[2]);
break;
caseSYS_GETPEERNAME:
err=sys_getpeername(a0,(structsockaddr__user*)a1,(int__user*)a[2]);
break;
caseSYS_SOCKETPAIR:
err=sys_socketpair(a0,a1,a[2],(int__user*)a[3]);
break;
caseSYS_SEND:
err=sys_send(a0,(void__user*)a1,a[2],a[3]);
break;
caseSYS_SENDTO:
err=sys_sendto(a0,(void__user*)a1,a[2],a[3],
(structsockaddr__user*)a[4],a[5]);
break;
caseSYS_RECV:
err=sys_recv(a0,(void__user*)a1,a[2],a[3]);
break;
caseSYS_RECVFROM:
err=sys_recvfrom(a0,(void__user*)a1,a[2],a[3],
(structsockaddr__user*)a[4],(int__user*)a[5]);
break;
caseSYS_SHUTDOWN:
err=sys_shutdown(a0,a1);
break;
caseSYS_SETSOCKOPT:
err=sys_setsockopt(a0,a1,a[2],(char__user*)a[3],a[4]);
break;
caseSYS_GETSOCKOPT:
err=sys_getsockopt(a0,a1,a[2],(char__user*)a[3],(int__user*)a[4]);
break;
caseSYS_SENDMSG:
err=sys_sendmsg(a0,(structmsghdr__user*)a1,a[2]);
break;
caseSYS_RECVMSG:
err=sys_recvmsg(a0,(structmsghdr__user*)a1,a[2]);
break;
default:
err=-EINVAL;
break;
}
returnerr;
}/*Itmaybealreadyanotherdescriptor8)Notkernelproblem.*/
returnretval;
out_release:
sock_release(sock);
returnretval;
}