| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- /*
- * 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"
- int
- Accept(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);
- }
- void
- Bind(int fd, const struct sockaddr *sa, socklen_t salen)
- {
- if (bind(fd, sa, salen) < 0)
- err_sys("bind error");
- }
- void
- Connect(int fd, const struct sockaddr *sa, socklen_t salen)
- {
- if (connect(fd, sa, salen) < 0)
- err_sys("connect error");
- }
- void
- Getpeername(int fd, struct sockaddr *sa, socklen_t *salenptr)
- {
- if (getpeername(fd, sa, salenptr) < 0)
- err_sys("getpeername error");
- }
- void
- Getsockname(int fd, struct sockaddr *sa, socklen_t *salenptr)
- {
- if (getsockname(fd, sa, salenptr) < 0)
- err_sys("getsockname error");
- }
- void
- Getsockopt(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_INIT
- int
- Inet6_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;
- }
- void
- Inet6_rth_add(void *rthbuf, const struct in6_addr *addr)
- {
- if (inet6_rth_add(rthbuf, addr) < 0)
- err_quit("inet6_rth_add error");
- }
- void
- Inet6_rth_reverse(const void *in, void *out)
- {
- if (inet6_rth_reverse(in, out) < 0)
- err_quit("inet6_rth_reverse error");
- }
- int
- Inet6_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_KQUEUE
- int
- Kqueue(void)
- {
- int ret;
- if ((ret = kqueue()) < 0)
- err_sys("kqueue error");
- return ret;
- }
- int
- Kevent(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 */
- void
- Listen(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_POLL
- int
- Poll(struct pollfd *fdarray, unsigned long nfds, int timeout)
- {
- int n;
- if ( (n = poll(fdarray, nfds, timeout)) < 0)
- err_sys("poll error");
- return(n);
- }
- #endif
- ssize_t
- Recv(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_t
- Recvfrom(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_t
- Recvmsg(int fd, struct msghdr *msg, int flags)
- {
- ssize_t n;
- if ( (n = recvmsg(fd, msg, flags)) < 0)
- err_sys("recvmsg error");
- return(n);
- }
- int
- Select(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 */
- }
- void
- Send(int fd, const void *ptr, size_t nbytes, int flags)
- {
- if (send(fd, ptr, nbytes, flags) != (ssize_t)nbytes)
- err_sys("send error");
- }
- void
- Sendto(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");
- }
- void
- Sendmsg(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");
- }
- void
- Setsockopt(int fd, int level, int optname, const void *optval, socklen_t optlen)
- {
- if (setsockopt(fd, level, optname, optval, optlen) < 0)
- err_sys("setsockopt error");
- }
- void
- Shutdown(int fd, int how)
- {
- if (shutdown(fd, how) < 0)
- err_sys("shutdown error");
- }
- int
- Sockatmark(int fd)
- {
- int n;
- if ( (n = sockatmark(fd)) < 0)
- err_sys("sockatmark error");
- return(n);
- }
- /* include Socket */
- int
- Socket(int family, int type, int protocol)
- {
- int n;
- if ( (n = socket(family, type, protocol)) < 0)
- err_sys("socket error");
- return(n);
- }
- /* end Socket */
- void
- Socketpair(int family, int type, int protocol, int *fd)
- {
- int n;
- if ( (n = socketpair(family, type, protocol, fd)) < 0)
- err_sys("socketpair error");
- }
|