1 /* $Id: test.c,v 1.1 2001/09/17 19:06:59 bodo Exp $ */
10 #include <netinet/in.h>
11 #include <netinet/tcp.h>
15 #include <sys/select.h>
16 #include <sys/socket.h>
22 void test_process_init(int fd, int client_p, void *apparg)
25 "test_process_init(fd = %d, client_p = %d, apparg = %p)\n", fd,
29 void test_errflush(int child_p, char *errbuf, size_t num, void *apparg)
31 fputs(errbuf, stderr);
34 int main(int argc, char *argv[])
44 char infobuf[TLS_INFO_SIZE + 1];
46 if (argc > 1 && argv[1][0] == '-') {
47 fputs("Usage: test [port] -- server\n"
48 " test num.num.num.num [port] -- client\n", stderr);
53 if (strchr(argv[1], '.')) {
58 fputs(client_p ? "Client\n" : "Server\n", stderr);
61 struct tls_create_ctx_args a = tls_create_ctx_defaultargs();
62 a.client_p = client_p;
63 a.certificate_file = "cert.pem";
64 a.key_file = "cert.pem";
65 a.ca_file = "cacerts.pem";
67 ctx = tls_create_ctx(a, NULL);
72 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
79 struct sockaddr_in addr;
80 size_t addr_len = sizeof addr;
82 addr.sin_family = AF_INET;
85 sscanf(argv[2], "%d", &port);
88 addr.sin_port = htons(port);
89 addr.sin_addr.s_addr = inet_addr(argv[1]);
91 r = connect(s, &addr, addr_len);
97 fprintf(stderr, "Connect (fd = %d).\n", fd);
103 r = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *)&i, sizeof i);
105 perror("setsockopt");
111 struct sockaddr_in addr;
112 size_t addr_len = sizeof addr;
115 sscanf(argv[1], "%d", &port);
118 addr.sin_family = AF_INET;
119 addr.sin_port = htons(port);
120 addr.sin_addr.s_addr = INADDR_ANY;
122 r = bind(s, &addr, addr_len);
135 fprintf(stderr, "Listening at port %i.\n", port);
137 fd = accept(s, NULL, 0);
143 fprintf(stderr, "Accept (fd = %d).\n", fd);
146 conn_in = fdopen(fd, "r");
147 if (conn_in == NULL) {
151 conn_out = fdopen(fd, "w");
152 if (conn_out == NULL) {
157 setvbuf(conn_in, NULL, _IOLBF, 256);
158 setvbuf(conn_out, NULL, _IOLBF, 256);
160 while (fgets(buf, sizeof buf, stdin) != NULL) {
162 fprintf(conn_out, "%.*s\r\n", (int)(strlen(buf + 1) - 1),
164 fprintf(stderr, ">>> %.*s\n", (int)(strlen(buf + 1) - 1),
166 } else if (buf[0] == 'C') {
167 fprintf(stderr, "Closing.\n");
171 } else if (buf[0] == 'R') {
174 sscanf(buf + 1, "%d", &lines);
176 if (fgets(buf, sizeof buf, conn_in) == NULL) {
177 if (ferror(conn_in)) {
178 fprintf(stderr, "ERROR\n");
181 fprintf(stderr, "CLOSED\n");
184 fprintf(stderr, "<<< %s", buf);
185 } while (--lines > 0);
186 } else if (buf[0] == 'T') {
191 struct tls_start_proxy_args a = tls_start_proxy_defaultargs();
193 a.client_p = client_p;
196 r = tls_start_proxy(a, NULL);
200 fprintf(stderr, "tls_start_proxy failed: %d\n", r);
203 fputs("socketpair", stderr);
206 fputs("FD_SETSIZE exceeded", stderr);
209 fputs("pipe", stderr);
212 fputs("fork", stderr);
215 fputs("dup2", stderr);
227 r = read(infofd, infobuf, sizeof infobuf - 1);
229 const char *info = infobuf;
233 while ((eol = strchr(info, '\n')) != NULL) {
234 fprintf(stderr, "+++ `%.*s'\n", eol - info, info);
240 fprintf(stderr, "W... write line to network\n"
241 "R[n] read line (n lines) from network\n"
243 "T start %sTLS proxy\n", tls ? "another " : "");