Skip to content

Commit ee1cec0

Browse files
committed
Update Bluewing Server to build 30
Build 28 was only fixes for the Fusion extension. Build 29 had mostly Fusion-only fixes, but some edits: * Fixed chance of crash for blank name set requests, the only crash in bluewing-cpp-server observed over a year of continous uptime now + Added channel close handler - runs just prior to channel unloading, be it from server-inited channel close, from last client leaving, from master leaving with autoclose on * Version function now has ANSI or Unicode in it for Windows (always Unicode compatible on mobile) * Fixed an invalid return code from the address resolver thread - wouldn't cause an error, but was bad practice And Bluewing Server b30 was a re-release of b29, after some botches in the release process, and issues with the then-bleeding-edge DarkEdif SDK v13.
1 parent 0a2f25a commit ee1cec0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+901
-1983
lines changed

Lacewing/CodePointAllowList.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ std::string lacewing::codepointsallowlist::setcodepointsallowedlist(std::string
8181
// Wildcard
8282
if (cur[1] == '*')
8383
{
84-
char firstCharUpper = std::toupper(cur[0]);
84+
char firstCharUpper = (char)std::toupper(cur[0]);
8585
for (size_t i = 0; i < sizeof(wildcardCategory); i++)
8686
{
8787
if (firstCharUpper == wildcardCategory[i])
@@ -131,7 +131,7 @@ std::string lacewing::codepointsallowlist::setcodepointsallowedlist(std::string
131131
if (std::find(specificCodePoints.cbegin(), specificCodePoints.cend(), codePointAllowed) != specificCodePoints.cend())
132132
return CPALMakeError(this, acTemp, "Specific codepoint %lu was added twice in list \"%hs\".", codePointAllowed, acStr.c_str());
133133

134-
specificCodePoints.push_back(codePointAllowed);
134+
specificCodePoints.push_back((int)codePointAllowed);
135135
if (cur[0] == ',')
136136
++cur;
137137
goto nextChar;

Lacewing/FrameBuilder.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,27 @@ class framebuilder : public messagebuilder
4747
lw_ui32 headersize;
4848

4949
// Message size < 254; store as type byte + size byte
50-
if (messagesize < 254)
50+
if (messagesize < 0xfe)
5151
{
52-
buffer[6] = type;
53-
buffer[7] = messagesize;
52+
(*(lw_ui8*)(buffer + 6)) = (lw_ui8)type;
53+
(*(lw_ui8*)(buffer + 7)) = (lw_ui8)messagesize;
5454

5555
headersize = 2;
5656
}
5757
// Message size >= 0xFF and <= 0xFFFF; store as type byte, plus size indicator byte of 254, plus size uint16
5858
else if (messagesize < 0xffff)
5959
{
60-
buffer[4] = type;
60+
(*(lw_ui8*)(buffer + 4)) = (lw_ui8)type;
6161

6262
(*(lw_ui8 *) (buffer + 5)) = 254;
63-
(*(lw_ui16 *) (buffer + 6)) = messagesize;
63+
(*(lw_ui16 *) (buffer + 6)) = (lw_ui16)messagesize;
6464

6565
headersize = 4;
6666
}
6767
// Message size > 0xFFFF and <= 0xFFFFFFFF; store as type byte, plus size indicator byte of 255, plus size uint32
68-
else if (messagesize < 0xffffffff)
68+
else if ((lw_ui32)messagesize < 0xffffffff)
6969
{
70-
buffer[2] = type;
70+
(*(lw_ui8*)(buffer + 2)) = (lw_ui8)type;
7171

7272
(*(lw_ui8 *) (buffer + 3)) = 255;
7373
(*(lw_ui32 *) (buffer + 4)) = messagesize;
@@ -107,10 +107,10 @@ class framebuilder : public messagebuilder
107107
return;
108108
}
109109

110-
add <lw_ui8> ((type << 4) | variant);
110+
add <lw_ui8> ((lw_ui8)((type << 4) | variant));
111111

112112
if (isudpclient)
113-
add <lw_ui16> (udpclientid);
113+
add <lw_ui16> ((lw_ui16)udpclientid);
114114
}
115115

116116
inline void send(lacewing::server_client client, bool clear = true)

Lacewing/FrameReader.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class framereader
6262

6363
while (state < 3 && size -- > 0)
6464
{
65-
unsigned char byte = *(data ++);
65+
lw_ui8 byte = *(data ++);
6666

6767
switch (state)
6868
{
@@ -76,7 +76,7 @@ class framereader
7676
{
7777
if (sizebytesleft > 0)
7878
{
79-
buffer.add <unsigned char> (byte);
79+
buffer.add <lw_ui8 > (byte);
8080

8181
if ((-- sizebytesleft) == 0)
8282
{
@@ -152,7 +152,7 @@ class framereader
152152
if (!mhRet)
153153
return false; // Error, exit out
154154

155-
// Not safe to do this if messagehandler() is false
155+
// Not safe to do this if messagehandler() is false, if we're using const memory
156156
*(char *)&data[messagesize] = nextbyte;
157157
state = 0;
158158

@@ -175,7 +175,7 @@ class framereader
175175

176176
if (buffer.size == messagesize)
177177
{
178-
buffer.add <char> (0);
178+
buffer.add <lw_ui8> (0);
179179

180180
if (!messagehandler(tag, messagetype, buffer.buffer, messagesize))
181181
return false; // Error, exit out

Lacewing/Lacewing.h

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,11 @@
118118
#include <mutex>
119119
#include <shared_mutex>
120120
#include <thread>
121+
#include <cctype>
121122
#include <cstring>
122123

123124
// std::string_view requires C++17
124-
#if __cplusplus < 201703L && _MSVC_LANG < 201703L
125+
#if (__cplusplus < 201703L && _MSVC_LANG < 201703L) || (defined(__clang__) && !__has_include(<string_view>))
125126
#error C++17 std::string_view not available, check what C++ standard your project is using
126127
#endif
127128
#include <string_view>
@@ -144,9 +145,7 @@ typedef lw_i8 lw_bool;
144145
#if (!defined(_lacewing_internal))
145146

146147
/* The ugly underscore prefixes are only necessary because we have to
147-
* compile the library as C++ for MSVC compatibility. Maybe one day MSVC
148-
* will support C99 (or everyone will stop using Windows - I'm happy either
149-
* way.)
148+
* compile the library as C++ for MSVC compatibility.
150149
*/
151150

152151
typedef struct _lw_thread * lw_thread;
@@ -195,9 +194,13 @@ typedef lw_i8 lw_bool;
195194
lw_import void lw_md5_hex (char * output, const char * input, size_t length);
196195
lw_import void lw_sha1 (char * output, const char * input, size_t length);
197196
lw_import void lw_sha1_hex (char * output, const char * input, size_t length);
198-
lw_import void lw_trace (const char * format, ...);
197+
#if defined(_MSC_VER) || (defined(__unix__) && !defined(__ANDROID__))
198+
#define __printflike(a,b) /* no op */
199+
#endif
200+
lw_import void lw_trace (const char * format, ...) __printflike(1, 2);
199201
lw_import void lw_dump (const char * buffer, size_t size);
200202
lw_import lw_bool lw_random (char * buffer, size_t size);
203+
lw_import size_t lw_min_size_t (size_t a, size_t b);
201204

202205
/* Thread */
203206

@@ -212,12 +215,12 @@ typedef lw_i8 lw_bool;
212215
/* Address */
213216

214217
lw_import lw_addr lw_addr_new (const char * hostname, const char * service);
215-
lw_import lw_addr lw_addr_new_port (const char * hostname, long port);
216-
lw_import lw_addr lw_addr_new_hint (const char * hostname, const char * service, long hints);
217-
lw_import lw_addr lw_addr_new_port_hint (const char * hostname, long port, long hints);
218+
lw_import lw_addr lw_addr_new_port (const char * hostname, lw_ui16 port);
219+
lw_import lw_addr lw_addr_new_hint (const char * hostname, const char * service, int hints);
220+
lw_import lw_addr lw_addr_new_port_hint (const char * hostname, lw_ui16 port, int hints);
218221
lw_import lw_addr lw_addr_clone (lw_addr);
219222
lw_import void lw_addr_delete (lw_addr);
220-
lw_import long lw_addr_port (lw_addr);
223+
lw_import lw_ui16 lw_addr_port (lw_addr);
221224
lw_import void lw_addr_set_port (lw_addr, long port);
222225
lw_import int lw_addr_type (lw_addr);
223226
lw_import void lw_addr_set_type (lw_addr, int);
@@ -378,7 +381,7 @@ typedef lw_i8 lw_bool;
378381
typedef struct lw_streamdef
379382
{
380383
size_t (* sink_data) (lw_stream, const char * buffer, size_t size);
381-
size_t (* sink_stream) (lw_stream, lw_stream source, size_t size);
384+
lw_i64 (* sink_stream) (lw_stream, lw_stream source, size_t size);
382385
void (* retry) (lw_stream, int when);
383386
lw_bool (* is_transparent) (lw_stream);
384387
lw_bool (* close) (lw_stream, lw_bool immediate);
@@ -455,7 +458,7 @@ typedef lw_i8 lw_bool;
455458

456459
lw_import lw_error lw_error_new ();
457460
lw_import void lw_error_delete (lw_error);
458-
lw_import void lw_error_add (lw_error, long);
461+
lw_import void lw_error_add (lw_error, int);
459462
lw_import void lw_error_addf (lw_error, const char * format, ...);
460463
lw_import void lw_error_addv (lw_error, const char * format, va_list);
461464
lw_import size_t lw_error_size (lw_error);
@@ -471,9 +474,9 @@ typedef lw_i8 lw_bool;
471474
*/
472475

473476
lw_import lw_client lw_client_new (lw_pump);
474-
lw_import void lw_client_connect (lw_client, const char * host, long port);
477+
lw_import void lw_client_connect (lw_client, const char * host, lw_ui16 port);
475478
lw_import void lw_client_connect_addr (lw_client, lw_addr);
476-
lw_import void lw_client_connect_secure (lw_client, const char * host, long port);
479+
lw_import void lw_client_connect_secure (lw_client, const char * host, lw_ui16 port);
477480
lw_import void lw_client_connect_addr_secure (lw_client, lw_addr);
478481
lw_import void lw_client_disconnect (lw_client);
479482
lw_import lw_bool lw_client_connected (lw_client);
@@ -530,12 +533,12 @@ typedef lw_i8 lw_bool;
530533

531534
lw_import lw_udp lw_udp_new (lw_pump);
532535
lw_import void lw_udp_delete (lw_udp);
533-
lw_import void lw_udp_host (lw_udp, long port);
536+
lw_import void lw_udp_host (lw_udp, lw_ui16 port);
534537
lw_import void lw_udp_host_filter (lw_udp, lw_filter);
535538
lw_import void lw_udp_host_addr (lw_udp, lw_addr);
536539
lw_import lw_bool lw_udp_hosting (lw_udp);
537540
lw_import void lw_udp_unhost (lw_udp);
538-
lw_import long lw_udp_port (lw_udp);
541+
lw_import lw_ui16 lw_udp_port (lw_udp);
539542
lw_import void lw_udp_send (lw_udp, lw_addr, const char * buffer, size_t size);
540543
lw_import void * lw_udp_tag (lw_udp);
541544
lw_import void lw_udp_set_tag (lw_udp, void *);
@@ -680,6 +683,11 @@ typedef lw_i8 lw_bool;
680683
#else
681684
#define lw_class_wraps(c)
682685
#endif
686+
#ifdef _MSC_VER
687+
#define lw_sprintf_s sprintf_s
688+
#else
689+
#define lw_sprintf_s sprintf
690+
#endif
683691

684692
#pragma region Phi stuff
685693

@@ -1008,7 +1016,7 @@ struct _fdstream : public _stream
10081016
lw_class_wraps (fdstream);
10091017

10101018
lw_import void set_fd
1011-
(lw_fd, lw_pump_watch watch = 0, bool auto_close = false);
1019+
(lw_fd, lw_pump_watch watch = 0, bool auto_close = false, bool is_socket = false);
10121020

10131021
lw_import bool valid ();
10141022

@@ -1048,8 +1056,8 @@ struct _address
10481056
{
10491057
lw_class_wraps (address);
10501058

1051-
lw_import long port ();
1052-
lw_import void port (long);
1059+
lw_import lw_ui16 port ();
1060+
lw_import void port (lw_ui16);
10531061

10541062
lw_import int type ();
10551063
lw_import void type (int);
@@ -1072,9 +1080,9 @@ struct _address
10721080

10731081
lw_import address address_new (address);
10741082
lw_import address address_new (const char * hostname, const char * service);
1075-
lw_import address address_new (const char * hostname, long port);
1076-
lw_import address address_new (const char * hostname, const char * service, long hints);
1077-
lw_import address address_new (const char * hostname, long port, long hints);
1083+
lw_import address address_new (const char * hostname, lw_ui16 port);
1084+
lw_import address address_new (const char * hostname, const char * service, int hints);
1085+
lw_import address address_new (const char * hostname, lw_ui16 port, int hints);
10781086

10791087
lw_import void address_delete (address);
10801088

@@ -1121,7 +1129,7 @@ struct _client : public _fdstream
11211129
{
11221130
lw_class_wraps (client);
11231131

1124-
lw_import void connect (const char * host, long port);
1132+
lw_import void connect (const char * host, lw_ui16 port);
11251133
lw_import void connect (address);
11261134

11271135
lw_import bool connected ();
@@ -1217,14 +1225,14 @@ struct _udp
12171225
{
12181226
lw_class_wraps (udp);
12191227

1220-
lw_import void host (long port);
1228+
lw_import void host (lw_ui16 port);
12211229
lw_import void host (filter);
12221230
lw_import void host (address);
12231231

12241232
lw_import bool hosting ();
12251233
lw_import void unhost ();
12261234

1227-
lw_import long port ();
1235+
lw_import lw_ui16 port ();
12281236

12291237
lw_import void send (address, const char * data, size_t size = -1);
12301238

@@ -1497,7 +1505,7 @@ struct _flashpolicy
14971505
lw_import flashpolicy flashpolicy_new (pump);
14981506
lw_import void flashpolicy_delete (flashpolicy);
14991507

1500-
#pragma region Phi stuff
1508+
//#pragma region Phi stuff
15011509
// NOTE: if you edit this due to new liblacewing release, note:
15021510
// _flashpolicy::on_error requires flash policy definition to be extracted.
15031511
// Otherwise the flashpolicy can't be accessed for the C++ Flash Policy extension covered in flashpolicy2.cc.
@@ -1526,6 +1534,9 @@ lw_import void flashpolicy_delete (flashpolicy);
15261534
//
15271535
// lw_client is_connecting is now set to false properly if getaddrinfo fails.
15281536

1537+
// Make sure you also add UDP keep-alive. Routers close connection otherwise.
1538+
// Make sure you also fix the timer issue in unix.
1539+
15291540
struct readlock;
15301541
struct writelock;
15311542
struct readwritelock
@@ -1566,6 +1577,7 @@ struct readwritelock
15661577
#else
15671578
lacewing::readlock createReadLock();
15681579
lacewing::writelock createWriteLock();
1580+
#endif
15691581

15701582
protected:
15711583
void openReadLock(readlock & rl);
@@ -1577,10 +1589,10 @@ struct readwritelock
15771589
void upgradeReadLock(readlock &rl, writelock &wl);
15781590
void downgradeWriteLock(writelock &wl, readlock &rl);
15791591

1580-
#endif
1581-
15821592
private:
15831593

1594+
// Would use std::shared_mutex, or std::shared_timed_mutex, but iOS doesn't support it until 10.0,
1595+
// so we'll roll our own.
15841596
std::shared_timed_mutex lock;
15851597
//std::condition_variable read, write;
15861598
::std::atomic<size_t> readers, writers, read_waiters, write_waiters;
@@ -1688,7 +1700,7 @@ struct relayclientinternal;
16881700
struct relayclient
16891701
{
16901702
public:
1691-
const static int buildnum = 96;
1703+
const static int buildnum = 99;
16921704

16931705
void * internaltag = nullptr, *tag = nullptr;
16941706

@@ -1912,7 +1924,7 @@ struct codepointsallowlist {
19121924
struct relayserverinternal;
19131925
struct relayserver
19141926
{
1915-
static const int buildnum = 27;
1927+
static const int buildnum = 30;
19161928

19171929
void * internaltag, * tag = nullptr;
19181930

@@ -2204,10 +2216,12 @@ struct relayserver
22042216
void nameset_response(std::shared_ptr<lacewing::relayserver::client> client,
22052217
std::string_view newClientName, std::string_view denyReason);
22062218
};
2207-
#pragma endregion
2219+
//#pragma endregion
22082220

22092221
}
22102222

2223+
#else
2224+
#error Not building as C++
22112225
#endif /* defined (__cplusplus) */
22122226
#endif /* _lacewing_h */
22132227

Lacewing/MessageBuilder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ class messagebuilder
5757

5858
void add(const char * const buffer, size_t sizeP)
5959
{
60-
if (sizeP == -1)
61-
sizeP = (lw_i32)strlen(buffer);
60+
if (sizeP == (size_t)-1)
61+
sizeP = (lw_ui32)strlen(buffer);
6262

6363
if constexpr (sizeof(sizeP) > 4)
6464
assert(sizeP < 0xFFFFFFFF);

Lacewing/PhiAddress.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,14 @@ std::string_view lw_u8str_trim(std::string_view toTrim, bool abortOnTrimNeeded)
295295
#endif
296296
void LacewingFatalErrorMsgBox2(const char * const func, const char * const file, const int line)
297297
{
298+
// Remove the repository name
299+
const char * fileSub = strstr(file, "Lacewing\\");
300+
fileSub = fileSub ? fileSub : file;
301+
298302
std::stringstream err;
299-
err << "Lacewing fatal error detected.\nFile: "sv << file << "\nFunction: "sv << func << "\nLine: "sv << line;
303+
err << "Lacewing fatal error detected.\nFile: "sv << fileSub << "\nFunction: "sv << func << "\nLine: "sv << line;
300304
#ifdef _WIN32
301-
MessageBoxA(NULL, err.str().c_str(), "" PROJECT_NAME " Msg Box Death", MB_ICONERROR);
305+
MessageBoxA(NULL, err.str().c_str(), "" PROJECT_NAME " fatal error", MB_ICONERROR);
302306
#else
303307
char output[512];
304308
strcpy(output, err.str().c_str());

0 commit comments

Comments
 (0)