Skip to content

Commit ca47e10

Browse files
committed
Restart the wiiload server on connection issues
1 parent 3559ac4 commit ca47e10

File tree

2 files changed

+42
-27
lines changed

2 files changed

+42
-27
lines changed

src/utils/TcpReceiver.cpp

+39-27
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
#include "utils/net.h"
55
#include "utils/utils.h"
66
#include <algorithm>
7+
#include <coreinit/cache.h>
78
#include <coreinit/debug.h>
89
#include <coreinit/dynload.h>
910
#include <coreinit/title.h>
1011
#include <cstring>
1112
#include <rpxloader/rpxloader.h>
1213
#include <sysapp/launch.h>
13-
#include <sysapp/title.h>
1414
#include <vector>
1515
#include <wups_backend/PluginUtils.h>
1616
#include <zlib.h>
@@ -30,18 +30,16 @@ TcpReceiver::TcpReceiver(int32_t port)
3030

3131
TcpReceiver::~TcpReceiver() {
3232
exitRequested = true;
33-
33+
OSMemoryBarrier();
3434
if (serverSocket >= 0) {
35-
shutdown(serverSocket, SHUT_RDWR);
36-
close(serverSocket);
37-
serverSocket = -1;
35+
cleanupSocket();
3836
}
3937
}
4038

41-
void TcpReceiver::executeThread() {
39+
bool TcpReceiver::createSocket() {
4240
serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
4341
if (serverSocket < 0) {
44-
return;
42+
return false;
4543
}
4644

4745
uint32_t enable = 1;
@@ -53,48 +51,62 @@ void TcpReceiver::executeThread() {
5351
bindAddress.sin_port = serverPort;
5452
bindAddress.sin_addr.s_addr = INADDR_ANY;
5553

56-
socklen_t len;
54+
5755
int32_t ret;
5856
if ((ret = bind(serverSocket, (struct sockaddr *) &bindAddress, 16)) < 0) {
59-
shutdown(serverSocket, SHUT_RDWR);
60-
close(serverSocket);
61-
serverSocket = -1;
62-
return;
57+
cleanupSocket();
58+
return false;
6359
}
6460

6561
if ((ret = listen(serverSocket, 1)) < 0) {
62+
cleanupSocket();
63+
return false;
64+
}
65+
return true;
66+
}
67+
68+
void TcpReceiver::cleanupSocket() {
69+
if (serverSocket >= 0) {
6670
shutdown(serverSocket, SHUT_RDWR);
6771
close(serverSocket);
6872
serverSocket = -1;
69-
return;
7073
}
74+
}
7175

72-
struct sockaddr_in clientAddr {};
73-
memset(&clientAddr, 0, sizeof(clientAddr));
74-
76+
void TcpReceiver::executeThread() {
77+
socklen_t len;
7578
while (!exitRequested) {
76-
len = 16;
79+
if (serverSocket < 0) {
80+
if (!createSocket()) {
81+
DEBUG_FUNCTION_LINE_WARN("Starting the wiiload server failed. Check the network connection.");
82+
OSSleepTicks(OSSecondsToTicks(5));
83+
}
84+
continue;
85+
}
86+
struct sockaddr_in clientAddr {};
87+
memset(&clientAddr, 0, sizeof(clientAddr));
88+
89+
len = 16;
90+
DEBUG_FUNCTION_LINE("Waiting for wiiload connection");
7791
int32_t clientSocket = accept(serverSocket, (struct sockaddr *) &clientAddr, &len);
7892
if (clientSocket >= 0) {
7993
uint32_t ipAddress = clientAddr.sin_addr.s_addr;
80-
//serverReceiveStart(this, ipAddress);
81-
int32_t result = loadToMemory(clientSocket, ipAddress);
82-
//serverReceiveFinished(this, ipAddress, result);
94+
int32_t result = loadToMemory(clientSocket, ipAddress);
8395
close(clientSocket);
8496

85-
8697
if (result >= 0) {
8798
break;
8899
}
89100
} else {
90-
DEBUG_FUNCTION_LINE_ERR("Server socket accept failed socket: %i errno: %d", clientSocket, errno);
91-
OSSleepTicks(OSMicrosecondsToTicks(100000));
101+
if (!exitRequested) {
102+
DEBUG_FUNCTION_LINE_WARN("Error accepting the socket");
103+
cleanupSocket();
104+
OSSleepTicks(OSSecondsToTicks(1));
105+
}
92106
}
93107
}
94-
95-
shutdown(serverSocket, SHUT_RDWR);
96-
close(serverSocket);
97-
serverSocket = -1;
108+
cleanupSocket();
109+
DEBUG_FUNCTION_LINE("Stopping wiiload server.");
98110
}
99111

100112
int32_t TcpReceiver::loadToMemory(int32_t clientSocket, uint32_t ipAddress) {

src/utils/TcpReceiver.h

+3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ class TcpReceiver : public CThread {
2424
private:
2525
void executeThread() override;
2626

27+
bool createSocket();
28+
void cleanupSocket();
29+
2730
static int32_t loadToMemory(int32_t clientSocket, uint32_t ipAddress);
2831

2932
bool exitRequested;

0 commit comments

Comments
 (0)