int xconnect(const char *peer) { int fd; int pf = sockaddr_pf(peer); char sockaddr[TP_SOCKADDRLEN] = {}; if (pf < 0 || sockaddr_addr(peer, sockaddr, sizeof(sockaddr)) != 0) { errno = EINVAL; return -1; } if ((fd = xsocket(pf, XCONNECTOR)) < 0) return -1; if (xbind(fd, sockaddr) < 0) { xclose(fd); return -1; } return fd; }
static int tcp_accept(iodev_t *dev, int fd, struct sockaddr *addr) { char paddr[64]; iodev_notify("accepted connection from %s on fd=%d", inet_ntop(addr->sa_family, sockaddr_addr(addr), paddr, sizeof(paddr)), fd); iodev_setstate(dev, IODEV_OPEN); dev->fd = fd; // set non-blocking int opts = fcntl(dev->fd, F_GETFL); if (opts < 0) iodev_error("fcntl(%d, F_GETFL) error(%d): %s", dev->fd, errno, strerror(errno)); else { opts |= O_NONBLOCK; if (fcntl(dev->fd, F_SETFL, opts) < 0) iodev_error("fcntl(%d, F_SETFL) error(%d): %s", dev->fd, errno, strerror(errno)); } iodev_setstate(dev, IODEV_CONNECTED); return fd; }