about summary refs log tree commit diff stats
path: root/source/netinf.c
diff options
context:
space:
mode:
authorKelly Rauchenberger <fefferburbia@gmail.com>2017-09-16 16:11:15 -0400
committerKelly Rauchenberger <fefferburbia@gmail.com>2017-09-16 16:11:15 -0400
commit4fe95cc1e7412e309d026e53cd44239bd3ef031d (patch)
treec1b711ed5a81976d9054da6205f5f9b2c3133248 /source/netinf.c
parente2a76d1f0fd978f285edf1dbc0f6e87cf89c63ce (diff)
downloadgen3uploader-4fe95cc1e7412e309d026e53cd44239bd3ef031d.tar.gz
gen3uploader-4fe95cc1e7412e309d026e53cd44239bd3ef031d.tar.bz2
gen3uploader-4fe95cc1e7412e309d026e53cd44239bd3ef031d.zip
Wii can now send a POST request to a website
The extractor now uses libfat to read a config file off the root of the
SD card, a model for which is included in the repository. The extractor
is capable of negotiating an HTTPS connection, but it requires a
download of the target site's root CA certificate to be on the SD card
and pointed at by the config file. TLS/SSL functionality is provided by
wolfSSL. I had to make a couple of minor changes to wolfSSL for it to
work properly, and those changes are located in the devkitpro branch of
my fork, hatkirby/wolfssl.

The Wii program now arranges some of the information that the GBA sends
it into a JSON object, which is then sent off (along with some
authentication information from the config file) to the endpoint defined
in the config file. The code used to maintain the network connection is
from the WiiTweet project, which was licensed under the GPL. Some of the
code used to send the HTTP request also comes from said project.
Diffstat (limited to 'source/netinf.c')
-rw-r--r--source/netinf.c161
1 files changed, 161 insertions, 0 deletions
diff --git a/source/netinf.c b/source/netinf.c new file mode 100644 index 0000000..4e4ec6f --- /dev/null +++ b/source/netinf.c
@@ -0,0 +1,161 @@
1/*
2 * Copyright (C) 2008 Tantric
3 * Copyright (C) 2012 Pedro Aguiar
4 * Copyright (C) 2017 hatkirby
5 *
6 * Originally part of the WiiTweet project, which was distributed under the
7 * GPL.
8 */
9#include "netinf.h"
10#include <gccore.h>
11#include <network.h>
12#include <ogc/lwp_watchdog.h>
13#include <sys/errno.h>
14#include <unistd.h>
15#include <string.h>
16#include <stdio.h>
17
18static bool networkInit = false;
19static lwp_t networkThread = LWP_THREAD_NULL;
20static u8 netStack[32768] ATTRIBUTE_ALIGN(32);
21static char wiiIP[16] = {0};
22static bool netHalt = false;
23
24static void* interface(void* arg)
25{
26 static bool prevInit = false;
27
28 while (!netHalt)
29 {
30 int retry = 5;
31 int result = -1;
32
33 while ((retry > 0) && (!netHalt))
34 {
35 if (prevInit)
36 {
37 net_deinit();
38
39 for (int i=0; (i<400) && !netHalt; i++)
40 {
41 if (net_get_status() != -EBUSY)
42 {
43 usleep(2000);
44 net_wc24cleanup();
45 prevInit = false;
46 usleep(20000);
47
48 break;
49 }
50
51 usleep(20000);
52 }
53 }
54
55 usleep(2000);
56
57 if (net_init_async(NULL, NULL))
58 {
59 sleep(1);
60
61 retry--;
62
63 continue;
64 }
65
66 result = net_get_status();
67 for (int wait = 400; (wait > 0) && (result == -EBUSY) && !netHalt; wait++)
68 {
69 usleep(20000);
70
71 result = net_get_status();
72 }
73
74 if (result == 0)
75 {
76 break;
77 }
78
79 retry--;
80
81 usleep(2000);
82 }
83
84 if (result == 0)
85 {
86 struct in_addr hostip;
87 hostip.s_addr = net_gethostip();
88
89 if (hostip.s_addr)
90 {
91 strcpy(wiiIP, inet_ntoa(hostip));
92 networkInit = true;
93 prevInit = true;
94 }
95 }
96
97 if (!netHalt)
98 {
99 LWP_SuspendThread(networkThread);
100 }
101 }
102
103 return NULL;
104}
105
106static void startNetworkThread()
107{
108 netHalt = false;
109
110 if (networkThread == LWP_THREAD_NULL)
111 {
112 LWP_CreateThread(&networkThread, interface, NULL, netStack, 8192, 40);
113 } else {
114 LWP_ResumeThread(networkThread);
115 }
116}
117
118static void stopNetworkThread()
119{
120 if ((networkThread == LWP_THREAD_NULL)
121 || (!LWP_ThreadIsSuspended(networkThread)))
122 {
123 return;
124 }
125
126 netHalt = true;
127
128 LWP_ResumeThread(networkThread);
129 LWP_JoinThread(networkThread, NULL);
130
131 networkThread = LWP_THREAD_NULL;
132}
133
134bool initializeNetwork()
135{
136 stopNetworkThread();
137
138 if (networkInit && (net_gethostip() > 0))
139 {
140 return true;
141 }
142
143 networkInit = false;
144
145 printf("Initializing network...\n");
146
147 u64 start = gettime();
148 startNetworkThread();
149
150 while (!LWP_ThreadIsSuspended(networkThread))
151 {
152 usleep(50 * 1000);
153
154 if (diff_sec(start, gettime()) > 10)
155 {
156 break;
157 }
158 }
159
160 return networkInit;
161}