typedef struct pk {
struct pk *next; /* Next packet in the chain */
octet *p, *o; /* Buffer start and current posn */
typedef struct pk {
struct pk *next; /* Next packet in the chain */
octet *p, *o; /* Buffer start and current posn */
unsigned f; /* Various flags */
#define cwf_port 1u /* Port is defined => listen */
sel_file a; /* Selector */
unsigned f; /* Various flags */
#define cwf_port 1u /* Port is defined => listen */
sel_file a; /* Selector */
static int cloexec(int fd)
{ return (fdflags(fd, 0, 0, FD_CLOEXEC, FD_CLOEXEC)); }
static int cloexec(int fd)
{ return (fdflags(fd, 0, 0, FD_CLOEXEC, FD_CLOEXEC)); }
if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) return;
moan("couldn't accept incoming connection: %s", strerror(errno));
return;
}
if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) return;
moan("couldn't accept incoming connection: %s", strerror(errno));
return;
}
- if (cw.peer.sin_addr.s_addr != INADDR_ANY &&
- cw.peer.sin_addr.s_addr != sin.sin_addr.s_addr) {
- moan("rejecting connection from %s", inet_ntoa(sin.sin_addr));
+ if (cw.peer.sin.sin_addr.s_addr != INADDR_ANY &&
+ cw.peer.sin.sin_addr.s_addr != a.sin.sin_addr.s_addr) {
+ moan("rejecting connection from %s", inet_ntoa(a.sin.sin_addr));
if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0 ||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) ||
if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0 ||
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) ||
listen(fd, 1) || nonblockify(fd) || cloexec(fd))
die(1, "couldn't set up listening socket: %s", strerror(errno));
sel_initfile(&sel, &cw.a, fd, SEL_READ, doaccept, 0);
listen(fd, 1) || nonblockify(fd) || cloexec(fd))
die(1, "couldn't set up listening socket: %s", strerror(errno));
sel_initfile(&sel, &cw.a, fd, SEL_READ, doaccept, 0);
-static void parseaddr(const char *host, const char *svc, unsigned f,
- struct sockaddr_in *sin)
+static void parseaddr(const char *host, const char *svc, unsigned f, addr *a)
parseaddr(connhost, 0, paf_parse, &tmpaddr);
if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ||
(bindhost &&
parseaddr(connhost, 0, paf_parse, &tmpaddr);
if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ||
(bindhost &&
- bind(fd, (struct sockaddr *)&bindaddr, sizeof(bindaddr))) ||
- connect(fd, (struct sockaddr *)&tmpaddr, sizeof(tmpaddr)))
+ bind(fd, &bindaddr.sa, sizeof(bindaddr.sin))) ||
+ connect(fd, &tmpaddr.sa, sizeof(tmpaddr.sin)))
die(1, "couldn't connect to TCP server: %s", strerror(errno));
if (nonblockify(fd) || cloexec(fd))
die(1, "couldn't connect to TCP server: %s", strerror(errno));
die(1, "couldn't connect to TCP server: %s", strerror(errno));
if (nonblockify(fd) || cloexec(fd))
die(1, "couldn't connect to TCP server: %s", strerror(errno));
nonblockify(fd_udp) || cloexec(fd_udp) ||
setsockopt(fd_udp, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len)) ||
setsockopt(fd_udp, SOL_SOCKET, SO_SNDBUF, &len, sizeof(len)) ||
nonblockify(fd_udp) || cloexec(fd_udp) ||
setsockopt(fd_udp, SOL_SOCKET, SO_RCVBUF, &len, sizeof(len)) ||
setsockopt(fd_udp, SOL_SOCKET, SO_SNDBUF, &len, sizeof(len)) ||
die(1, "couldn't set up UDP socket: %s", strerror(errno));
initaddr(&tmpaddr);
parseaddr(argv[optind + 1], 0, paf_parse, &tmpaddr);
die(1, "couldn't set up UDP socket: %s", strerror(errno));
initaddr(&tmpaddr);
parseaddr(argv[optind + 1], 0, paf_parse, &tmpaddr);