-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathChangeLog-LambdaMOO.txt
2518 lines (2461 loc) · 145 KB
/
ChangeLog-LambdaMOO.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Version 1.0.0, 5 February 1991
-- First public release.
Version 1.1.0, 8 February 1991
-- recycle(x) now calls x:recycle() before destroying the object.
-- the little-used and functionally-dubious update() function has been removed.
**** NOTE: Technically, this change should make this a major release, since
**** it can break old code that depended on update() existing. In
**** practice, however, only $prog:@update used it (in LambdaCore.db,
**** anyway). Thus, to install this server, you should first @rmverb
**** $prog:@update, since its code would otherwise be syntactically
**** illegal.
-- added renumber() and reset_max_object(), to facilitate automatically
generating new versions of LambdaCore.db from the current LambdaMOO db.
-- made it so that only wizards can set the .name property of players; code in
the database now checks that players keep unique names.
-- added set_player_flag() and boot_player() to enable registration-style
player creation and @toad-ing.
Version 1.1,1, 12 February 1991
-- Much rearrangement of #include's to come as close as possible to conformance
with ANSI C and POSIX.
-- Many changes to improve portability, especially to sites with only 'nearly'
ANSI-compliant compilers.
-- Added backtrace-printing for tasks aborted for running too long.
Version 1.1.2, 13 February 1991
-- Fixed nasty infinite recursion problem on server panic.
-- Fixed the implementation of renumber() to really do the job. It's now much
more expensive (linear in the size of the database rather than constant
time), but at least it's correct. It's only intended for use on a tiny
DB anyway.
Version 1.1.3, 11 March 1991
-- Fixed benign unparsing bug that always parenthesized unary-minus
expressions.
-- Changed move() to insert the newly-moved object as the last item in the
contents list, rather than the first.
-- Fixed a less-than-benign bug in the unparsing of conditional expressions,
where 'x ? y | (z ? w | v)' was being unparsed without the parentheses.
-- Fixed a bug whereby an extra checkpoint timer was created every time the
'.dump' command was used.
-- Added printing the value of 'this' to error backtraces whenever it is
different from the verb location.
-- Fixed bug in propagation of property ownership on object creation.
-- WARNING: I believe that there is a storage leak somewhere in the server. If
so, it is not very fast. With any luck, I'll find it soon. For
safety's sake, check on the size of your server's address space
and reboot the server every few days if it's getting large.
Version 1.2.0, 11 April 1991
-- Fixed bug in parser that made 'after' a reserved word; this was part of an
old (and never completely implemented) alternative syntax for the 'fork'
statement.
-- Added memory_usage() function, to help in tracking down any memory-leak
bugs, among other things.
-- Removed ancient restrictions on players recycling themselves.
-- Changed recycle() so that children of recycled objects are not themselves
recycled. Instead, they are adopted by their former grandparent.
-- Fixed bugs in which errors are returned from move() in certain cases.
-- Removed useless error value E_BADMOVE.
-- Fixed bug in move() that allowed the enterfunc to be called even if the
object being moved was no longer valid.
-- Changed several uses of E_INVIND to E_INVARG; E_INVIND is now only used when
an attempt is made to fetch or store the value of a property or verb from an
invalid object.
-- Changed several functions to improve consistency in the order in which
certain kinds of errors are checked for.
-- Made the allocator keep track of statistics concerning memory usage by type
of object being allocated.
-- Changed queued_tasks() to return the value of 'this' in each task as well.
This new value is returned at the end of the sublist for each task, so old
code should continue to work unless it depended upon the exact length of the
sublists.
-- Changed set_task_perms() not to return E_PERM if the argument is the same as
the current permissions of the verb (i.e., if the change in permissions
would be a no-op).
-- Made tonum() and toobj() more robust in the face of extra spaces before or
after tokens.
Version 1.3.0, 7 June 1991
-- Removed the now-useless `.help' and `.mem' commands, and all code concerning
the also-removed CHECKMALLOC option.
-- Fixed allocation bug in inheritance of 'dobjstr' and its ilk, when the
current value of the variable has the wrong type (e.g., 'dobjstr' is a list
when another verb-call happens).
-- Fixed the timers implementation not to try to free storage inside an
interrupt procedure.
-- Changed move() so that :accept is called even if it's a wizard doing the
moving; of course, the wizards gets to do the move even if :accept returns
false.
-- Added 'off/off of' as a new preposition.
-- Fixed the built-in parser to return #-1 ($nothing) for the empty string,
rather than #-2 ($ambiguous_match).
-- Fixed a few bugs in how the allocator keeps track of types.
-- Fixed two memory leaks:
1) If you returned or aborted from inside an iteration over a list,
the list was never freed.
2) If you killed a task, its associated environment was never freed.
-- Added ticks_left() and seconds_left(), for determining how much longer the
current task will be allowed to run.
-- Reduced the maximum number of seconds for each task from 60 to 15.
-- Removed restriction that the first argument to notify() and boot_player()
must be a valid player object.
-- Removed the .shutdown and .dump commands.
-- Added shutdown() and dump_database() functions to replace their respective
built-in commands. The shutdown() function takes a single string argument
that is printed to all players as their connections are closed.
-- Added output_delimiters() as a way to discover the current PREFIX and SUFFIX
strings on a given connection.
-- Completely rewrote and modularized the network interface (now in
bsd_network.c), the main loop, connection-management, and checkpointing code
(now in server.c), and the task dispatcher (now in tasks.c).
-- Eliminated the notion of `clocks' associated with tasks. All tasks,
including forked tasks, begin execution with a full complement of ticks and
seconds. To make this reasonable, the task dispatcher maintains a separate
queue per player, with command tasks and ready forked tasks intermingled.
Thus, a malicious player who forks many tasks can only clog his own queue.
-- Eliminated the `command burst' heuristics from the dispatcher; this always
seemed like just a patch for having a fair dispatcher anyway.
-- Added a timeout for closing idle un-logged-in connections.
-- Removed the QUIT command; the boot_player() function can now be used for
that purpose. boot_player() now does a normal disconnect, including running
the disfuncs. At the same time, I made it allow players to boot themselves.
-- Because clocks have been eliminated, the lists returned by queued_tasks()
have changed somewhat, though in a mostly-compatible way. The clock ID and
clock ticks fields are both constant now, with the ticks equal to 20,000.
-- ****************** All processing of commands typed by un-logged-in players
*** VITAL NOTE *** has been moved into the database. Every un-logged-in
****************** connection is assigned a unique negative player number.
The functions notify() and boot_player() can be used by wizards to send
text to and to terminate such a connection, respectively, using that player
number as the connection identifier. Each line of input on such a
connection is first parsed into words in the usual way and then these words
are passed as the arguments to #0:do_login_command(). For example, the line
connect Munchkin frebblebit
would result in the following call being made:
#0:do_login_command("connect", "Munchkin", "frebblebit")
If #0:do_login_command returns a valid player object, then the connection is
considered to have logged into that player. When the connection is first
established, the null command is automatically entered, resulting in a call
to #0:do_login_command with no arguments. This signal can be used by the
verb to print out a welcome message, for example; this service is no longer
provided by the server.
Because of this change, it will be **NECESSARY** to add an implementation
of #0:do_login_command to your database *before* beginning to use version
1.3.0 of the server. The Minimal.db database and the version of the
LambdaCore database released concurrently with 1.3.0 already provide such an
implementation. The following code can be used as a simple implementation
that preserves most of the functionality of version 1.2.0:
if (callers())
"This code should only be run as a server task.";
return;
endif
if (args == {})
args = {"help"};
endif
command = args[1];
args = args[2..length(args)];
nargs = length(args);
if (command == "connect")
if (nargs < 1)
notify(player,
"Usage: connect <existing-player-name> <password>");
else
name = args[1];
password = nargs >= 2 ? args[2] | "";
for p in (players())
if (p.name == name
&& (typeof(p.password) != STR
|| (length(p.password) >= 2
&& crypt(password, p.password[1..2]) == p.password)))
p.last_connect_time = time();
return p;
endif
endfor
notify(player, "Unknown player or wrong password.");
endif
elseif (command == "create")
if (nargs != 2)
notify(player, "Usage: create <new-player-name> <new-password>");
else
name = args[1];
password = args[2];
for p in (players())
if (p.name == name)
notify(player, "That player name is already in use.");
return 0;
endif
endfor
new = create($player_class, $nothing);
set_player_flag(new, 1);
new.name = name;
new.aliases = {name};
new.programmer = $player_class.programmer;
new.password = crypt(password);
new.last_connect_time = time();
move(new, $player_start);
return new;
endif
elseif (strcmp(command, "QUIT") == 0)
boot_player(player);
else
msg = $welcome_message;
if (typeof(msg) != LIST)
msg = {msg};
endif
for line in (msg)
if (typeof(line) == STR)
notify(player, line);
endif
endfor
endif
return 0;
Of course, the whole point of bringing this code into the database is to
enable easy experimentation with new facilities for un-logged-in users, such
as multiple Guest players, friendlier coping with similarly-named players,
provision of a `who' command, etc.
-- The network interface now copes more nicely with running out of buffer
space for output to a player. Before, excess output was simply dropped on
the floor; now, it instead attempts to push it out the network socket and
only flushes output when that doesn't work. I was able to have a single
command send me over 60,000 characters of output without flushing any.
-- The PREFIX and SUFFIX strings are no longer printed either for the .program
command or for any of the lines of program input.
-- Recycled players with active connections are more promptly noticed and their
connections closed.
-- The numeric ID associated with forked tasks is now guaranteed to be the same
as the value of task_id() in that task when it executes.
-- The create() function now invokes the :initialize verb on the newly-created
object before returning it. It is not an error if there is no :initialize
verb defined on the object.
-- Changed listinsert() and listappend() never to generate E_RANGE errors.
Instead, the following expressions are now always equivalent:
listinsert(list, element, index)
listappend(list, element, index - 1)
{@list[1..index - 1], element, @list[index..length(list)]}
-- Changed the matching algorithm for verb names so that the old behavior of
`*' matching anything is generalized to `foo*' matching anything beginning
with `foo'.
-- Changed eval() and set_verb_code() to require programmer permissions.
-- Added a timezone abbreviation onto the end of ctime()'s result.
-- Added min(), max(), and abs() functions.
-- The messages printed for running out of ticks and for running out of seconds
are now disinguishable.
Version 1.4.0, 22 August 1991
-- Fixed a bug whereby running out of seconds might be misreported as running
out of ticks.
-- Fixed a bug whereby using `@' on a non-list in a verb's argument list could
end up passing E_TYPE as the value of `args'.
-- Fixed parsing bug that would ignore an extraneous comma at the front of an
argument list.
-- Changed random() to raise E_INVARG on non-positive numerical arguments,
rather than E_TYPE.
-- Fixed bug in handling of the case where a verb disappears between a
`.program' and the corresponding `.'.
-- Made it a type error to use <, <=, >, or >= either on operands of different
types or on lists.
-- Completely rewrote the MOO-code parser, unparser, and interpreter using a
new program representation based on vectors of bytecodes instead of abstract
syntax trees. This saves space and time and also allows the interpreter to
be iterative instead of recursive. This, in turn, allows us to implement
various operations that involve saving the entire state of a running task
for later resumption.
-- Added read() and suspend() functions, using the new capabilities of the
interpreter.
-- The new interpreter counts a few more ticks than the old one; in particular,
every IF, ELSEIF, and FORK now counts a tick. In view of this, and in view
of the improved performance of the interpreter, the ticks limit for tasks
has been increased from 20,000 to 30,000.
-- Added an indexed assignment statement for updating lists stored in variables
and properties.
-- Fixed bug in numeric comparisons where `-2147483647 > 1' was false but
`-2147483647 > 2' was true.
-- Fixed database dumping to detect and recover from filesystem errors. For
normal periodic checkpoints, the dump attempt is simply abandoned. For
panic and shutdown dumps, the server retries the dump from the beginning
after waiting 60 seconds (during which time, presumably, the archwizard will
fix whatever the problem was). In all cases, explanatory messages are
printed in the log. This should help mitigate the problems that arise when
there's no more room left on the filesystem on which the server is dumping.
-- Enhanced the callers() function to return the verb-location and initial
value of `player' for each caller.
Version 1.4.5, 20 September 1991
-- Made unparser failures panic the server rather than try to press on.
-- Changed the task scheduler in two important ways:
1) Effectively gave each player's input tasks a higher priority than
their forked or suspended tasks. This should both improve
interactive response and make it possible for users to recover from
accidentally forking off many tasks; they can now run commands to
kill those tasks and avoid having those commands wait behind all of
the forked tasks.
2) The scheduler no longer uses a strictly round-robin algorithm for
choosing which player's task to run next. Instead, it keeps track
of how many seconds have been consumed by each player's tasks and
runs the next task from the queue with the least total `usage'.
Fresh queues and those queues that are empty when it becomes their
turn to run again are kept apart from non-empty queues. When an
empty queue next gets a task to run, its usage is set equal to the
least usage of already-non-empty queues. Thus, such queues go to
the head of the list but have no advantage over the queues that were
never empty. This more complex scheduling scheme is intended to
ameliorate the problems with some players having long-running tasks
constantly runnable in the background; such players will now get
only their fair share of the server.
-- Fixed queued_tasks() to list the player being read from as the owner of a
reading task. This makes it consistent with kill_task(), which only allows
that player to kill such a task.
-- Fixed a bug with my use of signal() on some POSIX-compliant machines. One
possible consequence of the bug (actually manifest on the IRIS) is that all
checkpointing processes after the first one will never be waited for,
leaving `defunct' processes lying around until the server itself terminates.
-- Fixed a small bug in my use of ANSI C: the `typedef enum Opcode Opcode;'
line in opcode.h must come *after* the definition of `enum Opcode'; unlike
struct types, enum types may not be forwardly referenced. Thanks to yduJ
and the Lucid C compiler for finding this bug.
-- Fixed a bug in the line-number-finding code; this bug was identical to one
we fixed long ago in the unparser. Since the LNF code is *derived* from the
unparsing code, this is unsurprising. What's embarassing is that we forgot
to fix the LNF code at the same time...
Version 1.5.0, 3 November 1991
-- Added connection_name(player) to allow wizards some level of reasonable
control over whom they allow to connect to their servers.
-- Changed read() to accept an optional argument, player, specifying the player
from whose connection to read. If this argument is given, the check that
the current task is an input task is not done. The only good use for this
that I'm aware of is in conjunction with the next change...
-- The new compilation option OUTBOUND_NETWORK enables a new built-in function
called open_network_connection(). The arguments are specific to the network
module in use, but the intent is that they somehow specify a remote place to
which a network connection can be made. For the default, BSD networking
module, there are two arguments, a host-name string and a port number. The
function creates a connection to that place, if possible, and tricks the
rest of the server into believing that a normal connection just came from
that place. Open_network_connection() returns the negative object number
that is the pseudo-player object for that connection. One can then use
read() and notify() to send and receive lines of ASCII text on that
connection. Of course, if the server should ever receive a line of input
when there's no task read()ing from the connection, that input will be
treated as a command in the usual way. Also, unless the connection `logs
in' at some point, the usual five-minute timeout-if-no-input-received
connection shutdown will take place. The usual practice is to have the same
task that opens the connection go into an infinite loop read()ing from it.
As usual, boot_player() can be used to shut down the connection. This
function can only be called by wizards, of course. If the OUTBOUND_NETWORK
option is not used, then open_network_connection() still exists, but always
raises E_PERM.
-- Changed the bsd_network module to map tab to space on input, rather than
simply dropping tabs on the floor.
Version 1.5.1, 12 November 1991
-- Fixed bug in checkpointing whereby the server's command log was flushed even
if the checkpoint failed.
-- Various minor tweaks to make the server work on an IBM RS/6000.
Version 1.5.9, 6 December 1991
-- Gave different ticks/seconds limits to non-input tasks. They get only 15,000
ticks and 5 seconds.
-- The task seconds limit is now measured in server CPU seconds (as opposed to
wall-clock seconds) on systems that can support it.
-- Adding some simple object-hierarchy checking and (in very simple cases)
repair code to the DB reading process. If unfixable errors are found, the
server refuses to run.
-- Fixed minor inconsistency in the log format.
-- Fixed a few minor memory leaks.
-- Fixed a bug whereby the bottom frame of a suspended task that was read from
the database file could be given the wrong size runtime value stack.
-- Made the DB-reading code a bit pickier about the correctness of its input.
-- Tweaked create() to make it more properly initialize the new object's
location and contents.
-- Fixed bug in move() that could be tickled if an `accept' verb recycled
either the movee or the destination.
-- Fixed several bugs in recycle() that could (and did!) corrupt the contents
hierarchy in the database. The implementation is now much simpler, too!
Version 1.5.14, 3 March 1992
-- Various minor tweaks to make the server work on a Macintosh running A/UX.
-- Tweak to work around bug in isgraph() on systems that default to signed
characters.
-- Fixed bug in boot_player() that didn't allow players to boot themselves.
[I know it says under release 1.3.0 above that boot_players() already worked
this way, but as far as I can see, that was a lie!]
-- Fixed bsd_network startup sequence so that the server does not `listen' on
its port until after the DB has been read. Connections during the
DB-reading phase will most likely time out. I think this is better than the
old situation, in which those connections succeeded and then hung without
printing anything until the server finished reading in the DB.
-- Changed behavior of server when there aren't enough file descriptors to
accept a new connection. The server now arranges to stop just short of this
point and to immediately close any new connections after printing an
explanatory message.
-- Fixed properties(), verbs(), x.contents, and queued_tasks() to run in time
linear in the length of their results, rather than quadratic.
Version 1.5.20, 24 July 1992
-- Added check for an empty string as the second argument to strsub(); this now
raises E_INVARG.
-- Conditionalized the keeping of the command log; it is now controlled by the
LOG_COMMANDS symbol.
-- Removed a number of causes for GCC 2.1 to issue warnings about server code.
(Version 1.5.15)
-- Fixed an ordering bug whereby the task queue for a newly-connected player
was not fully initialized when the :confunc task(s) were run. In
particular, the new, connected queue was not marked as belonging to that
player, and certain functions like output_delimiters() would always fail
(not that that's a very interesting function to call in a :confunc, since
it's guaranteed to return {"", ""} then...). (Version 1.5.16)
-- Finally fixed the bug whereby it was possible to use chparent() to create a
situation in which an object defines a property with the same name as one
defined by one of its ancestors. Such an attempt now results in chparent()
raising E_INVARG. (Version 1.5.17)
-- Finally fixed the bug whereby add_property() allowed the definition of a
property in a parent that was already defined in a child. With this change,
it should no longer be possible to create a situation in which a parent and
child define properties with the same name. (Version 1.5.18)
-- Eliminated some minor warnings from the Dell SVR4 and HP/UX 9000 compilers.
(Version 1.5.19)
-- Added logging of all instances of x.wizard = 1.
-- The very first task run on booting the server is now a server task calling
#0:server_started() with player == #-1. This task runs even before the
server gets the value of $dump_interval in order to schedule the first
checkpoint. (Version 1.5.20)
Version 1.6.0, 13 August 1992
-- Changed MOO-code parser to generate the old version 1.3 program-
representation based on abstract syntax trees. These syntax trees are then
translated to vectors of bytecodes. This is much cleaner and easier to
understand than the old method; perhaps surprisingly, it also appears to be
significantly faster, too. (Version 1.5.21)
-- Added support for compilation on MIPS SVR3 machines.
-- Added support for a remote `checkpoint-request' signal (SIGUSR2), analogous
to the existing `shutdown-request' signal (SIGUSR1).
-- Changed unparser to first convert bytecodes to trees and then use output
routines from version 1.3 of the server. Same for line numbers.
-- Error tracebacks now include line numbers for all frames on stack.
(Version 1.5.24)
-- Cleaned up interpreter code.
-- Added sqrt() and server_log() built in functions (Version 1.5.25)
-- All built-in function registration procedures are now located in one list,
so it is easier to add new ones.
-- Added match(), rmatch(), and substitute() built-in functions to handle
regular expression searches. (Version 1.6.0)
Version 1.6.1, 14 August 1992
-- Fixed off-by-one bug in GNU regexp searching code. (*sigh*)
Version 1.7.0, 23 October 1992
-- Fixed behavior of index(), rindex(), match(), and rmatch() on empty pattern
and/or subject strings. (Version 1.6.3)
-- Added the prefix `> ' to all log messages generated by the server_log()
built-in function, so that they can be distinguished from server-generated
messages.
-- Added a compile-time option (OUT_OF_BAND_PREFIX) enabling a method of
entering commands that bypass both normal command parsing and any pending
read()ing task. If OUT_OF_BAND_PREFIX is #define'd (in config.h) as a
non-empty string, then any lines of player input that begin with that prefix
will be parsed into a list of words and those words passed as arguments in a
server task invoking #0:do_out_of_band_command. This is intended for use by
fancy MOO clients that need to send reliably-understood messages to the
server, such as window-event notifications.
-- Added output to the `.program' built-in command, stating that it is obsolete
and will be replaced `soon' (i.e., in the next release).
-- Rearranged the per-system configuration procedure for compiling the server;
now it should be easier for people to understand just what needs to be done
for their particular system. The user changes in the Makefile are now
confined to specfying details of the compiler; all other kinds of options
are handled by editing the `config.h' file, which has been radically
reorganized.
-- Renamed a few files (notably parse_command.[ch]) to fit within the
14-character limit imposed on certain systems. (Version 1.6.4)
-- Implemented reference counting on string and list values, replacing the old,
CPU-intensive deep copying method of storage management.
-- Added subrange assignment for strings and lists. Added indexed assignment
for strings. (Version 1.6.5)
-- Fixed bug whereby a read()ing task with no more input to consume was never
resumed if the connection being read was subsequently closed, from either
side. Now the read() call raises E_INVARG, just as it would if the read()
were begun when the connection was already closed and no more input was left
to consume.
-- Added TYPE_CLEAR value to properties, which cause property lookup on the
parent. Added built in functions `clear_property()' and
`is_clear_property()' to assist in TYPE_CLEAR property manipulation.
-- Added hash-lookup for properties and changed property definition
representation to be arrays instead of linked-lists, both to speed up
property lookup. (1.6.6)
-- Added support for multiple complete networking implementations. The first
use of this flexibility is a new SINGLE_USER option, which creates a version
of the server that accepts only one connection at a time and uses the
server's own standard input and output streams for it.
-- Added a new built-in property on objects, the `f' (for `fertile') bit; it
replaces the use of the `r' bit to allow children to be made of the object
by either create() or chparent(). That is, now those operations check that
the `f' bit is set and disregard the setting of the `r' bit. (Version 1.6.7)
******** Before upgrading an existing MOO to use this version of the server,
* NOTE * you should make sure that no object in your database already has a
******** property named `f'; the following MOO program, run by a wizard,
will perform this check:
for i in [0..tonum(max_object())]
o = toobj(i);
if (ticks_left() < 1000 || seconds_left() < 2)
notify(player, tostr("Checking ", o, " ..."));
suspend(0);
endif
if (valid(o) && "f" in properties(o))
notify(player, tostr("*** ", o.name, " (", o,
") has an `f' property!"));
endif
endfor
After eliminating all such properties from the database and restarting with
this version of the server, you should, as a wizard, run the following MOO
code to initialize the `f' bits of all of the objects:
for i in [0..tonum(max_object())]
o = toobj(i);
if (ticks_left() < 1000 || seconds_left() < 2)
notify(player, tostr("Fixing ", o, ".f ..."));
suspend(0);
endif
if (valid(o))
o.f = o.r;
endif
endfor
-- Reorganized the files so that all database modifying procedures were in one
of four modules. (Version 1.6.8)
-- Reorganized existing network protocol and multiplexing wait implementations
into a pluggable modular form. (Version 1.6.9)
-- Fixed bug in the interpreter that could pass a garbage program counter to
the line-number-finding code, used in printing error tracebacks. The l-n-f
code responded semi-robustly by printing a message in the server log and
returning a line number of zero. (Version 1.6.10)
-- Fixed bug whereby passing negative numbers to random() failed to evoke an
E_INVARG error.
-- Fixed a bug in MOO-code compilation that led to real nastiness if there were
more than 255 literals in a single verb.
-- Incorporated several new networking implementations, allowing for use by a
single-user (using the standard input and output streams of the server
itself), and by multiple users on either System V or BSD-style UNIX systems,
either with or without TCP/IP networking. (Version 1.6.11)
-- Fixed a bug in built-in function management that caused max() and min() to
always raise E_TYPE on some systems.
-- Added a new automatic configuration system to the server distribution, so
that people do not, in general, need to know much of anything about their
local system in order to compile the server. (Version 1.6.12)
-- Fixed a misfeature of substitute whereby it was not possible to include a
percent-sign in the string that was to survive into the output. Now, `%%'
is replaced by `%' in the output. (Version 1.7.0)
Version 1.7.2, 3 August 1993
-- Made tabs input as themselves, rather than being mapped to spaces. This is
necessary in order to communicate with Gopher servers from within the MOO.
-- Reduced the default `seconds-left' limit for task; forground tasks went from
15 to 5 seconds and background tasks from 5 to 3.
-- Fixed regular-expression matching to respect task seconds limits, aborting
the match.
-- Fixed bugs whereby both kill_task() and queued_tasks() would miss reading
tasks that had no ready input (i.e., whose associated task queues were
empty).
-- Fixed memory leak when a read() call fails with E_INVARG; the copied
interpreter stack was never being freed.
-- Fixed possible free of the null pointer during object recycling.
-- Fixed a number of places that generated warnings in newer versions of GCC.
-- Fixed inconsistency of the behavior of strcmp() between different server
machines; now it always returns one of 1, 0, or -1.
-- Added a five-second timeout to outbound connection attempts, aborting them
if the timer expires.
-- Made the error message to users about network buffers overflowing and lines
of output being flushed much more understandable.
-- Added log entry for each time the server refuses a connection due to being
full.
-- Fixed premature-free bug in preposition matching.
-- Bowing to popular pressure, removed warning from `.program' command about
its (no longer) imminent demise.
-- Added more error checks to options.h to make it easier for installers to
diagnose problems.
-- Fixed a bunch of auto-configuration problems encountered by installers.
-- Fixed a bug in substitute() where certain successful match() results were
rejected as invalid.
-- Removed restrictions that only player objects could be used in place of `x'
in the following:
object.owner = x
add_property(object, pname, value, {x, perms})
set_property_info(object, pname, {x, perms})
add_verb(object, {x, perms, names}, args)
set_verb_info(object, vname, {x, perms, names})
set_task_perms(x)
That is, non-players may now own objects, verbs, and properties, and running
tasks may take on the authority of a non-player.
-- Fixed bug where it was possible for a task to run out of seconds during a
call to set_verb_code() and have a truncated version of the program
installed as the new verb code. Now, either all of it gets installed or
none of it.
-- The log messages produced by successful open_network_connection() calls are
more useful now, containing the hostname and port of the connection.
-- Outbound network connections are no longer susceptible to connection
timeouts due to a lack of input.
-- Fixed a bug whereby verbs with numeric names screwed up DB loading, with the
wrong code getting put into some verbs and others getting no code at all.
Version 1.7.3, 4 August 1993
-- Outbound connections no longer get a spurious blank line of input as soon as
they're created.
-- Fixed stupid bug introduced in fixing bug in substitute().
-- Fixed some bugs in the Makefile and the configuration script.
Version 1.7.4, 10 August 1993
-- Fixed more configuration problems and warnings from GCC.
Version 1.7.5, 12 August 1993
-- Added more log entries during loading, to make it clearer where the time is
being spent.
-- Fixed a long-standing denial-of-service attack vulnerability, in which a
connection could keep the server from ever running any tasks at all by
*always* providing ready input.
Version 1.7.6, 11 October 1993
-- The built-in command parser now matches the (in)direct object string against
the names of objects as well as their aliases.
-- The server no longer calls :confunc or :disfunc directly when users connect
or disconnect; instead, it calls the following verbs on #0 in the
appropriate circumstances:
:user_created(USER)
When #0:do_login_command() returns USER, a valid player object
whose number is greater than the value max_object() returned
before the server called #0:do_login_command(). That is, when
a new user has been created.
:user_connected(USER)
When #0:do_login_command() returns USER, a previously-existing
valid player object for which no active connection already
existed.
:user_reconnected(USER)
When #0:do_login_command() returns USER, a previously-existing
valid player object for which there was already an active
connection.
:user_disconnected(USER)
After the end of a task that called either boot_player(USER) or
set_player_flag(USER, 0).
:user_client_disconnected(USER)
When USER's client unilaterally closes its connection to the
server.
******** Before upgrading an existing MOO to use this version of the server,
* NOTE * you should install the following verbs on #0 in order to remain
******** compatible with existing code; NOTE WELL that they should be
installed with the `d' permissions bit UNSET:
#0:"user_created user_connected"
user = args[1];
fork (0)
user:confunc();
endfork
user.location:confunc(user);
#0:"user_disconnected user_client_disconnected"
user = args[1];
fork (0)
user.location:disfunc(user);
endfork
user:disfunc();
-- Non-wizard users can now use the read() built-in function when they give a
connected object they own as an argument. Thus, it is possible, for
example, for a non-wizard to prompt itself for input.
-- The match() and rmatch() built-in functions now cache some number of the
most recently used patterns, somewhat speeding up the matching process.
-- The server now calls #0:checkpoint_started() whenever it starts to dump a
checkpoint of the database and #0:checkpoint_finished(SUCCESS) whenever the
dump finishes, where SUCCESS is true iff and only if the checkpoint was
successful.
-- Fixed a bug (!) in the built-in command parser whereby in the command
="This is in quotes" and this is not
the variable `verb' would correctly be set to "=This is in quotes" but the
variable `argstr' would be "is in quotes\" and this is not" instead of the
correct "and this is not". (Reported by Shirgall.)
-- Fixed some compilation problems with the SYSV/TCP configuration on Solaris
machines.
-- The value of `argstr' when the server calls either #0:do_login_command() or
#0:do_out_of_band_command() is now the raw command line as received from the
connection, as opposed to the empty string.
Version 1.7.7, 20 December 1993
-- Added some extra configuration tests and other changes to work around bugs
in HP/UX.
-- Fixed an output-timing bug in calling the #0:checkpoint_started() hook.
-- Fixed bug in the SYSV/LOCAL client whereby some output from the server could
be lost, never being printed.
-- Added the server FIFO file name to an error message in the SYSV/LOCAL
configuration.
-- Added the first rudimentary support for in-DB command parsing. Each user
command is broken up into words, a list of which is passed as the arguments
in a call to #0:do_command(), if it exists, with `argstr' initialized to the
raw command line typed by the user. If #0:do_command() does not exist, or
if that verb-call completes normally (i.e., without suspending or aborting)
and returns a false value, then the built-in command parser is invoked as
usual to handle the command. Otherwise, it is assumed that the DB code
handled the command completely and no further action is taken by the server
for that command.
Version 1.7.8, 30 September 1994
-- Many serious bugs in the MOO-code compiler (some server-crashing) were fixed
by rewriting the code-generator portion from scratch. This should fix the
problems some folks have had with panics due to `Unparse failed!'.
-- As a side-effect of the support I wrote for debugging the new code
generator, there is a new built-in function, disassemble(OBJ, VERB), which
returns a (longish) list of strings giving the `assembly-language' listing
for the compiled code of the verb VERB on the object OBJ. The permissions
checks are the same as for verb_code(OBJ, VERB). I don't make any promises
about how that output might change in later releases and I probably won't be
writing any detailed documentation of the opcode set, etc. Think of it as a
little puzzle gift, from me to you... :-)
-- Added a number of new configuration tests, especially to aid compilation on
the DEC Alpha running OSF/1 and any machine running NeXT Mach 3.1.
-- The checkpoint process now changes how its command line shows up in the
output of the `ps' command (on systems where that's possible), to make it
clear what process it is.
-- Added the first stages of a general new facility for customizing the
operation of the server dynamically, from inside the database. At a number
of times, the server checks for whether the property $server_options exists
and has an object number as its value. If so, then the server looks for a
variety of other properties on that $server_options object and, if they
exist, uses their values to control how the server operates. There are only
a couple of uses of this facility in 1.7.8; many more are expected in the
future.
-- As the first use of the above facility, the server uses the value of
$server_options.fg_ticks and $server_options.fg_seconds (if they exist and
are numbers) as the numbers of ticks and seconds allotted to command tasks
and server tasks; the values of DEFAULT_FG_TICKS and DEFAULT_FG_SECONDS in
options.h are used if the corresponding properties either don't exist or are
not numbers. Similarly, the values of $server_options.bg_ticks and
$server_options.bg_seconds are used for forked tasks and suspended tasks,
falling back on DEFAULT_BG_TICKS and DEFAULT_BG_SECONDS. These properties
are looked up anew every time a task begins or resumes execution.
-- As the second use of the $server_options facility, on every call to a
built-in function `foo()', if the property $server_options.protect_foo
exists and is true, and the programmer is not a wizard, then E_PERM is
raised. Thus, for example, to make the `chparent()' function wiz-only,
simply set $server_options.protect_chparent to 1.
-- Fixed a bug in the MOO-code unparser where any use of a string naming a MOO
keyword as a property or verb name would be unparsed in such a way as to
make the resulting code syntactically incorrect. Thus, for example, the
expression
x.("while")
now unparses into the same code, instead of into
x.while
which won't parse properly.
-- The server now uses a pair of additional (smallish) UNIX processes to
perform all network host-name lookups. Under the new system, it can
reliably abort stalled lookups without causing problems; in particular, this
provides the real fix for the long-standing `VM exhausted' problem on NeXT
machines.
-- A few small storage leaks were fixed.
-- A number of new progress-report log messages were added to the DB loading
process.
Version 1.7.8p1, 3 October 1994
-- Fixed a file-descriptor leak in the new name-lookup code; if the server has
enough name-lookup timeouts, killing the name-lookup worker process over and
over, then the name-lookup intermediary will eventually run out of file
descriptors and fail, shutting down name-lookup services until the server is
rebooted.
-- Fixed a minor portability problem in the new code generator; believe it or
not, there are still C compiler's out there (on Ultrix, for example) that
don't implement initializers for locally-declared structures...
-- Fixed a bug in disassemble() whereby it couldn't find !x verbs.
Version 1.7.8p2, 6 October 1994
-- Fixed another little bug in disassemble(), whereby it could crash the server
if you try to disassemble an unprogrammed verb.
-- Added a hard minimum of 100 ticks and 1 second for all tasks, to prevent
disaster when somewiz somewhere blows the values of $server_options.fg_ticks
and company.
-- Fixed a bug whereby the new name-lookup code would fail to recognize even
dotted-decimal numeric addresses once the intermediary was presumed dead.
-- Fixed a null-pointer free in the disassembler that was crashing servers that
were using the GNU malloc() implementation.
-- Added Craig Horman's patch to the regex.c code for the Alpha, which avoids
occasional random failures of the matching code. I don't know why it took
me so long to apply this...
Version 1.7.8p3, 19 October 1994
-- Fixed a typo in the "hard minimum" code added in 1.7.8p2; the minimum
seconds allocation is now really 1, not 2...
-- Fixed a bug in the disassembler wherein it could produce garbage or even
possibly crash the server if the C compiler decided to evaluate certain sets
of function arguments in other than left-to-right order.
-- Fixed a bug in is_clear_property() that could attempt to access an
uninitialized variable. (Thanks to Quowong P Liu for pointing out this and
others of the bugs fixed in the various 1.7.8 patch releases.)
-- Fixed a bug whereby the server was, on some systems, always susceptible to
being shut down prematurely by the `hangup' signal. Now, the `restart'
script uses `nohup' and the server continues to ignore SIGHUP if it was
started ignoring it (i.e., by `nohup').
-- Fixed MOO-level tracebacks to include lines for built-in functions that call
verbs, such as eval(), move(), etc.
-- Added MOO-level traceback printing for all server panics that happen during
the execution of a MOO task.
Version 1.7.8p4, 2 November 1994
-- Fixed minor memory leak in disassemble().
-- Fixed bug whereby verb_info() and friends allowed an argument of "" to
always match the first verb on an object.
-- Fixed bug whereby MOO keywords (e.g., `if', `E_PERM', `return', etc.) were
case-sensitive.
-- Fixed (I hope...) the 32-bit assumptions that break on the (64-bit) Alpha.
Version 1.7.9alpha1, 25 September 1995
-- Fixed a few minor configuration and portability problems.
-- Fixed a potentially server-crashing bug in subrange assignments.
-- Renamed the internal server function `log()', to avoid name conflicts with
the logarithm function in the math library.
-- Changed the name-lookup subsystem to be more optimistic about the chances of
eventually recovering from an earlier failure to restart the lookup process.
Also bullet-proofed it against problems with its read() calls getting
interrupted by the checkpoint timer.
-- Added a paragraph to `README' explaining how to boost the limit on the
number of connections a server can support.
-- Added two new built-in functions enabling faster case-sensitive tests:
equal(X, Y) returns true iff the values X and Y are completely equal,
including the case of any strings they might contain; this is just
a case-sensitive version of the `==' expression.
is_member(X, L) is a similarly case-sensitive version of `X in L'.
-- Made the `.program' built-in command wiz-only if
$server_options.protect_set_verb_code exists and is true.
-- Added the built-in function `set_connection_option(CONN, OPTION, VALUE)',
for controlling various optional behaviors on the connection CONN. The only
allowed values for OPTION in this release are as follows:
"hold-input" -- if VALUE is true, then input received on CONN will
never be treated as a command; instead, it will remain in the queue
until retrieved by a call to read().
"client-echo" -- (NP_TCP configurations only) sends the Telnet Protocol
WON'T ECHO or WILL ECHO commands (depending on whether VALUE is
true or false, respectively). For clients that support the Telnet
Protocol, this should toggle whether or not the client echoes
locally the characters typed by the user. Note that the server
never echoes input characters under any circumstances.
-- Fixed stupid bug that let people lose by setting $server_options.fg_ticks
and company to negative values.
-- Added an optional second argument to the `read()' built-in function. If it
is provided and true, then this call to `read()' will not suspend the
calling task under any circumstances. If there is input currently
available, it will be returned immediately; otherwise, `read()' returns 0.
(As before, if no input is available and no more is coming, `read()' raises
E_INVARG as an end-of-input indicator.)
-- Added flow-control to the server's input-handling: if more than a reasonable
amount of unprocessed input accumulates for any connection, the server will
temporarily stop trying to read from that connection at all, until the
backlog drops down substantially.
-- Fixed a longstanding bug in match() that could make it return garbage in
certain circumstances. More bugs in match() almost certainly still exist.
(Thanks to Judy Anderson for finding this.)
-- Fixed a minor memory leak in the case where #0:do_command() exists and
returns a list or string value. (Thanks to Ian Macintosh for finding this.)
-- Fixed a possible race condition in the TCP networking code, where a timer
could go off before we've installed the exception handler. (Thanks to Alex
Stewart for finding this.)
-- Officially deprecated the USE_GNU_MALLOC option in options.h, since it's not
aging very well.
-- Completely replaced the regular-expression matching implementation that
underlies match() and rmatch(); it used to be the GNU `regex' package and is
now the GNU `RX' package shipped with GNU `sed'. This may not eliminate all
bugs in match(), but it almost certainly has moved them around a bit.
********** The old GNU regex package had a bug in its handling of certain
** NOTE ** patterns with parentheses in them, and it is reasonably likely
********** that many MOO programmers have, perhaps unconsciously, come to
depend upon this buggy behavior. Unfortunately for such programmers, RX
does not have this bug, so you will want to fix your regular expressions
before upgrading to this release; the fixed patterns will work correctly on
both releases.
The old bug concerns patterns of the form `%( ... %)*', that is, a starred
parenthesized sub-pattern; for example, consider the MOO expression
match("foo", "%(o%)*")
Using the old regex package, this returns
{2, 3, {{2, 3}, {0, -1}, ...}, "foo"}
which is *wrong*; the last successful match of the parenthesized sub-pattern
covered just the third character, not the second and third ones. Using the
new RX package, this expression returns the proper value:
{2, 3, {{3, 3}, {0, -1}, ...}, "foo"}
To get the effect of the old bug, you need another set of parentheses around
the whole starred sub-pattern:
match("foo", "%(%(o%)*%)")
Under both GNU regex and RX, if M is the result of this expression, we have
M[3][1] == {2, 3}
You should look carefully at your uses of match() and rmatch() before
upgrading to this release, fixing those places where your code depends on
the old, buggy behavior.
-- Added an optional third argument to the built-in function notify(); if it is
provided and true, and if there isn't enough room left in the given user's
output buffer to hold the given line, then notify() will return false and
the line will not have been queued for output. In all other circumstances,
notify() now returns true. If the new optional argument is false or not
provided, then the old behavior is invoked, in which some of the
already-queued output is discarded to make room for the new line.
-- Made it possible to change the maximum verb-call depth from inside the DB.
The MAX_VERB_DEPTH constant in options.h was replaced by
DEFAULT_MAX_STACK_DEPTH, which can be overridden by
$server_options.max_stack_depth. The maximum stack depth for any task is
set at the time that task is created and cannot be changed thereafter. This
implies that suspended tasks, even after being saved in and restored from
the DB, are not affected by later changes to
$server_options.max_stack_depth.
-- The task scheduler is now guaranteed never to assign a task_id() of zero.
-- The built-in functions notify(), connected_players(), connected_seconds(),
idle_seconds(), connection_name(), and set_connection_option() now treat
connections on which boot_player() has been called as if they did not exist.
-- A number of the messages printed to a connection by the server under various
circumstances can now be customized or eliminated from within the DB. In
each case, a property on $server_options is checked at the time the message
would be printed. If the property does not exist, the standard message is
printed. If the property exists and its value is not a string, then no
message is printed at all. Otherwise, the string is printed in place of the
standard message. The following list covers all of the newly customizable
messages, showing for each the name of the relevant property on
$server_options, the default/standard message, and the circumstances under
which the message is printed:
timeout_msg "*** Timed-out waiting for login. ***"
This in-bound network connection was idle and un-logged-in for
at least CONNECT_TIMEOUT seconds (as defined in options.h).
recycle_msg "*** Recycled ***"
The logged-in user of this connection has been recycled.
boot_msg "*** Disconnected ***"
The function boot_player() was called on this connection.
redirect_from_msg "*** Redirecting connection to new port ***"
The logged-in user of this connection has just logged in on
some other connection.
redirect_to_msg "*** Redirecting old connection to this port ***"
The user who just logged in on this connection was already
logged in on some other connection.
create_msg "*** Created ***"
The user object that just logged in on this connection did not
exist before #0:do_login_command() was called.
connect_msg "*** Connected ***"
The user object that just logged in on this connection existed
before #0:do_login_command() was called.
-- The `for VAR in [EXPR..EXPR]' looping construct can now be used with either
numbers or object numbers. That is, the construct `for o in [#0..#100]' is
now legal and does the obvious thing. NOTE that in the example `o' will
take on each of 101 object numbers in the specified range, regardless of
whether or not those object numbers are valid.
-- By popular request, added the built-in function `value_bytes(VALUE)', which
returns the number of bytes of memory required to store the given value. [I
was also asked to provide an `object_bytes(OBJ)' function, to give the total
memory required to store the given valid object, but I wanted to think
longer about possible interactions with 1.8.0's new modularity wall between
the DB implementation and the rest of the server.]
-- At long last, there is a DB-settable limit on the number of queued tasks any
single user can have at once. If $server_utils.user_task_limit exists and
is a non-negative number, then that is the `task limit' for normal users;
otherwise, the task limit is infinite. For wizards, the task limit is
controlled similarly by $server_utils.wizard_task_limit. Whenever a `fork'
statement or `suspend()' call are executed, the server checks whether or not
the current verb's owner (really, the current task perms) is already at or
above their task limit; if so, E_QUOTA is raised instead of either forking
or suspending. Reading tasks are not affected by the task limit.
-- The result of `tostr(E_QUOTA)' has been changed to the string
"Resource limit exceeded".
-- Applied Alex Stewart's pAS4 patch, which modifies the result of the
built-in function `connection_name()' on TCP networking configurations to
contain the remote port of the connection as well as the host name, in the
following format:
"99 from FOO.BAR.COM, port 9999"
As before, the first number in the result is pretty useless to MOO
programmers (it's the server's file descriptor for the connection) but can,
believe it or not, occasionally be useful to the maintainer.
******** Before upgrading an existing MOO to use this version of the server,
* NOTE * you should modify the verb $string_utils:connection_hostname_bsd as
******** follows:
@chmod $string_utils:connection_hostname_bsd -d
@program $string_utils:connection_hostname_bsd
s = args[1];
return strsub($string_utils:explode(s)[3], ",", "") || "";
.
This code should work compatibly with either version of the server.
-- Applied the key part of Alex Stewart's pAS7 patch, which fixes a problem
with the server occasionally hanging under Sun's Solaris 2.X system. [I
just removed the (useless) call to `shutdown()'; the SO_LINGER setting
didn't seem necessary or very useful.]
-- Added a new item to options.h, UNFORKED_CHECKPOINTS (off by default), that
prevents the server from forking a separate process to make checkpoints;
instead, the main server process performs the checkpoints itself, halting
all user interaction and MOO task execution for the duration.
-- Made the server's log output during the initial database load *slightly*
easier to understand.
-- Removed perhaps the last hard limit in the server; you can now have input
lines with more than 500 words on them. (Thanks to Bill Drury for sending
the message to MOO-Cows that finally got me to fix this longstanding bug.)
-- Disallowed empty verb names and those made up only of spaces.
-- Added a new built-in function `toliteral(VALUE)' such that
eval("return " + toliteral(VALUE) + ";") == {1, VALUE}
for all MOO values.
-- The `create()' built-in function will now create children of #-1.
-- Added an `emergency wizard mode' to the server's start-up sequence; if you
give an initial `-e' option on the command line, then after loading in the
database but *before* running #0:server_started(), the server will use its
standard input and output streams to allow execution of wizardly `eval'
commands and re-programming of verbs. For more details, type `help' from
inside the mode.
-- The verbs #0:user_disconnected() and #0:user_client_disconnected() are now
called for un-logged-in and outbound connections, too, just as they are for
logged-in ones.
******** Before upgrading an existing MOO to use this version of the server,
* NOTE * you should check your versions of these verbs to ensure that they