summaryrefslogtreecommitdiff
path: root/packaging/nacl
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/nacl')
-rwxr-xr-xpackaging/nacl/ports/manaplus/build.sh33
-rw-r--r--packaging/nacl/ports/manaplus/pkg_info6
-rwxr-xr-xpackaging/nacl/ports/sdl-gfx/build.sh11
-rw-r--r--packaging/nacl/ports/sdl-gfx/pkg_info7
-rw-r--r--packaging/nacl/ports/sdl-net/build.sh9
-rw-r--r--packaging/nacl/ports/sdl-net/nacl.patch1590
-rw-r--r--packaging/nacl/ports/sdl-net/pkg_info8
-rw-r--r--packaging/nacl/ports/sdl/build.sh24
-rw-r--r--packaging/nacl/ports/sdl/nacl.patch529
-rw-r--r--packaging/nacl/ports/sdl/pkg_info7
10 files changed, 0 insertions, 2224 deletions
diff --git a/packaging/nacl/ports/manaplus/build.sh b/packaging/nacl/ports/manaplus/build.sh
deleted file mode 100755
index 19f97cabd..000000000
--- a/packaging/nacl/ports/manaplus/build.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-# Copyright (c) 2011 The Native Client Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-ConfigureStep() {
- Banner "Configuring ${PACKAGE_NAME}"
-
- SetupCrossEnvironment
-
- # export the nacl tools
- export PKG_CONFIG_PATH=${NACLPORTS_LIBDIR}/pkgconfig
- export PKG_CONFIG_LIBDIR=${NACLPORTS_LIBDIR}
-
- export SDL_CONFIG=${NACLPORTS_LIBDIR}/../bin/sdl-config
- SDL_CFLAGS=`$SDL_CONFIG --cflags`
- SDL_LIBS="-lSDL_image -lSDL_ttf -lSDL_mixer -lSDL_gfx -lSDL_net -lfreetype -ljpeg -lpng16 -lwebp -lvorbisfile -lvorbis -logg -lmikmod -lz -lbz2 -ltiff"
- export LIBS="-L${NACLPORTS_LIBDIR} ${SDL_LIBS} -lnacl_io -lpthread -lRegal -lm"
- export MANAPLUSDIR="${START_DIR}/src"
-
-# autoreconf -i ${SRC_DIR}
- autoreconf -i ${MANAPLUSDIR}
-# ${SRC_DIR}/configure
- ${MANAPLUSDIR}/configure \
- --enable-naclbuild \
- --disable-nls \
- --with-opengl \
- --without-librt \
- --without-mumble \
- --without-dyecmd \
- --host=nacl \
- --prefix=${PREFIX}
-}
diff --git a/packaging/nacl/ports/manaplus/pkg_info b/packaging/nacl/ports/manaplus/pkg_info
deleted file mode 100644
index 314dfb0b7..000000000
--- a/packaging/nacl/ports/manaplus/pkg_info
+++ /dev/null
@@ -1,6 +0,0 @@
-NAME=manaplus
-VERSION=1
-#URL=https://gitlab.com/manaplus/manaplus.git@master
-LICENSE=GPL
-DEPENDS=(sdl sdl-gfx sdl-mixer sdl-ttf sdl-image sdl-net curl libxml2 libwebp zlib)
-SHA1=4178d0c709b34b811d1781fc6dc183ea4979c2b5
diff --git a/packaging/nacl/ports/sdl-gfx/build.sh b/packaging/nacl/ports/sdl-gfx/build.sh
deleted file mode 100755
index f7bfe8572..000000000
--- a/packaging/nacl/ports/sdl-gfx/build.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2014 The Native Client Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# sdl2-config --libs includes -lppapi which cannot be linked
-# with shared libraries, so for now we disable the shared build.
-# In the future we could instead filter out this flag or remove
-# it and force SDL2 programs to add it themselves.
-EXTRA_CONFIGURE_ARGS="--enable-mmx=no --host=nacl --disable-shared"
-export RANLIB=${NACLRANLIB}
-
diff --git a/packaging/nacl/ports/sdl-gfx/pkg_info b/packaging/nacl/ports/sdl-gfx/pkg_info
deleted file mode 100644
index a32b0f393..000000000
--- a/packaging/nacl/ports/sdl-gfx/pkg_info
+++ /dev/null
@@ -1,7 +0,0 @@
-NAME=sdl-gfx
-VERSION=2.0.24
-ARCHIVE_ROOT=SDL_gfx-2.0.24
-URL=http://www.ferzkopp.net/Software/SDL_gfx-2.0/SDL_gfx-2.0.24.tar.gz
-LICENSE=LGPL2
-DEPENDS=(sdl)
-SHA1=34e8963188e4845557468a496066a8fa60d5f563
diff --git a/packaging/nacl/ports/sdl-net/build.sh b/packaging/nacl/ports/sdl-net/build.sh
deleted file mode 100644
index 781e4fcfc..000000000
--- a/packaging/nacl/ports/sdl-net/build.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (c) 2014 The Native Client Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# sdl2-config --libs includes -lppapi which cannot be linked
-# with shared libraries, so for now we disable the shared build.
-# In the future we could instead filter out this flag or remove
-# it and force SDL2 programs to add it themselves.
-EXTRA_CONFIGURE_ARGS=--disable-shared
diff --git a/packaging/nacl/ports/sdl-net/nacl.patch b/packaging/nacl/ports/sdl-net/nacl.patch
deleted file mode 100644
index f07fdcffd..000000000
--- a/packaging/nacl/ports/sdl-net/nacl.patch
+++ /dev/null
@@ -1,1590 +0,0 @@
-diff -Naur a/Makefile.am b/Makefile.am
---- a/Makefile.am 2007-07-21 09:26:47.000000000 +0400
-+++ b/Makefile.am 2015-11-28 01:09:05.901015000 +0300
-@@ -8,7 +8,7 @@
-
- libSDL_net_la_SOURCES = \
- SDLnet.c \
-- SDLnetTCP.c \
-+ SDLnetTCP.cpp \
- SDLnetUDP.c \
- SDLnetselect.c \
- SDLnetsys.h
-diff -Naur a/Makefile.in b/Makefile.in
---- a/Makefile.in 2007-07-21 11:55:27.000000000 +0400
-+++ b/Makefile.in 2015-11-28 01:09:18.049151000 +0300
-@@ -244,7 +244,7 @@
-
- libSDL_net_la_SOURCES = \
- SDLnet.c \
-- SDLnetTCP.c \
-+ SDLnetTCP.cpp \
- SDLnetUDP.c \
- SDLnetselect.c \
- SDLnetsys.h
-diff -Naur a/SDLnetselect.c b/SDLnetselect.c
---- a/SDLnetselect.c 2007-07-02 06:04:03.000000000 +0400
-+++ b/SDLnetselect.c 2015-11-30 00:33:29.895731000 +0300
-@@ -111,109 +111,24 @@
- first. This function returns the number of sockets ready for reading,
- or -1 if there was an error with the select() system call.
- */
--#ifdef MACOS_OPENTRANSPORT
--int SDLNet_CheckSockets(SDLNet_SocketSet set, Uint32 timeout)
--{
--Uint32 stop;
--int numReady;
--
-- /* Loop, polling the network devices */
--
-- stop = SDL_GetTicks() + timeout;
--
-- do
-- {
-- OTResult status;
-- size_t numBytes;
-- int i;
--
-- numReady = 0;
--
-- for (i = set->numsockets-1;i >= 0;--i)
-- {
-- status = OTLook( set->sockets[i]->channel );
-- if( status > 0 )
-- {
-- switch( status )
-- {
-- case T_UDERR:
-- OTRcvUDErr( set->sockets[i]->channel , nil);
-- break;
-- case T_DISCONNECT:
-- OTRcvDisconnect( set->sockets[i]->channel, nil );
-- break;
-- case T_ORDREL:
-- OTRcvOrderlyDisconnect(set->sockets[i]->channel );
-- break;
-- case T_CONNECT:
-- OTRcvConnect( set->sockets[i]->channel, nil );
-- break;
--
--
-- default:
-- set->sockets[i]->ready = 1;
-- ++numReady;
-- }
-- }
-- else if( OTCountDataBytes(set->sockets[i]->channel, &numBytes ) != kOTNoDataErr )
-- {
-- set->sockets[i]->ready = 1;
-- ++numReady;
-- }
-- else
-- set->sockets[i]->ready = 0;
-- }
--
-- } while (!numReady && (SDL_GetTicks() < stop));
-
-- return(numReady);
--}
--#else
- int SDLNet_CheckSockets(SDLNet_SocketSet set, Uint32 timeout)
- {
- int i;
-- SOCKET maxfd;
- int retval;
-- struct timeval tv;
-- fd_set mask;
--
-- /* Find the largest file descriptor */
-- maxfd = 0;
-- for ( i=set->numsockets-1; i>=0; --i ) {
-- if ( set->sockets[i]->channel > maxfd ) {
-- maxfd = set->sockets[i]->channel;
-- }
-- }
--
-- /* Check the file descriptors for available data */
-- do {
-- errno = 0;
--
-- /* Set up the mask of file descriptors */
-- FD_ZERO(&mask);
-- for ( i=set->numsockets-1; i>=0; --i ) {
-- FD_SET(set->sockets[i]->channel, &mask);
-- }
-
-- /* Set up the timeout */
-- tv.tv_sec = timeout/1000;
-- tv.tv_usec = (timeout%1000)*1000;
-+ retval = 0;
-
-- /* Look! */
-- retval = select(maxfd+1, &mask, NULL, NULL, &tv);
-- } while ( errno == EINTR );
--
-- /* Mark all file descriptors ready that have data available */
-- if ( retval > 0 ) {
-- for ( i=set->numsockets-1; i>=0; --i ) {
-- if ( FD_ISSET(set->sockets[i]->channel, &mask) ) {
-- set->sockets[i]->ready = 1;
-- }
-- }
-+ for (i = 0; i < set->numsockets; ++i) {
-+ if (set->sockets[i]->ready)
-+ retval++;
-+ else
-+#warning SDLNet_CheckSockets can work only with TCPsockets!
-+ SDLNet_TCP_Recv (set->sockets[i], NULL, 0);
- }
-- return(retval);
-+
-+ return retval;
- }
--#endif /* MACOS_OPENTRANSPORT */
-
- /* Free a set of sockets allocated by SDL_NetAllocSocketSet() */
- extern void SDLNet_FreeSocketSet(SDLNet_SocketSet set)
-diff -Naur a/SDLnetTCP.c b/SDLnetTCP.c
---- a/SDLnetTCP.c 2007-07-15 09:55:42.000000000 +0400
-+++ b/SDLnetTCP.c 1970-01-01 03:00:00.000000000 +0300
-@@ -1,953 +0,0 @@
--/*
-- SDL_net: An example cross-platform network library for use with SDL
-- Copyright (C) 1997-2004 Sam Lantinga
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Library General Public
-- License as published by the Free Software Foundation; either
-- version 2 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Library General Public License for more details.
--
-- You should have received a copy of the GNU Library General Public
-- License along with this library; if not, write to the Free
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
--
-- Sam Lantinga
-- slouken@libsdl.org
--*/
--
--/* $Id: SDLnetTCP.c 3280 2007-07-15 05:55:42Z slouken $ */
--
--#include "SDLnetsys.h"
--#include "SDL_net.h"
--
--/* The network API for TCP sockets */
--
--/* Since the UNIX/Win32/BeOS code is so different from MacOS,
-- we'll just have two completely different sections here.
--*/
--
--#ifdef MACOS_OPENTRANSPORT
--
--#include <Events.h>
--#include <Threads.h>
--#include <OpenTransport.h>
--#include <OpenTptInternet.h>
--#include <OTDebug.h>
--
--struct _TCPsocket {
-- int ready;
-- SOCKET channel;
--
-- // These are taken from GUSI interface.
-- // I'm not sure if it's really necessary here yet
-- // ( masahiro minami<elsur@aaa.letter.co.jp> )
-- // ( 01/02/19 )
-- OTEventCode curEvent;
-- OTEventCode newEvent;
-- OTEventCode event;
-- OTEventCode curCompletion;
-- OTEventCode newCompletion;
-- OTEventCode completion;
-- OSStatus error;
-- TEndpointInfo info;
-- Boolean readShutdown;
-- Boolean writeShutdown;
-- Boolean connected;
-- OTConfigurationRef config; // Master configuration. you can clone this.
-- TCPsocket nextListener;
-- // ( end of new members --- masahiro minami<elsur@aaa.letter.co.jp>
--
-- IPaddress remoteAddress;
-- IPaddress localAddress;
-- int sflag;
--
-- // Maybe we don't need this---- it's from original SDL_net
-- // (masahiro minami<elsur@aaa.letter.co.jp>)
-- // ( 01/02/20 )
-- int rcvdPassConn;
--};
--
--// To be used in WaitNextEvent() here and there....
--// (010311 masahiro minami<elsur@aaa.letter.co.jp>)
--EventRecord macEvent;
--
--#if TARGET_API_MAC_CARBON
--/* for Carbon */
--OTNotifyUPP notifier;
--#endif
--
--/* Input: ep - endpointref on which to negotiate the option
-- enableReuseIPMode - desired option setting - true/false
-- Return: kOTNoError indicates that the option was successfully negotiated
-- OSStatus is an error if < 0, otherwise, the status field is
-- returned and is > 0.
--
-- IMPORTANT NOTE: The endpoint is assumed to be in synchronous more, otherwise
-- this code will not function as desired
--*/
--
--/*
--NOTE: As this version is written async way, we don't use this function...
--(010526) masahiro minami<elsur@aaa.letter.co.jp>
--*/
--/*
--OSStatus DoNegotiateIPReuseAddrOption(EndpointRef ep, Boolean enableReuseIPMode)
--
--{
-- UInt8 buf[kOTFourByteOptionSize]; // define buffer for fourByte Option size
-- TOption* opt; // option ptr to make items easier to access
-- TOptMgmt req;
-- TOptMgmt ret;
-- OSStatus err;
--
-- if (!OTIsSynchronous(ep))
-- {
-- return (-1);
-- }
-- opt = (TOption*)buf; // set option ptr to buffer
-- req.opt.buf = buf;
-- req.opt.len = sizeof(buf);
-- req.flags = T_NEGOTIATE; // negotiate for option
--
-- ret.opt.buf = buf;
-- ret.opt.maxlen = kOTFourByteOptionSize;
--
-- opt->level = INET_IP; // dealing with an IP Level function
-- opt->name = IP_REUSEADDR;
-- opt->len = kOTFourByteOptionSize;
-- opt->status = 0;
-- *(UInt32*)opt->value = enableReuseIPMode; // set the desired option level, true or false
--
-- err = OTOptionManagement(ep, &req, &ret);
--
-- // if no error then return the option status value
-- if (err == kOTNoError)
-- {
-- if (opt->status != T_SUCCESS)
-- err = opt->status;
-- else
-- err = kOTNoError;
-- }
--
-- return err;
--}
--*/
--
--/* A helper function for Mac OpenTransport support*/
--// This function is a complete copy from GUSI
--// ( masahiro minami<elsur@aaa.letter.co.jp> )
--// ( 01/02/19 )
--static __inline__ Uint32 CompleteMask(OTEventCode code)
--{
-- return 1 << (code & 0x1F);
--}
--
--/* Notifier for async OT calls */
--static pascal void AsyncTCPNotifier( TCPsocket sock, OTEventCode code,
-- OTResult result, void* cookie )
--{
--
--#ifdef DEBUG_NET
-- printf("AsyncTCPNotifier got an event : 0x%8.8x\n", code );
--#endif
--
-- switch( code & 0x7f000000L)
-- {
-- case 0:
-- sock->newEvent |= code;
-- result = 0;
-- break;
-- case kCOMPLETEEVENT:
-- if(!(code & 0x00FFFFE0 ))
-- sock->newCompletion |= CompleteMask( code );
-- if( code == T_OPENCOMPLETE )
-- sock->channel = (SOCKET)(cookie);
-- break;
-- default:
-- if( code != kOTProviderWillClose )
-- result = 0;
-- }
-- // Do we need these ???? TODO
-- // sock->SetAsyncMacError( result );
-- // sock->Wakeup();
--}
--
--/* Retrieve OT event */
--// This function is taken from GUSI interface.
--// ( 01/02/19 masahiro minami<elsur@aaa.letter.co.jp> )
--static void AsyncTCPPopEvent( TCPsocket sock )
--{
-- // Make sure OT calls are not interrupted
-- // Not sure if we really need this.
-- OTEnterNotifier( sock->channel );
--
-- sock->event |= (sock->curEvent = sock->newEvent );
-- sock->completion |= ( sock->curCompletion = sock->newCompletion );
-- sock->newEvent = sock->newCompletion = 0;
--
-- OTLeaveNotifier( sock->channel );
--
-- if( sock->curEvent & T_UDERR)
-- {
-- // We just clear the error.
-- // Should we feed this back to users ?
-- // (TODO )
-- OTRcvUDErr( sock->channel, NULL );
--
--#ifdef DEBUG_NET
-- printf("AsyncTCPPopEvent T_UDERR recognized");
--#endif
-- }
--
-- // Remote is disconnecting...
-- if( sock->curEvent & ( T_DISCONNECT | T_ORDREL ))
-- {
-- sock->readShutdown = true;
-- }
--
-- if( sock->curEvent &T_CONNECT )
-- {
-- // Ignore the info of remote (second parameter).
-- // Shoule we care ?
-- // (TODO)
-- OTRcvConnect( sock->channel, NULL );
-- sock->connected = 1;
-- }
--
-- if( sock->curEvent & T_ORDREL )
-- {
-- OTRcvOrderlyDisconnect( sock->channel );
-- }
--
-- if( sock->curEvent & T_DISCONNECT )
-- {
-- OTRcvDisconnect( sock->channel, NULL );
-- }
--
-- // Do we need to ?
-- // (masahiro minami<elsur@aaa.letter.co.jp>)
-- //YieldToAnyThread();
--}
--
--/* Create a new TCPsocket */
--// Because TCPsocket structure gets bigger and bigger,
--// I think we'd better have a constructor function and delete function.
--// ( 01/02/25 masahiro minami<elsur@aaa.letter.co.jp> )
--static TCPsocket AsyncTCPNewSocket()
--{
-- TCPsocket sock;
--
-- sock = (TCPsocket)malloc(sizeof(*sock));
-- if ( sock == NULL ) {
-- SDLNet_SetError("Out of memory");
-- return NULL;
-- }
--
-- sock->newEvent = 0;
-- sock->event = 0;
-- sock->curEvent = 0;
-- sock->newCompletion = 0;
-- sock->completion = 0;
-- sock->curCompletion = 0;
-- //sock->info = NULL;
-- sock->readShutdown = sock->writeShutdown = sock->connected = false;
-- sock->error = 0;
-- sock->config = NULL;
-- sock->nextListener = NULL;
-- sock->sflag = 0;
-- return sock;
--}
--
--// hmmm.... do we need this ???
--// ( 01/02/25 masahiro minami<elsur@aaa.letter.co.jp>)
--static void AsycnTCPDeleteSocket( TCPsocket sock )
--{
-- SDLNet_TCP_Close( sock );
--}
--/* Open a TCP network socket
-- If 'remote' is NULL, this creates a local server socket on the given port,
-- otherwise a TCP connection to the remote host and port is attempted.
-- The newly created socket is returned, or NULL if there was an error.
--
-- ( re-written by masahiro minami<elsur@aaa.letter.co.jp>
-- Now endpoint is created in Async mode.
-- 01/02/20 )
--*/
--TCPsocket SDLNet_TCP_Open(IPaddress *ip)
--{
-- EndpointRef dummy = NULL;
--
-- TCPsocket sock = AsyncTCPNewSocket();
-- if( ! sock)
-- return NULL;
--
-- // Determin whether bind locally, or connect to remote
-- if ( (ip->host != INADDR_NONE) && (ip->host != INADDR_ANY) )
-- {
-- // ######## Connect to remote
-- OTResult stat;
-- InetAddress inAddr;
-- TBind bindReq;
--
-- // Open endpoint
-- sock->error = OTAsyncOpenEndpoint(
-- OTCreateConfiguration(kTCPName), NULL, &(sock->info),
-- (OTNotifyProcPtr)(AsyncTCPNotifier),
-- sock );
--
-- AsyncTCPPopEvent( sock );
-- while( !sock->error && !( sock->completion & CompleteMask(T_OPENCOMPLETE)))
-- {
-- //SetThreadState( kCurrentThreadID, kReadyThreadState, kNoThreadID );
-- //YieldToAnyThread();
-- //WaitNextEvent(everyEvent, &macEvent, 1, NULL);
-- AsyncTCPPopEvent( sock );
-- }
--
-- if( !sock->channel )
-- {
-- SDLNet_SetError("OTAsyncOpenEndpoint failed --- client socket could not be opened");
-- goto error_return;
-- }
--
-- // Set blocking mode
-- // I'm not sure if this is a good solution....
-- // Check out Apple's sample code, OT Virtual Server
-- // ( 010314 masahiro minami<elsur@aaa.letter.co.jp>)
--
-- sock->error = OTSetBlocking( sock->channel );
-- if( sock->error != kOTNoError )
-- {
-- SDLNet_SetError("OTSetBlocking() returned an error");
-- goto error_return;
-- }
--
-- // Bind the socket
-- OTInitInetAddress(&inAddr, 0, 0 );
-- bindReq.addr.len = sizeof( InetAddress );
-- bindReq.addr.buf = (unsigned char*)&inAddr;
-- bindReq.qlen = 0;
--
-- sock->error = OTBind( sock->channel, &bindReq, NULL );
-- AsyncTCPPopEvent(sock);
-- while( !sock->error && !( sock->completion & CompleteMask(T_BINDCOMPLETE)))
-- {
-- //YieldToAnyThread();
-- //WaitNextEvent(everyEvent, &macEvent, 1, NULL);
-- AsyncTCPPopEvent(sock);
-- }
--
--
-- switch( stat = OTGetEndpointState( sock->channel ))
-- {
-- InetAddress inAddr;
-- TCall sndCall;
-- OTResult res;
--
-- case T_OUTCON:
-- SDLNet_SetError("SDLNet_Open() failed -- T_OUTCON");
-- goto error_return;
-- break;
-- case T_IDLE:
-- sock->readShutdown = false;
-- sock->writeShutdown = false;
-- sock->event &=~T_CONNECT;
--
-- OTMemzero(&sndCall, sizeof(TCall));
-- OTInitInetAddress(&inAddr, ip->port, ip->host );
-- sndCall.addr.len = sizeof(InetAddress);
-- sndCall.addr.buf = (unsigned char*)&inAddr;
-- sock->connected = 0;
-- res = OTConnect( sock->channel, &sndCall, NULL );
-- AsyncTCPPopEvent(sock);
-- while( sock->error == kOTNoDataErr || !sock->connected )
-- AsyncTCPPopEvent(sock);
-- break;
-- default:
-- // What's to be done ? (TODO)
-- SDLNet_SetError("SDLNet_TCP_Open() failed -- EndpointState not good");
-- goto error_return;
--
-- }
-- if( !(sock->event & (T_CONNECT|T_DISCONNECT)))
-- goto error_return;
--
-- AsyncTCPPopEvent( sock );
-- while( !(sock->event & (T_CONNECT|T_DISCONNECT)))
-- {
-- AsyncTCPPopEvent( sock );
-- }
-- // OTConnect successfull
-- if( sock->event & T_CONNECT)
-- {
-- sock->remoteAddress.host = inAddr.fHost;
-- sock->remoteAddress.port = inAddr.fPort;
-- sock->sflag = false;
-- }
-- else
-- {
-- // OTConnect failed
-- sock->event &= ~T_DISCONNECT;
-- goto error_return;
-- }
-- }
-- else
-- {
-- // ######## Bind locally
-- TBind bindReq;
-- InetAddress inAddr;
--
-- // First, get InetInterfaceInfo.
-- // I don't search for all of them.
-- // Does that matter ?
--
-- sock->error = OTAsyncOpenEndpoint(
-- OTCreateConfiguration("tilisten, tcp"), NULL, &(sock->info),
-- (OTNotifyProcPtr)(AsyncTCPNotifier),
-- sock);
-- AsyncTCPPopEvent( sock );
-- while( !sock->error && !( sock->completion & CompleteMask( T_OPENCOMPLETE)))
-- {
-- AsyncTCPPopEvent( sock );
-- }
--
-- if( ! sock->channel )
-- {
-- SDLNet_SetError("OTAsyncOpenEndpoint failed --- server socket could not be opened");
-- goto error_return;
-- }
--
-- // Create a master OTConfiguration
-- sock->config = OTCreateConfiguration(kTCPName);
-- if( ! sock->config )
-- {
-- SDLNet_SetError("Could not create master OTConfiguration");
-- goto error_return;
-- }
--
-- // Bind the socket
-- OTInitInetAddress(&inAddr, ip->port, 0 );
-- inAddr.fAddressType = AF_INET;
-- bindReq.addr.len = sizeof( InetAddress );
-- bindReq.addr.buf = (unsigned char*)&inAddr;
-- bindReq.qlen = 35; // This number is NOT well considered. (TODO)
-- sock->localAddress.host = inAddr.fHost;
-- sock->localAddress.port = inAddr.fPort;
-- sock->sflag = true;
--
-- sock->error = OTBind( sock->channel, &bindReq, NULL );
-- AsyncTCPPopEvent(sock);
-- while( !sock->error && !( sock->completion & CompleteMask(T_BINDCOMPLETE)))
-- {
-- AsyncTCPPopEvent(sock);
-- }
-- if( sock->error != kOTNoError )
-- {
-- SDLNet_SetError("Could not bind server socket");
-- goto error_return;
-- }
--
-- if( dummy )
-- OTCloseProvider( dummy );
--
-- }
--
-- sock->ready = 0;
-- return sock;
--
-- error_return:
-- if( dummy )
-- OTCloseProvider( dummy );
-- SDLNet_TCP_Close( sock );
-- return NULL;
--}
--
--/* Accept an incoming connection on the given server socket.
-- The newly created socket is returned, or NULL if there was an error.
--*/
--TCPsocket SDLNet_TCP_Accept(TCPsocket server)
--{
--
-- /* Only server sockets can accept */
-- if ( ! server->sflag ) {
-- SDLNet_SetError("Only server sockets can accept()");
-- return(NULL);
-- }
-- server->ready = 0;
--
-- /* Accept a new TCP connection on a server socket */
-- {
-- InetAddress peer;
-- TCall peerinfo;
-- TCPsocket sock = NULL;
-- Boolean mustListen = false;
-- OTResult err;
--
-- memset(&peerinfo, 0, (sizeof peerinfo ));
-- peerinfo.addr.buf = (Uint8 *) &peer;
-- peerinfo.addr.maxlen = sizeof(peer);
--
-- while( mustListen || !sock )
-- {
-- // OTListen
-- // We do NOT block ---- right thing ? (TODO)
-- err = OTListen( server->channel, &peerinfo );
--
-- if( err )
-- goto error_return;
-- else
-- {
-- mustListen = false;
-- sock = AsyncTCPNewSocket();
-- if( ! sock )
-- goto error_return;
-- }
-- }
-- if( sock )
-- {
-- // OTAsyncOpenEndpoint
-- server->error = OTAsyncOpenEndpoint( OTCloneConfiguration( server->config ),
-- NULL, &(sock->info), (OTNotifyProcPtr)AsyncTCPNotifier, sock );
-- AsyncTCPPopEvent( sock );
-- while( !sock->error && !( sock->completion & CompleteMask( T_OPENCOMPLETE)))
-- {
-- AsyncTCPPopEvent( sock );
-- }
-- if( ! sock->channel )
-- {
-- mustListen = false;
-- goto error_return;
-- }
--
-- // OTAccept
-- server->completion &= ~(CompleteMask(T_ACCEPTCOMPLETE));
-- server->error = OTAccept( server->channel, sock->channel, &peerinfo );
-- AsyncTCPPopEvent( server );
-- while( !(server->completion & CompleteMask(T_ACCEPTCOMPLETE)))
-- {
-- AsyncTCPPopEvent( server );
-- }
--
-- switch( server->error )
-- {
-- case kOTLookErr:
-- switch( OTLook(server->channel ))
-- {
-- case T_LISTEN:
-- mustListen = true;
-- break;
-- case T_DISCONNECT:
-- goto error_return;
-- }
-- break;
-- case 0:
-- sock->nextListener = server->nextListener;
-- server->nextListener = sock;
-- sock->remoteAddress.host = peer.fHost;
-- sock->remoteAddress.port = peer.fPort;
-- return sock;
-- // accept successful
-- break;
-- default:
-- free( sock );
-- }
-- }
-- sock->remoteAddress.host = peer.fHost;
-- sock->remoteAddress.port = peer.fPort;
-- sock->sflag = 0;
-- sock->ready = 0;
--
-- /* The socket is ready */
-- return(sock);
--
-- // Error; close the socket and return
-- error_return:
-- SDLNet_TCP_Close(sock);
-- return(NULL);
-- }
--}
--
--/* Get the IP address of the remote system associated with the socket.
-- If the socket is a server socket, this function returns NULL.
--*/
--IPaddress *SDLNet_TCP_GetPeerAddress(TCPsocket sock)
--{
-- if ( sock->sflag ) {
-- return(NULL);
-- }
-- return(&sock->remoteAddress);
--}
--
--/* Send 'len' bytes of 'data' over the non-server socket 'sock'
-- This function returns the actual amount of data sent. If the return value
-- is less than the amount of data sent, then either the remote connection was
-- closed, or an unknown socket error occurred.
--*/
--int SDLNet_TCP_Send(TCPsocket sock, const void *datap, int len)
--{
-- const Uint8 *data = (const Uint8 *)datap; /* For pointer arithmetic */
-- int sent, left;
--
-- /* Server sockets are for accepting connections only */
-- if ( sock->sflag ) {
-- SDLNet_SetError("Server sockets cannot send");
-- return(-1);
-- }
--
-- /* Keep sending data until it's sent or an error occurs */
-- left = len;
-- sent = 0;
-- errno = 0;
-- do {
-- len = OTSnd(sock->channel, (void *)data, left, 0);
-- if (len == kOTFlowErr)
-- len = 0;
-- if ( len > 0 ) {
-- sent += len;
-- left -= len;
-- data += len;
-- }
-- // Do we need to ?
-- // ( masahiro minami<elsur@aaa.letter.co.jp> )
-- // (TODO)
-- //WaitNextEvent(everyEvent, &macEvent, 1, NULL);
-- //AsyncTCPPopEvent(sock);
-- } while ( (left > 0) && (len > 0) );
--
-- return(sent);
--}
--
--/* Receive up to 'maxlen' bytes of data over the non-server socket 'sock',
-- and store them in the buffer pointed to by 'data'.
-- This function returns the actual amount of data received. If the return
-- value is less than or equal to zero, then either the remote connection was
-- closed, or an unknown socket error occurred.
--*/
--int SDLNet_TCP_Recv(TCPsocket sock, void *data, int maxlen)
--{
-- int len = 0;
-- OSStatus res;
-- /* Server sockets are for accepting connections only */
-- if ( sock->sflag ) {
-- SDLNet_SetError("Server sockets cannot receive");
-- return(-1);
-- }
--
-- do
-- {
-- res = OTRcv(sock->channel, data, maxlen-len, 0);
-- if (res > 0) {
-- len = res;
-- }
--
--#ifdef DEBUG_NET
-- if ( res != kOTNoDataErr )
-- printf("SDLNet_TCP_Recv received ; %d\n", res );
--#endif
--
-- AsyncTCPPopEvent(sock);
-- if( res == kOTLookErr )
-- {
-- res = OTLook(sock->channel );
-- continue;
-- }
-- } while ( (len == 0) && (res == kOTNoDataErr) );
--
-- sock->ready = 0;
-- if ( len == 0 ) { /* Open Transport error */
--#ifdef DEBUG_NET
-- printf("Open Transport error: %d\n", res);
--#endif
-- return(-1);
-- }
-- return(len);
--}
--
--/* Close a TCP network socket */
--void SDLNet_TCP_Close(TCPsocket sock)
--{
-- if ( sock != NULL ) {
-- if ( sock->channel != INVALID_SOCKET ) {
-- //closesocket(sock->channel);
-- OTSndOrderlyDisconnect( sock->channel );
-- }
-- free(sock);
-- }
--}
--
--#else /* !MACOS_OPENTRANSPORT */
--
--struct _TCPsocket {
-- int ready;
-- SOCKET channel;
-- IPaddress remoteAddress;
-- IPaddress localAddress;
-- int sflag;
--};
--
--/* Open a TCP network socket
-- If 'remote' is NULL, this creates a local server socket on the given port,
-- otherwise a TCP connection to the remote host and port is attempted.
-- The newly created socket is returned, or NULL if there was an error.
--*/
--TCPsocket SDLNet_TCP_Open(IPaddress *ip)
--{
-- TCPsocket sock;
-- struct sockaddr_in sock_addr;
--
-- /* Allocate a TCP socket structure */
-- sock = (TCPsocket)malloc(sizeof(*sock));
-- if ( sock == NULL ) {
-- SDLNet_SetError("Out of memory");
-- goto error_return;
-- }
--
-- /* Open the socket */
-- sock->channel = socket(AF_INET, SOCK_STREAM, 0);
-- if ( sock->channel == INVALID_SOCKET ) {
-- SDLNet_SetError("Couldn't create socket");
-- goto error_return;
-- }
--
-- /* Connect to remote, or bind locally, as appropriate */
-- if ( (ip->host != INADDR_NONE) && (ip->host != INADDR_ANY) ) {
--
-- // ######### Connecting to remote
--
-- memset(&sock_addr, 0, sizeof(sock_addr));
-- sock_addr.sin_family = AF_INET;
-- sock_addr.sin_addr.s_addr = ip->host;
-- sock_addr.sin_port = ip->port;
--
-- /* Connect to the remote host */
-- if ( connect(sock->channel, (struct sockaddr *)&sock_addr,
-- sizeof(sock_addr)) == SOCKET_ERROR ) {
-- SDLNet_SetError("Couldn't connect to remote host");
-- goto error_return;
-- }
-- sock->sflag = 0;
-- } else {
--
-- // ########## Binding locally
--
-- memset(&sock_addr, 0, sizeof(sock_addr));
-- sock_addr.sin_family = AF_INET;
-- sock_addr.sin_addr.s_addr = INADDR_ANY;
-- sock_addr.sin_port = ip->port;
--
--/*
-- * Windows gets bad mojo with SO_REUSEADDR:
-- * http://www.devolution.com/pipermail/sdl/2005-September/070491.html
-- * --ryan.
-- */
--#ifndef WIN32
-- /* allow local address reuse */
-- { int yes = 1;
-- setsockopt(sock->channel, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof(yes));
-- }
--#endif
--
-- /* Bind the socket for listening */
-- if ( bind(sock->channel, (struct sockaddr *)&sock_addr,
-- sizeof(sock_addr)) == SOCKET_ERROR ) {
-- SDLNet_SetError("Couldn't bind to local port");
-- goto error_return;
-- }
-- if ( listen(sock->channel, 5) == SOCKET_ERROR ) {
-- SDLNet_SetError("Couldn't listen to local port");
-- goto error_return;
-- }
--
-- /* Set the socket to non-blocking mode for accept() */
--#if defined(__BEOS__) && defined(SO_NONBLOCK)
-- /* On BeOS r5 there is O_NONBLOCK but it's for files only */
-- {
-- long b = 1;
-- setsockopt(sock->channel, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
-- }
--#elif defined(O_NONBLOCK)
-- {
-- fcntl(sock->channel, F_SETFL, O_NONBLOCK);
-- }
--#elif defined(WIN32)
-- {
-- unsigned long mode = 1;
-- ioctlsocket (sock->channel, FIONBIO, &mode);
-- }
--#elif defined(__OS2__)
-- {
-- int dontblock = 1;
-- ioctl(sock->channel, FIONBIO, &dontblock);
-- }
--#else
--#warning How do we set non-blocking mode on other operating systems?
--#endif
-- sock->sflag = 1;
-- }
-- sock->ready = 0;
--
--#ifdef TCP_NODELAY
-- /* Set the nodelay TCP option for real-time games */
-- { int yes = 1;
-- setsockopt(sock->channel, IPPROTO_TCP, TCP_NODELAY, (char*)&yes, sizeof(yes));
-- }
--#endif /* TCP_NODELAY */
--
-- /* Fill in the channel host address */
-- sock->remoteAddress.host = sock_addr.sin_addr.s_addr;
-- sock->remoteAddress.port = sock_addr.sin_port;
--
-- /* The socket is ready */
-- return(sock);
--
--error_return:
-- SDLNet_TCP_Close(sock);
-- return(NULL);
--}
--
--/* Accept an incoming connection on the given server socket.
-- The newly created socket is returned, or NULL if there was an error.
--*/
--TCPsocket SDLNet_TCP_Accept(TCPsocket server)
--{
-- TCPsocket sock;
-- struct sockaddr_in sock_addr;
-- int sock_alen;
--
-- /* Only server sockets can accept */
-- if ( ! server->sflag ) {
-- SDLNet_SetError("Only server sockets can accept()");
-- return(NULL);
-- }
-- server->ready = 0;
--
-- /* Allocate a TCP socket structure */
-- sock = (TCPsocket)malloc(sizeof(*sock));
-- if ( sock == NULL ) {
-- SDLNet_SetError("Out of memory");
-- goto error_return;
-- }
--
-- /* Accept a new TCP connection on a server socket */
-- sock_alen = sizeof(sock_addr);
-- sock->channel = accept(server->channel, (struct sockaddr *)&sock_addr,
--#ifdef USE_GUSI_SOCKETS
-- (unsigned int *)&sock_alen);
--#else
-- &sock_alen);
--#endif
-- if ( sock->channel == SOCKET_ERROR ) {
-- SDLNet_SetError("accept() failed");
-- goto error_return;
-- }
--#ifdef WIN32
-- {
-- /* passing a zero value, socket mode set to block on */
-- unsigned long mode = 0;
-- ioctlsocket (sock->channel, FIONBIO, &mode);
-- }
--#elif defined(O_NONBLOCK)
-- {
-- int flags = fcntl(sock->channel, F_GETFL, 0);
-- fcntl(sock->channel, F_SETFL, flags & ~O_NONBLOCK);
-- }
--#endif /* WIN32 */
-- sock->remoteAddress.host = sock_addr.sin_addr.s_addr;
-- sock->remoteAddress.port = sock_addr.sin_port;
--
-- sock->sflag = 0;
-- sock->ready = 0;
--
-- /* The socket is ready */
-- return(sock);
--
--error_return:
-- SDLNet_TCP_Close(sock);
-- return(NULL);
--}
--
--/* Get the IP address of the remote system associated with the socket.
-- If the socket is a server socket, this function returns NULL.
--*/
--IPaddress *SDLNet_TCP_GetPeerAddress(TCPsocket sock)
--{
-- if ( sock->sflag ) {
-- return(NULL);
-- }
-- return(&sock->remoteAddress);
--}
--
--/* Send 'len' bytes of 'data' over the non-server socket 'sock'
-- This function returns the actual amount of data sent. If the return value
-- is less than the amount of data sent, then either the remote connection was
-- closed, or an unknown socket error occurred.
--*/
--int SDLNet_TCP_Send(TCPsocket sock, const void *datap, int len)
--{
-- const Uint8 *data = (const Uint8 *)datap; /* For pointer arithmetic */
-- int sent, left;
--
-- /* Server sockets are for accepting connections only */
-- if ( sock->sflag ) {
-- SDLNet_SetError("Server sockets cannot send");
-- return(-1);
-- }
--
-- /* Keep sending data until it's sent or an error occurs */
-- left = len;
-- sent = 0;
-- errno = 0;
-- do {
-- len = send(sock->channel, (const char *) data, left, 0);
-- if ( len > 0 ) {
-- sent += len;
-- left -= len;
-- data += len;
-- }
-- } while ( (left > 0) && ((len > 0) || (errno == EINTR)) );
--
-- return(sent);
--}
--
--/* Receive up to 'maxlen' bytes of data over the non-server socket 'sock',
-- and store them in the buffer pointed to by 'data'.
-- This function returns the actual amount of data received. If the return
-- value is less than or equal to zero, then either the remote connection was
-- closed, or an unknown socket error occurred.
--*/
--int SDLNet_TCP_Recv(TCPsocket sock, void *data, int maxlen)
--{
-- int len;
--
-- /* Server sockets are for accepting connections only */
-- if ( sock->sflag ) {
-- SDLNet_SetError("Server sockets cannot receive");
-- return(-1);
-- }
--
-- errno = 0;
-- do {
-- len = recv(sock->channel, (char *) data, maxlen, 0);
-- } while ( errno == EINTR );
--
-- sock->ready = 0;
-- return(len);
--}
--
--/* Close a TCP network socket */
--void SDLNet_TCP_Close(TCPsocket sock)
--{
-- if ( sock != NULL ) {
-- if ( sock->channel != INVALID_SOCKET ) {
-- closesocket(sock->channel);
-- }
-- free(sock);
-- }
--}
--
--#endif /* MACOS_OPENTRANSPORT */
-diff -Naur a/SDLnetTCP.cpp b/SDLnetTCP.cpp
---- a/SDLnetTCP.cpp 1970-01-01 03:00:00.000000000 +0300
-+++ b/SDLnetTCP.cpp 2015-11-30 00:34:59.378830000 +0300
-@@ -0,0 +1,483 @@
-+/*
-+ SDL_net: An example cross-platform network library for use with SDL
-+ Copyright (C) 1997-2004 Sam Lantinga
-+
-+ This library is free software; you can redistribute it and/or
-+ modify it under the terms of the GNU Library General Public
-+ License as published by the Free Software Foundation; either
-+ version 2 of the License, or (at your option) any later version.
-+
-+ This library is distributed in the hope that it will be useful,
-+ but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ Library General Public License for more details.
-+
-+ You should have received a copy of the GNU Library General Public
-+ License along with this library; if not, write to the Free
-+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ Sam Lantinga
-+ slouken@libsdl.org
-+*/
-+
-+/* $Id: SDLnetTCP.c 3280 2007-07-15 05:55:42Z slouken $ */
-+
-+#include "SDLnetsys.h"
-+#include "SDL_net.h"
-+
-+#include "ppapi_simple/ps.h"
-+#include "ppapi/cpp/tcp_socket.h"
-+#include "ppapi/cpp/instance_handle.h"
-+#include "ppapi/cpp/message_loop.h"
-+#include "ppapi/cpp/instance.h"
-+#include "ppapi/c/ppb_net_address.h"
-+#include "ppapi/cpp/var.h"
-+#include "ppapi/utility/completion_callback_factory.h"
-+
-+#include "pthread.h"
-+#include <condition_variable>
-+#include <mutex>
-+
-+/* The network API for TCP sockets */
-+
-+#define BUFFER_SIZE 2000
-+
-+struct _TCPsocket {
-+ int ready;
-+ pp::TCPSocket channel;
-+ IPaddress remoteAddress;
-+ IPaddress localAddress;
-+ int sflag;
-+
-+ bool readInProgress;
-+ int bufferAmount;
-+ int bufferOffset;
-+ char buffer [BUFFER_SIZE];
-+};
-+
-+class SDLNetSynchronizer {
-+ public:
-+ pp::CompletionCallbackFactory <SDLNetSynchronizer> factory;
-+ pp::InstanceHandle handle;
-+ pp::Instance instance;
-+
-+ static pp::MessageLoop loop;
-+
-+ pp::TCPSocket sock_result;
-+ int32_t result;
-+ bool ready;
-+ std::condition_variable cv;
-+ std::mutex mtx;
-+
-+ SDLNetSynchronizer () : factory (this), handle (PSGetInstanceId ()), instance (PSGetInstanceId ()) {
-+ ready = false;
-+ if (loop.is_null ())
-+ loop = pp::MessageLoop::GetForMainThread ();
-+ }
-+
-+ int32_t Connect (pp::TCPSocket &sock, IPaddress *ip_addr) {
-+ int32_t code;
-+ PP_NetAddress_IPv4 ipv4_addr;
-+ IpToIpv4 (ip_addr, &ipv4_addr);
-+
-+ pp::CompletionCallback cb = factory.NewCallback (
-+ &SDLNetSynchronizer::ConnectWork,
-+ sock,
-+ pp::NetAddress (handle, ipv4_addr)
-+ );
-+
-+ loop.PostWork (cb, 0);
-+ wait ();
-+
-+ return result;
-+ }
-+
-+ int32_t Bind (pp::TCPSocket &sock, IPaddress *ip_addr) {
-+ PP_NetAddress_IPv4 ipv4_addr;
-+ IpToIpv4 (ip_addr, &ipv4_addr);
-+
-+
-+ pp::CompletionCallback cb = factory.NewCallback (
-+ &SDLNetSynchronizer::BindWork,
-+ sock,
-+ pp::NetAddress (handle, ipv4_addr)
-+ );
-+
-+ loop.PostWork (cb, 0);
-+
-+ wait ();
-+ return result;
-+ }
-+
-+ int32_t Listen (pp::TCPSocket &sock, int32_t backlog) {
-+
-+ pp::CompletionCallback cb = factory.NewCallback (
-+ &SDLNetSynchronizer::ListenWork,
-+ sock, backlog
-+ );
-+
-+ loop.PostWork (cb, 0);
-+
-+ wait ();
-+ return result;
-+ }
-+
-+ void WriteWork (int32_t result, pp::TCPSocket &sock, const char *data, size_t size) {
-+ sock.Write (
-+ data, size,
-+ factory.NewCallback (&SDLNetSynchronizer::resultCallback)
-+ );
-+ }
-+
-+ int32_t Write (pp::TCPSocket &sock, const char *data, size_t size) {
-+ pp::CompletionCallback cb = factory.NewCallback (
-+ &SDLNetSynchronizer::WriteWork,
-+ sock, data, size
-+ );
-+
-+ loop.PostWork (cb, 0);
-+
-+ wait ();
-+ return result;
-+ }
-+
-+ void ReadAsyncCallback (int32_t result, TCPsocket sock) {
-+ if (result <= 0)
-+ return;
-+
-+ sock->bufferOffset = 0;
-+ sock->bufferAmount = result;
-+ sock->ready = 1;
-+ sock->readInProgress = false;
-+ }
-+
-+ void ReadAsyncWork (int32_t result, TCPsocket sock) {
-+ sock->channel.Read (
-+ sock->buffer, BUFFER_SIZE,
-+ factory.NewCallback (&SDLNetSynchronizer::ReadAsyncCallback, sock)
-+ );
-+ }
-+
-+ void ReadAsync (TCPsocket sock) {
-+ pp::CompletionCallback cb = factory.NewCallback (
-+ &SDLNetSynchronizer::ReadAsyncWork,
-+ sock
-+ );
-+
-+ sock->readInProgress = true;
-+ loop.PostWork (cb, 0);
-+ }
-+
-+ void AcceptWork (int32_t result, pp::TCPSocket &sock) {
-+ sock.Accept (
-+ factory.NewCallbackWithOutput (&SDLNetSynchronizer::acceptCallback)
-+ );
-+ }
-+
-+ pp::TCPSocket Accept (pp::TCPSocket &sock, int32_t &out) {
-+ pp::CompletionCallback cb = factory.NewCallback (
-+ &SDLNetSynchronizer::AcceptWork,
-+ sock
-+ );
-+
-+ loop.PostWork (cb, 0);
-+
-+ wait ();
-+ out = result;
-+ return sock_result;
-+ }
-+
-+ void IpToIpv4 (IPaddress *ip_addr, PP_NetAddress_IPv4 *ipv4_addr) {
-+ ipv4_addr->port = ip_addr->port;
-+ for (int i = 0; i < 4; ++i)
-+ ipv4_addr->addr[i] = (ip_addr->host >> (8 * i)) & 0xFF;
-+ }
-+
-+ void NetToIp (pp::NetAddress net_addr, IPaddress *ip_addr) {
-+ PP_NetAddress_IPv4 ipv4_addr;
-+ net_addr.DescribeAsIPv4Address (&ipv4_addr);
-+ Ipv4ToIp (&ipv4_addr, ip_addr);
-+ }
-+
-+ void Ipv4ToIp (PP_NetAddress_IPv4 *ipv4_addr, IPaddress *ip_addr) {
-+ ip_addr->port = ipv4_addr->port;
-+ ip_addr->host = 0;
-+ for (int i = 0; i < 4; ++i)
-+ ip_addr->host ^= (((uint32_t) ipv4_addr->addr[i]) << (8 * i));
-+ }
-+
-+ void postMessage (std::string msg) {
-+ instance.PostMessage (pp::Var (msg));
-+ }
-+
-+ void postMessage (int32_t msg) {
-+ instance.PostMessage (pp::Var (msg));
-+ }
-+
-+ private:
-+ void ConnectWork (int32_t result, pp::TCPSocket &sock, pp::NetAddress &addr) {
-+ sock.Connect (
-+ addr,
-+ factory.NewCallback (&SDLNetSynchronizer::resultCallback)
-+ );
-+ }
-+
-+ void BindWork (int32_t result, pp::TCPSocket &sock, pp::NetAddress &addr) {
-+ sock.Bind (
-+ addr,
-+ factory.NewCallback (&SDLNetSynchronizer::resultCallback)
-+ );
-+ }
-+
-+ void ListenWork (int32_t result, pp::TCPSocket &sock, int32_t backlog) {
-+ sock.Listen (
-+ backlog,
-+ factory.NewCallback (&SDLNetSynchronizer::resultCallback)
-+ );
-+ }
-+
-+ void resultCallback (int32_t res) {
-+ result = res;
-+ unlock ();
-+ }
-+
-+ void acceptCallback (int32_t res, pp::TCPSocket sock) {
-+ result = res;
-+ sock_result = sock;
-+
-+ unlock();
-+ }
-+
-+ void wait () {
-+ std::unique_lock <std::mutex> lck (mtx);
-+ while (!ready)
-+ cv.wait (lck);
-+ ready = false;
-+ }
-+
-+ void unlock () {
-+ std::unique_lock <std::mutex> lck (mtx);
-+ ready = true;
-+ cv.notify_all ();
-+ }
-+};
-+
-+pp::MessageLoop SDLNetSynchronizer::loop = pp::MessageLoop ();
-+
-+SDLNetSynchronizer *__read_syncer = NULL;
-+
-+/* Open a TCP network socket
-+ If 'remote' is NULL, this creates a local server socket on the given port,
-+ otherwise a TCP connection to the remote host and port is attempted.
-+ The newly created socket is returned, or NULL if there was an error.
-+*/
-+TCPsocket SDLNet_TCP_Open (IPaddress *ip)
-+{
-+ TCPsocket sock;
-+ SDLNetSynchronizer syncer;
-+
-+ /* Allocate a TCP socket structure */
-+ sock = (TCPsocket)malloc (sizeof (*sock));
-+ if ( sock == NULL ) {
-+ SDLNet_SetError ("Out of memory");
-+ goto error_return;
-+ }
-+
-+ sock->channel = pp::TCPSocket (syncer.handle);
-+
-+ /* Connect to remote, or bind locally, as appropriate */
-+ if ( (ip->host != INADDR_NONE) && (ip->host != INADDR_ANY) ) {
-+
-+ // ######### Connecting to remote
-+
-+ /* Connect to the remote host */
-+ if ( syncer.Connect (sock->channel, ip) != PP_OK ) {
-+ SDLNet_SetError("Couldn't connect to remote host");
-+ goto error_return;
-+ }
-+ sock->sflag = 0;
-+
-+ } else {
-+
-+ // ########## Binding locally
-+
-+ /* Bind the socket for listening */
-+ if ( syncer.Bind (sock->channel, ip) != PP_OK ) {
-+ SDLNet_SetError("Couldn't bind to local port");
-+ goto error_return;
-+ }
-+
-+ if ( syncer.Listen (sock->channel, 5) != PP_OK ) {
-+ SDLNet_SetError("Couldn't listen to local port");
-+ goto error_return;
-+ }
-+
-+ /* Set the socket to non-blocking mode for accept() */
-+
-+ {
-+ /* In nacl O_NONBLOCK is defined */
-+ // fcntl(sock->channel, F_SETFL, O_NONBLOCK);
-+ }
-+
-+ sock->sflag = 1;
-+ }
-+
-+ sock->readInProgress = 0;
-+ sock->ready = 0;
-+ sock->bufferOffset = sock->bufferAmount = 0;
-+
-+#ifdef TCP_NODELAY
-+ /* Set the nodelay TCP option for real-time games */
-+ { int yes = 1;
-+ setsockopt(sock->channel, IPPROTO_TCP, TCP_NODELAY, (char*)&yes, sizeof(yes));
-+ }
-+#endif /* TCP_NODELAY */
-+
-+ /* Fill in the channel host address */
-+ sock->remoteAddress = *ip;
-+
-+ /* The socket is ready */
-+ return(sock);
-+
-+error_return:
-+ SDLNet_TCP_Close(sock);
-+ return(NULL);
-+}
-+
-+/* Accept an incoming connection on the given server socket.
-+ The newly created socket is returned, or NULL if there was an error.
-+*/
-+TCPsocket SDLNet_TCP_Accept(TCPsocket server)
-+{
-+ TCPsocket sock;
-+ SDLNetSynchronizer syncer;
-+ int acc_res;
-+
-+ /* Only server sockets can accept */
-+ if ( ! server->sflag ) {
-+ SDLNet_SetError("Only server sockets can accept()");
-+ return(NULL);
-+ }
-+ server->ready = 0;
-+
-+ /* Allocate a TCP socket structure */
-+ sock = (TCPsocket)malloc (sizeof (*sock));
-+ if ( sock == NULL ) {
-+ SDLNet_SetError("Out of memory");
-+ goto error_return;
-+ }
-+
-+ /* Accept a new TCP connection on a server socket */
-+ sock->channel = syncer.Accept (server->channel, acc_res);
-+
-+ if ( acc_res != PP_OK ) {
-+ SDLNet_SetError("accept() failed");
-+ goto error_return;
-+ }
-+
-+
-+ {
-+ /* int flags = fcntl(sock->channel, F_GETFL, 0);
-+ fcntl(sock->channel, F_SETFL, flags & ~O_NONBLOCK); */
-+ }
-+
-+ syncer.NetToIp ((sock->channel).GetRemoteAddress (), &sock->remoteAddress);
-+
-+ sock->sflag = 0;
-+ sock->ready = 0;
-+
-+ /* The socket is ready */
-+ return(sock);
-+
-+error_return:
-+ SDLNet_TCP_Close(sock);
-+ return(NULL);
-+}
-+
-+/* Get the IP address of the remote system associated with the socket.
-+ If the socket is a server socket, this function returns NULL.
-+*/
-+IPaddress *SDLNet_TCP_GetPeerAddress(TCPsocket sock)
-+{
-+ if ( sock->sflag ) {
-+ return(NULL);
-+ }
-+ return(&sock->remoteAddress);
-+}
-+
-+/* Send 'len' bytes of 'data' over the non-server socket 'sock'
-+ This function returns the actual amount of data sent. If the return value
-+ is less than the amount of data sent, then either the remote connection was
-+ closed, or an unknown socket error occurred.
-+*/
-+int SDLNet_TCP_Send(TCPsocket sock, const void *datap, int len)
-+{
-+ SDLNetSynchronizer syncer;
-+ Uint8 *data = (Uint8 *)datap; /* For pointer arithmetic */
-+ int sent, left;
-+
-+ /* Server sockets are for accepting connections only */
-+ if ( sock->sflag ) {
-+ SDLNet_SetError("Server sockets cannot send");
-+ return(-1);
-+ }
-+
-+ /* Keep sending data until it's sent or an error occurs */
-+ left = len;
-+ sent = 0;
-+ errno = 0;
-+ do {
-+ len = syncer.Write (sock->channel, (const char *) data, left);
-+ if ( len > 0 ) {
-+ sent += len;
-+ left -= len;
-+ data += len;
-+ }
-+ } while ( (left > 0) && (len >= 0 || errno == EINTR) );
-+
-+ return(sent);
-+}
-+
-+/* Receive up to 'maxlen' bytes of data over the non-server socket 'sock',
-+ and store them in the buffer pointed to by 'data'.
-+ This function returns the actual amount of data received. If the return
-+ value is less than or equal to zero, then either the remote connection was
-+ closed, or an unknown socket error occurred.
-+*/
-+int SDLNet_TCP_Recv(TCPsocket sock, void *data, int maxlen)
-+{
-+ SDLNetSynchronizer syncer;
-+ int len = 0;
-+
-+ /* Server sockets are for accepting connections only */
-+ if ( sock->sflag ) {
-+ SDLNet_SetError("Server sockets cannot receive");
-+ return(-1);
-+ }
-+
-+ if ( sock->ready && maxlen > 0 ) {
-+ len = std::min (sock->bufferAmount - sock->bufferOffset, maxlen);
-+ memcpy (data, sock->buffer + sock->bufferOffset, len);
-+ sock->bufferOffset += len;
-+ if ( sock->bufferOffset == sock->bufferAmount )
-+ sock->ready = 0;
-+ }
-+
-+ if ( sock->ready == 0 && sock->readInProgress == 0) {
-+ if (__read_syncer == NULL)
-+ __read_syncer = new SDLNetSynchronizer ();
-+ __read_syncer->ReadAsync (sock);
-+ }
-+
-+ return(len);
-+}
-+
-+/* Close a TCP network socket */
-+void SDLNet_TCP_Close(TCPsocket sock)
-+{
-+ SDLNetSynchronizer syncer;
-+ if ( sock != NULL ) {
-+ sock->channel.Close ();
-+ free (sock);
-+ }
-+}
diff --git a/packaging/nacl/ports/sdl-net/pkg_info b/packaging/nacl/ports/sdl-net/pkg_info
deleted file mode 100644
index 29f94bb20..000000000
--- a/packaging/nacl/ports/sdl-net/pkg_info
+++ /dev/null
@@ -1,8 +0,0 @@
-NAME=sdl-net
-VERSION=1.2.7
-ARCHIVE_ROOT=SDL_net-1.2.7
-URL=http://www.libsdl.org/projects/SDL_net/release/SDL_net-1.2.7.tar.gz
-LICENSE=LGPL2
-DEPENDS=(sdl)
-SHA1=b46c7e3221621cc34fec1238f1b5f0ce8972274d
-DISABLED_TOOLCHAIN=(emscripten)
diff --git a/packaging/nacl/ports/sdl/build.sh b/packaging/nacl/ports/sdl/build.sh
deleted file mode 100644
index ee30577d1..000000000
--- a/packaging/nacl/ports/sdl/build.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-# Copyright (c) 2011 The Native Client Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-EXTRA_CONFIGURE_ARGS="--disable-assembly --disable-pthread-sem"
-
-AutogenStep() {
- ChangeDir ${SRC_DIR}
- # For some reason if we don't remove configure before running
- # autoconf it doesn't always get updates correctly. About half
- # the time the old configure script (with no reference to nacl)
- # will remain after ./autogen.sh
- rm -f configure
- ./autogen.sh
- PatchConfigure
- PatchConfigSub
- cd -
-}
-
-ConfigureStep() {
- AutogenStep
- SetupCrossEnvironment
- DefaultConfigureStep
-}
diff --git a/packaging/nacl/ports/sdl/nacl.patch b/packaging/nacl/ports/sdl/nacl.patch
deleted file mode 100644
index 7c82591cc..000000000
--- a/packaging/nacl/ports/sdl/nacl.patch
+++ /dev/null
@@ -1,529 +0,0 @@
-diff --git a/configure.in b/configure.in
-index ab0e314..c7ae13b 100644
---- a/configure.in
-+++ b/configure.in
-@@ -957,7 +957,7 @@ AC_HELP_STRING([--enable-naclvideo], [enable the nacl video driver [[default=yes
- AC_DEFINE(SDL_VIDEO_DRIVER_NACL)
- SOURCES="$SOURCES $srcdir/src/video/nacl/*.c"
- EXTRA_LDFLAGS="-lppapi_simple -l${NACL_CXX_LIB:-stdc++} $EXTRA_LDFLAGS"
-- SDL_LIBS="-Wl,-unacl_main -Wl,-undefined=PSUserMainGet -lSDLmain $SDL_LIBS -lppapi_gles2 -lcli_main -lnacl_spawn -ltar -lppapi_simple -lnacl_io -lppapi -lm -l${NACL_CXX_LIB:-stdc++}"
-+ SDL_LIBS="-lSDLmain $SDL_LIBS -lppapi_gles2 -lcli_main -lnacl_spawn -ltar -lppapi_simple_cpp -lnacl_io -lppapi -lm -l${NACL_CXX_LIB:-stdc++} -lppapi_cpp"
- SDL_CFLAGS="$SDL_CFLAGS -Dmain=SDL_main"
- fi
-
-@@ -2449,7 +2449,7 @@ case "$host" in
- have_timers=yes
- fi
- CheckPTHREAD
-- SDLMAIN_SOURCES="$srcdir/src/main/nacl/*.c"
-+ SDLMAIN_SOURCES="$srcdir/src/main/nacl/*.cc"
- ;;
- *-*-linux*|*-*-uclinux*|*-*-gnu*|*-*-k*bsd*-gnu|*-*-bsdi*|*-*-freebsd*|*-*-dragonfly*|*-*-netbsd*|*-*-openbsd*|*-*-sysv5*|*-*-solaris*|*-*-hpux*|*-*-irix*|*-*-aix*|*-*-osf*)
- case "$host" in
-diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c
-index 5753927..da37fe6 100644
---- a/src/events/SDL_keyboard.c
-+++ b/src/events/SDL_keyboard.c
-@@ -371,6 +371,13 @@ Uint8 * SDL_GetKeyState (int *numkeys)
- *numkeys = SDLK_LAST;
- return(SDL_KeyState);
- }
-+
-+// private (used in naclevents.c)
-+void SDL_SetKeyState (SDLKey key, Uint8 state)
-+{
-+ SDL_KeyState[key] = state;
-+}
-+
- SDLMod SDL_GetModState (void)
- {
- return(SDL_ModState);
-diff --git a/src/main/nacl/SDL_nacl_main.c b/src/main/nacl/SDL_nacl_main.c
-deleted file mode 100644
-index ef26120..0000000
---- a/src/main/nacl/SDL_nacl_main.c
-+++ /dev/null
-@@ -1,125 +0,0 @@
--/*
-- Simple DirectMedia Layer
-- Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
--
-- This software is provided 'as-is', without any express or implied
-- warranty. In no event will the authors be held liable for any damages
-- arising from the use of this software.
--
-- Permission is granted to anyone to use this software for any purpose,
-- including commercial applications, and to alter it and redistribute it
-- freely, subject to the following restrictions:
--
-- 1. The origin of this software must not be misrepresented; you must not
-- claim that you wrote the original software. If you use this software
-- in a product, an acknowledgment in the product documentation would be
-- appreciated but is not required.
-- 2. Altered source versions must be plainly marked as such, and must not be
-- misrepresented as being the original software.
-- 3. This notice may not be removed or altered from any source distribution.
--*/
--#include "SDL_config.h"
--
--#if SDL_VIDEO_DRIVER_NACL
--
--/* Include the SDL main definition header */
--#include "SDL_main.h"
--#include "../../SDL_trace.h"
--
--#include <errno.h>
--#include <ppapi_simple/ps_main.h>
--#include <ppapi_simple/ps_event.h>
--#include <ppapi_simple/ps_interface.h>
--#include <nacl_io/nacl_io.h>
--#include <sys/mount.h>
--#include <nacl_main.h>
--#include <unistd.h>
--
--extern void NACL_SetScreenResolution(int width, int height);
--
--static int
--ProcessArgs(int argc, char** argv) {
-- const char* arg = getenv("SDL_TAR_EXTRACT");
-- if (arg != NULL) {
-- const char* source;
-- const char* target = "/";
-- char* sep;
-- char buf[64];
-- int n;
--
-- const char* q, *p = arg;
-- while (*p) {
-- while (*p && isspace((unsigned char)*p)) ++p;
-- if (!*p) break;
-- q = p;
-- while (*p && !isspace((unsigned char)*p)) ++p;
--
-- n = sizeof(buf) - 1;
-- if (p - q < n) n = p - q;
-- strncpy(buf, q, n);
-- buf[n] = '\0';
--
-- sep = strchr(buf, ':');
-- source = buf;
-- if (sep) {
-- target = sep + 1;
-- *sep = '\0';
-- }
--
-- SDL_log("extracting tar file '%s' -> '%s'\n", source, target);
-- if (nacl_startup_untar(argv[0], source, target) != 0)
-- return 1;
-- }
-- }
--
-- return 0;
--}
--
--/* This is started in a worker thread by ppapi_simple! */
--int
--nacl_main(int argc, char *argv[])
--{
-- SDL_TRACE("nacl_main\n");
-- PSEvent* ps_event;
-- PP_Resource event;
-- struct PP_Rect rect;
-- int ready = 0;
-- const PPB_View *ppb_view = PSInterfaceView();
--
-- if (ProcessArgs(argc, argv) != 0) {
-- return 1;
-- }
--
-- /* Wait for the first PSE_INSTANCE_DIDCHANGEVIEW event before starting the app */
-- PSEventSetFilter(PSE_INSTANCE_DIDCHANGEVIEW);
-- /* Process all waiting events without blocking */
-- while (!ready) {
-- ps_event = PSEventWaitAcquire();
-- event = ps_event->as_resource;
-- switch(ps_event->type) {
-- /* From DidChangeView, contains a view resource */
-- case PSE_INSTANCE_DIDCHANGEVIEW:
-- ppb_view->GetRect(event, &rect);
-- NACL_SetScreenResolution(rect.size.width, rect.size.height);
-- ready = 1;
-- break;
-- default:
-- break;
-- }
-- PSEventRelease(ps_event);
-- }
--
-- /*
-- * Startup in /mnt/http by default so resources hosted on the webserver
-- * are accessible in the current working directory.
-- */
-- if (getenv("PWD") == NULL) {
-- if (chdir("/mnt/http") != 0) {
-- SDL_log("chdir to /mnt/http failed: %s\n", strerror(errno));
-- }
-- }
--
-- return SDL_main(argc, argv);
--}
--
--#endif /* SDL_VIDEO_DRIVER_NACL */
-diff --git a/src/main/nacl/SDL_nacl_main.cc b/src/main/nacl/SDL_nacl_main.cc
-new file mode 100644
-index 0000000..ee80b9a
---- /dev/null
-+++ b/src/main/nacl/SDL_nacl_main.cc
-@@ -0,0 +1,129 @@
-+/*
-+ Simple DirectMedia Layer
-+ Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
-+
-+ This software is provided 'as-is', without any express or implied
-+ warranty. In no event will the authors be held liable for any damages
-+ arising from the use of this software.
-+
-+ Permission is granted to anyone to use this software for any purpose,
-+ including commercial applications, and to alter it and redistribute it
-+ freely, subject to the following restrictions:
-+
-+ 1. The origin of this software must not be misrepresented; you must not
-+ claim that you wrote the original software. If you use this software
-+ in a product, an acknowledgment in the product documentation would be
-+ appreciated but is not required.
-+ 2. Altered source versions must be plainly marked as such, and must not be
-+ misrepresented as being the original software.
-+ 3. This notice may not be removed or altered from any source distribution.
-+*/
-+#include "SDL_config.h"
-+
-+#if SDL_VIDEO_DRIVER_NACL
-+
-+/* Include the SDL main definition header */
-+#include "SDL_main.h"
-+#include "../../SDL_trace.h"
-+
-+#include <errno.h>
-+#include <ppapi_simple/ps_main.h>
-+#include <ppapi_simple/ps_event.h>
-+#include <ppapi_simple/ps_interface.h>
-+#include <nacl_io/nacl_io.h>
-+#include <sys/mount.h>
-+#include <nacl_main.h>
-+#include <unistd.h>
-+
-+extern "C" void NACL_SetScreenResolution(int width, int height);
-+
-+static int
-+ProcessArgs(int argc, char** argv) {
-+ const char* arg = getenv("SDL_TAR_EXTRACT");
-+ if (arg != NULL) {
-+ const char* source;
-+ const char* target = "/";
-+ char* sep;
-+ char buf[64];
-+ int n;
-+
-+ const char* q, *p = arg;
-+ while (*p) {
-+ while (*p && isspace((unsigned char)*p)) ++p;
-+ if (!*p) break;
-+ q = p;
-+ while (*p && !isspace((unsigned char)*p)) ++p;
-+
-+ n = sizeof(buf) - 1;
-+ if (p - q < n) n = p - q;
-+ strncpy(buf, q, n);
-+ buf[n] = '\0';
-+
-+ sep = strchr(buf, ':');
-+ source = buf;
-+ if (sep) {
-+ target = sep + 1;
-+ *sep = '\0';
-+ }
-+
-+ SDL_log("extracting tar file '%s' -> '%s'\n", source, target);
-+ if (nacl_startup_untar(argv[0], source, target) != 0)
-+ return 1;
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+#undef main
-+
-+/* This is started in a worker thread by ppapi_simple! */
-+int
-+main(int argc, char *argv[])
-+{
-+ SDL_TRACE("main\n");
-+ PSEvent* ps_event;
-+ PP_Resource event;
-+ struct PP_Rect rect;
-+ int ready = 0;
-+ const PPB_View *ppb_view = PSInterfaceView();
-+
-+ if (ProcessArgs(argc, argv) != 0) {
-+ return 1;
-+ }
-+
-+ /* Wait for the first PSE_INSTANCE_DIDCHANGEVIEW event before starting the app */
-+ PSEventSetFilter(PSE_INSTANCE_DIDCHANGEVIEW);
-+ /* Process all waiting events without blocking */
-+ while (!ready) {
-+ ps_event = PSEventWaitAcquire();
-+ event = ps_event->as_resource;
-+ switch(ps_event->type) {
-+ /* From DidChangeView, contains a view resource */
-+ case PSE_INSTANCE_DIDCHANGEVIEW:
-+ ppb_view->GetRect(event, &rect);
-+ NACL_SetScreenResolution(rect.size.width, rect.size.height);
-+ ready = 1;
-+ break;
-+ default:
-+ break;
-+ }
-+ PSEventRelease(ps_event);
-+ }
-+
-+ mount("", /* source */
-+ "/persistent", /* target */
-+ "html5fs", /* filesystemtype */
-+ 0, /* mountflags */
-+ "type=PERSISTENT,expected_size=1048576"); /* data */
-+
-+ mount("", /* source. Use relative URL */
-+ "/http", /* target */
-+ "httpfs", /* filesystemtype */
-+ 0, /* mountflags */
-+ ""); /* data */
-+
-+ return SDL_main(argc, argv);
-+}
-+
-+#endif /* SDL_VIDEO_DRIVER_NACL */
-diff --git a/src/video/nacl/SDL_naclevents.c b/src/video/nacl/SDL_naclevents.c
-index a2f7e19..a97134f 100644
---- a/src/video/nacl/SDL_naclevents.c
-+++ b/src/video/nacl/SDL_naclevents.c
-@@ -29,6 +29,7 @@
-
- #include <math.h>
- #include <ppapi_simple/ps_event.h>
-+#include <ppapi/c/ppb_input_event.h>
-
- #define PPAPI_KEY_CTRL 17
- #define PPAPI_KEY_ALT 18
-@@ -176,12 +177,85 @@ static SDLKey translateKey(uint32_t code) {
- }
- }
-
-+static SDL_bool SDL_NeedModUpdate = SDL_TRUE;
-+
-+static int Utf8ToUtf16(const Uint8 *utf8, const int utf8_length, Uint16 *utf16, const int utf16_max_length) {
-+
-+ /* p moves over the output buffer. max_ptr points to the next to the last slot of the buffer. */
-+ Uint16 *p = utf16;
-+ Uint16 const *const max_ptr = utf16 + utf16_max_length;
-+
-+ /* end_of_input points to the last byte of input as opposed to the next to the last byte. */
-+ Uint8 const *const end_of_input = utf8 + utf8_length - 1;
-+
-+ while (utf8 <= end_of_input) {
-+ Uint8 const c = *utf8;
-+ if (p >= max_ptr) {
-+ /* No more output space. */
-+ return -1;
-+ }
-+ if (c < 0x80) {
-+ /* One byte ASCII. */
-+ *p++ = c;
-+ utf8 += 1;
-+ } else if (c < 0xC0) {
-+ /* Follower byte without preceeding leader bytes. */
-+ return -1;
-+ } else if (c < 0xE0) {
-+ /* Two byte sequence. We need one follower byte. */
-+ if (end_of_input - utf8 < 1 || (((utf8[1] ^ 0x80)) & 0xC0)) {
-+ return -1;
-+ }
-+ *p++ = (Uint16)(0xCF80 + (c << 6) + utf8[1]);
-+ utf8 += 2;
-+ } else if (c < 0xF0) {
-+ /* Three byte sequence. We need two follower byte. */
-+ if (end_of_input - utf8 < 2 || (((utf8[1] ^ 0x80) | (utf8[2] ^ 0x80)) & 0xC0)) {
-+ return -1;
-+ }
-+ *p++ = (Uint16)(0xDF80 + (c << 12) + (utf8[1] << 6) + utf8[2]);
-+ utf8 += 3;
-+ } else if (c < 0xF8) {
-+ int plane;
-+ /* Four byte sequence. We need three follower bytes. */
-+ if (end_of_input - utf8 < 3 || (((utf8[1] ^ 0x80) | (utf8[2] ^0x80) | (utf8[3] ^ 0x80)) & 0xC0)) {
-+ return -1;
-+ }
-+ plane = (-0xC8 + (c << 2) + (utf8[1] >> 4));
-+ if (plane == 0) {
-+ /* This four byte sequence is an alias that
-+ corresponds to a Unicode scalar value in BMP.
-+ It fits in an UTF-16 encoding unit. */
-+ *p++ = (Uint16)(0xDF80 + (utf8[1] << 12) + (utf8[2] << 6) + utf8[3]);
-+ } else if (plane <= 16) {
-+ /* This is a legal four byte sequence that corresponds to a surrogate pair. */
-+ if (p + 1 >= max_ptr) {
-+ /* No enough space on the output buffer for the pair. */
-+ return -1;
-+ }
-+ *p++ = (Uint16)(0xE5B8 + (c << 8) + (utf8[1] << 2) + (utf8[2] >> 4));
-+ *p++ = (Uint16)(0xDB80 + ((utf8[2] & 0x0F) << 6) + utf8[3]);
-+ } else {
-+ /* This four byte sequence is out of UTF-16 code space. */
-+ return -1;
-+ }
-+ utf8 += 4;
-+ } else {
-+ /* Longer sequence or unused byte. */
-+ return -1;
-+ }
-+ }
-+ return p - utf16;
-+}
-+
-+
- void HandleInputEvent(_THIS, PP_Resource event) {
- static Uint8 last_scancode = 0;
- static int alt_down = 0;
- static int ctrl_down = 0;
- PP_InputEvent_Type type;
- PP_InputEvent_Modifier modifiers;
-+ SDLMod sdl_mod;
- Uint8 button;
- Uint8 state;
- Uint8 gained;
-@@ -197,9 +271,49 @@ void HandleInputEvent(_THIS, PP_Resource event) {
- int sdl_wheel_clicks_y;
- int i;
-
-+ // defining modifiers array for conversion
-+ static const size_t modcnt = 6;
-+ static const int ppapi_mods[modcnt] = {
-+ PP_INPUTEVENT_MODIFIER_SHIFTKEY,
-+ PP_INPUTEVENT_MODIFIER_CONTROLKEY,
-+ PP_INPUTEVENT_MODIFIER_ALTKEY,
-+ PP_INPUTEVENT_MODIFIER_METAKEY,
-+ PP_INPUTEVENT_MODIFIER_CAPSLOCKKEY,
-+ PP_INPUTEVENT_MODIFIER_NUMLOCKKEY
-+ };
-+ static const SDLMod sdl_mods[modcnt] = {
-+ KMOD_LSHIFT,
-+ KMOD_LCTRL,
-+ KMOD_LALT,
-+ KMOD_LMETA,
-+ KMOD_CAPS,
-+ KMOD_NUM
-+ };
-+ static const SDLKey sdl_keys[modcnt] = {
-+ SDLK_LSHIFT,
-+ SDLK_LCTRL,
-+ SDLK_LALT,
-+ SDLK_LMETA,
-+ SDLK_CAPSLOCK,
-+ SDLK_NUMLOCK
-+ };
-+ static const SDLKey sdl_rkeys[modcnt] = {
-+ SDLK_RSHIFT,
-+ SDLK_RCTRL,
-+ SDLK_RALT,
-+ SDLK_RMETA,
-+ SDLK_CAPSLOCK,
-+ SDLK_NUMLOCK
-+ };
-+
- type = dd->ppb_input_event->GetType(event);
- modifiers = dd->ppb_input_event->GetModifiers(event);
-
-+ // alt_down and ctrl_down correction
-+ // needed when one of these keys were pressed outside of the module
-+ alt_down = modifiers & PP_INPUTEVENT_MODIFIER_ALTKEY ? 1 : 0;
-+ ctrl_down = modifiers & PP_INPUTEVENT_MODIFIER_CONTROLKEY ? 1 : 0;
-+
- switch (type) {
- case PP_INPUTEVENT_TYPE_MOUSEDOWN:
- case PP_INPUTEVENT_TYPE_MOUSEUP:
-@@ -216,13 +330,13 @@ void HandleInputEvent(_THIS, PP_Resource event) {
- sdl_wheel_clicks_y = trunc(wheel_clicks_y);
- button = (sdl_wheel_clicks_x > 0) ? SDL_BUTTON_X1 : SDL_BUTTON_X2;
- for (i = 0; i < abs(sdl_wheel_clicks_x); i++) {
-- SDL_PrivateMouseButton(SDL_MOUSEBUTTONDOWN, button, 0, 0);
-- SDL_PrivateMouseButton(SDL_MOUSEBUTTONUP, button, 0, 0);
-+ SDL_PrivateMouseButton(SDL_PRESSED, button, 0, 0);
-+ SDL_PrivateMouseButton(SDL_RELEASED, button, 0, 0);
- }
- button = (sdl_wheel_clicks_y > 0) ? SDL_BUTTON_WHEELUP : SDL_BUTTON_WHEELDOWN;
- for (i = 0; i < abs(sdl_wheel_clicks_y); i++) {
-- SDL_PrivateMouseButton(SDL_MOUSEBUTTONDOWN, button, 0, 0);
-- SDL_PrivateMouseButton(SDL_MOUSEBUTTONUP, button, 0, 0);
-+ SDL_PrivateMouseButton(SDL_PRESSED, button, 0, 0);
-+ SDL_PrivateMouseButton(SDL_RELEASED, button, 0, 0);
- }
- wheel_clicks_x -= sdl_wheel_clicks_x;
- wheel_clicks_y -= sdl_wheel_clicks_y;
-@@ -259,7 +373,12 @@ void HandleInputEvent(_THIS, PP_Resource event) {
- // It seems that SDL 1.3 is better in this regard.
- keysym.scancode = dd->ppb_keyboard_input_event->GetKeyCode(event);
- unicode_var = dd->ppb_keyboard_input_event->GetCharacterText(event);
-- keysym.unicode = dd->ppb_var->VarToUtf8(unicode_var, &unicode_var_len)[0];
-+ const Uint8 *utf8_buf = dd->ppb_var->VarToUtf8(unicode_var, &unicode_var_len);
-+
-+ Uint8 utf16_buf[10];
-+ Utf8ToUtf16(utf8_buf, unicode_var_len, (Uint16*)&utf16_buf[0], 1);
-+ keysym.unicode = *(Uint16*)&utf16_buf[0];
-+
- dd->ppb_var->Release(unicode_var);
- keysym.sym = translateKey(keysym.scancode);
-
-@@ -318,6 +437,34 @@ void HandleInputEvent(_THIS, PP_Resource event) {
- state = SDL_RELEASED;
- last_scancode = 0;
- }
-+
-+ if (SDL_NeedModUpdate) {
-+ // copying keyboard modifiers from PPAPI
-+ sdl_mod = KMOD_NONE;
-+ for (i = 0; i < modcnt; ++i) {
-+ if (sdl_keys[i] == keysym.sym) // if key is a modifier
-+ continue; // then do not copy it
-+ if (modifiers & ppapi_mods[i]) {
-+ sdl_mod |= sdl_mods[i];
-+ SDL_SetKeyState(sdl_keys[i], SDL_PRESSED);
-+ } else {
-+ SDL_SetKeyState(sdl_keys[i], SDL_RELEASED);
-+ }
-+ }
-+ SDL_SetModState(sdl_mod);
-+ SDL_NeedModUpdate = SDL_FALSE;
-+ }
-+
-+ if (modifiers & PP_INPUTEVENT_MODIFIER_ISRIGHT) {
-+ // convert left modifier keycode to the right one
-+ for (i = 0; i < modcnt; ++i) {
-+ if (keysym.sym == sdl_keys[i]) {
-+ keysym.sym = sdl_rkeys[i];
-+ break;
-+ }
-+ }
-+ }
-+
- keysym.mod = KMOD_NONE;
- SDL_TRACE("Key event: %d: %s\n", state, SDL_GetKeyName(keysym.sym));
- SDL_PrivateKeyboard(state, &keysym);
-@@ -352,6 +499,7 @@ static void HandleEvent(_THIS, PSEvent* ps_event) {
-
- /* From DidChangeFocus, contains a PP_Bool with the current focus state. */
- case PSE_INSTANCE_DIDCHANGEFOCUS:
-+ SDL_NeedModUpdate = SDL_TRUE;
- break;
-
- /* When the 3D context is lost, no resource. */
diff --git a/packaging/nacl/ports/sdl/pkg_info b/packaging/nacl/ports/sdl/pkg_info
deleted file mode 100644
index 21813f18c..000000000
--- a/packaging/nacl/ports/sdl/pkg_info
+++ /dev/null
@@ -1,7 +0,0 @@
-NAME=sdl
-VERSION=1.2.15
-URL=https://github.com/sbc100/SDL-mirror.git@1c6f2d0
-LICENSE=LGPL2
-DEPENDS=(nacl-spawn regal)
-SHA1=0c5f193ced810b0d7ce3ab06d808cbb5eef03a2c
-DISABLED_TOOLCHAIN=(emscripten)