Hi,
It is easier to write race free tests if netcat reports when the
listen system call has finished. This avoids ugly kernel lookups
with fstat. Just report bind or listen like accepted connections
in verbose mode to stderr. Then the other end can proceed.
ok?
Index: usr.bin/nc/netcat.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/usr.bin/nc/netcat.c,v
retrieving revision 1.197
diff -u -p -r1.197 netcat.c
--- usr.bin/nc/netcat.c 6 Nov 2018 20:39:19 -0000 1.197
+++ usr.bin/nc/netcat.c 8 Nov 2018 21:06:30 -0000
@@ -137,7 +137,7 @@ void set_common_sockopts(int, int);
int process_tos_opt(char *, int *);
int process_tls_opt(char *, int *);
void save_peer_cert(struct tls *_tls_ctx, FILE *_fp);
-void report_connect(const struct sockaddr *, socklen_t, char *);
+void report_sock(const char *, const struct sockaddr *, socklen_t, char *);
void report_tls(struct tls *tls_ctx, char * host);
void usage(int);
ssize_t drainbuf(int, unsigned char *, size_t *, struct tls *);
@@ -596,7 +596,8 @@ main(int argc, char *argv[])
err(1, "connect");
if (vflag)
- report_connect((struct sockaddr *)&z,
len, NULL);
+ report_sock("Connection received",
+ (struct sockaddr *)&z, len, NULL);
readwrite(s, NULL);
} else {
@@ -611,7 +612,8 @@ main(int argc, char *argv[])
err(1, "accept");
}
if (vflag)
- report_connect((struct sockaddr
*)&cliaddr, len,
+ report_sock("Connection received",
+ (struct sockaddr *)&cliaddr, len,
family == AF_UNIX ? host : NULL);
if ((usetls) &&
(tls_cctx = tls_setup_server(tls_ctx,
connfd, host)))
@@ -754,6 +756,8 @@ unix_bind(char *path, int flags)
errno = save_errno;
return -1;
}
+ if (vflag)
+ report_sock("Bound", NULL, 0, path);
return s;
}
@@ -890,13 +894,16 @@ int
unix_listen(char *path)
{
int s;
+
if ((s = unix_bind(path, 0)) < 0)
return -1;
-
if (listen(s, 5) < 0) {
close(s);
return -1;
}
+ if (vflag)
+ report_sock("Listening", NULL, 0, path);
+
return s;
}
@@ -1037,6 +1044,16 @@ local_listen(const char *host, const cha
if (listen(s, 1) < 0)
err(1, "listen");
}
+ if (vflag && s != -1) {
+ struct sockaddr_storage ss;
+ socklen_t len;
+
+ len = sizeof(ss);
+ if (getsockname(s, (struct sockaddr *)&ss, &len) == -1)
+ err(1, "getsockname");
+ report_sock(uflag ? "Bound" : "Listening",
+ (struct sockaddr *)&ss, len, NULL);
+ }
freeaddrinfo(res0);
@@ -1689,34 +1706,30 @@ report_tls(struct tls * tls_ctx, char *
}
void
-report_connect(const struct sockaddr *sa, socklen_t salen, char *path)
+report_sock(const char *msg, const struct sockaddr *sa, socklen_t salen,
+ char *path)
{
- char remote_host[NI_MAXHOST];
- char remote_port[NI_MAXSERV];
+ char host[NI_MAXHOST], port[NI_MAXSERV];
int herr;
int flags = NI_NUMERICSERV;
if (path != NULL) {
- fprintf(stderr, "Connection on %s received!\n", path);
+ fprintf(stderr, "%s on %s\n", msg, path);
return;
}
if (nflag)
flags |= NI_NUMERICHOST;
- if ((herr = getnameinfo(sa, salen,
- remote_host, sizeof(remote_host),
- remote_port, sizeof(remote_port),
- flags)) != 0) {
+ if ((herr = getnameinfo(sa, salen, host, sizeof(host),
+ port, sizeof(port), flags)) != 0) {
if (herr == EAI_SYSTEM)
err(1, "getnameinfo");
else
errx(1, "getnameinfo: %s", gai_strerror(herr));
}
- fprintf(stderr,
- "Connection from %s %s "
- "received!\n", remote_host, remote_port);
+ fprintf(stderr, "%s on %s %s\n", msg, host, port);
}
void