Units owned by POGO are not in use. Giving a unit to POGO destroys
it. The opposite doesn't work, however: the unit prewrite hooks give
it right back to POGO, because efficiency is below the minimum. Make
it work by also increasing efficiency to minimum.
Note that you can't use this to create a unit that doesn't already
exist in the respective file. That's because edit's second argument
selects from existing objects only.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Blow away $(einfodir) and $(ehtmldir). Without this, formatted pages
can linger after page removal. Matters, because info.c searches
$(einfodir) rather than the index $(einfodir)/all. Same for web
servers and $(ehtmldir).
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
SO_KEEPALIVE isn't useless with long idle timeouts. Before v4.3.30's
idle timeout changes, such long timeouts had serious drawbacks (easy
denial of service), but they're just fine since then.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
supply: Fix harmless bug in supply from ship in same sector
Bug bites when a ship supplies the sector it's in. First the sector
is charged zero mob for moving the stuff, and is written back. Next,
the sector receives the stuff, and is written back, clobbering the
first write (no effect), and triggering a seqno oops.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
tests/actofgod: Disable in "make check" unless LWP
Expected to work only with thread package LWP, just like the smoke
test. Commit 7a91041 carelessly enabled it for all thread packages.
Revert, except with LWP.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Breaking sanctuary turns 100% sanctuaries into capitals, all others
into highways. Before Empire 3, sanctuaries always became capitals.
Give deities more control over initial state of countries than
choosing between 100% capital and <100% highway sectors: turn
sanctuaries into their new designation on break. Except make a
capital when the new designation is sanctuary (which it normally is).
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
"info setsector" claims you "can change anything that appears in dump
or peek (I think)", which has always been wrong.
edit is much more complete. However, edit used to be more limited in
that it could change only one sector. For mass-changes, you had to
use setsector and setresource. Since that limitation is gone, there's
no real use left for setsector and setresource.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Accept general <SECTS|SHIPS|PLANES|LANDS|NATS> argument instead of
just <SECT|SHIP|PLANE|LAND|NAT>.
edit with <KEY> <VALUE>... arguments applies the arguments to all
selected objects. Without such arguments, edit lets you edit the
selected objects interactively one after the other.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
edit: Detect concurrent updates during interactive nation edit
Unlike other edits, editing a country modifies the object in-place.
It has to, because editing may send bulletins, which updates nat_tgms,
and writing back a copy would clobber these updates, triggering a
seqno mismatch oops.
However, the in-place editing neglects to detect concurrent updates.
Fix that.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
edit: Don't reprint edited object when done with it
Interactive edit prints the edited object, then reads player input.
If it gets key and value, it applies them to the object, and repeats.
If it gets nothing, it prints the edited object again, and stops.
Remove this last print, because it's not really useful. The object is
commonly the same after reading input as before. Except when a nation
gets updated while "edit c" is waiting for input: then the second
print actually reflects the updates. Has always been that way.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Print a message describing the actual change for keys 't' (nat_tgms)
and 's' (nat_status). The message is necessary to give the deity a
chance to catch unexpected changes, e.g. a player reading telegrams
just before the deity edits nat_tgms.
Send a bulletin to the country for key 's'.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Print "FOO of CNAME (#CNUM)" instead of just "FOO". Print "unchanged"
instead of "changed from X to X" on no-op.
Send a bulletin to the country and report news when appropriate.
Affected keys:
key struct member before after notes
-------------------------------------------
n nat_cnam -- BN 1
r nat_pnam -- B- 2
b nat_btu -- BN 3
m nat_reserve BN BN
c nat_xcap,ycap -- B-
o nat_xorg,yorg -- B-
u nat_timeused -- BN
M nat_money B- BN
Notes:
1. Reports N_NAME_CHNG rather than N_AIDS/N_HURTS.
2. Message improved to accurately reflect string truncation.
3. Greengrocers' apostrophe in message fixed.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Print a message (always), send a bulletin to the unit owner and report
news (sometimes).
The message is necessary to give the deity a chance to catch
unexpected changes, e.g. a player spending mobility right before the
deity edits it. Watching out for such changes is especially important
with non-interactive edit.
Affected keys:
cmd key struct member action
----------------------------------
edit s L shp_x,y B-
E shp_effic BN
M shp_mobil BN
F shp_fleet B-
T shp_tech BN
a shp_pstage --
b shp_ptime --
R shp_rpath B-
edit p l pln_x,y B-
e pln_effic BN
m pln_mobil BN
w pln_wing B-
t pln_tech BN
r pln_range B-
edit u L lnd_x,y B-
e lnd_effic BN
M lnd_mobil BN
a lnd_army B-
t lnd_tech BN
F lnd_harden BN
Z lnd_retreat B-
R lnd_rpath B-
The two characters in column action show whether the command sends a
bulletin (B) or not (-), and whether it reports news (N) or not (-).
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Print a message, send bulletin to owner. Affects ship key 'W', land
unit key 'W', and plane key 'f'. The message is necessary to give the
deity a chance to catch unexpected changes, e.g. a player modifying
retreat conditions right before the deity edits them. Watching out
for such changes is especially important with non-interactive edit.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
edit: Teleport planes and land units to carrier on load
Edit lets deities load units onto remote carriers, resulting in a
carriers having cargo in another sector. Not good. Cargo gets
teleported to its carrier belatedly when the carrier moves.
Better let edit take care of the teleport.
Also tell the deity that he just caused a teleport. Necessary to give
the deity a chance to catch unexpected changes, e.g. a player moving a
plane right before the deity edits it. Watching out for such changes
is especially important with non-interactive edit.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
edit: Report loading/unloading of planes & land units properly
Print a message, send bulletin to owner. Affects plane keys 's', 'y',
and land unit keys 'S', 'Y'. The message is necessary to give the
deity a chance to catch unexpected changes, e.g. a player loading a
plane right before the deity edits it. Watching out for such changes
is especially important with non-interactive edit.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
edit: Report unit loss and gain properly for unit key 'O'
Print a message describing the actual change. Necessary to give the
deity a chance to catch unexpected changes, e.g. a player boarding a
ship right before the deity edits it. Watching out for such changes
is especially important with non-interactive edit.
Code already sends bulletins. Also report news.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
edit: Report ship and land unit commodity change properly
Print a message describing the actual change. Necessary to give the
deity a chance to catch unexpected changes, e.g. a player unloading
stuff right before the deity edits it, leaving fewer items than the
deity intends to take. Watching out for such changes is especially
important with non-interactive edit.
Send bulletin to owner and report news exactly like the give command.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Print "unchanged" instead of "changed from X to X". Affects edit,
setresource, setsector. Suppress bulletin and news. Affects only
edit sector key 'L'.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Key 'L' copies the source sector to a destination sector. Bug: it
doesn't copy, it messes up the source sector badly instead, and can
smash the stack on some machines.
Root cause: doland() passes § instead of sect to ef_set_uid().
Impact:
1. ef_setuid() clobbers a few bytes at §.
When the bitfield and uid fit into sizeof(sect) bytes, it clobbers
just sect, which has no effect, because doland() returns without
using it again. This is the case on a typical 64-bit machine: bit
field and uid are both 4 bytes, sizeof(sect) is 8.
When they don't fit, whatever is adjacent to sect gets clobbered.
On a typical 32-bit machine with stack growing down, that's p.
Again, no effect, because doland() returns without using it again.
With stack growing up, it could well be the return address,
crashing the server.
2. ef_setuid() fails to update *sect. Impact (when we survive 1):
sect->sct_uid remains unchanged. putsect() writes to the source
sector instead of the destination sector, clobbering the source's
sct_x, sct_y. Breaks invariant sctoff(sct_x, sct_y) == sct_uid!
Subsequent edits are all applied to the source sector.
sect->sct_seqno remains unchanged. No effect, because we write to
the source sector, and the unchanged sequence number is the right
one there.
edit, setresource and setsector report change in three ways:
* Print a message.
* Send a bulletin to the changed object's owner. This should be done
if and only if the change is visible to the owner, e.g. in census or
xdump.
* Report divine aid in news. This should be done if and only if a
bulletin was sent, except for changes that are neither negative nor
positive, such as changing the distribution sector.
Fix the places that don't get it right for sectors:
cmd key sctstr member before after notes
-------------------------------------------------
edit l O sct_oldown -- B-
edit l F sct_fallout -- BN 1
edit l M sct_mines -- BN 2 3
edit l D sct_dist_x,y -- B- 1
edit l s sct_type -- B- 1
edit l S sct_newtype -- B- 1
setse ow sct_own B- BN
setse ol sct_oldown -- B-
setse e sct_effic -- BN 2
setse mo sct_mobil -- BN 2
setse a sct_avail -- BN 2
setse w sct_work -- BN 2
The two characters in columns before, after show whether the command
sends a bulletin (B) or not (-), and whether it reports news (N) or
not (-).
Notes:
1. Printed message massaged slightly for consistency with other keys.
2. Printed message improved to show the old value, too. Necessary to
give the deity a chance to catch unexpected changes, e.g. a player
laying mines right before the deity edits them. Watching out for
such changes is especially important with non-interactive edit.
3. Bulletin and news suppressed for occupied sectors.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
setsector() reads the first two characters unconditionally. Wrong if
the first character is NUL. The second character read isn't actually
used then. Screwed up in Chainsaw.
When getstarg() returns an empty string, it's always in the buffer
passed as third argument. Thus, reading the second character is
actually safe.
Clean it up anyway.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
setsector: Don't disclose number of landmines to occupier
When the deity sets the number of mines with setsector, the sector
owner (if any) is told the resulting number of mines. Even for
occupied sectors, where mines belong to the old owner, and thus
shouldn't be disclosed. Oops.
Fix setsector not to tell the sector owner anything then.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Option GODNEWS is documented to be about deities giving or taking
things from players. Nevertheless, edit, give, setsector and
setresource report news of deities meddling with things owned by
deities other than POGO. Don't.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
In the beginning, all bulletins came from POGO. Chainsaw changed edit
and give to send them from the deity using the command. Its new
command setresource sent from POGO regardless. Its new command
setsector did both.
Go back to sending them only from POGO.
Some of the affected bulletins don't mention the acting deity. Reword
them so they do.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
Empty key arguments work fine when passed as command arguments, but
not interactively. For example, 'edit s 42 R ""' clears the retreat
path, but in an interactive 'edit s 43', 'R ""' sets it to "".
In Empire 1, omitting the argument made it empty. Empire 2 turned
that into an error without providing an alternative.
Switch to the common command parser, so that quoting works, and "" is
parsed as empty argument.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
give: Report number given when less than requested amount
Necessary to give the deity a chance to catch unexpected changes,
e.g. a player moving away stuff right before a give command, leaving
fewer items than the deity intends to take.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
give: Fix integer overflows on silly third arguments
give() silently caps the resulting number of items to 0..ITEM_MAX.
However, its test for "< 0" suffers integer overflow on two's
complement machines (i.e. practically everywhere) when the amount
argument is INT_MIN. give() proceeds as if the result was in range:
it sets the number of items to (short)(n + INT_MIN), telexes the owner
that INT_MIN items were stolen (obviously bogus), and tells the deity
that there are now n + INT_MIN items in X,Y.
On common machines, (short)(n + INT_MIN) == n, i.e. nothing is given.
On an oddball machine with short as wide as int, the cast to short
does nothing, item_prewrite() oopses, and corrects the number of items
to zero.
In both cases, output and telegram lie.
Likewise, its test for "> ITEM_MAX" suffers integer overflow for
sufficiently big amount arguments. Again, give() proceeds as if the
result was in range: it sets the number of items to (short)(n + amt),
telexes the owner that -amt items were stolen (obviously bogus), and
tells the deity that there are now close to INT_MIN items in X,Y.
On common machines, (short)(n + amt) = n + INT_MAX - amt - 1,
i.e. some items are stolen.
On an oddball machine with short as wide as int, the cast to short
does nothing, item_prewrite() oopses, and corrects the number of items
to zero.
Again, output and telegram lie.
Aside: setsector can suffer similar overflows, but it reports the
resulting change correctly. Good enough.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
edit: Don't permit putting a land unit or plane on two carriers
Only one of struct lndstr members lnd_ship, lnd_land may be
non-negative. When a deity screws that up, the server oopses. Be
nice: when setting one, zap the other.
Same for struct plnstr members pln_ship, pln_land.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
cmd key struct member wrong correct notes
-------------------------------------------------
edit l m sct_mobil 255 127 1
t sct_ptime 255 32767
edit c b nat_btu 1024 max_btus
edit p m pln_mobil 255 127 1
edit u F lnd_harden 255 127 1
Missing bounds supplied, arguments out of bounds are silently clipped
unless noted otherwise:
cmd key struct member bounds notes
---------------------------------------------------
edit c t nat_tgms 0 USHRT_MAX 2
m nat_reserve 0 INT_MAX
T... nat_level[] 0 infinity
edit s a shp_pstage 0 PLG_EXPOSED 3
b shp_ptime 0 32767
M shp_mobil -127 127
c... shp_item[] 0 load limit 4
edit u Y lnd_land -1 size of table 5
M lnd_mobil -127 127
S lnd_ship -1 size of table 5
Z lnd_retreat 0 100
c... lnd_item[] 0 load limit 4
edit p r pln_range 0 max range
s pln_ship -1 size of table 5
y pln_land -1 size of table 5
Notes:
1. Values between SCHAR_MAX and 255 were cast to signed char, changing
the sign.
2. The real upper bound is the number of telegrams in the mailbox, but
counting them isn't worth it.
3. This check is particularly important, because values out of bounds
make the server refuse to start without -F, and empdump -x warn
"export has errors, not importable as is".
4. Values outside 0..ITEM_MAX got caught and clipped by
item_prewrite(). This check avoids the oops, and tightens the upper
bound for units.
5. Argument out-of-bounds are rejected. This check is particularly
important, because unit numbers beyond the size of the table trigger
oopses.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
edit: Fix and unify handling of invalid country numbers
Negative numbers and numbers greater or equal than MAXNOC are invalid.
edit handles such arguments inconsistently:
cmd key struct member arg < 0 arg >= MAXNOC
---------------------------------------------------
edit l o sct_own reject MAXNOC - 1
O sct_oldown reject MAXNOC - 1
X sct_che_target 0 MAXNOC - 1
edit s O shp_own cast skip
edit u O lnd_own cast skip
edit p O pln_own cast skip
Legend:
0 replace arg by 0
MAXNOC - 1 replace arg by MAXNOC - 1
reject command fails
cast replace arg by (natid)arg
bug: can be >= MAXNOC!
skip ignore this key and arg
bug: telexes the owner he lost the unit, which is a lie
Unify to reject. Matches setsector.
Signed-off-by: Markus Armbruster <armbru@pond.sub.org>