📄 wrapsock.c
字号:
/* * Socket wrapper functions. * These could all go into separate files, so only the ones needed cause * the corresponding function to be added to the executable. If sockets * are a library (SVR4) this might make a difference (?), but if sockets * are in the kernel (BSD) it doesn't matter. * * These wrapper functions also use the same prototypes as POSIX.1g, * which might differ from many implementations (i.e., POSIX.1g specifies * the fourth argument to getsockopt() as "void *", not "char *"). * * If your system's headers are not correct [i.e., the Solaris 2.5 * <sys/socket.h> omits the "const" from the second argument to both * bind() and connect()], you'll get warnings of the form: *warning: passing arg 2 of `bind' discards `const' from pointer target type *warning: passing arg 2 of `connect' discards `const' from pointer target type */#include "unp.h"intAccept(int fd, struct sockaddr *sa, socklen_t *salenptr){ int n;again: if ( (n = accept(fd, sa, salenptr)) < 0) {#ifdef EPROTO if (errno == EPROTO || errno == ECONNABORTED)#else if (errno == ECONNABORTED)#endif goto again; else err_sys("accept error"); } return(n);}voidBind(int fd, const struct sockaddr *sa, socklen_t salen){ if (bind(fd, sa, salen) < 0) err_sys("bind error");}voidConnect(int fd, const struct sockaddr *sa, socklen_t salen){ if (connect(fd, sa, salen) < 0) err_sys("connect error");}voidGetpeername(int fd, struct sockaddr *sa, socklen_t *salenptr){ if (getpeername(fd, sa, salenptr) < 0) err_sys("getpeername error");}voidGetsockname(int fd, struct sockaddr *sa, socklen_t *salenptr){ if (getsockname(fd, sa, salenptr) < 0) err_sys("getsockname error");}voidGetsockopt(int fd, int level, int optname, void *optval, socklen_t *optlenptr){ if (getsockopt(fd, level, optname, optval, optlenptr) < 0) err_sys("getsockopt error");}#ifdef HAVE_INET6_RTH_INITintInet6_rth_space(int type, int segments){ int ret; ret = inet6_rth_space(type, segments); if (ret < 0) err_quit("inet6_rth_space error"); return ret;}void *Inet6_rth_init(void *rthbuf, socklen_t rthlen, int type, int segments){ void *ret; ret = inet6_rth_init(rthbuf, rthlen, type, segments); if (ret == NULL) err_quit("inet6_rth_init error"); return ret;}voidInet6_rth_add(void *rthbuf, const struct in6_addr *addr){ if (inet6_rth_add(rthbuf, addr) < 0) err_quit("inet6_rth_add error");}voidInet6_rth_reverse(const void *in, void *out){ if (inet6_rth_reverse(in, out) < 0) err_quit("inet6_rth_reverse error");}intInet6_rth_segments(const void *rthbuf){ int ret; ret = inet6_rth_segments(rthbuf); if (ret < 0) err_quit("inet6_rth_segments error"); return ret;}struct in6_addr *Inet6_rth_getaddr(const void *rthbuf, int idx){ struct in6_addr *ret; ret = inet6_rth_getaddr(rthbuf, idx); if (ret == NULL) err_quit("inet6_rth_getaddr error"); return ret;}#endif#ifdef HAVE_KQUEUEintKqueue(void){ int ret; if ((ret = kqueue()) < 0) err_sys("kqueue error"); return ret;}intKevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout){ int ret; if ((ret = kevent(kq, changelist, nchanges, eventlist, nevents, timeout)) < 0) err_sys("kevent error"); return ret;}#endif/* include Listen */voidListen(int fd, int backlog){ char *ptr; /*4can override 2nd argument with environment variable */ if ( (ptr = getenv("LISTENQ")) != NULL) backlog = atoi(ptr); if (listen(fd, backlog) < 0) err_sys("listen error");}/* end Listen */#ifdef HAVE_POLLintPoll(struct pollfd *fdarray, unsigned long nfds, int timeout){ int n; if ( (n = poll(fdarray, nfds, timeout)) < 0) err_sys("poll error"); return(n);}#endifssize_tRecv(int fd, void *ptr, size_t nbytes, int flags){ ssize_t n; if ( (n = recv(fd, ptr, nbytes, flags)) < 0) err_sys("recv error"); return(n);}ssize_tRecvfrom(int fd, void *ptr, size_t nbytes, int flags, struct sockaddr *sa, socklen_t *salenptr){ ssize_t n; if ( (n = recvfrom(fd, ptr, nbytes, flags, sa, salenptr)) < 0) err_sys("recvfrom error"); return(n);}ssize_tRecvmsg(int fd, struct msghdr *msg, int flags){ ssize_t n; if ( (n = recvmsg(fd, msg, flags)) < 0) err_sys("recvmsg error"); return(n);}intSelect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout){ int n; if ( (n = select(nfds, readfds, writefds, exceptfds, timeout)) < 0) err_sys("select error"); return(n); /* can return 0 on timeout */}voidSend(int fd, const void *ptr, size_t nbytes, int flags){ if (send(fd, ptr, nbytes, flags) != (ssize_t)nbytes) err_sys("send error");}voidSendto(int fd, const void *ptr, size_t nbytes, int flags, const struct sockaddr *sa, socklen_t salen){ if (sendto(fd, ptr, nbytes, flags, sa, salen) != (ssize_t)nbytes) err_sys("sendto error");}voidSendmsg(int fd, const struct msghdr *msg, int flags){ unsigned int i; ssize_t nbytes; nbytes = 0; /* must first figure out what return value should be */ for (i = 0; i < msg->msg_iovlen; i++) nbytes += msg->msg_iov[i].iov_len; if (sendmsg(fd, msg, flags) != nbytes) err_sys("sendmsg error");}voidSetsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen){ if (setsockopt(fd, level, optname, optval, optlen) < 0) err_sys("setsockopt error");}voidShutdown(int fd, int how){ if (shutdown(fd, how) < 0) err_sys("shutdown error");}intSockatmark(int fd){ int n; if ( (n = sockatmark(fd)) < 0) err_sys("sockatmark error"); return(n);}/* include Socket */intSocket(int family, int type, int protocol){ int n; if ( (n = socket(family, type, protocol)) < 0) err_sys("socket error"); return(n);}/* end Socket */voidSocketpair(int family, int type, int protocol, int *fd){ int n; if ( (n = socketpair(family, type, protocol, fd)) < 0) err_sys("socketpair error");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -