diff --git a/Lacewing/Lacewing.h b/Lacewing/Lacewing.h index 8b6b458..2902f04 100644 --- a/Lacewing/Lacewing.h +++ b/Lacewing/Lacewing.h @@ -2141,7 +2141,14 @@ struct relayserver // Expects you have already checked channel with that name does not exist. std::shared_ptr createchannel(std::string_view channelName, std::shared_ptr master, bool hidden, bool autoclose); - mutable lacewing::readwritelock lock; + // handles unhost/host, welcome message change, handler change + mutable lacewing::readwritelock lock_meta; + // handles channel list modifications - only to the underlying vector, not to requests like leave or close requests + mutable lacewing::readwritelock lock_channellist; + // handles client list modifications - only to the underlying vector, not to requests like disconnect requests + mutable lacewing::readwritelock lock_clientlist; + // handles UDP? + mutable lacewing::readwritelock lock_udp; typedef void(*handler_connect) (lacewing::relayserver &server, std::shared_ptr client); typedef void(*handler_disconnect) (lacewing::relayserver &server, std::shared_ptr client); diff --git a/Lacewing/PhiAddress.cc b/Lacewing/PhiAddress.cc index c06a6be..2f2027d 100644 --- a/Lacewing/PhiAddress.cc +++ b/Lacewing/PhiAddress.cc @@ -319,6 +319,7 @@ void LacewingFatalErrorMsgBox2(const char * const func, const char * const file, err << "Lacewing fatal error detected.\nFile: "sv << fileSub << "\nFunction: "sv << func << "\nLine: "sv << line; #ifdef _WIN32 MessageBoxA(NULL, err.str().c_str(), "" PROJECT_NAME " fatal error", MB_ICONERROR); + std::abort(); #else char output[512]; strcpy(output, err.str().c_str()); diff --git a/Lacewing/RelayServer.cc b/Lacewing/RelayServer.cc index a483355..34c3da3 100644 --- a/Lacewing/RelayServer.cc +++ b/Lacewing/RelayServer.cc @@ -108,7 +108,14 @@ struct relayserverinternal } ~relayserverinternal() noexcept { - auto serverWriteLock = server.lock.createWriteLock(); + // There shouldn't be any contention here anyway; by the time relayserverinternal is destructed, + // all other threads reading from relayserver should be shut down. + auto serverMetaWriteLock = server.lock_meta.createWriteLock(); + auto serverCliListWriteLock = server.lock_clientlist.createWriteLock(); + auto serverChListWriteLock = server.lock_channellist.createWriteLock(); + auto serverUDPWriteLock = server.lock_udp.createWriteLock(); + + // TODO: Will this ever be non-empty? for (auto& c : clients) { auto cliWriteLock = c->lock.createWriteLock(); @@ -175,7 +182,8 @@ struct relayserverinternal msgBuilderUDP.addheader(11, 0, true); /* ping header, true for UDP */ std::chrono::steady_clock::time_point currentTime = std::chrono::steady_clock::now(); - auto serverReadLock = server.lock.createReadLock(); + auto serverClientListReadLock = server.lock_clientlist.createReadLock(); + auto serverUDPWriteLock = server.lock_udp.createWriteLock(); for (const auto& client : clients) { if (client->_readonly) @@ -252,7 +260,8 @@ struct relayserverinternal if (pingUnresponsivesToDisconnect.empty() && inactivesToDisconnects.empty()) return; - serverReadLock.lw_unlock(); + serverClientListReadLock.lw_unlock(); + serverUDPWriteLock.lw_unlock(); // Loop all pending ping disconnects for (auto& client : pingUnresponsivesToDisconnect) @@ -263,12 +272,12 @@ struct relayserverinternal // To allow client disconnect handlers to run without clashes, we keep the lock open // as frequently as possible. - if (!serverReadLock.isEnabled()) - serverReadLock.lw_relock(); + if (!serverClientListReadLock.isEnabled()) + serverClientListReadLock.lw_relock(); if (std::find(clients.begin(), clients.end(), client) != clients.end()) { - serverReadLock.lw_unlock(); + serverClientListReadLock.lw_unlock(); auto clientWriteLock = client->lock.createWriteLock(); if (client->_readonly) continue; @@ -309,11 +318,11 @@ struct relayserverinternal if (client->_readonly) continue; - if (!serverReadLock.isEnabled()) - serverReadLock.lw_relock(); + if (!serverClientListReadLock.isEnabled()) + serverClientListReadLock.lw_relock(); if (std::find(clients.begin(), clients.end(), client) != clients.end()) { - serverReadLock.lw_unlock(); + serverClientListReadLock.lw_unlock(); auto clientWriteLock = client->lock.createWriteLock(); if (client->_readonly) @@ -394,12 +403,12 @@ void relayserverinternal::generic_handlerudpreceive(lacewing::udp udp, lacewing: data.remove_prefix(sizeof(type) + sizeof(id)); - auto serverReadLock = server.lock.createReadLock(); + auto serverClientListReadLock = server.lock_clientlist.createReadLock(); for (const auto& clientsocket : clients) { if (clientsocket->_id == id) { - serverReadLock.lw_unlock(); + serverClientListReadLock.lw_unlock(); // Pay close attention to this * here. You can do // lacewing::address == lacewing::_address, but // not any other combo. @@ -457,7 +466,7 @@ void relayserverinternal::generic_handlerudpreceive(lacewing::udp udp, lacewing: } } - serverReadLock.lw_unlock(); + serverClientListReadLock.lw_unlock(); #if 0 // http://web.archive.org/web/20020609030916/http://www.gamehigh.net/document/netdocs/docs/ping_src.htm @@ -720,7 +729,7 @@ void relayserver::client::PeerToPeer(relayserver &server, std::shared_ptrpseudoUDP) { - auto serverWriteLock = server.lock.createWriteLock(); + auto serverUDPWriteLock = server.lock_udp.createWriteLock(); builder.send(server.udp, receivingClient->udpaddress); } else @@ -851,7 +860,7 @@ void relayserverinternal::generic_handlerconnect(lacewing::server server, lacewi auto newClient = std::make_shared(*this, clientsocket); lw_server_client_set_relay_tag((lw_server_client)clientsocket, newClient.get()); { - auto serverWriteLock = this->server.lock.createWriteLock(); + auto serverClientListWriteLock = this->server.lock_clientlist.createWriteLock(); this->clients.push_back(newClient); } @@ -880,7 +889,7 @@ void relayserverinternal::generic_handlerdisconnect(lacewing::server server, lac lacewing::writelock cliWriteLock = client->lock.createWriteLock(); client->_readonly = true; - lacewing::writelock serverWriteLock = this->server.lock.createWriteLock(); + lacewing::writelock serverClientListWriteLock = this->server.lock_clientlist.createWriteLock(); auto clientIt = std::find_if(clients.begin(), clients.end(), [=](const auto &p) { return p.get() == client; }); @@ -894,9 +903,6 @@ void relayserverinternal::generic_handlerdisconnect(lacewing::server server, lac lw_server_client_set_relay_tag((lw_server_client)clientsocket, nullptr); - lw_trace("socket closure for %p", this->server.socket); - //client->socket->close(true); - //client->disconnect(); cliWriteLock.lw_unlock(); if (client->connectRequestApproved && handlerdisconnect && server->hosting()) @@ -904,13 +910,13 @@ void relayserverinternal::generic_handlerdisconnect(lacewing::server server, lac // We want count of clients to be accurate for the ondisconnect handler. // Note close_client() will also remove it, if it's the else block. clients.erase(clientIt); - serverWriteLock.lw_unlock(); + serverClientListWriteLock.lw_unlock(); handlerdisconnect(this->server, clientShd); } else { - serverWriteLock.lw_unlock(); + serverClientListWriteLock.lw_unlock(); } close_client(clientShd); @@ -1043,12 +1049,12 @@ void relayserverinternal::generic_handlerreceive(lacewing::server server, lacewi // This will instantly disconnect, destroying the relay tag; which will cause the relay // write lock to notice the disconnect func is still write-locking the relay tag, and abort the app. // So, we grab a shared_ptr owner for ourselves - auto rl = internal.server.lock.createReadLock(); + auto serverClientListReadLock = internal.server.lock_clientlist.createReadLock(); const auto csc = std::find_if(internal.clients.crbegin(), internal.clients.crend(), [=](const auto& s) { return &*s == clientPtr; }); if (csc == internal.clients.crend()) { - rl.lw_unlock(); + serverClientListReadLock.lw_unlock(); // This direct close may still cause a crash, but no idea what recovery we can do at this point clientsocket->tag(nullptr); clientsocket->close(true); @@ -1056,7 +1062,7 @@ void relayserverinternal::generic_handlerreceive(lacewing::server server, lacewi else { const auto csc2 = *csc; - rl.lw_unlock(); + serverClientListReadLock.lw_unlock(); csc2->disconnect(1003); } return; @@ -1107,12 +1113,12 @@ void relayserverinternal::generic_handlerreceive(lacewing::server server, lacewi // This will instantly disconnect, destroying the relay tag; which will cause the relay // write lock to notice the disconnect func is still write-locking the relay tag, and abort the app. // So, we grab a shared_ptr owner for ourselves - auto rl = internal.server.lock.createReadLock(); + auto serverClientListReadLock = internal.server.lock_clientlist.createReadLock(); const auto csc = std::find_if(internal.clients.crbegin(), internal.clients.crend(), [=](const auto& s) { return &*s == clientPtr; }); if (csc == internal.clients.crend()) { - rl.lw_unlock(); + serverClientListReadLock.lw_unlock(); // This direct close may still cause a crash, but no idea what recovery we can do at this point clientsocket->tag(nullptr); clientsocket->close(true); @@ -1120,7 +1126,7 @@ void relayserverinternal::generic_handlerreceive(lacewing::server server, lacewi else { const auto csc2 = *csc; - rl.lw_unlock(); + serverClientListReadLock.lw_unlock(); csc2->disconnect(1008); } } @@ -1546,13 +1552,13 @@ void relayserverinternal::close_channel(std::shared_ptr ch // Remove the channel from server's list (if it exists) { - auto serverWriteLock = server.lock.createWriteLock(); + auto serverChannelListWriteLock = server.lock_channellist.createWriteLock(); for (auto e3 = channels.begin(); e3 != channels.end(); e3++) { if (*e3 == channel) { // LW_ESCALATION_NOTE - // auto serverWriteLock = serverReadLock.lw_upgrade(); + // auto serverChannelListWriteLock = serverChannelListReadLock.lw_upgrade(); channels.erase(e3); break; } @@ -1601,6 +1607,8 @@ void relayserverinternal::close_client (std::shared_ptrchannels.cbegin(), client->channels.cend(), clientJoinedCh) != client->channels.cend()) LacewingFatalErrorMsgBox(); } @@ -1611,8 +1619,8 @@ void relayserverinternal::close_client (std::shared_ptrlock.createWriteLock(); auto clientWriteLock = client->lock.createWriteLock(); - // Note: We still have to tell peers if only leaving client is readonly, so keep running. - if (channel->_readonly /* || client->_readonly */) - return; - // Drop channel from client's joined channel list - note this happens even if the channel close handler pauses things for (auto e2 = client->channels.begin(); e2 != client->channels.end(); e2++) { @@ -1744,6 +1748,12 @@ void relayserverinternal::channel_removeclient(std::shared_ptr_readonly /* || client->_readonly */) + return; + framebuilder builder(true); for (auto e = channel->clients.begin(); e != channel->clients.end(); e++) @@ -1889,7 +1899,7 @@ bool relayserver::client::checkname(std::string_view name) } const std::string nameSimplified = lw_u8str_simplify(name); - auto serverReadLock = server.server.lock.createReadLock(); + auto serverClientListReadLock = server.server.lock_clientlist.createReadLock(); // const auto breaks on Unix - the lock doesn't destruct for (auto& e2 : server.clients) @@ -2623,15 +2633,12 @@ void relayserver::client::blast(lw_ui8 subchannel, std::string_view message, lw_ builder.add(subchannel); builder.add (message); - auto serverWriteLock = server.server.lock.createWriteLock(); + auto serverUDPWriteLock = server.server.lock_udp.createWriteLock(); auto clientReadLock = lock.createReadLock(); if (!_readonly) { if (pseudoUDP) - { builder.send(this->socket); - builder.revert(); - } else builder.send(server.server.udp, udpaddress); } @@ -2671,10 +2678,10 @@ void relayserver::channel::blast(lw_ui8 subchannel, std::string_view message, lw if (_readonly) return; - auto serverWriteLock = server.server.lock.createWriteLock(); + auto serverClientListReadLock = server.server.lock_clientlist.createReadLock(); for (const auto& e : clients) { - auto clientReadLock = e->lock.createWriteLock(); + auto clientWriteLock = e->lock.createWriteLock(); if (!e->_readonly) { if (e->socket->is_websocket()) @@ -2691,7 +2698,7 @@ void relayserver::channel::blast(lw_ui8 subchannel, std::string_view message, lw /// Throw all clients off this channel, sending Leave Request Success. void relayserver::channel::close() { - auto serverReadLock = server.server.lock.createReadLock(); + auto serverChannelListReadLock = server.server.lock_channellist.createReadLock(); auto ch = std::find_if(server.channels.begin(), server.channels.end(), [=](const auto &p) { return p.get() == this; }); @@ -2699,7 +2706,7 @@ void relayserver::channel::close() if (ch == server.channels.end()) return; - serverReadLock.lw_unlock(); + serverChannelListReadLock.lw_unlock(); server.close_channel(*ch); } @@ -2827,20 +2834,20 @@ std::vector>& relayserver::channe void relayserver::setwelcomemessage(std::string_view message) { - lacewing::writelock wl = lock.createWriteLock(); + lacewing::writelock serverMetaWriteLock = lock_meta.createWriteLock(); relayserverinternal& serverinternal = *(relayserverinternal *)internaltag; serverinternal.welcomemessage = message; } std::string relayserver::getwelcomemessage() { - lacewing::readlock rl = lock.createReadLock(); + lacewing::readlock serverMetaReadLock = lock_meta.createReadLock(); return ((relayserverinternal *)internaltag)->welcomemessage; } void relayserver::setchannellisting (bool enabled) { - lacewing::writelock wl = lock.createWriteLock(); + lacewing::writelock serverMetaWriteLock = lock_meta.createWriteLock(); ((relayserverinternal *) internaltag)->channellistingenabled = enabled; } @@ -2860,26 +2867,26 @@ void relayserver::client::disconnect(int websocketReasonCode) return; } - lacewing::writelock wl = lock.createWriteLock(); + lacewing::writelock clientWriteLock = lock.createWriteLock(); if (socket && socket->valid()) socket->close(); } std::string relayserver::client::name() const { - lacewing::readlock rl = lock.createReadLock(); + lacewing::readlock clientReadLock = lock.createReadLock(); return _name; } std::string relayserver::client::nameSimplified() const { - lacewing::readlock rl = lock.createReadLock(); + lacewing::readlock clientReadLock = lock.createReadLock(); return _namesimplified; } void relayserver::client::name(std::string_view name) { - lacewing::writelock wl = lock.createWriteLock(); + lacewing::writelock clientWriteLock = lock.createWriteLock(); _prevname = _name; _name = name; _namesimplified = lw_u8str_simplify(name); @@ -2902,7 +2909,7 @@ std::vector> & relayserver::clie size_t relayserver::channelcount() const { - lacewing::readlock rl = lock.createReadLock(); + lacewing::readlock serverChannelListReadLock = lock_channellist.createReadLock(); return ((relayserverinternal *) internaltag)->channels.size(); } @@ -2916,14 +2923,14 @@ void relayserver::setinactivitytimer(long MS) std::string relayserver::setcodepointsallowedlist(codepointsallowlistindex type, std::string acStr) { // String should be format: // 2 letters, or 1 letter + *, or an integer number that is the UTF32 number of char - lacewing::writelock wl = lock.createWriteLock(); + lacewing::writelock serverMetaWriteLock = lock_meta.createWriteLock(); return ((relayserverinternal *)internaltag)->setcodepointsallowedlist(type, acStr); } // True if the string passed only has code points within the code point allow list. int relayserver::checkcodepointsallowed(relayserver::codepointsallowlistindex type, std::string_view toTest, int * rejectedUTF32CodePoint /* = nullptr */) const { - lacewing::readlock rl = lock.createReadLock(); + lacewing::readlock serverMetaReadLock = lock_meta.createReadLock(); return ((relayserverinternal *)internaltag)->checkcodepointsallowed(type, toTest, rejectedUTF32CodePoint); } @@ -2934,12 +2941,12 @@ std::string relayserverinternal::setcodepointsallowedlist(relayserver::codepoint std::vector> & relayserver::getclients() { - lock.checkHoldsRead(); + lock_clientlist.checkHoldsRead(); return ((lacewing::relayserverinternal *)internaltag)->clients; } std::vector>& relayserver::getchannels() { - lock.checkHoldsRead(); + lock_channellist.checkHoldsRead(); return ((lacewing::relayserverinternal *)internaltag)->channels; } @@ -2971,13 +2978,13 @@ lw_i64 relayserver::client::getconnecttime() const size_t relayserver::clientcount() const { - lacewing::readlock rl = lock.createReadLock(); + lacewing::readlock serverClientListReadLock = lock_clientlist.createReadLock(); return ((relayserverinternal *)internaltag)->clients.size(); } relayserver::client::~client() noexcept { - writelock wl = lock.createWriteLock(); + lacewing::writelock clientWriteLock = lock.createWriteLock(); //lw_trace("~relayserver::client called for address %p, name %s, ID %hu\n", this, _name.c_str(), _id); channels.clear(); @@ -3038,7 +3045,7 @@ std::shared_ptr relayserver::createchannel(std::string_vie } else { - lacewing::writelock serverWriteLock = lock.createWriteLock(); + lacewing::writelock serverChannelListWriteLock = lock_channellist.createWriteLock(); if (std::find(serverinternal.channels.cbegin(), serverinternal.channels.cend(), channel) == serverinternal.channels.cend()) serverinternal.channels.push_back(channel); } @@ -3241,10 +3248,10 @@ void relayserver::joinchannel_response(std::shared_ptr cha return; } - lacewing::writelock serverWriteLock = lock.createWriteLock(); + lacewing::writelock serverChannelListWriteLock = lock_channellist.createWriteLock(); if (std::find(serverinternal.channels.cbegin(), serverinternal.channels.cend(), channel) == serverinternal.channels.cend()) serverinternal.channels.push_back(channel); - serverWriteLock.lw_unlock(); + serverChannelListWriteLock.lw_unlock(); // LW_ESCALATION_NOTE channelReadLock.lw_unlock(); @@ -3528,9 +3535,9 @@ void relayserver::channel::PeerToChannel(relayserver &server, std::shared_ptrhandler##handlername = handler; \ + void pub::on##handlername(pub::handler_##handlername handler) { \ + lacewing::writelock serverMetaWriteLock = lock_meta.createWriteLock(); \ + ((intern *) internaltag)->handler##handlername = handler; \ } autohandlerfunctions(relayserver, relayserverinternal, connect) autohandlerfunctions(relayserver, relayserverinternal, disconnect) diff --git a/Lacewing/src/windows/fdstream.c b/Lacewing/src/windows/fdstream.c index 78342a9..48ebdb0 100644 --- a/Lacewing/src/windows/fdstream.c +++ b/Lacewing/src/windows/fdstream.c @@ -34,8 +34,8 @@ static void remove_pending_write (lw_fdstream ctx) /* If any writes were pending, the stream was being retained. Since the * last write has finished, we can release it now. */ - - lwp_release (ctx, "fdstream pending write"); + + lwp_release (ctx, "fdstream pending write"); } } @@ -102,15 +102,18 @@ static void completion (void * tag, OVERLAPPED * _overlapped, break; case overlapped_type_write: + lw_sync_lock(ctx->pending_writes_sync); list_remove (fdstream_overlapped, ctx->pending_writes, overlapped); free (overlapped); write_completed (ctx); + lw_sync_release(ctx->pending_writes_sync); break; case overlapped_type_transmitfile: { + lw_sync_lock(ctx->pending_writes_sync); assert (overlapped == &ctx->transmitfile_overlapped); ctx->transmit_file_from->transmit_file_to = 0; @@ -118,6 +121,7 @@ static void completion (void * tag, OVERLAPPED * _overlapped, ctx->transmit_file_from = 0; write_completed (ctx); + lw_sync_release(ctx->pending_writes_sync); break; } @@ -196,11 +200,12 @@ static void close_fd (lw_fdstream ctx) } } - list_clear(ctx->pending_writes); + //list_clear(ctx->pending_writes); } void write_completed (lw_fdstream ctx) { + lw_sync_lock(ctx->pending_writes_sync); remove_pending_write (ctx); if (ctx->num_pending_writes == 0) @@ -208,13 +213,14 @@ void write_completed (lw_fdstream ctx) // Were we trying to close? if ( (ctx->flags & lwp_fdstream_flag_close_asap) && !(ctx->flags & lwp_fdstream_flag_read_pending)) { + lw_sync_release(ctx->pending_writes_sync); close_fd (ctx); lw_stream_close ((lw_stream) ctx, lw_true); - return; } } + lw_sync_release(ctx->pending_writes_sync); } void issue_read (lw_fdstream ctx) @@ -432,6 +438,12 @@ static size_t def_sink_data (lw_stream _ctx, const char * buffer, size_t size) * Same goes for ReadFile and WSARecv. */ + // We add before write, because the IOCP thread writing it could free it underneath us + // But... wouldn't this create an atomic issue? either way, two things are modifying pending_writes with no sync + lw_sync_lock(ctx->pending_writes_sync); + add_pending_write(ctx); + list_push(fdstream_overlapped, ctx->pending_writes, overlapped); + if (WriteFile(ctx->fd, overlapped->data, (DWORD)size, @@ -451,6 +463,7 @@ static size_t def_sink_data (lw_stream _ctx, const char * buffer, size_t size) lwp_trace("Failed to write to socket %p, got error %s", ctx, lw_error_tostring(err)); lw_error_delete(err); #endif + lw_sync_release(ctx->pending_writes_sync); return size; } @@ -459,9 +472,7 @@ static size_t def_sink_data (lw_stream _ctx, const char * buffer, size_t size) if (ctx->size != -1) ctx->offset.QuadPart += size; - add_pending_write (ctx); - list_push (fdstream_overlapped, ctx->pending_writes, overlapped); - + lw_sync_release(ctx->pending_writes_sync); return size; } @@ -510,6 +521,10 @@ static lw_i64 def_sink_stream (lw_stream _dest, lw_stream _src, size_t size) * the head buffers could be used to drain it. */ + // Phi note: this sync and the pending_write count is only half-implemented with file transmit, + // so redo it and make sure it's consistent if you're allowing it. + lw_sync_lock(dest->pending_writes_sync); + if (!TransmitFile ((SOCKET) dest->fd, source->fd, (DWORD) size, @@ -521,7 +536,10 @@ static lw_i64 def_sink_stream (lw_stream _dest, lw_stream _src, size_t size) int error = WSAGetLastError (); if (error != WSA_IO_PENDING) + { + lw_sync_release(dest->pending_writes_sync); return -1; + } } /* OK, looks like the TransmitFile call succeeded. */ @@ -535,6 +553,7 @@ static lw_i64 def_sink_stream (lw_stream _dest, lw_stream _src, size_t size) add_pending_write (dest); add_pending_write (source); + lw_sync_release(dest->pending_writes_sync); /* As far as stream is concerned, we've now written everything. */ return size; @@ -646,6 +665,15 @@ const lw_streamdef def_fdstream = def_cleanup }; +void lw_fdstream_dealloc(lw_fdstream ctx) +{ + // No refs, so there should be no pending writes + assert(list_length(ctx->pending_writes) == 0); + list_clear(ctx->pending_writes); + lw_sync_delete(ctx->pending_writes_sync); + + free(ctx); +} void lwp_fdstream_init (lw_fdstream ctx, lw_pump pump) { memset (ctx, 0, sizeof (*ctx)); @@ -654,7 +682,10 @@ void lwp_fdstream_init (lw_fdstream ctx, lw_pump pump) ctx->flags = lwp_fdstream_flag_nagle; ctx->size = -1; + ctx->pending_writes_sync = lw_sync_new(); + lwp_stream_init ((lw_stream) ctx, &def_fdstream, pump); + lwp_set_dealloc_proc(ctx, lw_fdstream_dealloc); } lw_fdstream lw_fdstream_new (lw_pump pump) diff --git a/Lacewing/src/windows/fdstream.h b/Lacewing/src/windows/fdstream.h index bd458c8..7f88237 100644 --- a/Lacewing/src/windows/fdstream.h +++ b/Lacewing/src/windows/fdstream.h @@ -51,6 +51,7 @@ struct _lw_fdstream int num_pending_writes; lw_list (fdstream_overlapped, pending_writes); + lw_sync pending_writes_sync; lw_fdstream transmitfile_from, transmitfile_to; }; diff --git a/Lacewing/src/windows/ssl/clientssl.c b/Lacewing/src/windows/ssl/clientssl.c index 29f00d8..52ceaf4 100644 --- a/Lacewing/src/windows/ssl/clientssl.c +++ b/Lacewing/src/windows/ssl/clientssl.c @@ -15,7 +15,7 @@ static size_t proc_handshake_data (lwp_ssl ssl, const char * buffer, size_t size void lwp_clientssl_init (lwp_clientssl ctx, CredHandle server_creds, - lw_stream socket) + lw_server_client socket) { memset (ctx, 0, sizeof (*ctx)); diff --git a/Lacewing/src/windows/ssl/clientssl.h b/Lacewing/src/windows/ssl/clientssl.h index ded9ed7..7c396fa 100644 --- a/Lacewing/src/windows/ssl/clientssl.h +++ b/Lacewing/src/windows/ssl/clientssl.h @@ -25,7 +25,7 @@ typedef struct _lwp_clientssl void lwp_clientssl_init (lwp_clientssl, CredHandle server_creds, - lw_stream socket); + lw_server_client socket); void lwp_clientssl_cleanup (lwp_clientssl); diff --git a/Lacewing/src/windows/udp.c b/Lacewing/src/windows/udp.c index 1ff49c3..87ce302 100644 --- a/Lacewing/src/windows/udp.c +++ b/Lacewing/src/windows/udp.c @@ -358,7 +358,7 @@ void lw_udp_send (lw_udp ctx, lw_addr addr, const char * buffer, size_t size) ++ctx->writes_posted; lwp_retain(ctx, "udp write"); - if (WSASendTo (ctx->socket, &winsock_buf, 1, 0, 0, addr->info->ai_addr, + if (WSASendTo (ctx->socket, &winsock_buf, 1, 0, /* MSG_XX flags */ 0, addr->info->ai_addr, (int)addr->info->ai_addrlen, (OVERLAPPED *) overlapped, 0) == SOCKET_ERROR) { int code = WSAGetLastError();