tGTK+ client now uses non-blocking connect() - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 77e40eafd4a8a40611daa344fef372430a27ac65
 (DIR) parent 37904e3dfe871225a52170c58cd5785407d8d8bd
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon, 11 Sep 2000 01:30:26 +0000
       
       GTK+ client now uses non-blocking connect()
       
       
       Diffstat:
         M po/cat-id-tbl.c                     |       4 ++--
         M po/dopewars.pot                     |     245 ++++++++++++++++---------------
         M src/AIPlayer.c                      |       2 +-
         M src/curses_client.c                 |       4 ++--
         M src/gtk_client.c                    |      86 ++++++++++++++++++++-----------
         M src/message.c                       |      28 +++++++++++++++++++++++++++-
         M src/message.h                       |       3 ++-
         M src/win32_client.c                  |       2 +-
       
       8 files changed, 214 insertions(+), 160 deletions(-)
       ---
 (DIR) diff --git a/po/cat-id-tbl.c b/po/cat-id-tbl.c
       t@@ -452,8 +452,8 @@ dopewars is released under the GNU General Public Licence\n", 386},
        \n\
        For information on the command line options, type dopewars -h at your\n\
        Unix prompt. This will display a help screen, listing the availableoptions.", 387},
       -  {"Status: Attempting to contact server...", 388},
       -  {"Status: Could not connect (%s)", 389},
       +  {"Status: Could not connect (%s)", 388},
       +  {"Status: Attempting to contact %s...", 389},
          {"%d of %d", 390},
          {"Server", 391},
          {"Port", 392},
 (DIR) diff --git a/po/dopewars.pot b/po/dopewars.pot
       t@@ -6,7 +6,7 @@
        msgid ""
        msgstr ""
        "Project-Id-Version: PACKAGE VERSION\n"
       -"POT-Creation-Date: 2000-09-11 00:51+0100\n"
       +"POT-Creation-Date: 2000-09-11 02:27+0100\n"
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
        "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
        "Language-Team: LANGUAGE <LL@li.org>\n"
       t@@ -998,7 +998,7 @@ msgstr ""
        msgid "CLQP"
        msgstr ""
        
       -#: src/curses_client.c:363 src/gtk_client.c:811
       +#: src/curses_client.c:363 src/gtk_client.c:805
        msgid "Where to, dude ? "
        msgstr ""
        
       t@@ -1104,12 +1104,12 @@ msgstr ""
        msgid "The server has terminated. Reverting to single player mode."
        msgstr ""
        
       -#: src/curses_client.c:635 src/gtk_client.c:338 src/serverside.c:258
       +#: src/curses_client.c:635 src/gtk_client.c:335 src/serverside.c:258
        #, c-format
        msgid "%s joins the game!"
        msgstr ""
        
       -#: src/curses_client.c:640 src/gtk_client.c:344
       +#: src/curses_client.c:640 src/gtk_client.c:341
        #, c-format
        msgid "%s has left the game."
        msgstr ""
       t@@ -1146,22 +1146,22 @@ msgstr ""
        msgid "You don't have any %s to sell!"
        msgstr ""
        
       -#: src/curses_client.c:807 src/gtk_client.c:1087
       +#: src/curses_client.c:807 src/gtk_client.c:1081
        #, c-format
        msgid "You'll need more %s to carry any more %s!"
        msgstr ""
        
       -#: src/curses_client.c:829 src/gtk_client.c:1091
       +#: src/curses_client.c:829 src/gtk_client.c:1085
        #, c-format
        msgid "You don't have enough space to carry that %s!"
        msgstr ""
        
       -#: src/curses_client.c:837 src/gtk_client.c:1095
       +#: src/curses_client.c:837 src/gtk_client.c:1089
        #, c-format
        msgid "You don't have enough cash to buy that %s!"
        msgstr ""
        
       -#: src/curses_client.c:850 src/gtk_client.c:1099
       +#: src/curses_client.c:850 src/gtk_client.c:1093
        msgid "You don't have any to sell!"
        msgstr ""
        
       t@@ -1169,7 +1169,7 @@ msgstr ""
        msgid "How much money do you pay back? "
        msgstr ""
        
       -#: src/curses_client.c:880 src/curses_client.c:910 src/gtk_client.c:1901
       +#: src/curses_client.c:880 src/curses_client.c:910 src/gtk_client.c:1927
        msgid "You don't have that much money!"
        msgstr ""
        
       t@@ -1185,7 +1185,7 @@ msgstr ""
        msgid "How much money? "
        msgstr ""
        
       -#: src/curses_client.c:913 src/gtk_client.c:1894
       +#: src/curses_client.c:913 src/gtk_client.c:1920
        msgid "There isn't that much money in the bank..."
        msgstr ""
        
       t@@ -1197,7 +1197,7 @@ msgstr ""
        msgid "Messages"
        msgstr ""
        
       -#: src/curses_client.c:1130 src/gtk_client.c:1384
       +#: src/curses_client.c:1130 src/gtk_client.c:1378
        msgid "Stats"
        msgstr ""
        
       t@@ -1445,7 +1445,7 @@ msgstr ""
        msgid "Inventory"
        msgstr ""
        
       -#: src/gtk_client.c:236 src/gtk_client.c:2137 src/gtk_client.c:2505
       +#: src/gtk_client.c:236 src/gtk_client.c:2163 src/gtk_client.c:2531
        msgid "Close"
        msgstr ""
        
       t@@ -1453,204 +1453,204 @@ msgstr ""
        msgid "Connection to server lost - switching to single player mode"
        msgstr ""
        
       -#: src/gtk_client.c:312
       +#: src/gtk_client.c:309
        msgid "You have been pushed from the server."
        msgstr ""
        
       -#: src/gtk_client.c:317
       +#: src/gtk_client.c:314
        msgid "The server has terminated."
        msgstr ""
        
       -#: src/gtk_client.c:357
       +#: src/gtk_client.c:354
        #, c-format
        msgid "Jetting to %s"
        msgstr ""
        
       -#: src/gtk_client.c:362
       +#: src/gtk_client.c:359
        msgid "<main>/Errands/Spy"
        msgstr ""
        
       -#: src/gtk_client.c:364
       +#: src/gtk_client.c:361
        #, c-format
        msgid "_Spy\t(%s)"
        msgstr ""
        
       -#: src/gtk_client.c:368
       +#: src/gtk_client.c:365
        #, c-format
        msgid "_Tipoff\t(%s)"
        msgstr ""
        
       -#: src/gtk_client.c:370
       +#: src/gtk_client.c:367
        msgid "<main>/Errands/Tipoff"
        msgstr ""
        
       -#: src/gtk_client.c:406
       +#: src/gtk_client.c:400
        msgid "High Scores"
        msgstr ""
        
       -#: src/gtk_client.c:440 src/gtk_client.c:1038 src/gtk_client.c:1497
       -#: src/gtk_client.c:1810 src/gtk_client.c:1975 src/gtk_client.c:2254
       -#: src/gtk_client.c:2412
       +#: src/gtk_client.c:434 src/gtk_client.c:1032 src/gtk_client.c:1491
       +#: src/gtk_client.c:1836 src/gtk_client.c:2001 src/gtk_client.c:2280
       +#: src/gtk_client.c:2438
        msgid "OK"
        msgstr ""
        
       -#: src/gtk_client.c:522
       +#: src/gtk_client.c:516
        msgid "Fight"
        msgstr ""
        
       -#: src/gtk_client.c:549
       +#: src/gtk_client.c:543
        #, c-format
        msgid "_Deal %s"
        msgstr ""
        
       -#: src/gtk_client.c:553 src/gtk_client.c:1131 src/gtk_client.c:1327
       +#: src/gtk_client.c:547 src/gtk_client.c:1125 src/gtk_client.c:1321
        msgid "_Fight"
        msgstr ""
        
       -#: src/gtk_client.c:556
       +#: src/gtk_client.c:550
        msgid "_Stand"
        msgstr ""
        
       -#: src/gtk_client.c:559 src/gtk_client.c:1130
       +#: src/gtk_client.c:553 src/gtk_client.c:1124
        msgid "_Run"
        msgstr ""
        
       -#: src/gtk_client.c:802
       +#: src/gtk_client.c:796
        msgid "Jet to location"
        msgstr ""
        
       -#: src/gtk_client.c:871
       +#: src/gtk_client.c:865
        #, c-format
        msgid "at %s"
        msgstr ""
        
       -#: src/gtk_client.c:876
       +#: src/gtk_client.c:870
        #, c-format
        msgid "You are currently carrying %d %s"
        msgstr ""
        
       -#: src/gtk_client.c:881
       +#: src/gtk_client.c:875
        #, c-format
        msgid "Available space: %d"
        msgstr ""
        
       -#: src/gtk_client.c:886
       +#: src/gtk_client.c:880
        #, c-format
        msgid "You can afford %d"
        msgstr ""
        
       -#: src/gtk_client.c:936 src/gtk_client.c:1067
       +#: src/gtk_client.c:930 src/gtk_client.c:1061
        msgid "Buy"
        msgstr ""
        
       -#: src/gtk_client.c:937 src/gtk_client.c:1068
       +#: src/gtk_client.c:931 src/gtk_client.c:1062
        msgid "Sell"
        msgstr ""
        
       -#: src/gtk_client.c:938 src/gtk_client.c:1069
       +#: src/gtk_client.c:932 src/gtk_client.c:1063
        msgid "Drop"
        msgstr ""
        
       -#: src/gtk_client.c:1026
       +#: src/gtk_client.c:1020
        #, c-format
        msgid "%s how many?"
        msgstr ""
        
       -#: src/gtk_client.c:1044 src/gtk_client.c:1810 src/gtk_client.c:1986
       -#: src/gtk_client.c:2262
       +#: src/gtk_client.c:1038 src/gtk_client.c:1836 src/gtk_client.c:2012
       +#: src/gtk_client.c:2288
        msgid "Cancel"
        msgstr ""
        
       -#: src/gtk_client.c:1083
       +#: src/gtk_client.c:1077
        #, c-format
        msgid "You don't have any %s!"
        msgstr ""
        
       -#: src/gtk_client.c:1130 src/gtk_client.c:1811
       +#: src/gtk_client.c:1124 src/gtk_client.c:1837
        msgid "_Yes"
        msgstr ""
        
       -#: src/gtk_client.c:1130 src/gtk_client.c:1811
       +#: src/gtk_client.c:1124 src/gtk_client.c:1837
        msgid "_No"
        msgstr ""
        
       -#: src/gtk_client.c:1131
       +#: src/gtk_client.c:1125
        msgid "_Attack"
        msgstr ""
        
       -#: src/gtk_client.c:1131
       +#: src/gtk_client.c:1125
        msgid "_Evade"
        msgstr ""
        
       -#: src/gtk_client.c:1149
       +#: src/gtk_client.c:1143
        msgid "Question"
        msgstr ""
        
       -#: src/gtk_client.c:1257
       +#: src/gtk_client.c:1251
        msgid "<main>/Talk"
        msgstr ""
        
       -#: src/gtk_client.c:1259
       +#: src/gtk_client.c:1253
        msgid "<main>/List"
        msgstr ""
        
       -#: src/gtk_client.c:1261
       +#: src/gtk_client.c:1255
        msgid "<main>/Errands"
        msgstr ""
        
       -#: src/gtk_client.c:1277
       +#: src/gtk_client.c:1271
        msgid "Space"
        msgstr ""
        
       -#: src/gtk_client.c:1282
       +#: src/gtk_client.c:1276
        msgid "Cash"
        msgstr ""
        
       -#: src/gtk_client.c:1287
       +#: src/gtk_client.c:1281
        msgid "Debt"
        msgstr ""
        
       -#: src/gtk_client.c:1292
       +#: src/gtk_client.c:1286
        msgid "Bank"
        msgstr ""
        
       -#: src/gtk_client.c:1307
       +#: src/gtk_client.c:1301
        msgid "Health"
        msgstr ""
        
       -#: src/gtk_client.c:1327
       +#: src/gtk_client.c:1321
        msgid "_Jet!"
        msgstr ""
        
       -#: src/gtk_client.c:1358
       +#: src/gtk_client.c:1352
        msgid "dopewars"
        msgstr ""
        
       -#: src/gtk_client.c:1444
       +#: src/gtk_client.c:1438
        msgid "Drug Dealing and Research"
        msgstr ""
        
       -#: src/gtk_client.c:1445
       +#: src/gtk_client.c:1439
        msgid "Play Testing"
        msgstr ""
        
       -#: src/gtk_client.c:1446
       +#: src/gtk_client.c:1440
        msgid "Extensive Play Testing"
        msgstr ""
        
       -#: src/gtk_client.c:1448
       +#: src/gtk_client.c:1442
        msgid "Constructive Criticism"
        msgstr ""
        
       -#: src/gtk_client.c:1450
       +#: src/gtk_client.c:1444
        msgid "Unconstructive Criticism"
        msgstr ""
        
       -#: src/gtk_client.c:1454
       +#: src/gtk_client.c:1448
        msgid "About dopewars"
        msgstr ""
        
       -#: src/gtk_client.c:1463
       +#: src/gtk_client.c:1457
        msgid ""
        "Based on John E. Dell's old Drug Wars game, dopewars is a simulation of an\n"
        "imaginary drug market.  dopewars is an All-American game which features\n"
       t@@ -1662,150 +1662,151 @@ msgid ""
        "have one month of game time to make your fortune.\n"
        msgstr ""
        
       -#: src/gtk_client.c:1471
       +#: src/gtk_client.c:1465
        #, c-format
        msgid ""
        "Version %s     Copyright (C) 1998-2000  Ben Webb ben@bellatrix.pcl.ox.ac.uk\n"
        "dopewars is released under the GNU General Public Licence\n"
        msgstr ""
        
       -#: src/gtk_client.c:1489
       +#: src/gtk_client.c:1483
        msgid ""
        "\n"
        "For information on the command line options, type dopewars -h at your\n"
        "Unix prompt. This will display a help screen, listing the availableoptions."
        msgstr ""
        
       -#: src/gtk_client.c:1527 src/gtk_client.c:1612
       -msgid "Status: Attempting to contact server..."
       +#: src/gtk_client.c:1521 src/gtk_client.c:1544
       +#, c-format
       +msgid "Status: Could not connect (%s)"
        msgstr ""
        
       -#: src/gtk_client.c:1533 src/gtk_client.c:1618
       +#: src/gtk_client.c:1532
        #, c-format
       -msgid "Status: Could not connect (%s)"
       +msgid "Status: Attempting to contact %s..."
        msgstr ""
        
       -#: src/gtk_client.c:1567
       +#: src/gtk_client.c:1592
        #, c-format
        msgid "%d of %d"
        msgstr ""
        
       -#: src/gtk_client.c:1634 src/gtk_client.c:1671 src/gtk_client.c:1712
       +#: src/gtk_client.c:1656 src/gtk_client.c:1697 src/gtk_client.c:1738
        msgid "Server"
        msgstr ""
        
       -#: src/gtk_client.c:1635 src/gtk_client.c:1686
       +#: src/gtk_client.c:1657 src/gtk_client.c:1712
        msgid "Port"
        msgstr ""
        
       -#: src/gtk_client.c:1636
       +#: src/gtk_client.c:1658
        msgid "Version"
        msgstr ""
        
       -#: src/gtk_client.c:1637
       +#: src/gtk_client.c:1659
        msgid "Players"
        msgstr ""
        
       -#: src/gtk_client.c:1638
       +#: src/gtk_client.c:1660
        msgid "Comment"
        msgstr ""
        
       -#: src/gtk_client.c:1647
       +#: src/gtk_client.c:1673
        msgid "New Game"
        msgstr ""
        
       -#: src/gtk_client.c:1656
       +#: src/gtk_client.c:1682
        msgid "Hey dude, what's your _name?"
        msgstr ""
        
       -#: src/gtk_client.c:1678
       +#: src/gtk_client.c:1704
        msgid "Host name"
        msgstr ""
        
       -#: src/gtk_client.c:1701 src/gtk_client.c:1764
       +#: src/gtk_client.c:1727 src/gtk_client.c:1790
        msgid "_Connect"
        msgstr ""
        
       -#: src/gtk_client.c:1714 src/gtk_client.c:1735
       +#: src/gtk_client.c:1740 src/gtk_client.c:1761
        msgid "Single player"
        msgstr ""
        
       -#: src/gtk_client.c:1720
       +#: src/gtk_client.c:1746
        msgid "_Antique mode"
        msgstr ""
        
       -#: src/gtk_client.c:1727
       +#: src/gtk_client.c:1753
        msgid "_Start single-player game"
        msgstr ""
        
       -#: src/gtk_client.c:1737 src/gtk_client.c:1775
       +#: src/gtk_client.c:1763 src/gtk_client.c:1801
        msgid "Metaserver"
        msgstr ""
        
       -#: src/gtk_client.c:1754
       +#: src/gtk_client.c:1780
        msgid "_Update"
        msgstr ""
        
       -#: src/gtk_client.c:1779
       +#: src/gtk_client.c:1805
        msgid "Status: Waiting for user input"
        msgstr ""
        
       -#: src/gtk_client.c:1932
       +#: src/gtk_client.c:1958
        #, c-format
        msgid "Cash: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1939
       +#: src/gtk_client.c:1965
        #, c-format
        msgid "Debt: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1942
       +#: src/gtk_client.c:1968
        #, c-format
        msgid "Bank: %s"
        msgstr ""
        
       -#: src/gtk_client.c:1950
       +#: src/gtk_client.c:1976
        msgid "Pay back:"
        msgstr ""
        
       -#: src/gtk_client.c:1953
       +#: src/gtk_client.c:1979
        msgid "Deposit"
        msgstr ""
        
       -#: src/gtk_client.c:1957
       +#: src/gtk_client.c:1983
        msgid "Withdraw"
        msgstr ""
        
       -#: src/gtk_client.c:1981
       +#: src/gtk_client.c:2007
        msgid "Pay all"
        msgstr ""
        
       -#: src/gtk_client.c:2003
       +#: src/gtk_client.c:2029
        msgid "Player List"
        msgstr ""
        
       -#: src/gtk_client.c:2092
       +#: src/gtk_client.c:2118
        msgid "Talk to player(s)"
        msgstr ""
        
       -#: src/gtk_client.c:2114
       +#: src/gtk_client.c:2140
        msgid "Talk to all players"
        msgstr ""
        
       -#: src/gtk_client.c:2118
       +#: src/gtk_client.c:2144
        msgid "Message:-"
        msgstr ""
        
       -#: src/gtk_client.c:2131
       +#: src/gtk_client.c:2157
        msgid "Send"
        msgstr ""
        
       -#: src/gtk_client.c:2224
       +#: src/gtk_client.c:2250
        msgid "Spy On Player"
        msgstr ""
        
       -#: src/gtk_client.c:2226
       +#: src/gtk_client.c:2252
        #, c-format
        msgid ""
        "Please choose the player to spy on. Your %s will\n"
       t@@ -1815,11 +1816,11 @@ msgid ""
        "you, so any %s or %s that he's carrying may be lost!"
        msgstr ""
        
       -#: src/gtk_client.c:2234
       +#: src/gtk_client.c:2260
        msgid "Tip Off The Cops"
        msgstr ""
        
       -#: src/gtk_client.c:2236
       +#: src/gtk_client.c:2262
        #, c-format
        msgid ""
        "Please choose the player to tip off the cops to. Your %s will\n"
       t@@ -1828,71 +1829,71 @@ msgid ""
        "so any %s or %s that he's carrying may be lost!"
        msgstr ""
        
       -#: src/gtk_client.c:2276
       +#: src/gtk_client.c:2302
        #, c-format
        msgid "Sack %s"
        msgstr ""
        
       -#: src/gtk_client.c:2277
       +#: src/gtk_client.c:2303
        #, c-format
        msgid ""
        "Are you sure? (Any %s or %s carried\n"
        "by this %s may be lost!)"
        msgstr ""
        
       -#: src/gtk_client.c:2298
       +#: src/gtk_client.c:2324
        msgid "Name"
        msgstr ""
        
       -#: src/gtk_client.c:2299
       +#: src/gtk_client.c:2325
        msgid "Price"
        msgstr ""
        
       -#: src/gtk_client.c:2300
       +#: src/gtk_client.c:2326
        msgid "Number"
        msgstr ""
        
       -#: src/gtk_client.c:2302
       +#: src/gtk_client.c:2328
        msgid "_Buy ->"
        msgstr ""
        
       -#: src/gtk_client.c:2303
       +#: src/gtk_client.c:2329
        msgid "<- _Sell"
        msgstr ""
        
       -#: src/gtk_client.c:2304
       +#: src/gtk_client.c:2330
        msgid "_Drop <-"
        msgstr ""
        
       -#: src/gtk_client.c:2309
       +#: src/gtk_client.c:2335
        #, c-format
        msgid "%s here"
        msgstr ""
        
       -#: src/gtk_client.c:2312
       +#: src/gtk_client.c:2338
        #, c-format
        msgid "%s carried"
        msgstr ""
        
       -#: src/gtk_client.c:2388
       +#: src/gtk_client.c:2414
        msgid "Change Name"
        msgstr ""
        
       -#: src/gtk_client.c:2398
       +#: src/gtk_client.c:2424
        msgid ""
        "Unfortunately, somebody else is already using \"your\" name. Please change "
        "it:-"
        msgstr ""
        
       -#: src/gtk_client.c:2457
       +#: src/gtk_client.c:2483
        msgid "Done"
        msgstr ""
        
       -#: src/gtk_client.c:2491
       +#: src/gtk_client.c:2517
        msgid "Spy reports"
        msgstr ""
        
       -#: src/gtk_client.c:2562
       +#: src/gtk_client.c:2588
        msgid ""
        "No GTK+ client available - rebuild the binary passing the\n"
        "--enable-gtk-client option to configure, or use the curses\n"
       t@@ -2510,7 +2511,7 @@ msgstr ""
        msgid "%s fails to return fire..."
        msgstr ""
        
       -#: src/message.c:384
       +#: src/message.c:386
        #, c-format
        msgid ""
        "This server is version %s, while your client is version %s.\n"
       t@@ -2519,27 +2520,27 @@ msgid ""
        "for the latest version."
        msgstr ""
        
       -#: src/message.c:519
       +#: src/message.c:525
        msgid "Could not find host"
        msgstr ""
        
       -#: src/message.c:520
       +#: src/message.c:526
        msgid "Could not create network socket"
        msgstr ""
        
       -#: src/message.c:521
       +#: src/message.c:527 src/message.c:560
        msgid "Connection refused or no server present"
        msgstr ""
        
       -#: src/message.c:677
       +#: src/message.c:703
        msgid "Cannot locate metaserver"
        msgstr ""
        
       -#: src/message.c:678
       +#: src/message.c:704
        msgid "Cannot create socket"
        msgstr ""
        
       -#: src/message.c:680
       +#: src/message.c:706
        msgid "Metaserver not running HTTP or connection denied"
        msgstr ""
        
 (DIR) diff --git a/src/AIPlayer.c b/src/AIPlayer.c
       t@@ -57,7 +57,7 @@ void AIPlayerLoop() {
           FirstClient=AddPlayer(0,AIPlay,FirstClient);
           g_message(_("AI Player started; attempting to contact server at %s:%d..."),
                     ServerName,Port);
       -   pt=SetupNetwork();
       +   pt=SetupNetwork(FALSE);
           if (pt) g_error(_("Could not connect to dopewars server\n(%s)\n"
                           "AI Player terminating abnormally."),_(pt));
           AIPlay->fd=ClientSock;
 (DIR) diff --git a/src/curses_client.c b/src/curses_client.c
       t@@ -253,7 +253,7 @@ static char *SelectServerFromMetaServer() {
              switch(c) {
                 case 'S': AssignName(&ServerName,ThisServer->Name);
                           Port=ThisServer->Port;
       -                   ThisServer=NULL;
       +                   ListPt=NULL;
                           break;
                 case 'N': ListPt=g_slist_next(ListPt);
                           if (!ListPt) ListPt=ServerList;
       t@@ -297,7 +297,7 @@ static char ConnectToServer(Player *Play) {
                 mvaddstr(17,1,
                          _("Please wait... attempting to contact dopewars server..."));
                 refresh();
       -         pt=SetupNetwork();
       +         pt=SetupNetwork(FALSE);
              }
              if (pt || MetaError) {
                 clear_line(17);
 (DIR) diff --git a/src/gtk_client.c b/src/gtk_client.c
       t@@ -287,9 +287,6 @@ void HandleClientMessage(char *pt,Player *ReallyTo) {
           GtkWidget *MenuItem;
           GSList *list;
        
       -/* Handle events first */
       -   while (gtk_main_iteration_do(FALSE));
       -
           if (ProcessMessage(pt,&From,&AICode,&Code,&To,&Data,FirstClient)==-1) {
              return;
           }
       t@@ -389,9 +386,6 @@ void HandleClientMessage(char *pt,Player *ReallyTo) {
                 break;
           }
           g_free(Data);
       -
       -/* Handle events again */
       -   while (gtk_main_iteration_do(FALSE));
        }
        
        struct HiScoreDiaStruct {
       t@@ -1510,10 +1504,51 @@ _("\nFor information on the command line options, type dopewars -h at your\n"
        
        struct StartGameStruct {
           GtkWidget *dialog,*name,*hostname,*port,*antique,*status,*metaserv;
       +   gint ConnectTag;
        };
        
       -static void ConnectToServer(GtkWidget *widget,struct StartGameStruct *widgets) {
       +static void FinishConnect(gpointer data,gint socket,
       +                          GdkInputCondition condition) {
           gchar *text,*NetworkError;
       +   struct StartGameStruct *widgets;
       +
       +   widgets=(struct StartGameStruct *)data;
       +
       +   gdk_input_remove(widgets->ConnectTag);
       +   widgets->ConnectTag=0;
       +   NetworkError=FinishSetupNetwork();
       +   if (NetworkError) {
       +      text=g_strdup_printf(_("Status: Could not connect (%s)"),NetworkError);
       +      gtk_label_set_text(GTK_LABEL(widgets->status),text);
       +      g_free(text);
       +   } else {
       +      gtk_widget_destroy(widgets->dialog);
       +      StartGame();
       +   } 
       +}
       +
       +static void DoConnect(struct StartGameStruct *widgets) {
       +   gchar *text,*NetworkError;
       +   text=g_strdup_printf(_("Status: Attempting to contact %s..."),ServerName);
       +   gtk_label_set_text(GTK_LABEL(widgets->status),text); g_free(text);
       +
       +   if (widgets->ConnectTag!=0) {
       +      gdk_input_remove(widgets->ConnectTag); CloseSocket(ClientSock);
       +      widgets->ConnectTag=0;
       +   }
       +   NetworkError=SetupNetwork(TRUE);
       +   if (!NetworkError) {
       +      widgets->ConnectTag=gdk_input_add(ClientSock,GDK_INPUT_WRITE,
       +                                        FinishConnect,(gpointer)widgets);
       +   } else {
       +      text=g_strdup_printf(_("Status: Could not connect (%s)"),NetworkError);
       +      gtk_label_set_text(GTK_LABEL(widgets->status),text);
       +      g_free(text);
       +   }
       +}
       +
       +static void ConnectToServer(GtkWidget *widget,struct StartGameStruct *widgets) {
       +   gchar *text;
           g_free(ServerName);
           ServerName=gtk_editable_get_chars(GTK_EDITABLE(widgets->hostname),0,-1);
           text=gtk_editable_get_chars(GTK_EDITABLE(widgets->port),0,-1);
       t@@ -1523,17 +1558,7 @@ static void ConnectToServer(GtkWidget *widget,struct StartGameStruct *widgets) {
           ClientData.PlayerName=gtk_editable_get_chars(GTK_EDITABLE(widgets->name),
                                                        0,-1);
           if (!ClientData.PlayerName || !ClientData.PlayerName[0]) return;
       -   gtk_label_set_text(GTK_LABEL(widgets->status),
       -                      _("Status: Attempting to contact server..."));
       -   NetworkError=SetupNetwork();
       -   if (!NetworkError) {
       -      gtk_widget_destroy(widgets->dialog);
       -      StartGame();
       -   } else {
       -      text=g_strdup_printf(_("Status: Could not connect (%s)"),NetworkError);
       -      gtk_label_set_text(GTK_LABEL(widgets->status),text);
       -      g_free(text);
       -   }
       +   DoConnect(widgets);
        }
        
        static void StartSinglePlayer(GtkWidget *widget,
       t@@ -1595,7 +1620,6 @@ static void MetaServerConnect(GtkWidget *widget,
           gint row;
           GtkWidget *clist;
           ServerData *ThisServer;
       -   gchar *text,*NetworkError;
        
           clist=widgets->metaserv;
           selection=GTK_CLIST(clist)->selection;
       t@@ -1608,17 +1632,15 @@ static void MetaServerConnect(GtkWidget *widget,
              ClientData.PlayerName=gtk_editable_get_chars(GTK_EDITABLE(widgets->name),
                                                           0,-1);
              if (!ClientData.PlayerName || !ClientData.PlayerName[0]) return;
       -      gtk_label_set_text(GTK_LABEL(widgets->status),
       -                         _("Status: Attempting to contact server..."));
       -      NetworkError=SetupNetwork();
       -      if (!NetworkError) {
       -         gtk_widget_destroy(widgets->dialog);
       -         StartGame();
       -      } else {
       -         text=g_strdup_printf(_("Status: Could not connect (%s)"),NetworkError);
       -         gtk_label_set_text(GTK_LABEL(widgets->status),text);
       -         g_free(text);
       -      }
       +      DoConnect(widgets);
       +   }
       +}
       +
       +static void CloseNewGameDia(GtkWidget *widget,
       +                            struct StartGameStruct *widgets) {
       +   if (widgets->ConnectTag!=0) {
       +      gdk_input_remove(widgets->ConnectTag); CloseSocket(ClientSock);
       +      widgets->ConnectTag=0;
           }
        }
        
       t@@ -1637,7 +1659,11 @@ void NewGameDialog() {
           server_titles[3]=_("Players");
           server_titles[4]=_("Comment");
        
       +   widgets.ConnectTag=0;
           widgets.dialog=dialog=gtk_window_new(GTK_WINDOW_DIALOG);
       +   gtk_signal_connect(GTK_OBJECT(dialog),"destroy",
       +                      GTK_SIGNAL_FUNC(CloseNewGameDia),
       +                      (gpointer)&widgets);
           
           gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
           gtk_window_set_transient_for(GTK_WINDOW(dialog),
 (DIR) diff --git a/src/message.c b/src/message.c
       t@@ -29,6 +29,8 @@
        #include <fcntl.h>
        #endif
        
       +#include <sys/types.h>
       +#include <sys/socket.h>
        #include <string.h>
        #include <stdlib.h>
        #include <glib.h>
       t@@ -509,11 +511,15 @@ price_t GetNextPrice(gchar **Data,price_t Default) {
        }
        
        #if NETWORKING
       -char *SetupNetwork() {
       +char *SetupNetwork(gboolean NonBlocking) {
        /* Sets up the connection from the client to the server. If the connection */
        /* is successful, Network and Client are set to TRUE, and ClientSock is a  */
        /* file descriptor for the newly-opened socket. NULL is returned. If the   */
        /* connection fails, a pointer to an error message is returned.            */
       +/* If "NonBlocking" is TRUE, a non-blocking connect() is carried out. In   */
       +/* this case, the routine returns successfully after initiating the        */
       +/* connect call; the caller should then select() the socket for writing,   */
       +/* before calling FinishSetupNetwork()                                     */
           struct sockaddr_in ClientAddr;
           struct hostent *he;
           static char NoHost[]= N_("Could not find host");
       t@@ -535,8 +541,10 @@ char *SetupNetwork() {
           ClientAddr.sin_addr=*((struct in_addr *)he->h_addr);
           memset(ClientAddr.sin_zero,0,sizeof(ClientAddr.sin_zero));
        
       +   if (NonBlocking) fcntl(ClientSock,F_SETFL,O_NONBLOCK);
           if (connect(ClientSock,(struct sockaddr *)&ClientAddr,
               sizeof(struct sockaddr))==-1) {
       +      if (errno==EINPROGRESS) return NULL;
              CloseSocket(ClientSock);
              return NoConnect;
           } else {
       t@@ -545,6 +553,24 @@ char *SetupNetwork() {
           Client=TRUE; Network=TRUE;
           return NULL;
        }
       +
       +char *FinishSetupNetwork() {
       +   socklen_t optlen;
       +   int optval;
       +   static char NoConnect[]= N_("Connection refused or no server present");
       +
       +   optlen=sizeof(optval);
       +   if (getsockopt(ClientSock,SOL_SOCKET,SO_ERROR,&optval,&optlen)==-1) {
       +      return NoConnect;
       +   }
       +   if (optval==0) {
       +      Client=TRUE; Network=TRUE;
       +      return NULL;
       +   } else {
       +      return NoConnect;
       +   }
       +}
       +
        #endif /* NETWORKING */
        
        void SwitchToSinglePlayer(Player *Play) {
 (DIR) diff --git a/src/message.h b/src/message.h
       t@@ -127,7 +127,8 @@ gchar *GetNextWord(gchar **Data,gchar *Default);
        void AssignNextWord(gchar **Data,gchar **Dest);
        int GetNextInt(gchar **Data,int Default);
        price_t GetNextPrice(gchar **Data,price_t Default);
       -char *SetupNetwork();
       +char *SetupNetwork(gboolean NonBlocking);
       +char *FinishSetupNetwork();
        void ShutdownNetwork();
        void SwitchToSinglePlayer(Player *Play);
        int ProcessMessage(char *Msg,Player **From,char *AICode,char *Code,
 (DIR) diff --git a/src/win32_client.c b/src/win32_client.c
       t@@ -1196,7 +1196,7 @@ static BOOL CALLBACK NewGameWndProc(HWND hwnd,UINT msg,UINT wParam,
                    buflen=GetWindowTextLength(GetDlgItem(hwnd,ED_HOSTNAME));
                    GetDlgItemText(hwnd,ED_HOSTNAME,ServerName,buflen+1);
                    Port=GetDlgItemInt(hwnd,ED_PORT,NULL,FALSE);
       -            NetworkError=SetupNetwork();
       +            NetworkError=SetupNetwork(FALSE);
                    if (!NetworkError) {
                       EndDialog(hwnd,1);
                       StartGame();