socket的实现,安卓系统AOSP源码
来源:互联网 发布:gst5000软件 编辑:程序博客网 时间:2024/05/17 21:11
bionic\libc\include\sys\socket.h
#ifndef _SYS_SOCKET_H_#define _SYS_SOCKET_H_#include <sys/cdefs.h>#include <sys/types.h>#include <linux/socket.h>#include <asm/fcntl.h>#include <asm/socket.h>#include <linux/sockios.h>#include <linux/uio.h>#include <linux/types.h>#include <linux/compiler.h>__BEGIN_DECLS#define sockaddr_storage __kernel_sockaddr_storagetypedef unsigned short sa_family_t;struct timespec;#ifdef __mips__#define SOCK_DGRAM 1#define SOCK_STREAM 2#define SOCK_RAW 3#define SOCK_RDM 4#define SOCK_SEQPACKET 5#define SOCK_DCCP 6#define SOCK_PACKET 10#else#define SOCK_STREAM 1#define SOCK_DGRAM 2#define SOCK_RAW 3#define SOCK_RDM 4#define SOCK_SEQPACKET 5#define SOCK_PACKET 10#endif#define SOCK_CLOEXEC O_CLOEXEC#define SOCK_NONBLOCK O_NONBLOCKenum { SHUT_RD = 0,#define SHUT_RD SHUT_RD SHUT_WR,#define SHUT_WR SHUT_WR SHUT_RDWR#define SHUT_RDWR SHUT_RDWR};struct sockaddr { sa_family_t sa_family; char sa_data[14];};struct linger { int l_onoff; int l_linger;};struct msghdr { void* msg_name; socklen_t msg_namelen; struct iovec* msg_iov; size_t msg_iovlen; void* msg_control; size_t msg_controllen; int msg_flags;};struct mmsghdr { struct msghdr msg_hdr; unsigned int msg_len;};struct cmsghdr { size_t cmsg_len; int cmsg_level; int cmsg_type;};#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr((mhdr), (cmsg))#define CMSG_ALIGN(len) ( ((len)+sizeof(long)-1) & ~(sizeof(long)-1) )#define CMSG_DATA(cmsg) ((void*)((char*)(cmsg) + CMSG_ALIGN(sizeof(struct cmsghdr))))#define CMSG_SPACE(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len))#define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len))#define CMSG_FIRSTHDR(msg) \ ((msg)->msg_controllen >= sizeof(struct cmsghdr) \ ? (struct cmsghdr*) (msg)->msg_control : (struct cmsghdr*) NULL)#define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) && (cmsg)->cmsg_len <= (unsigned long) ((mhdr)->msg_controllen - ((char*)(cmsg) - (char*)(mhdr)->msg_control)))struct cmsghdr* __cmsg_nxthdr(struct msghdr*, struct cmsghdr*);#define SCM_RIGHTS 0x01#define SCM_CREDENTIALS 0x02#define SCM_SECURITY 0x03struct ucred { pid_t pid; uid_t uid; gid_t gid;};#define AF_UNSPEC 0#define AF_UNIX 1#define AF_LOCAL 1#define AF_INET 2#define AF_AX25 3#define AF_IPX 4#define AF_APPLETALK 5#define AF_NETROM 6#define AF_BRIDGE 7#define AF_ATMPVC 8#define AF_X25 9#define AF_INET6 10#define AF_ROSE 11#define AF_DECnet 12#define AF_NETBEUI 13#define AF_SECURITY 14#define AF_KEY 15#define AF_NETLINK 16#define AF_ROUTE AF_NETLINK#define AF_PACKET 17#define AF_ASH 18#define AF_ECONET 19#define AF_ATMSVC 20#define AF_RDS 21#define AF_SNA 22#define AF_IRDA 23#define AF_PPPOX 24#define AF_WANPIPE 25#define AF_LLC 26#define AF_CAN 29#define AF_TIPC 30#define AF_BLUETOOTH 31#define AF_IUCV 32#define AF_RXRPC 33#define AF_ISDN 34#define AF_PHONET 35#define AF_IEEE802154 36#define AF_CAIF 37#define AF_ALG 38#define AF_MAX 39#define PF_UNSPEC AF_UNSPEC#define PF_UNIX AF_UNIX#define PF_LOCAL AF_LOCAL#define PF_INET AF_INET#define PF_AX25 AF_AX25#define PF_IPX AF_IPX#define PF_APPLETALK AF_APPLETALK#define PF_NETROM AF_NETROM#define PF_BRIDGE AF_BRIDGE#define PF_ATMPVC AF_ATMPVC#define PF_X25 AF_X25#define PF_INET6 AF_INET6#define PF_ROSE AF_ROSE#define PF_DECnet AF_DECnet#define PF_NETBEUI AF_NETBEUI#define PF_SECURITY AF_SECURITY#define PF_KEY AF_KEY#define PF_NETLINK AF_NETLINK#define PF_ROUTE AF_ROUTE#define PF_PACKET AF_PACKET#define PF_ASH AF_ASH#define PF_ECONET AF_ECONET#define PF_ATMSVC AF_ATMSVC#define PF_RDS AF_RDS#define PF_SNA AF_SNA#define PF_IRDA AF_IRDA#define PF_PPPOX AF_PPPOX#define PF_WANPIPE AF_WANPIPE#define PF_LLC AF_LLC#define PF_CAN AF_CAN#define PF_TIPC AF_TIPC#define PF_BLUETOOTH AF_BLUETOOTH#define PF_IUCV AF_IUCV#define PF_RXRPC AF_RXRPC#define PF_ISDN AF_ISDN#define PF_PHONET AF_PHONET#define PF_IEEE802154 AF_IEEE802154#define PF_CAIF AF_CAIF#define PF_ALG AF_ALG#define PF_MAX AF_MAX#define SOMAXCONN 128#define MSG_OOB 1#define MSG_PEEK 2#define MSG_DONTROUTE 4#define MSG_TRYHARD 4#define MSG_CTRUNC 8#define MSG_PROBE 0x10#define MSG_TRUNC 0x20#define MSG_DONTWAIT 0x40#define MSG_EOR 0x80#define MSG_WAITALL 0x100#define MSG_FIN 0x200#define MSG_SYN 0x400#define MSG_CONFIRM 0x800#define MSG_RST 0x1000#define MSG_ERRQUEUE 0x2000#define MSG_NOSIGNAL 0x4000#define MSG_MORE 0x8000#define MSG_WAITFORONE 0x10000#define MSG_FASTOPEN 0x20000000#define MSG_CMSG_CLOEXEC 0x40000000#define MSG_EOF MSG_FIN#define MSG_CMSG_COMPAT 0#define SOL_IP 0#define SOL_TCP 6#define SOL_UDP 17#define SOL_IPV6 41#define SOL_ICMPV6 58#define SOL_SCTP 132#define SOL_RAW 255#define SOL_IPX 256#define SOL_AX25 257#define SOL_ATALK 258#define SOL_NETROM 259#define SOL_ROSE 260#define SOL_DECNET 261#define SOL_X25 262#define SOL_PACKET 263#define SOL_ATM 264#define SOL_AAL 265#define SOL_IRDA 266#define SOL_NETBEUI 267#define SOL_LLC 268#define SOL_DCCP 269#define SOL_NETLINK 270#define SOL_TIPC 271#define IPX_TYPE 1#ifdef __i386__# define __socketcall extern __attribute__((__cdecl__))#else# define __socketcall extern#endif__socketcall int accept(int, struct sockaddr*, socklen_t*);__socketcall int accept4(int, struct sockaddr*, socklen_t*, int);__socketcall int bind(int, const struct sockaddr*, int);__socketcall int connect(int, const struct sockaddr*, socklen_t);__socketcall int getpeername(int, struct sockaddr*, socklen_t*);__socketcall int getsockname(int, struct sockaddr*, socklen_t*);__socketcall int getsockopt(int, int, int, void*, socklen_t*);__socketcall int listen(int, int);__socketcall int recvmmsg(int, struct mmsghdr*, unsigned int, int, const struct timespec*);__socketcall int recvmsg(int, struct msghdr*, int);__socketcall int sendmmsg(int, const struct mmsghdr*, unsigned int, int);__socketcall int sendmsg(int, const struct msghdr*, int);__socketcall int setsockopt(int, int, int, const void*, socklen_t);__socketcall int shutdown(int, int);__socketcall int socket(int, int, int);__socketcall int socketpair(int, int, int, int*);extern ssize_t send(int, const void*, size_t, int);extern ssize_t recv(int, void*, size_t, int);__socketcall ssize_t sendto(int, const void*, size_t, int, const struct sockaddr*, socklen_t);__socketcall ssize_t recvfrom(int, void*, size_t, int, const struct sockaddr*, socklen_t*);__errordecl(__recvfrom_error, "recvfrom called with size bigger than buffer");extern ssize_t __recvfrom_chk(int, void*, size_t, size_t, int, const struct sockaddr*, socklen_t*);extern ssize_t __recvfrom_real(int, void*, size_t, int, const struct sockaddr*, socklen_t*) __RENAME(recvfrom);#if defined(__BIONIC_FORTIFY)__BIONIC_FORTIFY_INLINEssize_t recvfrom(int fd, void* buf, size_t len, int flags, const struct sockaddr* src_addr, socklen_t* addr_len) { size_t bos = __bos0(buf);#if !defined(__clang__) if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { return __recvfrom_real(fd, buf, len, flags, src_addr, addr_len); } if (__builtin_constant_p(len) && (len <= bos)) { return __recvfrom_real(fd, buf, len, flags, src_addr, addr_len); } if (__builtin_constant_p(len) && (len > bos)) { __recvfrom_error(); }#endif return __recvfrom_chk(fd, buf, len, bos, flags, src_addr, addr_len);}__BIONIC_FORTIFY_INLINEssize_t recv(int socket, void* buf, size_t len, int flags) { return recvfrom(socket, buf, len, flags, NULL, 0);}#endif /* __BIONIC_FORTIFY */#undef __socketcall__END_DECLS#endif /* _SYS_SOCKET_H */
bionic\libc\bionic\socket.cpp
#include "private/NetdClientDispatch.h"#include <sys/socket.h>int socket(int domain, int type, int protocol) { return __netdClientDispatch.socket(domain, type, protocol);}
bionic\libc\bionic\send.cpp
#include <sys/socket.h>ssize_t send(int socket, const void* buf, size_t len, int flags) { return sendto(socket, buf, len, flags, NULL, 0);//注释1}
bionic\libc\bionic\recv.cpp
#undef _FORTIFY_SOURCE#include <sys/socket.h>ssize_t recv(int socket, void *buf, size_t len, int flags) { return recvfrom(socket, buf, len, flags, NULL, 0);}
bionic\libc\bionic\connect.cpp
#include "private/NetdClientDispatch.h"#include <sys/socket.h>int connect(int sockfd, const sockaddr* addr, socklen_t addrlen) { return __netdClientDispatch.connect(sockfd, addr, addrlen);}
bionic\libc\bionic\bindresvport.c
#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <string.h>#include <unistd.h>#define START_PORT600#define END_PORTIPPORT_RESERVED#define NUM_PORTS(END_PORT - START_PORT)int bindresvport(int sd, struct sockaddr_in *sin){ static short port; struct sockaddr_in sin0; int nn, ret; if (sin == NULL) { sin = &sin0; memset( sin, 0, sizeof *sin ); sin->sin_family = AF_INET; } else if (sin->sin_family != AF_INET) { errno = EPFNOSUPPORT; return -1; } if (port == 0) { port = START_PORT + (getpid() % NUM_PORTS); } for (nn = NUM_PORTS; nn > 0; nn--, port++) { if (port == END_PORT) port = START_PORT; sin->sin_port = htons(port); do { ret = bind(sd, (struct sockaddr*)sin, sizeof(*sin)); } while (ret < 0 && errno == EINTR); if (!ret) break; } return ret;}
bionic\libc\bionic\accept.cpp
#include <sys/socket.h>int accept(int sockfd, sockaddr* addr, socklen_t* addrlen) { return accept4(sockfd, addr, addrlen, 0);}
bionic\libc\bionic\accept4.cpp
#include "private/NetdClientDispatch.h"#include <sys/socket.h>int accept4(int sockfd, sockaddr* addr, socklen_t* addrlen, int flags) { return __netdClientDispatch.accept4(sockfd, addr, addrlen, flags);}
注释1:sendto方法
External\chromium_org\native_client_sdk\src\libraries\nacl_io\syscalls\socket\sendto.c
#include "nacl_io/kernel_intercept.h"#include "nacl_io/kernel_wrap.h"#if defined(PROVIDES_SOCKET_API) && !defined(__GLIBC__)ssize_t sendto(int fd, const void* buf, size_t len, int flags, const struct sockaddr* addr, socklen_t addrlen) { return ki_sendto(fd, buf, len, flags, addr, addrlen);}#endif
系统调用
External\chromium_org\native_client_sdk\src\libraries\nacl_io\kernel_intercept.cc 483行
#include "nacl_io/kernel_intercept.h"#include <assert.h>#include <errno.h>#include <string.h>#include "nacl_io/kernel_proxy.h"#include "nacl_io/kernel_wrap.h"#include "nacl_io/kernel_wrap_real.h"#include "nacl_io/log.h"#include "nacl_io/osmman.h"#include "nacl_io/ossocket.h"#include "nacl_io/ostime.h"#include "nacl_io/pepper_interface.h"#include "nacl_io/real_pepper_interface.h"using namespace nacl_io;#define ON_NOSYS_RETURN(x) \ if (!ki_is_initialized()) { \ errno = ENOSYS; \ return x; \ }struct KernelInterceptState { KernelProxy* kp; PepperInterface* ppapi; bool kp_owned;};static KernelInterceptState s_state;// The the test code we want to be able to save the previous kernel// proxy when intialising and restore it on uninit.static KernelInterceptState s_saved_state;int ki_push_state_for_testing() { assert(s_saved_state.kp == NULL); if (s_saved_state.kp != NULL) return 1; s_saved_state = s_state; s_state.kp = NULL; s_state.ppapi = NULL; s_state.kp_owned = false; return 0;}static void ki_pop_state() { // Swap out the KernelProxy. This will normally reset the // proxy to NULL, aside from in test code that has called // ki_push_state_for_testing(). s_state = s_saved_state; s_saved_state.kp = NULL; s_saved_state.ppapi = NULL; s_saved_state.kp_owned = false;}int ki_pop_state_for_testing() { ki_pop_state(); return 0;}int ki_init(void* kp) { LOG_TRACE("ki_init: %p", kp); return ki_init_ppapi(kp, 0, NULL);}int ki_init_ppapi(void* kp, PP_Instance instance, PPB_GetInterface get_browser_interface) { assert(!s_state.kp); if (s_state.kp != NULL) return 1; PepperInterface* ppapi = NULL; if (instance && get_browser_interface) { ppapi = new RealPepperInterface(instance, get_browser_interface); s_state.ppapi = ppapi; } int rtn = ki_init_interface(kp, ppapi); return rtn;}int ki_init_interface(void* kp, void* pepper_interface) { LOG_TRACE("ki_init_interface: %p %p", kp, pepper_interface); assert(!s_state.kp); if (s_state.kp != NULL) return 1; PepperInterface* ppapi = static_cast<PepperInterface*>(pepper_interface); kernel_wrap_init(); if (kp == NULL) { s_state.kp = new KernelProxy(); s_state.kp_owned = true; } else { s_state.kp = static_cast<KernelProxy*>(kp); s_state.kp_owned = false; } if (s_state.kp->Init(ppapi) != 0) return 1; return 0;}int ki_is_initialized() { return s_state.kp != NULL;}int ki_uninit() { LOG_TRACE("ki_uninit"); assert(s_state.kp); if (s_state.kp == NULL) return 1; if (s_saved_state.kp == NULL) kernel_wrap_uninit(); // If we are going to delete the KernelProxy don't do it // until we've swapped it out. KernelInterceptState state_to_delete = s_state; ki_pop_state(); if (state_to_delete.kp_owned) delete state_to_delete.kp; delete state_to_delete.ppapi; return 0;}nacl_io::KernelProxy* ki_get_proxy() { return s_state.kp;}int ki_chdir(const char* path) { ON_NOSYS_RETURN(-1); return s_state.kp->chdir(path);}void ki_exit(int status) { if (ki_is_initialized()) s_state.kp->exit(status); _real_exit(status);}char* ki_getcwd(char* buf, size_t size) { // gtest uses getcwd in a static initializer and expects it to always // succeed. If we haven't initialized kernel-intercept yet, then try // the IRT's getcwd, and fall back to just returning ".". if (!ki_is_initialized()) { int rtn = _real_getcwd(buf, size); if (rtn != 0) { if (rtn == ENOSYS) { buf[0] = '.'; buf[1] = 0; } else { errno = rtn; return NULL; } } return buf; } return s_state.kp->getcwd(buf, size);}char* ki_getwd(char* buf) { ON_NOSYS_RETURN(NULL); return s_state.kp->getwd(buf);}int ki_dup(int oldfd) { ON_NOSYS_RETURN(-1); return s_state.kp->dup(oldfd);}int ki_dup2(int oldfd, int newfd) { ON_NOSYS_RETURN(-1); return s_state.kp->dup2(oldfd, newfd);}int ki_chmod(const char* path, mode_t mode) { ON_NOSYS_RETURN(-1); return s_state.kp->chmod(path, mode);}int ki_fchdir(int fd) { ON_NOSYS_RETURN(-1); return s_state.kp->fchdir(fd);}int ki_fchmod(int fd, mode_t mode) { ON_NOSYS_RETURN(-1); return s_state.kp->fchmod(fd, mode);}int ki_stat(const char* path, struct stat* buf) { ON_NOSYS_RETURN(-1); return s_state.kp->stat(path, buf);}int ki_mkdir(const char* path, mode_t mode) { ON_NOSYS_RETURN(-1); return s_state.kp->mkdir(path, mode);}int ki_rmdir(const char* path) { ON_NOSYS_RETURN(-1); return s_state.kp->rmdir(path);}int ki_mount(const char* source, const char* target, const char* filesystemtype, unsigned long mountflags, const void* data) { ON_NOSYS_RETURN(-1); return s_state.kp->mount(source, target, filesystemtype, mountflags, data);}int ki_umount(const char* path) { ON_NOSYS_RETURN(-1); return s_state.kp->umount(path);}int ki_open(const char* path, int oflag, mode_t mode) { ON_NOSYS_RETURN(-1); return s_state.kp->open(path, oflag, mode);}int ki_pipe(int pipefds[2]) { ON_NOSYS_RETURN(-1); return s_state.kp->pipe(pipefds);}ssize_t ki_read(int fd, void* buf, size_t nbyte) { ON_NOSYS_RETURN(-1); return s_state.kp->read(fd, buf, nbyte);}ssize_t ki_write(int fd, const void* buf, size_t nbyte) { ON_NOSYS_RETURN(-1); return s_state.kp->write(fd, buf, nbyte);}int ki_fstat(int fd, struct stat* buf) { ON_NOSYS_RETURN(-1); return s_state.kp->fstat(fd, buf);}int ki_getdents(int fd, void* buf, unsigned int count) { ON_NOSYS_RETURN(-1); return s_state.kp->getdents(fd, buf, count);}int ki_ftruncate(int fd, off_t length) { ON_NOSYS_RETURN(-1); return s_state.kp->ftruncate(fd, length);}int ki_fsync(int fd) { ON_NOSYS_RETURN(-1); return s_state.kp->fsync(fd);}int ki_fdatasync(int fd) { ON_NOSYS_RETURN(-1); return s_state.kp->fdatasync(fd);}int ki_isatty(int fd) { ON_NOSYS_RETURN(0); return s_state.kp->isatty(fd);}int ki_close(int fd) { ON_NOSYS_RETURN(-1); return s_state.kp->close(fd);}off_t ki_lseek(int fd, off_t offset, int whence) { ON_NOSYS_RETURN(-1); return s_state.kp->lseek(fd, offset, whence);}int ki_remove(const char* path) { ON_NOSYS_RETURN(-1); return s_state.kp->remove(path);}int ki_unlink(const char* path) { ON_NOSYS_RETURN(-1); return s_state.kp->unlink(path);}int ki_truncate(const char* path, off_t length) { ON_NOSYS_RETURN(-1); return s_state.kp->truncate(path, length);}int ki_lstat(const char* path, struct stat* buf) { ON_NOSYS_RETURN(-1); return s_state.kp->lstat(path, buf);}int ki_link(const char* oldpath, const char* newpath) { ON_NOSYS_RETURN(-1); return s_state.kp->link(oldpath, newpath);}int ki_rename(const char* path, const char* newpath) { ON_NOSYS_RETURN(-1); return s_state.kp->rename(path, newpath);}int ki_symlink(const char* oldpath, const char* newpath) { ON_NOSYS_RETURN(-1); return s_state.kp->symlink(oldpath, newpath);}int ki_access(const char* path, int amode) { ON_NOSYS_RETURN(-1); return s_state.kp->access(path, amode);}int ki_readlink(const char* path, char* buf, size_t count) { ON_NOSYS_RETURN(-1); return s_state.kp->readlink(path, buf, count);}int ki_utimes(const char* path, const struct timeval times[2]) { ON_NOSYS_RETURN(-1); // Implement in terms of utimens. struct timespec ts[2]; ts[0].tv_sec = times[0].tv_sec; ts[0].tv_nsec = times[0].tv_usec * 1000; ts[1].tv_sec = times[1].tv_sec; ts[1].tv_nsec = times[1].tv_usec * 1000; return s_state.kp->utimens(path, ts);}int ki_futimes(int fd, const struct timeval times[2]) { ON_NOSYS_RETURN(-1); // Implement in terms of futimens. struct timespec ts[2]; ts[0].tv_sec = times[0].tv_sec; ts[0].tv_nsec = times[0].tv_usec * 1000; ts[1].tv_sec = times[1].tv_sec; ts[1].tv_nsec = times[1].tv_usec * 1000; return s_state.kp->futimens(fd, ts);}void* ki_mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) { ON_NOSYS_RETURN(MAP_FAILED); return s_state.kp->mmap(addr, length, prot, flags, fd, offset);}int ki_munmap(void* addr, size_t length) { ON_NOSYS_RETURN(-1); return s_state.kp->munmap(addr, length);}int ki_open_resource(const char* file) { ON_NOSYS_RETURN(-1); return s_state.kp->open_resource(file);}int ki_fcntl(int d, int request, va_list args) { ON_NOSYS_RETURN(-1); return s_state.kp->fcntl(d, request, args);}int ki_ioctl(int d, int request, va_list args) { ON_NOSYS_RETURN(-1); return s_state.kp->ioctl(d, request, args);}int ki_chown(const char* path, uid_t owner, gid_t group) { ON_NOSYS_RETURN(-1); return s_state.kp->chown(path, owner, group);}int ki_fchown(int fd, uid_t owner, gid_t group) { ON_NOSYS_RETURN(-1); return s_state.kp->fchown(fd, owner, group);}int ki_lchown(const char* path, uid_t owner, gid_t group) { ON_NOSYS_RETURN(-1); return s_state.kp->lchown(path, owner, group);}int ki_utime(const char* filename, const struct utimbuf* times) { ON_NOSYS_RETURN(-1); // Implement in terms of utimens. struct timespec ts[2]; ts[0].tv_sec = times->actime; ts[0].tv_nsec = 0; ts[1].tv_sec = times->modtime; ts[1].tv_nsec = 0; return s_state.kp->utimens(filename, ts);}int ki_futimens(int fd, const struct timespec times[2]) { ON_NOSYS_RETURN(-1); return s_state.kp->futimens(fd, times);}int ki_poll(struct pollfd* fds, nfds_t nfds, int timeout) { return s_state.kp->poll(fds, nfds, timeout);}int ki_select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout) { return s_state.kp->select(nfds, readfds, writefds, exceptfds, timeout);}int ki_tcflush(int fd, int queue_selector) { ON_NOSYS_RETURN(-1); return s_state.kp->tcflush(fd, queue_selector);}int ki_tcgetattr(int fd, struct termios* termios_p) { ON_NOSYS_RETURN(-1); return s_state.kp->tcgetattr(fd, termios_p);}int ki_tcsetattr(int fd, int optional_actions, const struct termios* termios_p) { ON_NOSYS_RETURN(-1); return s_state.kp->tcsetattr(fd, optional_actions, termios_p);}int ki_kill(pid_t pid, int sig) { ON_NOSYS_RETURN(-1); return s_state.kp->kill(pid, sig);}int ki_killpg(pid_t pid, int sig) { errno = ENOSYS; return -1;}int ki_sigaction(int signum, const struct sigaction* action, struct sigaction* oaction) { ON_NOSYS_RETURN(-1); return s_state.kp->sigaction(signum, action, oaction);}int ki_sigpause(int sigmask) { errno = ENOSYS; return -1;}int ki_sigpending(sigset_t* set) { errno = ENOSYS; return -1;}int ki_sigsuspend(const sigset_t* set) { errno = ENOSYS; return -1;}sighandler_t ki_signal(int signum, sighandler_t handler) { return ki_sigset(signum, handler);}sighandler_t ki_sigset(int signum, sighandler_t handler) { ON_NOSYS_RETURN(SIG_ERR); // Implement sigset(2) in terms of sigaction(2). struct sigaction action; struct sigaction oaction; memset(&action, 0, sizeof(action)); memset(&oaction, 0, sizeof(oaction)); action.sa_handler = handler; int rtn = s_state.kp->sigaction(signum, &action, &oaction); if (rtn) return SIG_ERR; return oaction.sa_handler;}#ifdef PROVIDES_SOCKET_API// Socket Functionsint ki_accept(int fd, struct sockaddr* addr, socklen_t* len) { ON_NOSYS_RETURN(-1); return s_state.kp->accept(fd, addr, len);}int ki_bind(int fd, const struct sockaddr* addr, socklen_t len) { ON_NOSYS_RETURN(-1); return s_state.kp->bind(fd, addr, len);}int ki_connect(int fd, const struct sockaddr* addr, socklen_t len) { ON_NOSYS_RETURN(-1); return s_state.kp->connect(fd, addr, len);}struct hostent* ki_gethostbyname(const char* name) { ON_NOSYS_RETURN(NULL); return s_state.kp->gethostbyname(name);}int ki_getnameinfo(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, unsigned int flags) { ON_NOSYS_RETURN(EAI_SYSTEM); return s_state.kp->getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);}int ki_getaddrinfo(const char* node, const char* service, const struct addrinfo* hints, struct addrinfo** res) { ON_NOSYS_RETURN(EAI_SYSTEM); return s_state.kp->getaddrinfo(node, service, hints, res);}void ki_freeaddrinfo(struct addrinfo* res) { s_state.kp->freeaddrinfo(res);}int ki_getpeername(int fd, struct sockaddr* addr, socklen_t* len) { ON_NOSYS_RETURN(-1); return s_state.kp->getpeername(fd, addr, len);}int ki_getsockname(int fd, struct sockaddr* addr, socklen_t* len) { ON_NOSYS_RETURN(-1); return s_state.kp->getsockname(fd, addr, len);}int ki_getsockopt(int fd, int lvl, int optname, void* optval, socklen_t* len) { ON_NOSYS_RETURN(-1); return s_state.kp->getsockopt(fd, lvl, optname, optval, len);}int ki_listen(int fd, int backlog) { ON_NOSYS_RETURN(-1); return s_state.kp->listen(fd, backlog);}ssize_t ki_recv(int fd, void* buf, size_t len, int flags) { ON_NOSYS_RETURN(-1); return s_state.kp->recv(fd, buf, len, flags);}ssize_t ki_recvfrom(int fd, void* buf, size_t len, int flags, struct sockaddr* addr, socklen_t* addrlen) { ON_NOSYS_RETURN(-1); return s_state.kp->recvfrom(fd, buf, len, flags, addr, addrlen);}ssize_t ki_recvmsg(int fd, struct msghdr* msg, int flags) { ON_NOSYS_RETURN(-1); return s_state.kp->recvmsg(fd, msg, flags);}ssize_t ki_send(int fd, const void* buf, size_t len, int flags) { ON_NOSYS_RETURN(-1); return s_state.kp->send(fd, buf, len, flags);}ssize_t ki_sendto(int fd, const void* buf, size_t len, int flags, const struct sockaddr* addr, socklen_t addrlen) { ON_NOSYS_RETURN(-1); return s_state.kp->sendto(fd, buf, len, flags, addr, addrlen);}ssize_t ki_sendmsg(int fd, const struct msghdr* msg, int flags) { ON_NOSYS_RETURN(-1); return s_state.kp->sendmsg(fd, msg, flags);}int ki_setsockopt(int fd, int lvl, int optname, const void* optval, socklen_t len) { ON_NOSYS_RETURN(-1); return s_state.kp->setsockopt(fd, lvl, optname, optval, len);}int ki_shutdown(int fd, int how) { ON_NOSYS_RETURN(-1); return s_state.kp->shutdown(fd, how);}int ki_socket(int domain, int type, int protocol) { ON_NOSYS_RETURN(-1); return s_state.kp->socket(domain, type, protocol);}int ki_socketpair(int domain, int type, int protocol, int* sv) { ON_NOSYS_RETURN(-1); return s_state.kp->socketpair(domain, type, protocol, sv);}#endif // PROVIDES_SOCKET_API
阅读全文
0 0
- socket的实现,安卓系统AOSP源码
- C语言实现hashmap,安卓系统AOSP源码
- NativeCrashListener,安卓系统AOSP源码
- Android.mk,安卓系统AOSP源码
- 安卓系统AOSP手记
- AOSP 安卓源码-开发工具
- AOSP 安卓源码6.0编译-模拟器运行
- AOSP 安卓源码7.1编译-真机运行
- AOSP 安卓源码-ubuntu开发环境搭建
- 安卓官方原生系统与AOSP区别
- 用repo从清华开源镜像站同步安卓最新AOSP源码(ubuntu平台)
- 安卓地图的实现附源码
- 动手实现Android源码(AOSP)的下载、编译、运行、导入、调试
- 一个简单的安卓socket程序为什么不能实现
- 安卓系统的启动流程(源码分析)
- 安卓各个版本系统的源码github下载地址
- 安卓系统学习--获取Google安卓系统源码
- AOSP 安卓7.1 ubuntu17.04编译问题
- 【51nod】1080 两个数的平方和
- 这可能是最好的RxJava 2.x 入门教程(五)
- 释放技术的想象-解码腾讯云软件架构与应用
- 一些简单的小程序_2——C语言篇
- Windows_Postgresql相关错误处理
- socket的实现,安卓系统AOSP源码
- Mybatis批量修改mysql犯的两个错Query was empty和
- Dubbo调度机制解析(cluster扩展或者路由扩展)
- Android题目笔记(六)
- 6.13
- (10)映射继承关系一之继承关系都映射在一张表中(@Inheritance(strategy=InheritanceType.SINGLE_TABLE))
- ios-音乐播放器的简单实现
- Python模块matlotlib之pylot.plot()
- Qt编写自定义控件及插件的使用