From 3ca0e592183839f339d47723ca51be1ca2bbc7ec Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Fri, 24 Feb 2012 08:22:37 +0100 Subject: Fix potential segafult in dump_handshake_info. Modularise code a bit. Modularise the code a bit. --- .gitignore | 22 ++++++++++ src/Makefile.am | 8 +++- src/http.cc | 86 +++++++++++++++++++++++++++++++++++++++ src/http.h | 43 ++++++++++++++++++++ src/muniad.cc | 124 ++++---------------------------------------------------- src/task.cc | 30 ++++++++++++++ src/task.h | 64 +++++++++++++++++++++++++++++ 7 files changed, 258 insertions(+), 119 deletions(-) create mode 100644 .gitignore create mode 100644 src/http.cc create mode 100644 src/http.h create mode 100644 src/task.cc create mode 100644 src/task.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb8afab --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +Makefile +Makefile.in +aclocal.m4 +autom4te.cache/ +config.h +config.h.in +config.log +config.status +configure +depcomp +install-sh +ltmain.sh +missing +src/.deps/ +src/Makefile +src/Makefile.am.test +src/Makefile.in +src/muniad +src/*.o +stamp-h1 +tools/Makefile +tools/Makefile.in diff --git a/src/Makefile.am b/src/Makefile.am index ec4ada4..b7ded17 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,9 +7,13 @@ muniad_LDADD = $(LIBWEBSOCKETS_LIBS) muniad_CXXFLAGS = $(LIBWEBSOCKETS_CFLAGS) muniad_SOURCES = \ - muniad.cc + muniad.cc \ + http.cc \ + task.cc -EXTRA_DIST = +EXTRA_DIST = \ + http.h \ + task.h ################ # Test Section # diff --git a/src/http.cc b/src/http.cc new file mode 100644 index 0000000..3dff64e --- /dev/null +++ b/src/http.cc @@ -0,0 +1,86 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * http.cc + * + * Fri Feb 24 07:58:48 CET 2012 + * Copyright 2012 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Munia. + * + * Munia is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Munia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Munia; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "http.h" + +#include +#include + +int callback_http(struct libwebsocket_context * context, + struct libwebsocket *wsi, + enum libwebsocket_callback_reasons reason, void *user, + void *in, size_t len) +{ + char client_name[128]; + char client_ip[128]; + + switch(reason) { + case LWS_CALLBACK_HTTP: + fprintf(stderr, "serving HTTP URI %s\n", (char *)in); + + // add favicon later + if(in && strcmp((const char *)in, "/favicon.ico") == 0) { + if(libwebsockets_serve_http_file(wsi, + LOCAL_RESOURCE_PATH"/favicon.ico", + "image/x-icon")) + fprintf(stderr, "Failed to send favicon\n"); + break; + } + + + /* send the script... when it runs it'll start websockets */ + if(libwebsockets_serve_http_file(wsi, + LOCAL_RESOURCE_PATH"/munia.html", + "text/html")) + fprintf(stderr, "Failed to send HTTP file\n"); + break; + + /* + * callback for confirming to continue with client IP appear in + * protocol 0 callback since no websocket protocol has been agreed + * yet. You can just ignore this if you won't filter on client IP + * since the default uhandled callback return is 0 meaning let the + * connection continue. + */ + + case LWS_CALLBACK_FILTER_NETWORK_CONNECTION: + libwebsockets_get_peer_addresses((int)(long)user, + client_name, + sizeof(client_name), + client_ip, + sizeof(client_ip)); + fprintf(stderr, "Received network connect from %s (%s)\n", + client_name, client_ip); + /* if we returned non-zero from here, we kill the connection */ + break; + + default: + break; + } + + return 0; +} diff --git a/src/http.h b/src/http.h new file mode 100644 index 0000000..0b619dc --- /dev/null +++ b/src/http.h @@ -0,0 +1,43 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * http.h + * + * Fri Feb 24 07:58:48 CET 2012 + * Copyright 2012 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Munia. + * + * Munia is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Munia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Munia; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __MUNIA_HTTP_H__ +#define __MUNIA_HTTP_H__ + +#include + +#include + +#define LOCAL_RESOURCE_PATH "." + +/* this protocol server (always the first one) just knows how to do HTTP */ +int callback_http(struct libwebsocket_context * context, + struct libwebsocket *wsi, + enum libwebsocket_callback_reasons reason, void *user, + void *in, size_t len); + +#endif/*__MUNIA_HTTP_H__*/ diff --git a/src/muniad.cc b/src/muniad.cc index 0277099..8181f68 100644 --- a/src/muniad.cc +++ b/src/muniad.cc @@ -35,79 +35,13 @@ #include +#include "http.h" +#include "task.h" + #define LWS_NO_FORK static int close_testing; -/* - * This demo server shows how to use libwebsockets for one or more - * websocket protocols in the same server - * - * It defines the following websocket protocols: - * lws-mirror-protocol: copies any received packet to every connection also - * using this protocol, including the sender - */ - -enum demo_protocols { - /* always first */ - PROTOCOL_HTTP = 0, - PROTOCOL_LWS_MIRROR, - /* always last */ - DEMO_PROTOCOL_COUNT -}; - -#define LOCAL_RESOURCE_PATH "." - -/* this protocol server (always the first one) just knows how to do HTTP */ - -static int callback_http(struct libwebsocket_context * context, - struct libwebsocket *wsi, - enum libwebsocket_callback_reasons reason, void *user, - void *in, size_t len) -{ - char client_name[128]; - char client_ip[128]; - - switch (reason) { - case LWS_CALLBACK_HTTP: - fprintf(stderr, "serving HTTP URI %s\n", (char *)in); - -// add favicon later - if(in && strcmp((const char *)in, "/favicon.ico") == 0) { - if(libwebsockets_serve_http_file(wsi, LOCAL_RESOURCE_PATH"/favicon.ico", "image/x-icon")) - fprintf(stderr, "Failed to send favicon\n"); - break; - } - - - /* send the script... when it runs it'll start websockets */ -// if (libwebsockets_serve_http_file(wsi, LOCAL_RESOURCE_PATH"/test.html", "text/html")) - if (libwebsockets_serve_http_file(wsi, LOCAL_RESOURCE_PATH"/munia.html", "text/html")) - fprintf(stderr, "Failed to send HTTP file\n"); - break; - - /* - * callback for confirming to continue with client IP appear in - * protocol 0 callback since no websocket protocol has been agreed - * yet. You can just ignore this if you won't filter on client IP - * since the default uhandled callback return is 0 meaning let the - * connection continue. - */ - - case LWS_CALLBACK_FILTER_NETWORK_CONNECTION: - libwebsockets_get_peer_addresses((int)(long)user, client_name, sizeof(client_name), client_ip, sizeof(client_ip)); - fprintf(stderr, "Received network connect from %s (%s)\n", client_name, client_ip); - /* if we returned non-zero from here, we kill the connection */ - break; - - default: - break; - } - - return 0; -} - - /* * this is just an example of parsing handshake headers, you don't need this * in your code unless you will filter allowing connections by the header @@ -145,8 +79,10 @@ static void dump_handshake_info(struct lws_tokens *lwst) }; for (n = 0; n < WSI_TOKEN_COUNT; n++) { - if (lwst[n].token == NULL) continue; - fprintf(stderr, " %s = %s\n", token_names[n], lwst[n].token); + if (lwst[n].token == NULL || lwst[n].token_len == 0) continue; + fprintf(stderr, " %s = ", token_names[n]); + if(fwrite(lwst[n].token, 1, lwst[n].token_len, stderr)) {} + fprintf(stderr, "\n"); } } @@ -165,53 +101,7 @@ struct a_message { size_t len; }; -#include -#include - -typedef int boxid_t; -class Box { -public: - Box(std::string data) {} - Box() {} - - boxid_t id; - std::string title; - std::string description; - int x, y; -}; - -std::map boxes; - -/* -Protocol: - -Server -> client: - update [id] [title] [description]; - move [id] [x] [y]; - add [id] [title] [description] [x] [y]; - del [id] - -Client -> server: - update [id] [title] [description]; - move [id] [x] [y]; - add [title] [description] [x] [y]; - del [id] - -title and description are " encapsulated utf-8 string with " escaped with a backslash. -x and y are integers as strings -id are an integer as a string - */ - -struct task { - int x, y; - int id; - std::string title; - std::string desc; -}; typedef std::list ClientList; -typedef std::list TaskList; - -static TaskList tasklist; static struct a_message ringbuffer[MAX_MESSAGE_QUEUE]; static int ringbuffer_head; diff --git a/src/task.cc b/src/task.cc new file mode 100644 index 0000000..0b948c5 --- /dev/null +++ b/src/task.cc @@ -0,0 +1,30 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * task.cc + * + * Fri Feb 24 08:16:30 CET 2012 + * Copyright 2012 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Munia. + * + * Munia is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Munia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Munia; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#include "task.h" + +TaskList tasklist; diff --git a/src/task.h b/src/task.h new file mode 100644 index 0000000..ffe93d7 --- /dev/null +++ b/src/task.h @@ -0,0 +1,64 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + * task.h + * + * Fri Feb 24 08:16:29 CET 2012 + * Copyright 2012 Bent Bisballe Nyeng + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of Munia. + * + * Munia is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Munia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Munia; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ +#ifndef __MUNIA_TASK_H__ +#define __MUNIA_TASK_H__ + +#include +#include + +/* +Protocol: + +Server -> client: + update [id] [title] [description]; + move [id] [x] [y]; + add [id] [title] [description] [x] [y]; + del [id] + +Client -> server: + update [id] [title] [description]; + move [id] [x] [y]; + add [title] [description] [x] [y]; + del [id] + +title and description are " encapsulated utf-8 string with " escaped with a backslash. +x and y are integers as strings +id are an integer as a string + */ + +struct task { + int x, y; + int id; + std::string title; + std::string desc; +}; + +typedef std::list TaskList; +extern TaskList tasklist; + +#endif/*__MUNIA_TASK_H__*/ -- cgit v1.2.3