看明白在uclibc中网络系统调用是如何实现的

本文分析了uClibc-0.9.30.1/libc/inet目录下的代码,重点关注socketcall.c中如何实现网络系统调用如recv、connect和getpeername。代码通过将参数放入unsigned long型数组传递给内核,但未进行参数验证,可能有安全隐患。还介绍了ntohl.c中的字节序转换和getaddrinfo.c的复杂性。对于合格的uCLinux C开发者,熟悉并理解这些库函数至关重要。
摘要由CSDN通过智能技术生成

目标: 看明白在uclibc中网络系统调用是如何实现的,和普通的Linux有什么区别

0. 将uClibc-0.9.30.1/libc/inet目录下的文件按文件大小排列一下,会发出100多字节的文件有很多,都是调用的。呵呵。

1. 代码文件:uClibc-0.9.30.1/libc/inet/socketcall.c 代码如下:

#ifdef L_recv

extern __typeof(recv) __libc_recv;

#ifdef __NR_recv

#define __NR___libc_recv __NR_recv

_syscall4(ssize_t, __libc_recv, int, sockfd, __ptr_t, buffer, size_t, len,

int, flags)

#elif defined(__NR_socketcall)

/* recv, recvfrom added by bir7@leland.stanford.edu */

ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)

{

unsigned long args[4];

 

args[0] = sockfd;

args[1] = (unsigned long) buffer;

args[2] = len;

args[3] = flags;

return (__socketcall(SYS_RECV, args));

}

#elif defined(__NR_recvfrom)

libc_hidden_proto(recvfrom)

ssize_t __libc_recv(int sockfd, __ptr_t buffer, size_t len, int flags)

{

return (recvfrom(sockfd, buffer, len, flags, NULL, NULL));

}

#endif

libc_hidden_proto(recv)

weak_alias(__libc_recv,recv)

libc_hidden_weak(recv)

#endif

 

#ifdef L_connect

extern __typeof(connect) __libc_connect;

#ifdef __NR_connect

#define __NR___libc_connect __NR_connect

_syscall3(int, __libc_connect, int, sockfd, const struct sockaddr *, saddr, socklen_t, addrlen)

#elif defined(__NR_socketcall)

int __libc_conn

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值