mirror of https://github.com/OpenTTD/OpenTTD
Remove: OS/2 port
parent
d4c2043294
commit
1a3d1bca59
|
@ -174,9 +174,6 @@ See `src/3rdparty/squirrel/COPYRIGHT` for the complete license text.
|
||||||
The md5 implementation in `src/3rdparty/md5` is licensed under the Zlib license.
|
The md5 implementation in `src/3rdparty/md5` is licensed under the Zlib license.
|
||||||
See the comments in the source files in `src/3rdparty/md5` for the complete license text.
|
See the comments in the source files in `src/3rdparty/md5` for the complete license text.
|
||||||
|
|
||||||
The implementations of Posix `getaddrinfo` and `getnameinfo` for OS/2 in `src/3rdparty/os2` are distributed partly under the GNU Lesser General Public License 2.1, and partly under the (3-clause) BSD license.
|
|
||||||
The exact licensing terms can be found in `src/3rdparty/os2/getaddrinfo.c` resp. `src/3rdparty/os2/getnameinfo.c`.
|
|
||||||
|
|
||||||
The fmt implementation in `src/3rdparty/fmt` is licensed under the MIT license.
|
The fmt implementation in `src/3rdparty/fmt` is licensed under the MIT license.
|
||||||
See `src/3rdparty/fmt/LICENSE.rst` for the complete license text.
|
See `src/3rdparty/fmt/LICENSE.rst` for the complete license text.
|
||||||
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
rem
|
|
||||||
rem Building language files...
|
|
||||||
rem
|
|
||||||
cd ..
|
|
||||||
strgen\strgen
|
|
||||||
for %%f in (lang\*.txt) do strgen\strgen %%f
|
|
||||||
cd strgen
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
start /n /win openttd.exe -D %1 %2 %3 %4 %5 %6 %7 %8 %9
|
|
|
@ -1,21 +0,0 @@
|
||||||
@echo off
|
|
||||||
if "%1" == "" goto err
|
|
||||||
if "%2" == "" goto err
|
|
||||||
|
|
||||||
echo Downloading NoSound...
|
|
||||||
|
|
||||||
%1\wget http://binaries.openttd.org/installer/nosound-NOSOUND_VERSION.7z -O %2/baseset/nosound.7z
|
|
||||||
|
|
||||||
echo Extracting NoSound...
|
|
||||||
|
|
||||||
%1\7za x -y -O%2/baseset %2/baseset/nosound.7z
|
|
||||||
del %1\baseset\nosound.7z /n
|
|
||||||
|
|
||||||
echo NoSound has been installed.
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:err
|
|
||||||
echo This batch file is only intended for use by the OpenTTD installer.
|
|
||||||
echo Please visit www.openttd.org for details on downloading NoSound.
|
|
||||||
|
|
||||||
:end
|
|
|
@ -1,21 +0,0 @@
|
||||||
@echo off
|
|
||||||
if "%1" == "" goto err
|
|
||||||
if "%2" == "" goto err
|
|
||||||
|
|
||||||
echo Downloading OpenGFX...
|
|
||||||
|
|
||||||
%1\wget http://binaries.openttd.org/installer/opengfx-OPENGFX_VERSION.7z -O %2/baseset/opengfx.7z
|
|
||||||
|
|
||||||
echo Extracting OpenGFX...
|
|
||||||
|
|
||||||
%1\7za x -y -O%2/baseset %2/baseset/opengfx.7z
|
|
||||||
del %1\baseset\opengfx.7z /n
|
|
||||||
|
|
||||||
echo OpenGFX has been installed.
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:err
|
|
||||||
echo This batch file is only intended for use by the OpenTTD installer.
|
|
||||||
echo Please visit www.openttd.org for details on downloading OpenGFX.
|
|
||||||
|
|
||||||
:end
|
|
|
@ -1,21 +0,0 @@
|
||||||
@echo off
|
|
||||||
if "%1" == "" goto err
|
|
||||||
if "%2" == "" goto err
|
|
||||||
|
|
||||||
echo Downloading OpenSFX...
|
|
||||||
|
|
||||||
%1\wget http://binaries.openttd.org/installer/opensfx-OPENSFX_VERSION.7z -O %2/baseset/opensfx.7z
|
|
||||||
|
|
||||||
echo Extracting OpenSFX...
|
|
||||||
|
|
||||||
%1\7za x -y -O%2/baseset %2/baseset/opensfx.7z
|
|
||||||
del %1\baseset\opensfx.7z /n
|
|
||||||
|
|
||||||
echo OpenSFX has been installed.
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:err
|
|
||||||
echo This batch file is only intended for use by the OpenTTD installer.
|
|
||||||
echo Please visit www.openttd.org for details on downloading OpenSFX.
|
|
||||||
|
|
||||||
:end
|
|
|
@ -1,85 +0,0 @@
|
||||||
@echo off
|
|
||||||
|
|
||||||
set OPENTTD_VERSION=1.11.0
|
|
||||||
set OPENSFX_VERSION=0.8.0
|
|
||||||
set NOSOUND_VERSION=0.8.0
|
|
||||||
set OPENGFX_VERSION=1.2.0
|
|
||||||
|
|
||||||
echo To make the installer, you must have the WarpIN compiler (wic) installed and in
|
|
||||||
echo your path, as well as wget and unzip. This file will download the various DLLs
|
|
||||||
echo to be distributed with the installer. If you do not want to continue, please
|
|
||||||
echo press CTRL-C now.
|
|
||||||
echo.
|
|
||||||
pause
|
|
||||||
|
|
||||||
cd ..\..\..\bundle
|
|
||||||
|
|
||||||
if not exist SDL12.dll goto getsdl
|
|
||||||
if not exist FSLib.dll goto getsdl
|
|
||||||
goto libc
|
|
||||||
|
|
||||||
:getsdl
|
|
||||||
|
|
||||||
wget http://www.os2site.com/sw/dev/sdl/sdl-1.2.10-bin-20080804.zip -O dl.zip
|
|
||||||
unzip -j dl.zip SDL/FSLib.dll SDL/SDL12.dll
|
|
||||||
del dl.zip
|
|
||||||
|
|
||||||
:libc
|
|
||||||
|
|
||||||
if exist libc063.dll goto gcc
|
|
||||||
|
|
||||||
wget ftp://ftp.netlabs.org/pub/gcc/libc-0.6.3-csd3.zip -O dl.zip
|
|
||||||
unzip -j dl.zip libc063.dll
|
|
||||||
del dl.zip
|
|
||||||
|
|
||||||
:gcc
|
|
||||||
|
|
||||||
if exist gcc442.dll goto tools
|
|
||||||
|
|
||||||
wget http://www.owenrudge.net/various/gcc442.zip -O dl.zip
|
|
||||||
unzip -j dl.zip gcc442.dll
|
|
||||||
del dl.zip
|
|
||||||
|
|
||||||
:tools
|
|
||||||
|
|
||||||
cd ..\os\os2\installer
|
|
||||||
if exist tools goto opengfx
|
|
||||||
|
|
||||||
mkdir tools
|
|
||||||
cd tools
|
|
||||||
|
|
||||||
wget http://download.smedley.info/wget-1.11.4-os2-20090315.zip -O dl.zip
|
|
||||||
unzip -j dl.zip wget/bin/wget.exe
|
|
||||||
del dl.zip
|
|
||||||
|
|
||||||
wget ftp://ftp.os4.su/moveton/p7zip-9.04-bin-os2.zip -O dl.zip
|
|
||||||
unzip -j dl.zip bin/7za.exe dll/ilibca.dll
|
|
||||||
del dl.zip
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
:opengfx
|
|
||||||
|
|
||||||
if exist opengfx goto opensfx
|
|
||||||
|
|
||||||
mkdir opengfx
|
|
||||||
sed s/OPENGFX_VERSION/%OPENGFX_VERSION%/ < download_opengfx.cmd > opengfx\download_opengfx.cmd
|
|
||||||
copy remove_opengfx.cmd opengfx
|
|
||||||
|
|
||||||
:opensfx
|
|
||||||
if exist opensfx goto nosound
|
|
||||||
|
|
||||||
mkdir opensfx
|
|
||||||
sed s/OPENSFX_VERSION/%OPENSFX_VERSION%/ < download_opensfx.cmd > opensfx\download_opensfx.cmd
|
|
||||||
copy remove_opensfx.cmd opensfx
|
|
||||||
|
|
||||||
:nosound
|
|
||||||
|
|
||||||
mkdir nosound
|
|
||||||
sed s/NOSOUND_VERSION/%NOSOUND_VERSION%/ < download_nosound.cmd > nosound\download_nosound.cmd
|
|
||||||
copy remove_nosound.cmd nosound
|
|
||||||
|
|
||||||
:end
|
|
||||||
|
|
||||||
if exist openttd-%OPENTTD_VERSION%-os2.exe del openttd-%OPENTTD_VERSION%-os2.exe
|
|
||||||
wic -a openttd-%OPENTTD_VERSION%-os2.exe 1 -c../../../bundle -r * 2 -ctools -r * 3 -copengfx -r * 4 -copensfx -r * 5 -cnosound -r * -U -s openttd.wis
|
|
|
@ -1,106 +0,0 @@
|
||||||
<WARPIN>
|
|
||||||
<HEAD>
|
|
||||||
<TITLE>OpenTTD</TITLE>
|
|
||||||
|
|
||||||
<!-- Please remember to increment the build number for each package
|
|
||||||
when releasing a new stable version, particularly if there are
|
|
||||||
also release candidates sharing the major/minor versions:
|
|
||||||
|
|
||||||
e.g., 0\7\1\16279 for 0.7.1-RC1,
|
|
||||||
0\7\1\16365 for 0.7.1-RC2,
|
|
||||||
0\7\1\16540 for 0.7.1 final
|
|
||||||
-->
|
|
||||||
|
|
||||||
<PCK INDEX="1"
|
|
||||||
PACKAGEID="OpenTTD\OpenTTD\OpenTTD\1\0\0\18862"
|
|
||||||
TARGET="$(WARPIN_DEFAULTAPPSPATH)\OpenTTD"
|
|
||||||
SELECT
|
|
||||||
TITLE="OpenTTD"
|
|
||||||
LONGFILENAMES
|
|
||||||
BASE
|
|
||||||
>OpenTTD is an open source transport simulation game</PCK>
|
|
||||||
|
|
||||||
<PCK INDEX="2"
|
|
||||||
PACKAGEID="OpenTTD\OpenTTD\Downloader\1\0\0\18862"
|
|
||||||
TARGET="$(WARPIN_DEFAULTAPPSPATH)\OpenTTD"
|
|
||||||
SELECT
|
|
||||||
TITLE="Download tools"
|
|
||||||
REQUIRES=1
|
|
||||||
FIXED
|
|
||||||
>Tools required for downloading the OpenGFX/SFX packs</PCK>
|
|
||||||
|
|
||||||
<PCK INDEX="3"
|
|
||||||
PACKAGEID="OpenTTD\OpenTTD\OpenGFX\1\0\0\18862"
|
|
||||||
TARGET="$(WARPIN_DEFAULTAPPSPATH)\OpenTTD"
|
|
||||||
SELECT
|
|
||||||
TITLE="OpenGFX"
|
|
||||||
LONGFILENAMES
|
|
||||||
REQUIRES=2
|
|
||||||
EXECUTE="$(3)\download_opengfx.cmd | $(1) $(/1)"
|
|
||||||
DEEXECUTE="$(3)\remove_opengfx.cmd | $(1) $(/1)"
|
|
||||||
FIXED
|
|
||||||
>Downloads the OpenGFX graphics pack for OpenTTD</PCK>
|
|
||||||
|
|
||||||
<PCK INDEX="4"
|
|
||||||
PACKAGEID="OpenTTD\OpenTTD\OpenSFX\1\0\0\18862"
|
|
||||||
TARGET="$(WARPIN_DEFAULTAPPSPATH)\OpenTTD"
|
|
||||||
SELECT
|
|
||||||
TITLE="OpenSFX"
|
|
||||||
LONGFILENAMES
|
|
||||||
REQUIRES=2
|
|
||||||
EXECUTE="$(4)\download_opensfx.cmd | $(1) $(/1)"
|
|
||||||
DEEXECUTE="$(4)\remove_opensfx.cmd | $(1) $(/1)"
|
|
||||||
FIXED
|
|
||||||
>Downloads the OpenSFX sound effects pack for OpenTTD</PCK>
|
|
||||||
|
|
||||||
<PCK INDEX="5"
|
|
||||||
PACKAGEID="OpenTTD\OpenTTD\NoSound\1\0\0\18862"
|
|
||||||
TARGET="$(WARPIN_DEFAULTAPPSPATH)\OpenTTD"
|
|
||||||
SELECT
|
|
||||||
TITLE="NoSound"
|
|
||||||
LONGFILENAMES
|
|
||||||
REQUIRES=2
|
|
||||||
EXECUTE="$(5)\download_nosound.cmd | $(1) $(/1)"
|
|
||||||
DEEXECUTE="$(5)\remove_nosound.cmd | $(1) $(/1)"
|
|
||||||
FIXED
|
|
||||||
>Downloads the NoSound pack for OpenTTD, to disable sound effects</PCK>
|
|
||||||
|
|
||||||
</HEAD>
|
|
||||||
|
|
||||||
<BODY>
|
|
||||||
<!-- page 1: introductory page -->
|
|
||||||
<PAGE INDEX="1" TYPE="README">
|
|
||||||
<NEXTBUTTON TARGET=2>~Next</NEXTBUTTON>
|
|
||||||
<README EXTRACTFROMPCK="1">README.md</README>
|
|
||||||
<TEXT>Welcome to the OpenTTD installer. This program will install OpenTTD 1.0 on your system. Before we begin the installation process, please take a moment to read the following document.
|
|
||||||
|
|
||||||
Select "Next" to continue, or "Cancel" to abort installation.</TEXT>
|
|
||||||
</PAGE>
|
|
||||||
|
|
||||||
<!-- page 2: licence page -->
|
|
||||||
<PAGE INDEX="2" TYPE="README">
|
|
||||||
<NEXTBUTTON TARGET=3>~Next</NEXTBUTTON>
|
|
||||||
<README EXTRACTFROMPCK="1">COPYING.md</README>
|
|
||||||
<TEXT>OpenTTD is licenced under the GNU General Public License. The text of the licence is below.
|
|
||||||
|
|
||||||
Select "Next" if you agree to this licence.
|
|
||||||
Select "Cancel" to abort installation.</TEXT>
|
|
||||||
</PAGE>
|
|
||||||
|
|
||||||
<!-- The TYPE=CONTAINER will list the packages which can be installed. -->
|
|
||||||
<PAGE INDEX="3" TYPE="CONTAINER">
|
|
||||||
<NEXTBUTTON TARGET="4">~Next</NEXTBUTTON>
|
|
||||||
<TEXT>On this page, you may choose which components to install. If you don't own Transport Tycoon Deluxe, you will need to download OpenGFX (3MiB) and OpenSFX (10MiB).</TEXT>
|
|
||||||
</PAGE>
|
|
||||||
|
|
||||||
<!-- Display another TEXT page to inform the user
|
|
||||||
that installation will begin. We use the TARGET=0
|
|
||||||
with the NEXTBUTTON tag which starts installation. -->
|
|
||||||
|
|
||||||
<PAGE INDEX="4" TYPE="TEXT">
|
|
||||||
<NEXTBUTTON TARGET="0">I~nstall</NEXTBUTTON>
|
|
||||||
<TEXT>
|
|
||||||
Press "Install" to begin installing OpenTTD.</TEXT>
|
|
||||||
</PAGE>
|
|
||||||
</BODY>
|
|
||||||
</WARPIN>
|
|
|
@ -1,15 +0,0 @@
|
||||||
@echo off
|
|
||||||
if "%1" == "" goto err
|
|
||||||
|
|
||||||
echo Removing NoSound...
|
|
||||||
|
|
||||||
del %1\baseset\nosound\*.* /n
|
|
||||||
rmdir %1\baseset\nosound
|
|
||||||
|
|
||||||
echo NoSound has been removed.
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:err
|
|
||||||
echo This batch file is only intended for use by the OpenTTD installer.
|
|
||||||
|
|
||||||
:end
|
|
|
@ -1,15 +0,0 @@
|
||||||
@echo off
|
|
||||||
if "%1" == "" goto err
|
|
||||||
|
|
||||||
echo Removing OpenGFX...
|
|
||||||
|
|
||||||
del %1\baseset\opengfx\*.* /n
|
|
||||||
rmdir %1\baseset\opengfx
|
|
||||||
|
|
||||||
echo OpenGFX has been removed.
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:err
|
|
||||||
echo This batch file is only intended for use by the OpenTTD installer.
|
|
||||||
|
|
||||||
:end
|
|
|
@ -1,15 +0,0 @@
|
||||||
@echo off
|
|
||||||
if "%1" == "" goto err
|
|
||||||
|
|
||||||
echo Removing OpenSFX...
|
|
||||||
|
|
||||||
del %1\baseset\opensfx\*.* /n
|
|
||||||
rmdir %1\baseset\opensfx
|
|
||||||
|
|
||||||
echo OpenSFX has been removed.
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:err
|
|
||||||
echo This batch file is only intended for use by the OpenTTD installer.
|
|
||||||
|
|
||||||
:end
|
|
|
@ -1,64 +0,0 @@
|
||||||
40
|
|
||||||
projectIdent
|
|
||||||
0
|
|
||||||
VpeMain
|
|
||||||
1
|
|
||||||
WRect
|
|
||||||
0
|
|
||||||
0
|
|
||||||
10304
|
|
||||||
10020
|
|
||||||
2
|
|
||||||
MProject
|
|
||||||
3
|
|
||||||
MCommand
|
|
||||||
15
|
|
||||||
svn_version.cmd
|
|
||||||
4
|
|
||||||
MCommand
|
|
||||||
0
|
|
||||||
2
|
|
||||||
5
|
|
||||||
WFileName
|
|
||||||
17
|
|
||||||
..\..\openttd.tgt
|
|
||||||
6
|
|
||||||
WFileName
|
|
||||||
23
|
|
||||||
..\..\strgen\strgen.tgt
|
|
||||||
7
|
|
||||||
WVList
|
|
||||||
2
|
|
||||||
8
|
|
||||||
VComponent
|
|
||||||
9
|
|
||||||
WRect
|
|
||||||
0
|
|
||||||
0
|
|
||||||
5696
|
|
||||||
4240
|
|
||||||
0
|
|
||||||
0
|
|
||||||
10
|
|
||||||
WFileName
|
|
||||||
17
|
|
||||||
..\..\openttd.tgt
|
|
||||||
0
|
|
||||||
0
|
|
||||||
11
|
|
||||||
VComponent
|
|
||||||
12
|
|
||||||
WRect
|
|
||||||
688
|
|
||||||
680
|
|
||||||
5696
|
|
||||||
4240
|
|
||||||
0
|
|
||||||
0
|
|
||||||
13
|
|
||||||
WFileName
|
|
||||||
23
|
|
||||||
..\..\strgen\strgen.tgt
|
|
||||||
0
|
|
||||||
1
|
|
||||||
8
|
|
|
@ -1,30 +0,0 @@
|
||||||
@echo off
|
|
||||||
echo Running SVN version detection script...
|
|
||||||
rem
|
|
||||||
rem Requires subversion (`svnversion') to be installed
|
|
||||||
rem
|
|
||||||
cd ..\..
|
|
||||||
if not "%RELEASE%"=="" goto forcerelease
|
|
||||||
if not exist .svn goto nosvn
|
|
||||||
svnversion -n . > os\os2\svnver.tmp
|
|
||||||
if not "%ERRORLEVEL%"=="0" goto nosvn
|
|
||||||
|
|
||||||
copy os\os2\svnver1.c+os\os2\svnver.tmp+os\os2\svnver2.c rev.c /a /y > nul 2> nul
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:forcerelease
|
|
||||||
echo Forcing release string "%RELEASE%"...
|
|
||||||
echo const char _openttd_revision[] = "%RELEASE%"; > rev.c
|
|
||||||
echo const int _revision_number = 0; >> rev.c
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:nosvn
|
|
||||||
echo Error executing `svnversion' or no SVN data detected
|
|
||||||
echo const char _openttd_revision[] = "norev000"; > rev.c
|
|
||||||
echo const int _revision_number = 0; >> rev.c
|
|
||||||
goto end
|
|
||||||
|
|
||||||
:end
|
|
||||||
cd os\os2
|
|
||||||
del svnver.tmp > nul 2> nul
|
|
||||||
rem end
|
|
|
@ -1,3 +0,0 @@
|
||||||
/* rev.c part #1 for OS/2 - ensure no newline at end of file! */
|
|
||||||
|
|
||||||
const char _openttd_revision[] = "r
|
|
|
@ -1,4 +0,0 @@
|
||||||
";
|
|
||||||
const int _revision_number = 0;
|
|
||||||
|
|
||||||
/* rev.c part 2 for OS/2 - ensure no newline at start of file! */
|
|
|
@ -4,4 +4,3 @@ add_subdirectory(icu)
|
||||||
add_subdirectory(md5)
|
add_subdirectory(md5)
|
||||||
add_subdirectory(squirrel)
|
add_subdirectory(squirrel)
|
||||||
add_subdirectory(opengl)
|
add_subdirectory(opengl)
|
||||||
add_subdirectory(os2)
|
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
add_files(
|
|
||||||
getaddrinfo.c
|
|
||||||
getaddrinfo.h
|
|
||||||
getnameinfo.c
|
|
||||||
getnameinfo.h
|
|
||||||
CONDITION OPTION_OS2
|
|
||||||
)
|
|
|
@ -1,299 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of libESMTP, a library for submission of RFC 2822
|
|
||||||
* formatted electronic mail messages using the SMTP protocol described
|
|
||||||
* in RFC 2821.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2001,2002 Brian Stafford <brian@stafford.uklinux.net>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 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
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* An emulation of the RFC 2553 / Posix getaddrinfo resolver interface.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !HAVE_GETADDRINFO
|
|
||||||
|
|
||||||
/* Need to turn off Posix features in glibc to build this */
|
|
||||||
#undef _POSIX_C_SOURCE
|
|
||||||
#undef _XOPEN_SOURCE
|
|
||||||
|
|
||||||
#include "getaddrinfo.h"
|
|
||||||
//#include "compat/inet_pton.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
|
|
||||||
static struct addrinfo *
|
|
||||||
dup_addrinfo (struct addrinfo *info, void *addr, size_t addrlen) {
|
|
||||||
struct addrinfo *ret;
|
|
||||||
|
|
||||||
ret = malloc (sizeof (struct addrinfo));
|
|
||||||
if (ret == NULL)
|
|
||||||
return NULL;
|
|
||||||
memcpy (ret, info, sizeof (struct addrinfo));
|
|
||||||
ret->ai_addr = malloc (addrlen);
|
|
||||||
if (ret->ai_addr == NULL) {
|
|
||||||
free (ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
memcpy (ret->ai_addr, addr, addrlen);
|
|
||||||
ret->ai_addrlen = addrlen;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
getaddrinfo (const char *nodename, const char *servname,
|
|
||||||
const struct addrinfo *hints, struct addrinfo **res)
|
|
||||||
{
|
|
||||||
struct hostent *hp;
|
|
||||||
struct servent *servent;
|
|
||||||
const char *socktype;
|
|
||||||
int port;
|
|
||||||
struct addrinfo hint, result;
|
|
||||||
struct addrinfo *ai, *sai, *eai;
|
|
||||||
char **addrs;
|
|
||||||
|
|
||||||
if (servname == NULL && nodename == NULL)
|
|
||||||
return EAI_NONAME;
|
|
||||||
|
|
||||||
memset (&result, 0, sizeof result);
|
|
||||||
|
|
||||||
/* default for hints */
|
|
||||||
if (hints == NULL) {
|
|
||||||
memset (&hint, 0, sizeof hint);
|
|
||||||
hint.ai_family = PF_UNSPEC;
|
|
||||||
hints = &hint;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (servname == NULL)
|
|
||||||
port = 0;
|
|
||||||
else {
|
|
||||||
/* check for tcp or udp sockets only */
|
|
||||||
if (hints->ai_socktype == SOCK_STREAM)
|
|
||||||
socktype = "tcp";
|
|
||||||
else if (hints->ai_socktype == SOCK_DGRAM)
|
|
||||||
socktype = "udp";
|
|
||||||
else
|
|
||||||
return EAI_SERVICE;
|
|
||||||
result.ai_socktype = hints->ai_socktype;
|
|
||||||
|
|
||||||
/* Note: maintain port in host byte order to make debugging easier */
|
|
||||||
if (isdigit (*servname))
|
|
||||||
port = strtol (servname, NULL, 10);
|
|
||||||
else if ((servent = getservbyname (servname, socktype)) != NULL)
|
|
||||||
port = ntohs (servent->s_port);
|
|
||||||
else
|
|
||||||
return EAI_NONAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if nodename == NULL refer to the local host for a client or any
|
|
||||||
for a server */
|
|
||||||
if (nodename == NULL) {
|
|
||||||
struct sockaddr_in sin;
|
|
||||||
|
|
||||||
/* check protocol family is PF_UNSPEC or PF_INET - could try harder
|
|
||||||
for IPv6 but that's more code than I'm prepared to write */
|
|
||||||
if (hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET)
|
|
||||||
result.ai_family = AF_INET;
|
|
||||||
else
|
|
||||||
return EAI_FAMILY;
|
|
||||||
|
|
||||||
sin.sin_family = result.ai_family;
|
|
||||||
sin.sin_port = htons (port);
|
|
||||||
if (hints->ai_flags & AI_PASSIVE)
|
|
||||||
sin.sin_addr.s_addr = htonl (INADDR_ANY);
|
|
||||||
else
|
|
||||||
sin.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
|
|
||||||
/* Duplicate result and addr and return */
|
|
||||||
*res = dup_addrinfo (&result, &sin, sizeof sin);
|
|
||||||
return (*res == NULL) ? EAI_MEMORY : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If AI_NUMERIC is specified, use inet_pton to translate numbers and
|
|
||||||
dots notation. */
|
|
||||||
if (hints->ai_flags & AI_NUMERICHOST) {
|
|
||||||
struct sockaddr_in sin;
|
|
||||||
|
|
||||||
/* check protocol family is PF_UNSPEC or PF_INET */
|
|
||||||
if (hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET)
|
|
||||||
result.ai_family = AF_INET;
|
|
||||||
else
|
|
||||||
return EAI_FAMILY;
|
|
||||||
|
|
||||||
sin.sin_family = result.ai_family;
|
|
||||||
sin.sin_port = htons (port);
|
|
||||||
if (inet_pton(result.ai_family, nodename, &sin.sin_addr)==0)
|
|
||||||
return EAI_NONAME;
|
|
||||||
sin.sin_addr.s_addr = inet_addr (nodename);
|
|
||||||
/* Duplicate result and addr and return */
|
|
||||||
*res = dup_addrinfo (&result, &sin, sizeof sin);
|
|
||||||
return (*res == NULL) ? EAI_MEMORY : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if HAVE_H_ERRNO
|
|
||||||
h_errno = 0;
|
|
||||||
#endif
|
|
||||||
errno = 0;
|
|
||||||
hp = gethostbyname(nodename);
|
|
||||||
if (hp == NULL) {
|
|
||||||
#ifdef EAI_SYSTEM
|
|
||||||
if (errno != 0) {
|
|
||||||
return EAI_SYSTEM;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
switch (h_errno) {
|
|
||||||
case HOST_NOT_FOUND:
|
|
||||||
return EAI_NODATA;
|
|
||||||
case NO_DATA:
|
|
||||||
return EAI_NODATA;
|
|
||||||
#if defined(NO_ADDRESS) && NO_ADDRESS != NO_DATA
|
|
||||||
case NO_ADDRESS:
|
|
||||||
return EAI_NODATA;
|
|
||||||
#endif
|
|
||||||
case NO_RECOVERY:
|
|
||||||
return EAI_FAIL;
|
|
||||||
case TRY_AGAIN:
|
|
||||||
return EAI_AGAIN;
|
|
||||||
default:
|
|
||||||
return EAI_FAIL;
|
|
||||||
}
|
|
||||||
return EAI_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check that the address family is acceptable.
|
|
||||||
*/
|
|
||||||
switch (hp->h_addrtype) {
|
|
||||||
case AF_INET:
|
|
||||||
if (!(hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET))
|
|
||||||
return EAI_FAMILY;
|
|
||||||
break;
|
|
||||||
#ifndef __OS2__
|
|
||||||
case AF_INET6:
|
|
||||||
if (!(hints->ai_family == PF_UNSPEC || hints->ai_family == PF_INET6))
|
|
||||||
return EAI_FAMILY;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
return EAI_FAMILY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For each element pointed to by hp, create an element in the
|
|
||||||
result linked list. */
|
|
||||||
sai = eai = NULL;
|
|
||||||
for (addrs = hp->h_addr_list; *addrs != NULL; addrs++) {
|
|
||||||
struct sockaddr sa;
|
|
||||||
size_t addrlen;
|
|
||||||
|
|
||||||
if (hp->h_length < 1)
|
|
||||||
continue;
|
|
||||||
sa.sa_family = hp->h_addrtype;
|
|
||||||
switch (hp->h_addrtype) {
|
|
||||||
case AF_INET:
|
|
||||||
((struct sockaddr_in *) &sa)->sin_port = htons (port);
|
|
||||||
memcpy (&((struct sockaddr_in *) &sa)->sin_addr,
|
|
||||||
*addrs, hp->h_length);
|
|
||||||
addrlen = sizeof (struct sockaddr_in);
|
|
||||||
break;
|
|
||||||
#ifndef __OS2__
|
|
||||||
case AF_INET6:
|
|
||||||
#if SIN6_LEN
|
|
||||||
((struct sockaddr_in6 *) &sa)->sin6_len = hp->h_length;
|
|
||||||
#endif
|
|
||||||
((struct sockaddr_in6 *) &sa)->sin6_port = htons (port);
|
|
||||||
memcpy (&((struct sockaddr_in6 *) &sa)->sin6_addr,
|
|
||||||
*addrs, hp->h_length);
|
|
||||||
addrlen = sizeof (struct sockaddr_in6);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
result.ai_family = hp->h_addrtype;
|
|
||||||
ai = dup_addrinfo (&result, &sa, addrlen);
|
|
||||||
if (ai == NULL) {
|
|
||||||
freeaddrinfo (sai);
|
|
||||||
return EAI_MEMORY;
|
|
||||||
}
|
|
||||||
if (sai == NULL)
|
|
||||||
sai = ai;
|
|
||||||
else
|
|
||||||
eai->ai_next = ai;
|
|
||||||
eai = ai;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sai == NULL) {
|
|
||||||
return EAI_NODATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hints->ai_flags & AI_CANONNAME) {
|
|
||||||
sai->ai_canonname = malloc (strlen (hp->h_name) + 1);
|
|
||||||
if (sai->ai_canonname == NULL) {
|
|
||||||
freeaddrinfo (sai);
|
|
||||||
return EAI_MEMORY;
|
|
||||||
}
|
|
||||||
strcpy (sai->ai_canonname, hp->h_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
*res = sai;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
freeaddrinfo (struct addrinfo *ai)
|
|
||||||
{
|
|
||||||
struct addrinfo *next;
|
|
||||||
|
|
||||||
while (ai != NULL) {
|
|
||||||
next = ai->ai_next;
|
|
||||||
if (ai->ai_canonname != NULL)
|
|
||||||
free (ai->ai_canonname);
|
|
||||||
if (ai->ai_addr != NULL)
|
|
||||||
free (ai->ai_addr);
|
|
||||||
free (ai);
|
|
||||||
ai = next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
gai_strerror (int ecode)
|
|
||||||
{
|
|
||||||
static const char *eai_descr[] = {
|
|
||||||
"no error",
|
|
||||||
"address family for nodename not supported", /* EAI_ADDRFAMILY */
|
|
||||||
"temporary failure in name resolution", /* EAI_AGAIN */
|
|
||||||
"invalid value for ai_flags", /* EAI_BADFLAGS */
|
|
||||||
"non-recoverable failure in name resolution", /* EAI_FAIL */
|
|
||||||
"ai_family not supported", /* EAI_FAMILY */
|
|
||||||
"memory allocation failure", /* EAI_MEMORY */
|
|
||||||
"no address associated with nodename", /* EAI_NODATA */
|
|
||||||
"nodename nor servname provided, or not known", /* EAI_NONAME */
|
|
||||||
"servname not supported for ai_socktype", /* EAI_SERVICE */
|
|
||||||
"ai_socktype not supported", /* EAI_SOCKTYPE */
|
|
||||||
"system error returned in errno", /* EAI_SYSTEM */
|
|
||||||
"argument buffer overflow", /* EAI_OVERFLOW */
|
|
||||||
};
|
|
||||||
|
|
||||||
if (ecode < 0 || ecode > (int) (sizeof eai_descr/ sizeof eai_descr[0]))
|
|
||||||
return "unknown error";
|
|
||||||
return eai_descr[ecode];
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* HAVE_GETADDRINFO */
|
|
|
@ -1,101 +0,0 @@
|
||||||
#ifndef _getaddrinfo_h
|
|
||||||
#define _getaddrinfo_h
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Shamelessly duplicated from the fetchmail public sources
|
|
||||||
* for use by the Squid Project under GNU Public License.
|
|
||||||
*
|
|
||||||
* Update/Maintenance History:
|
|
||||||
*
|
|
||||||
* 15-Aug-2007 : Copied from fetchmail 6.3.8
|
|
||||||
* - added protection around libray headers
|
|
||||||
*
|
|
||||||
* 16-Aug-2007 : Altered configure checks
|
|
||||||
* Un-hacked slightly to use system gethostbyname()
|
|
||||||
*
|
|
||||||
* Original License and code follows.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of libESMTP, a library for submission of RFC 2822
|
|
||||||
* formatted electronic mail messages using the SMTP protocol described
|
|
||||||
* in RFC 2821.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2001,2002 Brian Stafford <brian@stafford.uklinux.net>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 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
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Structure and prototypes taken from RFC 2553 */
|
|
||||||
|
|
||||||
/* SG 23/09/2007:
|
|
||||||
On Windows the following definitions are already available, may be that
|
|
||||||
this could be needed on some other platform */
|
|
||||||
typedef int socklen_t;
|
|
||||||
|
|
||||||
struct addrinfo {
|
|
||||||
int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
|
|
||||||
int ai_family; /* PF_xxx */
|
|
||||||
int ai_socktype; /* SOCK_xxx */
|
|
||||||
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
|
|
||||||
socklen_t ai_addrlen; /* length of ai_addr */
|
|
||||||
char *ai_canonname; /* canonical name for nodename */
|
|
||||||
struct sockaddr *ai_addr; /* binary address */
|
|
||||||
struct addrinfo *ai_next; /* next structure in linked list */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Supposed to be defined in <netdb.h> */
|
|
||||||
#define AI_ADDRCONFIG 0
|
|
||||||
#define AI_PASSIVE 1 /* Socket address is intended for `bind'. */
|
|
||||||
#define AI_CANONNAME 2 /* Request for canonical name. */
|
|
||||||
#define AI_NUMERICHOST 4 /* Don't use name resolution. */
|
|
||||||
|
|
||||||
/* Supposed to be defined in <netdb.h> */
|
|
||||||
#define EAI_ADDRFAMILY 1 /* address family for nodename not supported */
|
|
||||||
#define EAI_AGAIN 2 /* temporary failure in name resolution */
|
|
||||||
#define EAI_BADFLAGS 3 /* invalid value for ai_flags */
|
|
||||||
#define EAI_FAIL 4 /* non-recoverable failure in name resolution */
|
|
||||||
#define EAI_FAMILY 5 /* ai_family not supported */
|
|
||||||
#define EAI_MEMORY 6 /* memory allocation failure */
|
|
||||||
#define EAI_NODATA 7 /* no address associated with nodename */
|
|
||||||
#define EAI_NONAME 8 /* nodename nor servname provided, or not known */
|
|
||||||
#define EAI_SERVICE 9 /* servname not supported for ai_socktype */
|
|
||||||
#define EAI_SOCKTYPE 10 /* ai_socktype not supported */
|
|
||||||
|
|
||||||
#ifndef EAI_SYSTEM
|
|
||||||
/* Not defined on mingw32. */
|
|
||||||
#define EAI_SYSTEM 11 /* System error returned in `errno'. */
|
|
||||||
#endif
|
|
||||||
#ifndef EAI_OVERFLOW
|
|
||||||
/* Not defined on mingw32. */
|
|
||||||
#define EAI_OVERFLOW 12 /* Argument buffer overflow. */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/* RFC 2553 / Posix resolver */
|
|
||||||
int getaddrinfo (const char *nodename, const char *servname,
|
|
||||||
const struct addrinfo *hints, struct addrinfo **res);
|
|
||||||
/* Free addrinfo structure and associated storage */
|
|
||||||
void freeaddrinfo (struct addrinfo *ai);
|
|
||||||
|
|
||||||
/* Convert error return from getaddrinfo() to string */
|
|
||||||
const char *gai_strerror (int code);
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _getaddrinfo_h */
|
|
|
@ -1,367 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
* 3. Neither the name of the project nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Issues to be discussed:
|
|
||||||
* - RFC2553 says that we should raise error on short buffer. X/Open says
|
|
||||||
* we need to truncate the result. We obey RFC2553 (and X/Open should be
|
|
||||||
* modified). ipngwg rough consensus seems to follow RFC2553. RFC3493 says
|
|
||||||
* nothing about it, but defines a new error code EAI_OVERFLOW which seems
|
|
||||||
* to be intended the code for this case.
|
|
||||||
* - What is "local" in NI_NOFQDN? (see comments in the code)
|
|
||||||
* - NI_NAMEREQD and NI_NUMERICHOST conflict with each other.
|
|
||||||
* - (KAME extension) always attach textual scopeid (fe80::1%lo0), if
|
|
||||||
* sin6_scope_id is filled - standardization status?
|
|
||||||
* - what should we do if we should do getservbyport("sctp")?
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Considerations about thread-safeness
|
|
||||||
* The code in this file is thread-safe, and so the thread-safeness of
|
|
||||||
* getnameinfo() depends on the property of backend functions.
|
|
||||||
* - getservbyport() is not thread safe for most systems we are targeting.
|
|
||||||
* - getipnodebyaddr() is thread safe. However, many resolver libraries
|
|
||||||
* used in the function are not thread safe.
|
|
||||||
* - gethostbyaddr() is usually not thread safe.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !HAVE_GETNAMEINFO
|
|
||||||
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <arpa/nameser.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <resolv.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include "getaddrinfo.h"
|
|
||||||
#include "getnameinfo.h"
|
|
||||||
|
|
||||||
static const struct afd {
|
|
||||||
int a_af;
|
|
||||||
int a_addrlen;
|
|
||||||
int a_socklen;
|
|
||||||
int a_off;
|
|
||||||
int a_portoff;
|
|
||||||
} afdl [] = {
|
|
||||||
#if INET6
|
|
||||||
{PF_INET6, sizeof(struct in6_addr), sizeof(struct sockaddr_in6),
|
|
||||||
offsetof(struct sockaddr_in6, sin6_addr),
|
|
||||||
offsetof(struct sockaddr_in6, sin6_port)},
|
|
||||||
#endif
|
|
||||||
{PF_INET, sizeof(struct in_addr), sizeof(struct sockaddr_in),
|
|
||||||
offsetof(struct sockaddr_in, sin_addr),
|
|
||||||
offsetof(struct sockaddr_in, sin_port)},
|
|
||||||
{0, 0, 0, 0, 0},
|
|
||||||
};
|
|
||||||
|
|
||||||
#if INET6
|
|
||||||
static int ip6_parsenumeric __P((const struct sockaddr *, const char *, char *,
|
|
||||||
size_t, int));
|
|
||||||
static int ip6_sa2str __P((const struct sockaddr_in6 *, char *, size_t, int));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
|
||||||
getnameinfo(sa, salen, host, hostlen, serv, servlen, flags)
|
|
||||||
const struct sockaddr *sa;
|
|
||||||
socklen_t salen;
|
|
||||||
char *host;
|
|
||||||
size_t hostlen;
|
|
||||||
char *serv;
|
|
||||||
size_t servlen;
|
|
||||||
int flags;
|
|
||||||
{
|
|
||||||
const struct afd *afd;
|
|
||||||
struct servent *sp;
|
|
||||||
struct hostent *hp;
|
|
||||||
unsigned short port;
|
|
||||||
int family, i;
|
|
||||||
const char *addr;
|
|
||||||
uint32_t v4a;
|
|
||||||
char numserv[512];
|
|
||||||
|
|
||||||
if (sa == NULL)
|
|
||||||
return EAI_FAIL;
|
|
||||||
|
|
||||||
#if HAVE_SA_LEN /*XXX*/
|
|
||||||
if (sa->sa_len != salen)
|
|
||||||
return EAI_FAIL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
family = sa->sa_family;
|
|
||||||
for (i = 0; afdl[i].a_af; i++)
|
|
||||||
if (afdl[i].a_af == family) {
|
|
||||||
afd = &afdl[i];
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
return EAI_FAMILY;
|
|
||||||
|
|
||||||
found:
|
|
||||||
if (salen != afd->a_socklen)
|
|
||||||
return EAI_FAIL;
|
|
||||||
|
|
||||||
/* network byte order */
|
|
||||||
memcpy(&port, (const char *)sa + afd->a_portoff, sizeof(port));
|
|
||||||
addr = (const char *)sa + afd->a_off;
|
|
||||||
|
|
||||||
if (serv == NULL || servlen == 0) {
|
|
||||||
/*
|
|
||||||
* do nothing in this case.
|
|
||||||
* in case you are wondering if "&&" is more correct than
|
|
||||||
* "||" here: RFC3493 says that serv == NULL OR servlen == 0
|
|
||||||
* means that the caller does not want the result.
|
|
||||||
*/
|
|
||||||
} else {
|
|
||||||
if (flags & NI_NUMERICSERV)
|
|
||||||
sp = NULL;
|
|
||||||
else {
|
|
||||||
sp = getservbyport(port,
|
|
||||||
(flags & NI_DGRAM) ? "udp" : "tcp");
|
|
||||||
}
|
|
||||||
if (sp) {
|
|
||||||
if (strlen(sp->s_name) + 1 > servlen)
|
|
||||||
return EAI_OVERFLOW;
|
|
||||||
strncpy(serv, sp->s_name, servlen);
|
|
||||||
} else {
|
|
||||||
snprintf(numserv, sizeof(numserv), "%u", ntohs(port));
|
|
||||||
if (strlen(numserv) + 1 > servlen)
|
|
||||||
return EAI_OVERFLOW;
|
|
||||||
strncpy(serv, numserv, servlen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (sa->sa_family) {
|
|
||||||
case AF_INET:
|
|
||||||
v4a = (uint32_t)
|
|
||||||
ntohl(((const struct sockaddr_in *)sa)->sin_addr.s_addr);
|
|
||||||
if (IN_MULTICAST(v4a) || IN_EXPERIMENTAL(v4a))
|
|
||||||
flags |= NI_NUMERICHOST;
|
|
||||||
v4a >>= IN_CLASSA_NSHIFT;
|
|
||||||
if (v4a == 0)
|
|
||||||
flags |= NI_NUMERICHOST;
|
|
||||||
break;
|
|
||||||
#if INET6
|
|
||||||
case AF_INET6: {
|
|
||||||
const struct sockaddr_in6 *sin6;
|
|
||||||
sin6 = (const struct sockaddr_in6 *)sa;
|
|
||||||
switch (sin6->sin6_addr.s6_addr[0]) {
|
|
||||||
case 0x00:
|
|
||||||
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
|
|
||||||
;
|
|
||||||
else if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))
|
|
||||||
;
|
|
||||||
else
|
|
||||||
flags |= NI_NUMERICHOST;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
|
|
||||||
flags |= NI_NUMERICHOST;
|
|
||||||
else if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
|
|
||||||
flags |= NI_NUMERICHOST;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (host == NULL || hostlen == 0) {
|
|
||||||
/*
|
|
||||||
* do nothing in this case.
|
|
||||||
* in case you are wondering if "&&" is more correct than
|
|
||||||
* "||" here: RFC3493 says that host == NULL or hostlen == 0
|
|
||||||
* means that the caller does not want the result.
|
|
||||||
*/
|
|
||||||
} else if (flags & NI_NUMERICHOST) {
|
|
||||||
/* NUMERICHOST and NAMEREQD conflicts with each other */
|
|
||||||
if (flags & NI_NAMEREQD)
|
|
||||||
return EAI_NONAME;
|
|
||||||
|
|
||||||
goto numeric;
|
|
||||||
} else {
|
|
||||||
#if USE_GETIPNODEBY
|
|
||||||
int h_error = 0;
|
|
||||||
hp = getipnodebyaddr(addr, afd->a_addrlen, afd->a_af, &h_error);
|
|
||||||
#else
|
|
||||||
hp = gethostbyaddr(addr, afd->a_addrlen, afd->a_af);
|
|
||||||
#if 0 // getnameinfo.c:161:9: error: variable 'h_error' set but not used
|
|
||||||
#if HAVE_H_ERRNO
|
|
||||||
h_error = h_errno;
|
|
||||||
#else
|
|
||||||
h_error = EINVAL;
|
|
||||||
#endif
|
|
||||||
#endif /* 0 */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (hp) {
|
|
||||||
#if 0
|
|
||||||
if (flags & NI_NOFQDN) {
|
|
||||||
/*
|
|
||||||
* According to RFC3493 section 6.2, NI_NOFQDN
|
|
||||||
* means "node name portion of the FQDN shall
|
|
||||||
* be returned for local hosts." The following
|
|
||||||
* code tries to implement it by returning the
|
|
||||||
* first label (the part before the first
|
|
||||||
* period) of the FQDN. However, it is not
|
|
||||||
* clear if this always makes sense, since the
|
|
||||||
* given address may be outside of "local
|
|
||||||
* hosts." Due to the unclear description, we
|
|
||||||
* disable the code in this implementation.
|
|
||||||
*/
|
|
||||||
char *p;
|
|
||||||
p = strchr(hp->h_name, '.');
|
|
||||||
if (p)
|
|
||||||
*p = '\0';
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (strlen(hp->h_name) + 1 > hostlen) {
|
|
||||||
#if USE_GETIPNODEBY
|
|
||||||
freehostent(hp);
|
|
||||||
#endif
|
|
||||||
return EAI_OVERFLOW;
|
|
||||||
}
|
|
||||||
strncpy(host, hp->h_name, hostlen);
|
|
||||||
#if USE_GETIPNODEBY
|
|
||||||
freehostent(hp);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
if (flags & NI_NAMEREQD)
|
|
||||||
return EAI_NONAME;
|
|
||||||
|
|
||||||
numeric:
|
|
||||||
switch (afd->a_af) {
|
|
||||||
#if INET6
|
|
||||||
case AF_INET6: {
|
|
||||||
int error;
|
|
||||||
|
|
||||||
if ((error = ip6_parsenumeric(sa, addr, host,
|
|
||||||
hostlen,
|
|
||||||
flags)) != 0)
|
|
||||||
return(error);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
if (inet_ntop(afd->a_af, addr, host,
|
|
||||||
hostlen) == NULL)
|
|
||||||
return EAI_SYSTEM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if INET6
|
|
||||||
static int
|
|
||||||
ip6_parsenumeric(sa, addr, host, hostlen, flags)
|
|
||||||
const struct sockaddr *sa;
|
|
||||||
const char *addr;
|
|
||||||
char *host;
|
|
||||||
size_t hostlen;
|
|
||||||
int flags;
|
|
||||||
{
|
|
||||||
int numaddrlen;
|
|
||||||
char numaddr[512];
|
|
||||||
|
|
||||||
if (inet_ntop(AF_INET6, addr, numaddr, sizeof(numaddr)) == NULL)
|
|
||||||
return EAI_SYSTEM;
|
|
||||||
|
|
||||||
numaddrlen = strlen(numaddr);
|
|
||||||
if (numaddrlen + 1 > hostlen) /* don't forget terminator */
|
|
||||||
return EAI_OVERFLOW;
|
|
||||||
strncpy(host, numaddr, hostlen);
|
|
||||||
|
|
||||||
if (((const struct sockaddr_in6 *)sa)->sin6_scope_id) {
|
|
||||||
char zonebuf[SQUIDHOSTNAMELEN];
|
|
||||||
int zonelen;
|
|
||||||
|
|
||||||
zonelen = ip6_sa2str(
|
|
||||||
(const struct sockaddr_in6 *)(const void *)sa,
|
|
||||||
zonebuf, sizeof(zonebuf), flags);
|
|
||||||
if (zonelen < 0)
|
|
||||||
return EAI_OVERFLOW;
|
|
||||||
if (zonelen + 1 + numaddrlen + 1 > hostlen)
|
|
||||||
return EAI_OVERFLOW;
|
|
||||||
|
|
||||||
/* construct <numeric-addr><delim><zoneid> */
|
|
||||||
memcpy(host + numaddrlen + 1, zonebuf,
|
|
||||||
(size_t)zonelen);
|
|
||||||
host[numaddrlen] = SCOPE_DELIMITER;
|
|
||||||
host[numaddrlen + 1 + zonelen] = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ARGSUSED */
|
|
||||||
static int
|
|
||||||
ip6_sa2str(sa6, buf, bufsiz, flags)
|
|
||||||
const struct sockaddr_in6 *sa6;
|
|
||||||
char *buf;
|
|
||||||
size_t bufsiz;
|
|
||||||
int flags;
|
|
||||||
{
|
|
||||||
unsigned int ifindex;
|
|
||||||
const struct in6_addr *a6;
|
|
||||||
int n;
|
|
||||||
|
|
||||||
ifindex = (unsigned int)sa6->sin6_scope_id;
|
|
||||||
a6 = &sa6->sin6_addr;
|
|
||||||
|
|
||||||
#if NI_NUMERICSCOPE
|
|
||||||
if ((flags & NI_NUMERICSCOPE) != 0) {
|
|
||||||
n = snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id);
|
|
||||||
if (n < 0 || n >= bufsiz)
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* if_indextoname() does not take buffer size. not a good api... */
|
|
||||||
if ((IN6_IS_ADDR_LINKLOCAL(a6) || IN6_IS_ADDR_MC_LINKLOCAL(a6) ||
|
|
||||||
IN6_IS_ADDR_MC_NODELOCAL(a6)) && bufsiz >= IF_NAMESIZE) {
|
|
||||||
char *p = if_indextoname(ifindex, buf);
|
|
||||||
if (p)
|
|
||||||
return (strlen(p));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* last resort */
|
|
||||||
n = snprintf(buf, bufsiz, "%u", sa6->sin6_scope_id);
|
|
||||||
if (n < 0 || n >= bufsiz)
|
|
||||||
return -1;
|
|
||||||
else
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
#endif /* INET6 */
|
|
||||||
#endif
|
|
|
@ -1,29 +0,0 @@
|
||||||
#ifndef _getnameinfo_h
|
|
||||||
#define _getnameinfo_h
|
|
||||||
/*
|
|
||||||
* Reconstructed from KAME getnameinfo.c (in lib/)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* getnameinfo flags */
|
|
||||||
#define NI_NOFQDN 0x0001
|
|
||||||
#define NI_NUMERICHOST 0x0002 /* return numeric form of address */
|
|
||||||
#define NI_NAMEREQD 0x0004 /* request DNS name */
|
|
||||||
#define NI_NUMERICSERV 0x0008
|
|
||||||
#define NI_DGRAM 0x0010
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
/* RFC 2553 / Posix resolver */
|
|
||||||
int getnameinfo(const struct sockaddr *sa,
|
|
||||||
socklen_t salen,
|
|
||||||
char *host,
|
|
||||||
size_t hostlen,
|
|
||||||
char *serv,
|
|
||||||
size_t servlen,
|
|
||||||
int flags );
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _getnameinfo_h */
|
|
|
@ -32,13 +32,6 @@ uint64 ottd_rdtsc()
|
||||||
#define RDTSC_AVAILABLE
|
#define RDTSC_AVAILABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* rdtsc for OS/2. Hopefully this works, who knows */
|
|
||||||
#if defined (__WATCOMC__) && !defined(RDTSC_AVAILABLE)
|
|
||||||
unsigned __int64 ottd_rdtsc();
|
|
||||||
# pragma aux ottd_rdtsc = 0x0F 0x31 value [edx eax] parm nomemory modify exact [edx eax] nomemory;
|
|
||||||
# define RDTSC_AVAILABLE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* rdtsc for all other *nix-en (hopefully). Use GCC syntax */
|
/* rdtsc for all other *nix-en (hopefully). Use GCC syntax */
|
||||||
#if (defined(__i386__) || defined(__x86_64__)) && !defined(RDTSC_AVAILABLE)
|
#if (defined(__i386__) || defined(__x86_64__)) && !defined(RDTSC_AVAILABLE)
|
||||||
uint64 ottd_rdtsc()
|
uint64 ottd_rdtsc()
|
||||||
|
|
|
@ -88,8 +88,6 @@ void CrashLog::LogCompiler(std::back_insert_iterator<std::string> &output_iterat
|
||||||
"ICC {}", __ICC
|
"ICC {}", __ICC
|
||||||
#elif defined(__GNUC__)
|
#elif defined(__GNUC__)
|
||||||
"GCC {}.{}.{}", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
|
"GCC {}.{}.{}", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
|
||||||
#elif defined(__WATCOMC__)
|
|
||||||
"WatcomC {}", __WATCOMC__
|
|
||||||
#else
|
#else
|
||||||
"<unknown>"
|
"<unknown>"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -347,8 +347,6 @@ void FioCreateDirectory(const std::string &name)
|
||||||
* of the time they are 'directory already exists' errors anyhow. */
|
* of the time they are 'directory already exists' errors anyhow. */
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
CreateDirectory(OTTD2FS(name).c_str(), nullptr);
|
CreateDirectory(OTTD2FS(name).c_str(), nullptr);
|
||||||
#elif defined(OS2) && !defined(__INNOTEK_LIBC__)
|
|
||||||
mkdir(OTTD2FS(name).c_str());
|
|
||||||
#else
|
#else
|
||||||
mkdir(OTTD2FS(name).c_str(), 0755);
|
mkdir(OTTD2FS(name).c_str(), 0755);
|
||||||
#endif
|
#endif
|
||||||
|
@ -724,7 +722,7 @@ bool ExtractTar(const std::string &tar_filename, Subdirectory subdir)
|
||||||
/**
|
/**
|
||||||
* Determine the base (personal dir and game data dir) paths
|
* Determine the base (personal dir and game data dir) paths
|
||||||
* @param exe the path from the current path to the executable
|
* @param exe the path from the current path to the executable
|
||||||
* @note defined in the OS related files (os2.cpp, win32.cpp, unix.cpp etc)
|
* @note defined in the OS related files (win32.cpp, unix.cpp etc)
|
||||||
*/
|
*/
|
||||||
extern void DetermineBasePaths(const char *exe);
|
extern void DetermineBasePaths(const char *exe);
|
||||||
#else /* defined(_WIN32) */
|
#else /* defined(_WIN32) */
|
||||||
|
@ -846,7 +844,7 @@ void DetermineBasePaths(const char *exe)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(OS2) || !defined(WITH_PERSONAL_DIR)
|
#if !defined(WITH_PERSONAL_DIR)
|
||||||
_searchpaths[SP_PERSONAL_DIR].clear();
|
_searchpaths[SP_PERSONAL_DIR].clear();
|
||||||
#else
|
#else
|
||||||
if (!homedir.empty()) {
|
if (!homedir.empty()) {
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
static std::string *_fios_path = nullptr;
|
static std::string *_fios_path = nullptr;
|
||||||
SortingBits _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING;
|
SortingBits _savegame_sort_order = SORT_BY_DATE | SORT_DESCENDING;
|
||||||
|
|
||||||
/* OS-specific functions are taken from their respective files (win32/unix/os2 .c) */
|
/* OS-specific functions are taken from their respective files (win32/unix .c) */
|
||||||
extern bool FiosIsRoot(const std::string &path);
|
extern bool FiosIsRoot(const std::string &path);
|
||||||
extern bool FiosIsValidFile(const std::string &path, const struct dirent *ent, struct stat *sb);
|
extern bool FiosIsValidFile(const std::string &path, const struct dirent *ent, struct stat *sb);
|
||||||
extern bool FiosIsHiddenFile(const struct dirent *ent);
|
extern bool FiosIsHiddenFile(const struct dirent *ent);
|
||||||
|
@ -143,7 +143,7 @@ bool FiosBrowseTo(const FiosItem *item)
|
||||||
{
|
{
|
||||||
switch (item->type) {
|
switch (item->type) {
|
||||||
case FIOS_TYPE_DRIVE:
|
case FIOS_TYPE_DRIVE:
|
||||||
#if defined(_WIN32) || defined(__OS2__)
|
#if defined(_WIN32)
|
||||||
assert(_fios_path != nullptr);
|
assert(_fios_path != nullptr);
|
||||||
*_fios_path = std::string{ item->title, 0, 1 } + ":" PATHSEP;
|
*_fios_path = std::string{ item->title, 0, 1 } + ":" PATHSEP;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -36,12 +36,6 @@ if(NOT OPTION_DEDICATED)
|
||||||
bemidi.h
|
bemidi.h
|
||||||
CONDITION HAIKU
|
CONDITION HAIKU
|
||||||
)
|
)
|
||||||
|
|
||||||
add_files(
|
|
||||||
os2_m.cpp
|
|
||||||
os2_m.h
|
|
||||||
CONDITION OPTION_OS2
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_files(
|
add_files(
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD 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 General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file os2_m.cpp Music playback on OS/2. */
|
|
||||||
|
|
||||||
#include "../stdafx.h"
|
|
||||||
#include "../openttd.h"
|
|
||||||
#include "os2_m.h"
|
|
||||||
#include "midifile.hpp"
|
|
||||||
#include "../base_media_base.h"
|
|
||||||
#include "../3rdparty/fmt/format.h"
|
|
||||||
|
|
||||||
#define INCL_DOS
|
|
||||||
#define INCL_OS2MM
|
|
||||||
#define INCL_WIN
|
|
||||||
|
|
||||||
#include <os2.h>
|
|
||||||
#include <os2me.h>
|
|
||||||
|
|
||||||
#include "../safeguards.h"
|
|
||||||
|
|
||||||
/**********************
|
|
||||||
* OS/2 MIDI PLAYER
|
|
||||||
**********************/
|
|
||||||
|
|
||||||
/* Interesting how similar the MCI API in OS/2 is to the Win32 MCI API,
|
|
||||||
* eh? Anyone would think they both came from the same place originally! ;)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a midi command.
|
|
||||||
* @param cmd The command to send.
|
|
||||||
* @return The result of sending it.
|
|
||||||
*/
|
|
||||||
static long CDECL MidiSendCommand(const std::string_view cmd)
|
|
||||||
{
|
|
||||||
return mciSendString(cmd.data(), nullptr, 0, nullptr, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** OS/2's music player's factory. */
|
|
||||||
static FMusicDriver_OS2 iFMusicDriver_OS2;
|
|
||||||
|
|
||||||
void MusicDriver_OS2::PlaySong(const MusicSongInfo &song)
|
|
||||||
{
|
|
||||||
std::string filename = MidiFile::GetSMFFile(song);
|
|
||||||
|
|
||||||
MidiSendCommand("close all");
|
|
||||||
if (filename.empty()) return;
|
|
||||||
|
|
||||||
if (MidiSendCommand(fmt::format("open {} type sequencer alias song", filename)) != 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
MidiSendCommand("play song from 0");
|
|
||||||
}
|
|
||||||
|
|
||||||
void MusicDriver_OS2::StopSong()
|
|
||||||
{
|
|
||||||
MidiSendCommand("close all");
|
|
||||||
}
|
|
||||||
|
|
||||||
void MusicDriver_OS2::SetVolume(byte vol)
|
|
||||||
{
|
|
||||||
MidiSendCommand("set song audio volume %d", ((vol/127)*100));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MusicDriver_OS2::IsSongPlaying()
|
|
||||||
{
|
|
||||||
char buf[16];
|
|
||||||
mciSendString("status song mode", buf, sizeof(buf), nullptr, 0);
|
|
||||||
return strcmp(buf, "playing") == 0 || strcmp(buf, "seeking") == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *MusicDriver_OS2::Start(const StringList &parm)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MusicDriver_OS2::Stop()
|
|
||||||
{
|
|
||||||
MidiSendCommand("close all");
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD 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 General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file os2_m.h Base for OS2 music playback. */
|
|
||||||
|
|
||||||
#ifndef MUSIC_OS2_H
|
|
||||||
#define MUSIC_OS2_H
|
|
||||||
|
|
||||||
#include "music_driver.hpp"
|
|
||||||
|
|
||||||
/** OS/2's music player. */
|
|
||||||
class MusicDriver_OS2 : public MusicDriver {
|
|
||||||
public:
|
|
||||||
const char *Start(const StringList ¶m) override;
|
|
||||||
|
|
||||||
void Stop() override;
|
|
||||||
|
|
||||||
void PlaySong(const MusicSongInfo &song) override;
|
|
||||||
|
|
||||||
void StopSong() override;
|
|
||||||
|
|
||||||
bool IsSongPlaying() override;
|
|
||||||
|
|
||||||
void SetVolume(byte vol) override;
|
|
||||||
const char *GetName() const override { return "os2"; }
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Factory for OS/2's music player. */
|
|
||||||
class FMusicDriver_OS2 : public DriverFactoryBase {
|
|
||||||
public:
|
|
||||||
FMusicDriver_OS2() : DriverFactoryBase(Driver::DT_MUSIC, 10, "os2", "OS/2 Music Driver") {}
|
|
||||||
Driver *CreateInstance() const override { return new MusicDriver_OS2(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* MUSIC_OS2_H */
|
|
|
@ -316,13 +316,11 @@ static SOCKET ListenLoopProc(addrinfo *runp)
|
||||||
Debug(net, 0, "Setting reuse-address mode failed: {}", NetworkError::GetLast().AsString());
|
Debug(net, 0, "Setting reuse-address mode failed: {}", NetworkError::GetLast().AsString());
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef __OS2__
|
|
||||||
int on = 1;
|
int on = 1;
|
||||||
if (runp->ai_family == AF_INET6 &&
|
if (runp->ai_family == AF_INET6 &&
|
||||||
setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&on, sizeof(on)) == -1) {
|
setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, (const char*)&on, sizeof(on)) == -1) {
|
||||||
Debug(net, 3, "Could not disable IPv4 over IPv6: {}", NetworkError::GetLast().AsString());
|
Debug(net, 3, "Could not disable IPv4 over IPv6: {}", NetworkError::GetLast().AsString());
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (bind(sock, runp->ai_addr, (int)runp->ai_addrlen) != 0) {
|
if (bind(sock, runp->ai_addr, (int)runp->ai_addrlen) != 0) {
|
||||||
Debug(net, 0, "Could not bind socket on {}: {}", address, NetworkError::GetLast().AsString());
|
Debug(net, 0, "Could not bind socket on {}: {}", address, NetworkError::GetLast().AsString());
|
||||||
|
|
|
@ -118,8 +118,6 @@ bool NetworkError::HasError() const
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
return NetworkError(WSAGetLastError());
|
return NetworkError(WSAGetLastError());
|
||||||
#elif defined(__OS2__)
|
|
||||||
return NetworkError(sock_errno());
|
|
||||||
#else
|
#else
|
||||||
return NetworkError(errno);
|
return NetworkError(errno);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -60,7 +60,7 @@ typedef unsigned long in_addr_t;
|
||||||
#endif /* _WIN32 */
|
#endif /* _WIN32 */
|
||||||
|
|
||||||
/* UNIX stuff */
|
/* UNIX stuff */
|
||||||
#if defined(UNIX) && !defined(__OS2__)
|
#if defined(UNIX)
|
||||||
# if defined(OPENBSD) || defined(__NetBSD__)
|
# if defined(OPENBSD) || defined(__NetBSD__)
|
||||||
# define AI_ADDRCONFIG 0
|
# define AI_ADDRCONFIG 0
|
||||||
# endif
|
# endif
|
||||||
|
@ -79,7 +79,7 @@ typedef unsigned long in_addr_t;
|
||||||
# include <arpa/inet.h>
|
# include <arpa/inet.h>
|
||||||
# include <net/if.h>
|
# include <net/if.h>
|
||||||
/* According to glibc/NEWS, <ifaddrs.h> appeared in glibc-2.3. */
|
/* According to glibc/NEWS, <ifaddrs.h> appeared in glibc-2.3. */
|
||||||
# if !defined(__sgi__) && !defined(SUNOS) && !defined(__INNOTEK_LIBC__) \
|
# if !defined(__sgi__) && !defined(SUNOS) \
|
||||||
&& !(defined(__GLIBC__) && (__GLIBC__ <= 2) && (__GLIBC_MINOR__ <= 2)) && !defined(__dietlibc__) && !defined(HPUX)
|
&& !(defined(__GLIBC__) && (__GLIBC__ <= 2) && (__GLIBC_MINOR__ <= 2)) && !defined(__dietlibc__) && !defined(HPUX)
|
||||||
/* If for any reason ifaddrs.h does not exist on your system, comment out
|
/* If for any reason ifaddrs.h does not exist on your system, comment out
|
||||||
* the following two lines and an alternative way will be used to fetch
|
* the following two lines and an alternative way will be used to fetch
|
||||||
|
@ -117,60 +117,6 @@ typedef unsigned long in_addr_t;
|
||||||
|
|
||||||
#endif /* UNIX */
|
#endif /* UNIX */
|
||||||
|
|
||||||
/* OS/2 stuff */
|
|
||||||
#if defined(__OS2__)
|
|
||||||
# define SOCKET int
|
|
||||||
# define INVALID_SOCKET -1
|
|
||||||
# define closesocket close
|
|
||||||
|
|
||||||
/* Includes needed for OS/2 systems */
|
|
||||||
# include <types.h>
|
|
||||||
# include <unistd.h>
|
|
||||||
# include <sys/ioctl.h>
|
|
||||||
# include <sys/socket.h>
|
|
||||||
# include <netinet/in.h>
|
|
||||||
# include <netinet/tcp.h>
|
|
||||||
# include <arpa/inet.h>
|
|
||||||
# include <net/if.h>
|
|
||||||
# include <errno.h>
|
|
||||||
# include <sys/time.h>
|
|
||||||
# include <netdb.h>
|
|
||||||
# include <nerrno.h>
|
|
||||||
# define INADDR_NONE 0xffffffff
|
|
||||||
# include "../../3rdparty/os2/getaddrinfo.h"
|
|
||||||
# include "../../3rdparty/os2/getnameinfo.h"
|
|
||||||
|
|
||||||
#define IPV6_V6ONLY 27
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IPv6 address
|
|
||||||
*/
|
|
||||||
struct in6_addr {
|
|
||||||
union {
|
|
||||||
uint8_t __u6_addr8[16];
|
|
||||||
uint16_t __u6_addr16[8];
|
|
||||||
uint32_t __u6_addr32[4];
|
|
||||||
} __u6_addr; /* 128-bit IP6 address */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define s6_addr __u6_addr.__u6_addr8
|
|
||||||
|
|
||||||
struct sockaddr_in6 {
|
|
||||||
uint8_t sin6_len; /* length of this struct */
|
|
||||||
sa_family_t sin6_family; /* AF_INET6 */
|
|
||||||
in_port_t sin6_port; /* Transport layer port # */
|
|
||||||
uint32_t sin6_flowinfo; /* IP6 flow information */
|
|
||||||
struct in6_addr sin6_addr; /* IP6 address */
|
|
||||||
uint32_t sin6_scope_id; /* scope zone index */
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef int socklen_t;
|
|
||||||
#if !defined(__INNOTEK_LIBC__)
|
|
||||||
typedef unsigned long in_addr_t;
|
|
||||||
#endif /* __INNOTEK_LIBC__ */
|
|
||||||
|
|
||||||
#endif /* OS/2 */
|
|
||||||
|
|
||||||
#ifdef __EMSCRIPTEN__
|
#ifdef __EMSCRIPTEN__
|
||||||
/**
|
/**
|
||||||
* Emscripten doesn't set 'addrlen' for accept(), getsockname(), getpeername()
|
* Emscripten doesn't set 'addrlen' for accept(), getsockname(), getpeername()
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
add_subdirectory(macosx)
|
add_subdirectory(macosx)
|
||||||
add_subdirectory(os2)
|
|
||||||
add_subdirectory(unix)
|
add_subdirectory(unix)
|
||||||
add_subdirectory(windows)
|
add_subdirectory(windows)
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
add_files(
|
|
||||||
os2.cpp
|
|
||||||
CONDITION OPTION_OS2
|
|
||||||
)
|
|
||||||
|
|
||||||
if(OPTION_OS2)
|
|
||||||
target_sources(openttd PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/os2_main.cpp)
|
|
||||||
endif()
|
|
|
@ -1,187 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD 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 General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file os2.cpp OS2 related OS support. */
|
|
||||||
|
|
||||||
#include "../../stdafx.h"
|
|
||||||
#include "../../openttd.h"
|
|
||||||
#include "../../gui.h"
|
|
||||||
#include "../../fileio_func.h"
|
|
||||||
#include "../../fios.h"
|
|
||||||
#include "../../string_func.h"
|
|
||||||
#include "../../textbuf_gui.h"
|
|
||||||
#include "../../thread.h"
|
|
||||||
|
|
||||||
#include "table/strings.h"
|
|
||||||
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <time.h>
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
# include <dos.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "../../safeguards.h"
|
|
||||||
|
|
||||||
#define INCL_WIN
|
|
||||||
#define INCL_WINCLIPBOARD
|
|
||||||
|
|
||||||
#include <os2.h>
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
# include <i86.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool FiosIsRoot(const std::string &file)
|
|
||||||
{
|
|
||||||
return file.size() == 3; // C:\...
|
|
||||||
}
|
|
||||||
|
|
||||||
void FiosGetDrives(FileList &file_list)
|
|
||||||
{
|
|
||||||
uint disk, disk2, save, total;
|
|
||||||
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
_dos_getdrive(&save); // save original drive
|
|
||||||
#else
|
|
||||||
save = _getdrive(); // save original drive
|
|
||||||
char wd[MAX_PATH];
|
|
||||||
getcwd(wd, MAX_PATH);
|
|
||||||
total = 'z';
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* get an available drive letter */
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
for (disk = 1;; disk++) {
|
|
||||||
_dos_setdrive(disk, &total);
|
|
||||||
#else
|
|
||||||
for (disk = 'A';; disk++) {
|
|
||||||
_chdrive(disk);
|
|
||||||
#endif
|
|
||||||
if (disk >= total) break;
|
|
||||||
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
_dos_getdrive(&disk2);
|
|
||||||
#else
|
|
||||||
disk2 = _getdrive();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (disk == disk2) {
|
|
||||||
FiosItem *fios = file_list.Append();
|
|
||||||
fios->type = FIOS_TYPE_DRIVE;
|
|
||||||
fios->mtime = 0;
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
fios->name += 'A' + disk - 1;
|
|
||||||
#else
|
|
||||||
fios->name += (char)disk;
|
|
||||||
#endif
|
|
||||||
fios->name += ':';
|
|
||||||
fios->title = fios->name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Restore the original drive */
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
_dos_setdrive(save, &total);
|
|
||||||
#else
|
|
||||||
chdir(wd);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<uint64_t> FiosGetDiskFreeSpace(const std::string &path)
|
|
||||||
{
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
struct diskfree_t free;
|
|
||||||
char drive = path[0] - 'A' + 1;
|
|
||||||
|
|
||||||
if (_getdiskfree(drive, &free) == 0) {
|
|
||||||
return free.avail_clusters * free.sectors_per_cluster * free.bytes_per_sector;
|
|
||||||
}
|
|
||||||
#elif defined(HAS_STATVFS)
|
|
||||||
struct statvfs s;
|
|
||||||
|
|
||||||
if (statvfs(path.c_str(), &s) == 0) return static_cast<uint64_t>(s.f_frsize) * s.f_bavail;
|
|
||||||
#endif
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FiosIsValidFile(const std::string &path, const struct dirent *ent, struct stat *sb)
|
|
||||||
{
|
|
||||||
std::string filename = fmt::format("{}" PATHSEP "{}", path, ent->d_name);
|
|
||||||
return stat(filename.c_str(), sb) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FiosIsHiddenFile(const struct dirent *ent)
|
|
||||||
{
|
|
||||||
return ent->d_name[0] == '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShowInfoI(const std::string &str)
|
|
||||||
{
|
|
||||||
HAB hab;
|
|
||||||
HMQ hmq;
|
|
||||||
ULONG rc;
|
|
||||||
|
|
||||||
/* init PM env. */
|
|
||||||
hmq = WinCreateMsgQueue((hab = WinInitialize(0)), 0);
|
|
||||||
|
|
||||||
/* display the box */
|
|
||||||
rc = WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, (const unsigned char *)str.c_str(), (const unsigned char *)"OpenTTD", 0, MB_OK | MB_MOVEABLE | MB_INFORMATION);
|
|
||||||
|
|
||||||
/* terminate PM env. */
|
|
||||||
WinDestroyMsgQueue(hmq);
|
|
||||||
WinTerminate(hab);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShowOSErrorBox(const char *buf, bool system)
|
|
||||||
{
|
|
||||||
HAB hab;
|
|
||||||
HMQ hmq;
|
|
||||||
ULONG rc;
|
|
||||||
|
|
||||||
/* init PM env. */
|
|
||||||
hmq = WinCreateMsgQueue((hab = WinInitialize(0)), 0);
|
|
||||||
|
|
||||||
/* display the box */
|
|
||||||
rc = WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, (const unsigned char *)buf, (const unsigned char *)"OpenTTD", 0, MB_OK | MB_MOVEABLE | MB_ERROR);
|
|
||||||
|
|
||||||
/* terminate PM env. */
|
|
||||||
WinDestroyMsgQueue(hmq);
|
|
||||||
WinTerminate(hab);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<std::string> GetClipboardContents()
|
|
||||||
{
|
|
||||||
/* XXX -- Currently no clipboard support implemented with GCC */
|
|
||||||
#ifndef __INNOTEK_LIBC__
|
|
||||||
HAB hab = 0;
|
|
||||||
|
|
||||||
if (WinOpenClipbrd(hab)) {
|
|
||||||
const char *text = (const char *)WinQueryClipbrdData(hab, CF_TEXT);
|
|
||||||
|
|
||||||
if (text != nullptr) {
|
|
||||||
std::string result = text;
|
|
||||||
WinCloseClipbrd(hab);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
WinCloseClipbrd(hab);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void OSOpenBrowser(const char *url)
|
|
||||||
{
|
|
||||||
// stub only
|
|
||||||
Debug(misc, 0, "Failed to open url: {}", url);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetCurrentThreadName(const char *)
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD 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 General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file os2_main.cpp Main entry for OS/2. */
|
|
||||||
|
|
||||||
#include "../../stdafx.h"
|
|
||||||
#include "../../openttd.h"
|
|
||||||
#include "../../core/random_func.hpp"
|
|
||||||
#include "../../string_func.h"
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include "../../safeguards.h"
|
|
||||||
|
|
||||||
int CDECL main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
SetRandomSeed(time(nullptr));
|
|
||||||
|
|
||||||
/* Make sure our arguments contain only valid UTF-8 characters. */
|
|
||||||
for (int i = 0; i < argc; i++) StrMakeValidInPlace(argv[i]);
|
|
||||||
|
|
||||||
return openttd_main(argc, argv);
|
|
||||||
}
|
|
|
@ -1,12 +1,12 @@
|
||||||
add_files(
|
add_files(
|
||||||
crashlog_unix.cpp
|
crashlog_unix.cpp
|
||||||
survey_unix.cpp
|
survey_unix.cpp
|
||||||
CONDITION UNIX AND NOT APPLE AND NOT OPTION_OS2
|
CONDITION UNIX AND NOT APPLE
|
||||||
)
|
)
|
||||||
|
|
||||||
add_files(
|
add_files(
|
||||||
unix.cpp
|
unix.cpp
|
||||||
CONDITION UNIX AND NOT OPTION_OS2
|
CONDITION UNIX
|
||||||
)
|
)
|
||||||
|
|
||||||
add_files(
|
add_files(
|
||||||
|
@ -14,6 +14,6 @@ add_files(
|
||||||
CONDITION Fontconfig_FOUND
|
CONDITION Fontconfig_FOUND
|
||||||
)
|
)
|
||||||
|
|
||||||
if(UNIX AND NOT APPLE AND NOT OPTION_OS2)
|
if(UNIX AND NOT APPLE)
|
||||||
target_sources(openttd PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/unix_main.cpp)
|
target_sources(openttd PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/unix_main.cpp)
|
||||||
endif()
|
endif()
|
||||||
|
|
12
src/stdafx.h
12
src/stdafx.h
|
@ -121,14 +121,6 @@
|
||||||
# define NODISCARD [[nodiscard]]
|
# define NODISCARD [[nodiscard]]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__WATCOMC__)
|
|
||||||
# define NORETURN
|
|
||||||
# define CDECL
|
|
||||||
# define FINAL
|
|
||||||
# define FALLTHROUGH
|
|
||||||
# include <malloc.h>
|
|
||||||
#endif /* __WATCOMC__ */
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
# define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
# define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||||
#endif
|
#endif
|
||||||
|
@ -236,7 +228,7 @@
|
||||||
# endif /* _WIN32 or WITH_ICONV */
|
# endif /* _WIN32 or WITH_ICONV */
|
||||||
#endif /* STRGEN || SETTINGSGEN */
|
#endif /* STRGEN || SETTINGSGEN */
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(__OS2__) && !defined(__INNOTEK_LIBC__)
|
#if defined(_WIN32)
|
||||||
# define PATHSEP "\\"
|
# define PATHSEP "\\"
|
||||||
# define PATHSEPCHAR '\\'
|
# define PATHSEPCHAR '\\'
|
||||||
#else
|
#else
|
||||||
|
@ -244,7 +236,7 @@
|
||||||
# define PATHSEPCHAR '/'
|
# define PATHSEPCHAR '/'
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_MSC_VER) || defined(__WATCOMC__)
|
#if defined(_MSC_VER)
|
||||||
# define PACK_N(type_dec, n) __pragma(pack(push, n)) type_dec; __pragma(pack(pop))
|
# define PACK_N(type_dec, n) __pragma(pack(push, n)) type_dec; __pragma(pack(pop))
|
||||||
#elif defined(__MINGW32__)
|
#elif defined(__MINGW32__)
|
||||||
# define PRAGMA(x) _Pragma(#x)
|
# define PRAGMA(x) _Pragma(#x)
|
||||||
|
|
|
@ -25,33 +25,6 @@
|
||||||
#include "../window_func.h"
|
#include "../window_func.h"
|
||||||
#include "dedicated_v.h"
|
#include "dedicated_v.h"
|
||||||
|
|
||||||
#ifdef __OS2__
|
|
||||||
# include <sys/time.h> /* gettimeofday */
|
|
||||||
# include <sys/types.h>
|
|
||||||
# include <unistd.h>
|
|
||||||
# include <conio.h>
|
|
||||||
|
|
||||||
# define INCL_DOS
|
|
||||||
# include <os2.h>
|
|
||||||
|
|
||||||
# define STDIN 0 /* file descriptor for standard input */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Switches OpenTTD to a console app at run-time, instead of a PM app
|
|
||||||
* Necessary to see stdout, etc.
|
|
||||||
*/
|
|
||||||
static void OS2_SwitchToConsoleMode()
|
|
||||||
{
|
|
||||||
PPIB pib;
|
|
||||||
PTIB tib;
|
|
||||||
|
|
||||||
DosGetInfoBlocks(&tib, &pib);
|
|
||||||
|
|
||||||
/* Change flag from PM to VIO */
|
|
||||||
pib->pib_ultype = 3;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(UNIX)
|
#if defined(UNIX)
|
||||||
# include <sys/time.h> /* gettimeofday */
|
# include <sys/time.h> /* gettimeofday */
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
|
@ -160,11 +133,6 @@ const char *VideoDriver_Dedicated::Start(const StringList &parm)
|
||||||
_set_error_mode(_OUT_TO_STDERR);
|
_set_error_mode(_OUT_TO_STDERR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __OS2__
|
|
||||||
/* For OS/2 we also need to switch to console mode instead of PM mode */
|
|
||||||
OS2_SwitchToConsoleMode();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Debug(driver, 1, "Loading dedicated server");
|
Debug(driver, 1, "Loading dedicated server");
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -181,7 +149,7 @@ void VideoDriver_Dedicated::MakeDirty(int left, int top, int width, int height)
|
||||||
bool VideoDriver_Dedicated::ChangeResolution(int w, int h) { return false; }
|
bool VideoDriver_Dedicated::ChangeResolution(int w, int h) { return false; }
|
||||||
bool VideoDriver_Dedicated::ToggleFullscreen(bool fs) { return false; }
|
bool VideoDriver_Dedicated::ToggleFullscreen(bool fs) { return false; }
|
||||||
|
|
||||||
#if defined(UNIX) || defined(__OS2__)
|
#if defined(UNIX)
|
||||||
static bool InputWaiting()
|
static bool InputWaiting()
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
@ -214,7 +182,7 @@ static void DedicatedHandleKeyInput()
|
||||||
|
|
||||||
if (_exit_game) return;
|
if (_exit_game) return;
|
||||||
|
|
||||||
#if defined(UNIX) || defined(__OS2__)
|
#if defined(UNIX)
|
||||||
if (fgets(input_line, lengthof(input_line), stdin) == nullptr) return;
|
if (fgets(input_line, lengthof(input_line), stdin) == nullptr) return;
|
||||||
#else
|
#else
|
||||||
/* Handle console input, and signal console thread, it can accept input again */
|
/* Handle console input, and signal console thread, it can accept input again */
|
||||||
|
|
|
@ -446,7 +446,7 @@ static uint ConvertSdlKeyIntoMy(SDL_keysym *sym, WChar *character)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check scancode for BACKQUOTE key, because we want the key left of "1", not anything else (on non-US keyboards) */
|
/* check scancode for BACKQUOTE key, because we want the key left of "1", not anything else (on non-US keyboards) */
|
||||||
#if defined(_WIN32) || defined(__OS2__)
|
#if defined(_WIN32)
|
||||||
if (sym->scancode == 41) key = WKC_BACKQUOTE;
|
if (sym->scancode == 41) key = WKC_BACKQUOTE;
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
if (sym->scancode == 10) key = WKC_BACKQUOTE;
|
if (sym->scancode == 10) key = WKC_BACKQUOTE;
|
||||||
|
|
Loading…
Reference in New Issue