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]);