5 #include <libubox/usock.h>
6 #include <libubox/uloop.h>
7 #include "ustream-ssl.h"
9 static struct uloop_fd fd;
11 static struct ustream_fd stream, s_input;
12 static struct ustream_ssl ssl;
16 static void client_teardown(void)
18 if (s_input.fd.registered)
19 ustream_free(&s_input.stream);
21 ustream_free(&ssl.stream);
22 ustream_free(&stream.stream);
27 static void client_input_notify_read(struct ustream *s, int bytes)
32 buf = ustream_get_read_buf(s, &len);
33 ustream_write(&ssl.stream, buf, len, false);
34 ustream_consume(s, len);
37 static void client_ssl_notify_read(struct ustream *s, int bytes)
42 buf = ustream_get_read_buf(s, &len);
43 fwrite(buf, len, 1, stdout);
45 ustream_consume(s, len);
48 static void client_notify_connected(struct ustream_ssl *ssl)
50 fprintf(stderr, "SSL connection established\n");
51 s_input.stream.notify_read = client_input_notify_read;
52 ustream_fd_init(&s_input, 0);
55 static void client_notify_error(struct ustream_ssl *ssl, int error, const char *str)
57 fprintf(stderr, "SSL connection error(%d): %s\n", error, str);
61 static void client_notify_state(struct ustream *us)
63 if (!us->write_error && !us->eof)
66 fprintf(stderr, "Connection closed\n");
70 static void example_connect_ssl(int fd)
72 fprintf(stderr, "Starting SSL negnotiation\n");
74 ssl.notify_error = client_notify_error;
75 ssl.notify_connected = client_notify_connected;
76 ssl.stream.notify_read = client_ssl_notify_read;
77 ssl.stream.notify_state = client_notify_state;
79 ustream_fd_init(&stream, fd);
80 ustream_ssl_init(&ssl, &stream.stream, ctx, false);
83 static void example_connect_cb(struct uloop_fd *f, unsigned int events)
85 if (fd.eof || fd.error) {
86 fprintf(stderr, "Connection failed\n");
91 fprintf(stderr, "Connection established\n");
93 example_connect_ssl(fd.fd);
96 static void connect_client(const char *host, const char *port)
98 fd.fd = usock(USOCK_TCP | USOCK_NONBLOCK, host, port);
99 fd.cb = example_connect_cb;
100 uloop_fd_add(&fd, ULOOP_WRITE | ULOOP_EDGE_TRIGGER);
103 int main(int argc, char **argv)
106 fprintf(stderr, "Usage: %s <hostname> <port>\n", argv[0]);
110 ctx = ustream_ssl_context_new(false);
112 connect_client(argv[1], argv[2]);