summaryrefslogtreecommitdiffstats
path: root/tinyNET/src/tnet.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinyNET/src/tnet.c')
-rw-r--r--tinyNET/src/tnet.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/tinyNET/src/tnet.c b/tinyNET/src/tnet.c
new file mode 100644
index 0000000..04f4cba
--- /dev/null
+++ b/tinyNET/src/tnet.c
@@ -0,0 +1,143 @@
+/*
+* Copyright (C) 2009-2010 Mamadou Diop.
+*
+* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
+*
+* This file is part of Open Source Doubango Framework.
+*
+* DOUBANGO 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 3 of the License, or
+* (at your option) any later version.
+*
+* DOUBANGO 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 DOUBANGO.
+*
+*/
+
+/**@file tnet.c
+ * @brief Network stack.
+ *
+ * @author Mamadou Diop <diopmamadou(at)doubango.org>
+ *
+ * @date Created: Sat Nov 8 16:54:58 2009 mdiop
+ */
+#include "tnet.h"
+#include "tnet_utils.h"
+
+#include "tsk_time.h"
+#include "tsk_debug.h"
+
+#include <stdlib.h> /* srand */
+
+/** @mainpage tinyNET API Overview
+*
+* <h1>10 Sockets and Network Functions</h1>
+*
+* All network functions are part of tinyNET projects.<br>
+* You MUST call @ref tnet_startup() before using any network function (tnet_*). tnet_cleanup() is used to terminate use of network functions. <br>
+* The startup function will determine whether the host is a ìlittle-endianî machine or not (at runtime).
+*
+* ======
+*
+* - @ref tnet_socket_group
+* - @ref tnet_utils_group
+* - @ref tnet_dhcp_group
+* - @ref tnet_dhcp6_group
+* - @ref tnet_dns_group
+* - @ref tnet_nat_group (@ref tnet_stun_group, @ref tnet_turn_group, ICE)
+*
+* ======
+*
+*/
+static tsk_bool_t __tnet_started = tsk_false;
+tsk_bool_t tnet_isBigEndian = tsk_false;
+
+/**
+ * @fn tnet_startup
+ * This is probably the most important function. You MUST call this function to initialize the network stack before calling any <b>tnet_*</b> function.
+ * You MUST call @ref tnet_cleanup to cleanup the network stack.
+ *
+ * @sa @ref tnet_cleanup.
+ * @return Zero if succeed and error code otherwise.
+**/
+int tnet_startup()
+{
+ int err = 0;
+ short word = 0x4321;
+
+ if(__tnet_started){
+ goto bail;
+ }
+
+ // rand()
+ srand((unsigned int) tsk_time_epoch());
+
+ // endianness
+ tnet_isBigEndian = ((*(int8_t *)&word) != 0x21);
+#if TNET_UNDER_WINDOWS
+ if(tnet_isBigEndian){
+ TSK_DEBUG_ERROR("Big endian on Windows machine. Is it right?");
+ }
+#endif
+
+#if TNET_UNDER_WINDOWS
+ {
+ WORD wVersionRequested;
+ WSADATA wsaData;
+
+ wVersionRequested = MAKEWORD(2, 2);
+
+ err = WSAStartup(wVersionRequested, &wsaData);
+ if (err != 0) {
+ TSK_DEBUG_FATAL("WSAStartup failed with error: %d\n", err);
+ return -1;
+ }
+
+ if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){
+ TSK_DEBUG_FATAL("Could not find a usable version of Winsock.dll\n");
+ tnet_cleanup();
+ return -2;
+ }
+ else{
+ __tnet_started = tsk_true;
+ TSK_DEBUG_INFO("The Winsock 2.2 dll was found okay\n");
+ }
+ }
+#else
+ __tnet_started = tsk_true;
+#endif /* TNET_UNDER_WINDOWS */
+
+bail:
+ return err;
+}
+
+
+/**
+ * Cleanup the network stack.
+ *
+ * @sa @ref tnet_startup.
+ * @retval Zero if succeed and non-zero error code otherwise.
+**/
+int tnet_cleanup()
+{
+ if(!__tnet_started){
+ goto bail;
+ }
+
+#if TNET_UNDER_WINDOWS
+ __tnet_started = tsk_false;
+ return WSACleanup();
+#else
+ __tnet_started = tsk_false;
+#endif
+
+bail:
+ return 0;
+}
+
OpenPOWER on IntegriCloud