Terminate the s_server after n clients connected to it. This is
occasionally useful, matches OpenSSL's behavior and should help
simplifying regress/usr.bin/openssl/x509.
Index: openssl.1
===================================================================
RCS file: /cvs/src/usr.bin/openssl/openssl.1,v
retrieving revision 1.129
diff -u -p -r1.129 openssl.1
--- openssl.1 17 Mar 2021 18:08:32 -0000 1.129
+++ openssl.1 28 Aug 2021 17:12:59 -0000
@@ -4607,6 +4607,7 @@ will be used.
.Op Fl keymatexportlen Ar len
.Op Fl msg
.Op Fl mtu Ar mtu
+.Op Fl naccept Ar arg
.Op Fl named_curve Ar arg
.Op Fl nbio
.Op Fl nbio_test
@@ -4807,6 +4808,10 @@ Export len bytes of keying material (def
Show all protocol messages with hex dump.
.It Fl mtu Ar mtu
Set the link layer MTU.
+.It Fl naccept Ar num
+Terminate server after
+.Ar num
+connections.
.It Fl named_curve Ar arg
Specify the elliptic curve name to use for ephemeral ECDH keys.
This option is deprecated; use
Index: s_apps.h
===================================================================
RCS file: /cvs/src/usr.bin/openssl/s_apps.h,v
retrieving revision 1.5
diff -u -p -r1.5 s_apps.h
--- s_apps.h 25 Apr 2018 07:12:33 -0000 1.5
+++ s_apps.h 28 Aug 2021 17:12:59 -0000
@@ -120,7 +120,7 @@ extern int verify_return_error;
int do_server(int port, int type, int *ret,
int (*cb)(char *hostname, int s, unsigned char *context),
- unsigned char *context);
+ unsigned char *context, int naccept);
#ifdef HEADER_X509_H
int verify_callback(int ok, X509_STORE_CTX *ctx);
#endif
Index: s_server.c
===================================================================
RCS file: /cvs/src/usr.bin/openssl/s_server.c,v
retrieving revision 1.47
diff -u -p -r1.47 s_server.c
--- s_server.c 17 Mar 2021 18:11:01 -0000 1.47
+++ s_server.c 28 Aug 2021 17:17:38 -0000
@@ -267,6 +267,7 @@ static struct {
uint16_t min_version;
const SSL_METHOD *meth;
int msg;
+ int naccept;
char *named_curve;
int nbio;
int nbio_test;
@@ -741,6 +742,13 @@ static const struct option s_server_opti
},
#endif
{
+ .name = "naccept",
+ .argname = "num",
+ .desc = "terminate after num connections",
+ .type = OPTION_ARG_INT,
+ .opt.value = &s_server_config.naccept
+ },
+ {
.name = "named_curve",
.argname = "arg",
.type = OPTION_ARG,
@@ -1084,6 +1092,7 @@ s_server_main(int argc, char *argv[])
memset(&s_server_config, 0, sizeof(s_server_config));
s_server_config.keymatexportlen = 20;
s_server_config.meth = TLS_server_method();
+ s_server_config.naccept = -1;
s_server_config.port = PORT;
s_server_config.cert_file = TEST_CERT;
s_server_config.cert_file2 = TEST_CERT2;
@@ -1465,10 +1474,12 @@ s_server_main(int argc, char *argv[])
(void) BIO_flush(bio_s_out);
if (s_server_config.www)
do_server(s_server_config.port, s_server_config.socket_type,
- &accept_socket, www_body, s_server_config.context);
+ &accept_socket, www_body, s_server_config.context,
+ s_server_config.naccept);
else
do_server(s_server_config.port, s_server_config.socket_type,
- &accept_socket, sv_body, s_server_config.context);
+ &accept_socket, sv_body, s_server_config.context,
+ s_server_config.naccept);
print_stats(bio_s_out, ctx);
ret = 0;
end:
Index: s_socket.c
===================================================================
RCS file: /cvs/src/usr.bin/openssl/s_socket.c,v
retrieving revision 1.11
diff -u -p -r1.11 s_socket.c
--- s_socket.c 28 Jun 2019 13:35:02 -0000 1.11
+++ s_socket.c 28 Aug 2021 17:12:59 -0000
@@ -132,7 +132,7 @@ init_client(int *sock, char *host, char
int
do_server(int port, int type, int *ret,
int (*cb) (char *hostname, int s, unsigned char *context),
- unsigned char *context)
+ unsigned char *context, int naccept)
{
int sock;
char *name = NULL;
@@ -161,7 +161,9 @@ do_server(int port, int type, int *ret,
shutdown(sock, SHUT_RDWR);
close(sock);
}
- if (i < 0) {
+ if (naccept != -1)
+ naccept--;
+ if (i < 0 || naccept == 0) {
shutdown(accept_socket, SHUT_RDWR);
close(accept_socket);
return (i);