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
10731081lw_import address address_new (address);
10741082lw_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
10791087lw_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
14971505lw_import flashpolicy flashpolicy_new (pump);
14981506lw_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+
15291540struct readlock ;
15301541struct writelock ;
15311542struct readwritelock
@@ -1566,6 +1577,7 @@ struct readwritelock
15661577#else
15671578 lacewing::readlock createReadLock ();
15681579 lacewing::writelock createWriteLock ();
1580+ #endif
15691581
15701582protected:
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-
15821592private:
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;
16881700struct relayclient
16891701{
16901702public:
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 {
19121924struct relayserverinternal ;
19131925struct 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
0 commit comments