Rewrite much of client's playing phase code:
(EOF_COOKIE, INTR_COOKIE, input_fd, send_intr, recv_output)
(recv_input, intr, play): New playing phase code. No native Windows
support yet. Sends just one EOF cookie on EOF on standard input
instead of up to three. Old servers (before recvclient.c rev. 1.16)
fail to terminate the session when they receive an EOF cookie at an
argument prompt. The session then hangs; use SIGINT to get out. No
longer blocks on sending input, which could deadlock the session.
Closes #827090. Fixes error handling for select(). Fixes race
condition that could cause server output to be discarded on EOF on
standard input.
(main): Replace old playing phase code by a call to play().
(intr, sock, interrupt, handleintr): Replaced by play(), remove.
[_WIN32] (hStdIn): Ditto.
(auxfp): New.
(servercmd, prompt, doexecute): Remove parameter auxfi, use auxfp.
(eight_bit_clean): Move to servcmd.c.
(servercmd): Work on a single non-C_DATA line instead of getting lines
from an ioqueue.
(servercmd, output, screen, outch): Deal with all ids in servercmd()
rather than some there and some in output(). Don't treat C_NOECHO,
C_ABORT, C_CMDERR, C_BADCMD specially. Fix C_FLASH and C_EXIT to
ignore redirections; they used to ignore them only for some parts.
Replace output() by outch(), fold screen into outch().
(servercmd): Truncate long prompts and telegram infos to prevent
buffer overflow.
(prompt): Use new parameters code, prompt, teles instead of global
variables mode, the_prompt, num_teles.
(num_teles, the_prompt, mode, nbtu, nmin): Remove.
(prompt): Don't write an empty line before argument prompts to auxfp.
(servercmd): Don't strip newline from redirections and execute,
doredir(), dopipe() and doexecute() need it now.
(doredir, dopipe, doexecute): Use new seen_input() instead of gettag().
(doexecute): Set input_fd and leave reading the script file to play().
(serverio, termio, sendeof): Replaced by play(), remove.
(LBUF_LEN_MAX, lbuf, lbuf_init, lbuf_len, lbuf_full, lbuf_line)
(lbuf_putc): New.
(RING_SIZE, ring, ring_init, ring_len, ring_space, ring_peek)
(ring_getc, ring_putc, ring_putm, ring_discard, ring_search)
(ring_from_file, ring_to_file): New.
(clear_recent_input, save_input, seen_input): New.
(MAX): New.
(ioqueue, io, ioq_init, ioq_dequeue, ioq_read, ioq_write, ioq_qsize)
(ioq_drain, ioq_gets, ioqtobuf, enqueuecc, dequeuecc): Unused, remove.
(QEMPTY, qelem, insque, remque, initque): Unused, remove.
(tagstruct, taglist, io_init, gettag): Unused, remove.
(main) [_WIN32]: Don't call WSAStartup() until after option
processing, so that we can version and help even when it fails. Fix
program exit status on failure.
Belatedly update standalone build for last night's changeset:
(main): Rewrite argument parsing to use getopt(). New options -h and
-v.
(print_usage): New.
(saveargv): Lame attempt at protecting users who foolishly specify
passwords on the command line. Antisocially zaps the complete command
line, not just the password. Remove, at least for now.
(main): Update accordingly.
(load_plane_ship, load_land_ship, load_plane_land, load_land_land):
isdigit() can return anything, not just 0 or 1, and you can't combine
its values with &=! The bug could make loading operations fail
noisily instead of silently, depending on the system's implementation
of isdigit().
Shut down session on receipt of "ctld\n" even when reading arguments:
(player): New member eof.
(recvclient): Return -1 without receiving input when it is set. Set
it on receipt of "ctld\n".
(execute): Clear it after receiving the script.
(execute): Prompted for a missing argument, but then passed a null
pointer to prexec() instead. Some systems (GNU, Windows) deal
gracefully with printing null strings, others crash.
Ron Koenderink [Mon, 12 Nov 2007 20:08:15 +0000 (20:08 +0000)]
Fix the test scripts for the players for the new world -R 1 for fairland
and for -R 1 for the server. Cleanup the shell selection for the current builds
and the push the shell fixes to the config files. Add PATCH and
CVSROOT environment variables to add flexibility. Add the changes for
the new autoconf build and remove build.conf and makedepend.
Swiitch All patch to use the source code All patches.
Fix the spelling of sandbox.
(carriersatxy): Remove parameters wantflags, nowantflags, and use
carrier_planes() instead, ignoring carriers that can only operate
x-light planes. No functional change.
(carrier_planes): External linkage.
(carrier_planes): New.
(pln_onewaymission): Use it. No functional change.
(pln_airbase_ok): Use it to enforce capabilities. Before, a plane
could fly once it got on the ship. Because ships can load only planes
that can fly from them, this has no effect other than make that sanity
check redundant; remove it.
(pln_airbase_ok): Update land unit case to keep it similar to the ship
case.
(pln_airbase_ok): New parameter noisy to allow suppressing messages.
Check player->cnum only when noisy. Update existing caller to pass 1.
No functional change.
(mission_pln_airbase_ok): Remove, use pln_airbase_ok() instead. No
functional change.
(pln_airbase_ok): Plug information leak: carrier owner was checked
last, so when it was (no longer) allied, attempting to fly off it let
you test the conditions checked before that. Check owner first.
(mission_pln_airbase_ok): Matching change, to avoid diverging from
pln_airbase_ok().
(pln_airbase_ok, mission_pln_airbase_ok): Oops when plane's carrier is
bad. Before, the plane was destroyed, and the player got a message.
(pln_airbase_ok, mission_pln_airbase_ok): Oops when plane's base
sector is bad.
(pln_airbase_ok): Oops when the player doesn't own the plane. Before,
this was checked only for planes on carriers, and the plane was
destroyed, and the player got a misleading message.
(mission_pln_wanted): Broken like its cousin pln_wanted() was, only
more so: additionally, any of P_E, P_K, P_L satisfied any subset of
P_E, P_K, P_L. Chainsaw fixed this one in plnsub.c, but not here.
Remove, use the fixed pln_wanted() instead.
(pln_wanted): External linkage.
(pln_wanted): Rewrite. Old version was incomprehensible, slow and
buggy: any P_E, P_L, P_K in wantflags were ignored when the plane
lacked P_ESC. The bug bit only when non-escort interceptors escorted
a one-way mission to a carrier. pln_oneway_to_carrier_ok() then could
not fit the plane on the carrier, and the command failed complaining
about lack of room on the carrier. Broken since Chainsaw added
escorts, abusable before 4.2.17 catched it. Also change behavior when
only one of P_F and P_ESC is in wantflags: new version requires that
flag, while old version treats it as if both flags were in wantflags:
a plane having either is okay. Current code never passes such
wantflags.
(fit_plane_on_ship, fit_plane_off_ship): Change how planes are fit on
ships, so that order of loading no longer matters: choppers can use
chopper or plane slots, x-lights can use x-light or plane slots, light
planes can use plane slots. However, plane slots require M_FLY or
M_MSL to hold missiles or x-lights, and M_FLY to hold anything else.
Choppers and x-lights can now use plane slots even when not light.
X-light choppers, which don't exist in the stock game, can no longer
use x-light slots.
(fit_plane_on_ship, fit_plane_off_ship): Don't require M_CHOPPER for
use of chopper slot. Same for M_XLIGHT and x-light slot. No
functional change, because presence of slots implies the flags (see
init_mchr()).
Collect the test whether a plane fits on a carrier in one place:
(fit_plane_on_ship, fit_plane_on_land): New.
(pln_oneway_to_carrier_ok, put_plane_on_ship, count_planes)
(put_plane_on_land, count_land_planes): Use them. No functional
change.
(fit_plane_off_ship, fit_plane_off_land): New.
(take_plane_off_ship, take_plane_off_land): Use them. This oopses
when the carriers plane counter underflows.
(take_plane_off_ship): Document that carrier's plane counters may be
screwed up.
(take_plane_off_ship, take_plane_off_land): Oops when the plane isn't
on the carrier.
(take_plane_off_ship, take_plane_off_land): Don't fail when the plane
to be taken off can't go on this type of carrier, just take it off.
No error condition left, so return void. Callers couldn't do anything
useful with the status anyway, and most didn't bother. Change those
that did.
Keep log open, rotate it just like the journal:
(logfd, logopen): New.
(loginit): Set logfd, return success.
(logerror): Use logfd.
(logreopen): New.
(relo, main): Use it.
Ron Koenderink [Tue, 23 Oct 2007 03:05:56 +0000 (03:05 +0000)]
(main, init_server, emp_server.6): Add -R command line option to set
a seed for the random function.
(nightlybuild.sh): Add the -R 1 for the server.
(nightlybuild.sh): Switch to -R 1 for the fairland as 1 is safer.
Some systems might generate lousy randomness from a
zero seed.
(prng.patch): Not required anymore, -R 1 is used instead.
(main, emp_server.6): Rename -r and -R to -u and -U. "-R" is now used for random seed.
Ron Koenderink [Sun, 21 Oct 2007 15:34:27 +0000 (15:34 +0000)]
(random, srandom) [_WIN32]: Provide random and srandom
POSIX equivalents instead of using the WIN32 rand/srand functions.
The files were derived from GNU libc source.
(empth_threadMain) [_WIN32]: Remove the srandom() as the
POSIX equivalent are not thread specific as the WIN32 functions were.
Ron Koenderink [Sun, 30 Sep 2007 15:39:48 +0000 (15:39 +0000)]
(empth_sleep) [_WIN32]: Change if to while to ensure the time has
actually been reached. There has been examples where the time
expired early by one second probably due a resolution error. This
caused a scheduled update to be missed. Broken in rev. 1.56.
Ron Koenderink [Wed, 29 Aug 2007 23:00:55 +0000 (23:00 +0000)]
(in.h, inet.h) [_WIN32]: Switch <sys/socket.h> to "sys/socket.h" so all
files in w32 library use a local file access for include files in or under w32.
Ron Koenderink [Sun, 26 Aug 2007 23:04:14 +0000 (23:04 +0000)]
(posix_close, posix_read, posix_write) [_WIN32]:
Move CANT_REACH() and return -1 into a default case.
Removes warnings for MinGW of potential missing cases.
(posix_accept, posix_socket) [_WIN32]: Switch handle to SOCKET
to match Windows call. Cast to an int for translation map.
Ron Koenderink [Fri, 24 Aug 2007 21:05:59 +0000 (21:05 +0000)]
(posix_fileno) [_WIN32]: Rename posix_fileno() to fileno().
Remove the extern posix_fileno().
(fileno) [_WIN32]: Replace system fileno() with a function that supports posix
file descriptors. Move #undef fileno to w32misc.h as the system define
is in stdio.h.
(rea) [_WIN32]: Add stdio.h for fileno() extern declaration and add misc.h
to ensure the WIN32 fixes to stdio.h are included.
Ron Koenderink [Fri, 24 Aug 2007 20:51:00 +0000 (20:51 +0000)]
(ssize) [_WIN32]: Switch __W64 to _w64, incorrectly case.
ssize_t declaration conflicts with MinGW
long declaration for ssize_t so add a #ifdef _MSC_VER
around the ssize_t declaration.