linux 文件socket,linux内核中的文件描述符(二)--socket和文件描述符

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值