diff options
author | bluhm <> | 2018-11-09 04:05:14 +0000 |
---|---|---|
committer | bluhm <> | 2018-11-09 04:05:14 +0000 |
commit | 849bf17f8ac09c0c0dfec2caaf9509f99053212d (patch) | |
tree | aadf1e58a7977213720b7157a50e8d7b01eb2a8c /src/usr.bin | |
parent | 5227ed064ec75038c5fd654250b783bbf6fbc695 (diff) | |
download | openbsd-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.c | 45 |
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); | |||
137 | int process_tos_opt(char *, int *); | 137 | int process_tos_opt(char *, int *); |
138 | int process_tls_opt(char *, int *); | 138 | int process_tls_opt(char *, int *); |
139 | void save_peer_cert(struct tls *_tls_ctx, FILE *_fp); | 139 | void save_peer_cert(struct tls *_tls_ctx, FILE *_fp); |
140 | void report_connect(const struct sockaddr *, socklen_t, char *); | 140 | void report_sock(const char *, const struct sockaddr *, socklen_t, char *); |
141 | void report_tls(struct tls *tls_ctx, char * host); | 141 | void report_tls(struct tls *tls_ctx, char * host); |
142 | void usage(int); | 142 | void usage(int); |
143 | ssize_t drainbuf(int, unsigned char *, size_t *, struct tls *); | 143 | ssize_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 | |||
890 | unix_listen(char *path) | 894 | unix_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 | ||
1691 | void | 1708 | void |
1692 | report_connect(const struct sockaddr *sa, socklen_t salen, char *path) | 1709 | report_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 | ||
1722 | void | 1735 | void |