diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-10-30 03:21:54 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-10-30 03:21:54 +0200 |
commit | a95f2716f609c2b1dbf49a11830535d88177dffd (patch) | |
tree | d38e09fdf0f662a44ff6f67937029422392499ef /tools/wispr.c | |
parent | 17dbeffefc57c5c5434f65782350249c2a84e853 (diff) | |
download | connman-a95f2716f609c2b1dbf49a11830535d88177dffd.tar.gz connman-a95f2716f609c2b1dbf49a11830535d88177dffd.tar.bz2 connman-a95f2716f609c2b1dbf49a11830535d88177dffd.zip |
Add dummy HTTPS client to WISPr test program
Diffstat (limited to 'tools/wispr.c')
-rw-r--r-- | tools/wispr.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/tools/wispr.c b/tools/wispr.c index 51995796..7e7db21f 100644 --- a/tools/wispr.c +++ b/tools/wispr.c @@ -23,7 +23,136 @@ #include <config.h> #endif +#include <stdio.h> +#include <errno.h> +#include <unistd.h> +#include <string.h> +#include <signal.h> +#include <sys/socket.h> +#include <arpa/inet.h> + +#include "gweb/giognutls.h" + +static GMainLoop *main_loop; + +static void sig_term(int sig) +{ + g_main_loop_quit(main_loop); +} + +static int create_connection(const char *address, unsigned short port) +{ + struct sockaddr_in sin; + int sk; + + sk = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (sk < 0) + return -EIO; + + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + sin.sin_addr.s_addr = inet_addr(address); + + if (connect(sk, (struct sockaddr *) &sin, sizeof(sin)) < 0) { + close(sk); + return -EIO; + } + + return sk; +} + +static gboolean received_data(GIOChannel *channel, GIOCondition cond, + gpointer user_data) +{ + gchar buf[2048]; + gsize bytes_read; + GIOStatus status; + + if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) { + g_main_loop_quit(main_loop); + return FALSE; + } + + memset(buf, 0, sizeof(buf)); + + status = g_io_channel_read_chars(channel, buf, sizeof(buf) - 1, + &bytes_read, NULL); + + printf("%s\n", buf); + + if (bytes_read == 0) { + g_main_loop_quit(main_loop); + return FALSE; + } + + return TRUE; +} + +static gboolean option_debug = FALSE; + +static GOptionEntry options[] = { + { "debug", 'd', 0, G_OPTION_ARG_NONE, &option_debug, + "Enable debug output" }, + { NULL }, +}; + int main(int argc, char *argv[]) { + GOptionContext *context; + GError *error = NULL; + struct sigaction sa; + GIOChannel *channel; + gsize written; + int sk; + + context = g_option_context_new(NULL); + g_option_context_add_main_entries(context, options, NULL); + + if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) { + if (error != NULL) { + g_printerr("%s\n", error->message); + g_error_free(error); + } else + g_printerr("An unknown error occurred\n"); + return 1; + } + + g_option_context_free(context); + + sk = create_connection("140.211.169.100", 443); + if (sk < 0) { + fprintf(stderr, "Failed to create connection\n"); + return 1; + } + + main_loop = g_main_loop_new(NULL, FALSE); + + channel = g_io_channel_gnutls_new(sk); + if (channel == NULL) { + fprintf(stderr, "Failed to create GnuTLS IO channel\n"); + return 1; + } + + g_io_channel_set_close_on_unref(channel, TRUE); + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = sig_term; + sigaction(SIGINT, &sa, NULL); + sigaction(SIGTERM, &sa, NULL); + + g_io_add_watch(channel, G_IO_IN | G_IO_ERR | G_IO_HUP, + received_data, NULL); + +#define MSG "GET / HTTP/1.0\r\n\r\n" + + g_io_channel_write_chars(channel, MSG, strlen(MSG), &written, NULL); + + g_main_loop_run(main_loop); + + g_main_loop_unref(main_loop); + + g_io_channel_unref(channel); + return 0; } |