summaryrefslogtreecommitdiff
path: root/src/usr.bin
diff options
context:
space:
mode:
authorbluhm <>2018-11-09 04:05:14 +0000
committerbluhm <>2018-11-09 04:05:14 +0000
commit849bf17f8ac09c0c0dfec2caaf9509f99053212d (patch)
treeaadf1e58a7977213720b7157a50e8d7b01eb2a8c /src/usr.bin
parent5227ed064ec75038c5fd654250b783bbf6fbc695 (diff)
downloadopenbsd-849bf17f8ac09c0c0dfec2caaf9509f99053212d.tar.gz
openbsd-849bf17f8ac09c0c0dfec2caaf9509f99053212d.tar.bz2
openbsd-849bf17f8ac09c0c0dfec2caaf9509f99053212d.zip
In verbose mode netcat reports to stderr when the listen system
call has finished. This allows to write race free scripts as they can check that the server is up and running. OK sthen@ tb@
Diffstat (limited to 'src/usr.bin')
-rw-r--r--src/usr.bin/nc/netcat.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/src/usr.bin/nc/netcat.c b/src/usr.bin/nc/netcat.c
index 9c19049d59..f5045013aa 100644
--- a/src/usr.bin/nc/netcat.c
+++ b/src/usr.bin/nc/netcat.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: netcat.c,v 1.197 2018/11/06 20:39:19 jsing Exp $ */ 1/* $OpenBSD: netcat.c,v 1.198 2018/11/09 04:05:14 bluhm Exp $ */
2/* 2/*
3 * Copyright (c) 2001 Eric Jackson <ericj@monkey.org> 3 * Copyright (c) 2001 Eric Jackson <ericj@monkey.org>
4 * Copyright (c) 2015 Bob Beck. All rights reserved. 4 * Copyright (c) 2015 Bob Beck. All rights reserved.
@@ -137,7 +137,7 @@ void set_common_sockopts(int, int);
137int process_tos_opt(char *, int *); 137int process_tos_opt(char *, int *);
138int process_tls_opt(char *, int *); 138int process_tls_opt(char *, int *);
139void save_peer_cert(struct tls *_tls_ctx, FILE *_fp); 139void save_peer_cert(struct tls *_tls_ctx, FILE *_fp);
140void report_connect(const struct sockaddr *, socklen_t, char *); 140void report_sock(const char *, const struct sockaddr *, socklen_t, char *);
141void report_tls(struct tls *tls_ctx, char * host); 141void report_tls(struct tls *tls_ctx, char * host);
142void usage(int); 142void usage(int);
143ssize_t drainbuf(int, unsigned char *, size_t *, struct tls *); 143ssize_t drainbuf(int, unsigned char *, size_t *, struct tls *);
@@ -596,7 +596,8 @@ main(int argc, char *argv[])
596 err(1, "connect"); 596 err(1, "connect");
597 597
598 if (vflag) 598 if (vflag)
599 report_connect((struct sockaddr *)&z, len, NULL); 599 report_sock("Connection received",
600 (struct sockaddr *)&z, len, NULL);
600 601
601 readwrite(s, NULL); 602 readwrite(s, NULL);
602 } else { 603 } else {
@@ -611,7 +612,8 @@ main(int argc, char *argv[])
611 err(1, "accept"); 612 err(1, "accept");
612 } 613 }
613 if (vflag) 614 if (vflag)
614 report_connect((struct sockaddr *)&cliaddr, len, 615 report_sock("Connection received",
616 (struct sockaddr *)&cliaddr, len,
615 family == AF_UNIX ? host : NULL); 617 family == AF_UNIX ? host : NULL);
616 if ((usetls) && 618 if ((usetls) &&
617 (tls_cctx = tls_setup_server(tls_ctx, connfd, host))) 619 (tls_cctx = tls_setup_server(tls_ctx, connfd, host)))
@@ -754,6 +756,8 @@ unix_bind(char *path, int flags)
754 errno = save_errno; 756 errno = save_errno;
755 return -1; 757 return -1;
756 } 758 }
759 if (vflag)
760 report_sock("Bound", NULL, 0, path);
757 761
758 return s; 762 return s;
759} 763}
@@ -890,13 +894,16 @@ int
890unix_listen(char *path) 894unix_listen(char *path)
891{ 895{
892 int s; 896 int s;
897
893 if ((s = unix_bind(path, 0)) < 0) 898 if ((s = unix_bind(path, 0)) < 0)
894 return -1; 899 return -1;
895
896 if (listen(s, 5) < 0) { 900 if (listen(s, 5) < 0) {
897 close(s); 901 close(s);
898 return -1; 902 return -1;
899 } 903 }
904 if (vflag)
905 report_sock("Listening", NULL, 0, path);
906
900 return s; 907 return s;
901} 908}
902 909
@@ -1037,6 +1044,16 @@ local_listen(const char *host, const char *port, struct addrinfo hints)
1037 if (listen(s, 1) < 0) 1044 if (listen(s, 1) < 0)
1038 err(1, "listen"); 1045 err(1, "listen");
1039 } 1046 }
1047 if (vflag && s != -1) {
1048 struct sockaddr_storage ss;
1049 socklen_t len;
1050
1051 len = sizeof(ss);
1052 if (getsockname(s, (struct sockaddr *)&ss, &len) == -1)
1053 err(1, "getsockname");
1054 report_sock(uflag ? "Bound" : "Listening",
1055 (struct sockaddr *)&ss, len, NULL);
1056 }
1040 1057
1041 freeaddrinfo(res0); 1058 freeaddrinfo(res0);
1042 1059
@@ -1689,34 +1706,30 @@ report_tls(struct tls * tls_ctx, char * host)
1689} 1706}
1690 1707
1691void 1708void
1692report_connect(const struct sockaddr *sa, socklen_t salen, char *path) 1709report_sock(const char *msg, const struct sockaddr *sa, socklen_t salen,
1710 char *path)
1693{ 1711{
1694 char remote_host[NI_MAXHOST]; 1712 char host[NI_MAXHOST], port[NI_MAXSERV];
1695 char remote_port[NI_MAXSERV];
1696 int herr; 1713 int herr;
1697 int flags = NI_NUMERICSERV; 1714 int flags = NI_NUMERICSERV;
1698 1715
1699 if (path != NULL) { 1716 if (path != NULL) {
1700 fprintf(stderr, "Connection on %s received!\n", path); 1717 fprintf(stderr, "%s on %s\n", msg, path);
1701 return; 1718 return;
1702 } 1719 }
1703 1720
1704 if (nflag) 1721 if (nflag)
1705 flags |= NI_NUMERICHOST; 1722 flags |= NI_NUMERICHOST;
1706 1723
1707 if ((herr = getnameinfo(sa, salen, 1724 if ((herr = getnameinfo(sa, salen, host, sizeof(host),
1708 remote_host, sizeof(remote_host), 1725 port, sizeof(port), flags)) != 0) {
1709 remote_port, sizeof(remote_port),
1710 flags)) != 0) {
1711 if (herr == EAI_SYSTEM) 1726 if (herr == EAI_SYSTEM)
1712 err(1, "getnameinfo"); 1727 err(1, "getnameinfo");
1713 else 1728 else
1714 errx(1, "getnameinfo: %s", gai_strerror(herr)); 1729 errx(1, "getnameinfo: %s", gai_strerror(herr));
1715 } 1730 }
1716 1731
1717 fprintf(stderr, 1732 fprintf(stderr, "%s on %s %s\n", msg, host, port);
1718 "Connection from %s %s "
1719 "received!\n", remote_host, remote_port);
1720} 1733}
1721 1734
1722void 1735void