diff options
Diffstat (limited to 'demos/easy_tls/test.c')
-rw-r--r-- | demos/easy_tls/test.c | 356 |
1 files changed, 180 insertions, 176 deletions
diff --git a/demos/easy_tls/test.c b/demos/easy_tls/test.c index 21f679afd1..d1dd53d0c5 100644 --- a/demos/easy_tls/test.c +++ b/demos/easy_tls/test.c @@ -20,21 +20,19 @@ #include "test.h" #include "easy-tls.h" -void -test_process_init(int fd, int client_p, void *apparg) +void test_process_init(int fd, int client_p, void *apparg) { - fprintf(stderr, "test_process_init(fd = %d, client_p = %d, apparg = %p)\n", fd, client_p, apparg); + fprintf(stderr, + "test_process_init(fd = %d, client_p = %d, apparg = %p)\n", fd, + client_p, apparg); } -void -test_errflush(int child_p, char *errbuf, size_t num, void *apparg) +void test_errflush(int child_p, char *errbuf, size_t num, void *apparg) { fputs(errbuf, stderr); } - -int -main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int s, fd, r; FILE *conn_in; @@ -47,198 +45,204 @@ main(int argc, char *argv[]) char infobuf[TLS_INFO_SIZE + 1]; if (argc > 1 && argv[1][0] == '-') { - fputs("Usage: test [port] -- server\n" - " test num.num.num.num [port] -- client\n", - stderr); - exit(1); + fputs("Usage: test [port] -- server\n" + " test num.num.num.num [port] -- client\n", stderr); + exit(1); } if (argc > 1) { - if (strchr(argv[1], '.')) { - client_p = 1; - } + if (strchr(argv[1], '.')) { + client_p = 1; + } } - + fputs(client_p ? "Client\n" : "Server\n", stderr); - + { - struct tls_create_ctx_args a = tls_create_ctx_defaultargs(); - a.client_p = client_p; - a.certificate_file = "cert.pem"; - a.key_file = "cert.pem"; - a.ca_file = "cacerts.pem"; - - ctx = tls_create_ctx(a, NULL); - if (ctx == NULL) - exit(1); + struct tls_create_ctx_args a = tls_create_ctx_defaultargs(); + a.client_p = client_p; + a.certificate_file = "cert.pem"; + a.key_file = "cert.pem"; + a.ca_file = "cacerts.pem"; + + ctx = tls_create_ctx(a, NULL); + if (ctx == NULL) + exit(1); } - + s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (s == -1) { - perror("socket"); - exit(1); + perror("socket"); + exit(1); } - + if (client_p) { - struct sockaddr_in addr; - size_t addr_len = sizeof addr; - - addr.sin_family = AF_INET; - assert(argc > 1); - if (argc > 2) - sscanf(argv[2], "%d", &port); - else - port = C_PORT; - addr.sin_port = htons(port); - addr.sin_addr.s_addr = inet_addr(argv[1]); - - r = connect(s, &addr, addr_len); - if (r != 0) { - perror("connect"); - exit(1); - } - fd = s; - fprintf(stderr, "Connect (fd = %d).\n", fd); + struct sockaddr_in addr; + size_t addr_len = sizeof addr; + + addr.sin_family = AF_INET; + assert(argc > 1); + if (argc > 2) + sscanf(argv[2], "%d", &port); + else + port = C_PORT; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = inet_addr(argv[1]); + + r = connect(s, &addr, addr_len); + if (r != 0) { + perror("connect"); + exit(1); + } + fd = s; + fprintf(stderr, "Connect (fd = %d).\n", fd); } else { - /* server */ - { - int i = 1; - - r = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *) &i, sizeof i); - if (r == -1) { - perror("setsockopt"); - exit(1); - } - } - - { - struct sockaddr_in addr; - size_t addr_len = sizeof addr; - - if (argc > 1) - sscanf(argv[1], "%d", &port); - else - port = L_PORT; - addr.sin_family = AF_INET; - addr.sin_port = htons(port); - addr.sin_addr.s_addr = INADDR_ANY; - - r = bind(s, &addr, addr_len); - if (r != 0) { - perror("bind"); - exit(1); - } - } - - r = listen(s, 1); - if (r == -1) { - perror("listen"); - exit(1); - } - - fprintf(stderr, "Listening at port %i.\n", port); - - fd = accept(s, NULL, 0); - if (fd == -1) { - perror("accept"); - exit(1); - } - - fprintf(stderr, "Accept (fd = %d).\n", fd); + /* server */ + { + int i = 1; + + r = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)&i, sizeof i); + if (r == -1) { + perror("setsockopt"); + exit(1); + } + } + + { + struct sockaddr_in addr; + size_t addr_len = sizeof addr; + + if (argc > 1) + sscanf(argv[1], "%d", &port); + else + port = L_PORT; + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + addr.sin_addr.s_addr = INADDR_ANY; + + r = bind(s, &addr, addr_len); + if (r != 0) { + perror("bind"); + exit(1); + } + } + + r = listen(s, 1); + if (r == -1) { + perror("listen"); + exit(1); + } + + fprintf(stderr, "Listening at port %i.\n", port); + + fd = accept(s, NULL, 0); + if (fd == -1) { + perror("accept"); + exit(1); + } + + fprintf(stderr, "Accept (fd = %d).\n", fd); } conn_in = fdopen(fd, "r"); if (conn_in == NULL) { - perror("fdopen"); - exit(1); + perror("fdopen"); + exit(1); } conn_out = fdopen(fd, "w"); if (conn_out == NULL) { - perror("fdopen"); - exit(1); + perror("fdopen"); + exit(1); } setvbuf(conn_in, NULL, _IOLBF, 256); setvbuf(conn_out, NULL, _IOLBF, 256); - + while (fgets(buf, sizeof buf, stdin) != NULL) { - if (buf[0] == 'W') { - fprintf(conn_out, "%.*s\r\n", (int)(strlen(buf + 1) - 1), buf + 1); - fprintf(stderr, ">>> %.*s\n", (int)(strlen(buf + 1) - 1), buf + 1); - } else if (buf[0] == 'C') { - fprintf(stderr, "Closing.\n"); - fclose(conn_in); - fclose(conn_out); - exit(0); - } else if (buf[0] == 'R') { - int lines = 0; - - sscanf(buf + 1, "%d", &lines); - do { - if (fgets(buf, sizeof buf, conn_in) == NULL) { - if (ferror(conn_in)) { - fprintf(stderr, "ERROR\n"); - exit(1); - } - fprintf(stderr, "CLOSED\n"); - return 0; - } - fprintf(stderr, "<<< %s", buf); - } while (--lines > 0); - } else if (buf[0] == 'T') { - int infofd; - - tls++; - { - struct tls_start_proxy_args a = tls_start_proxy_defaultargs(); - a.fd = fd; - a.client_p = client_p; - a.ctx = ctx; - a.infofd = &infofd; - r = tls_start_proxy(a, NULL); - } - assert(r != 1); - if (r != 0) { - fprintf(stderr, "tls_start_proxy failed: %d\n", r); - switch (r) { - case -1: - fputs("socketpair", stderr); break; - case 2: - fputs("FD_SETSIZE exceeded", stderr); break; - case -3: - fputs("pipe", stderr); break; - case -4: - fputs("fork", stderr); break; - case -5: - fputs("dup2", stderr); break; - default: - fputs("?", stderr); - } - if (r < 0) - perror(""); - else - fputc('\n', stderr); - exit(1); - } - - r = read(infofd, infobuf, sizeof infobuf - 1); - if (r > 0) { - const char *info = infobuf; - const char *eol; - - infobuf[r] = '\0'; - while ((eol = strchr(info, '\n')) != NULL) { - fprintf(stderr, "+++ `%.*s'\n", eol - info, info); - info = eol+1; - } - close (infofd); - } - } else { - fprintf(stderr, "W... write line to network\n" - "R[n] read line (n lines) from network\n" - "C close\n" - "T start %sTLS proxy\n", tls ? "another " : ""); - } + if (buf[0] == 'W') { + fprintf(conn_out, "%.*s\r\n", (int)(strlen(buf + 1) - 1), + buf + 1); + fprintf(stderr, ">>> %.*s\n", (int)(strlen(buf + 1) - 1), + buf + 1); + } else if (buf[0] == 'C') { + fprintf(stderr, "Closing.\n"); + fclose(conn_in); + fclose(conn_out); + exit(0); + } else if (buf[0] == 'R') { + int lines = 0; + + sscanf(buf + 1, "%d", &lines); + do { + if (fgets(buf, sizeof buf, conn_in) == NULL) { + if (ferror(conn_in)) { + fprintf(stderr, "ERROR\n"); + exit(1); + } + fprintf(stderr, "CLOSED\n"); + return 0; + } + fprintf(stderr, "<<< %s", buf); + } while (--lines > 0); + } else if (buf[0] == 'T') { + int infofd; + + tls++; + { + struct tls_start_proxy_args a = tls_start_proxy_defaultargs(); + a.fd = fd; + a.client_p = client_p; + a.ctx = ctx; + a.infofd = &infofd; + r = tls_start_proxy(a, NULL); + } + assert(r != 1); + if (r != 0) { + fprintf(stderr, "tls_start_proxy failed: %d\n", r); + switch (r) { + case -1: + fputs("socketpair", stderr); + break; + case 2: + fputs("FD_SETSIZE exceeded", stderr); + break; + case -3: + fputs("pipe", stderr); + break; + case -4: + fputs("fork", stderr); + break; + case -5: + fputs("dup2", stderr); + break; + default: + fputs("?", stderr); + } + if (r < 0) + perror(""); + else + fputc('\n', stderr); + exit(1); + } + + r = read(infofd, infobuf, sizeof infobuf - 1); + if (r > 0) { + const char *info = infobuf; + const char *eol; + + infobuf[r] = '\0'; + while ((eol = strchr(info, '\n')) != NULL) { + fprintf(stderr, "+++ `%.*s'\n", eol - info, info); + info = eol + 1; + } + close(infofd); + } + } else { + fprintf(stderr, "W... write line to network\n" + "R[n] read line (n lines) from network\n" + "C close\n" + "T start %sTLS proxy\n", tls ? "another " : ""); + } } return 0; } |