Short list of differences between 2.0 and 2.0.3: - The ability to run Minix under DOS. - New and improved network task. More stable then the old inet, and allows for user-space serial IP (PPP). ("Allows for" means that only a simple SLIP daemon is supplied. Look for PPP elsewhere.) - Network configuration changed from behind the times RARP to modern DHCP, see boot(8). - Disk like devices (/dev/hd*, cd*, sd*) changed to generic controller names (/dev/c0d*, /dev/c1d*, etc.). Read controller(4) for the gory details. Example: /dev/c0d0p1s0 is now what used to be /dev/hd2a! (It may not seem like it, but this is a simplification.) - The 4 gigabyte disk limit has been replaced by a 2 terabyte limit. (IDE disks still limited to 128G though. Individual partitions also still limited to 4G.) - The Minix /bin/sh is replaced by the BSD shell (formerly /usr/bin/ash.) Makes life easier (always line editing), but is also more memory hungry, which is why we have: - A simple form of swapping that may make life on really old crates bearable. (Alas it isn't good enough to counter the memory need of the BSD shell, so 2.0.3 needs more than 640K in 16-bit mode. This will be fixed in a next version, promise.) - Console driver lines/columns is no longer fixed at 80x25. (See boot monitor's 'console' variable.) - The 'cc' driver now does separate I&D by default. You need 'cc -com' to get common I&D binaries. (Only the bootstraps really need this.) - Its now enough to use 'cc -D_MINIX' to have all POSIX, common UNIX and Minix extensions defined. (One used to use -D_MINIX -D_POSIX_SOURCE). - In 16-bit mode, what used to be 'cc -m' is now the default. The new 'cc -m' behaviour is to change C code to K&R style before passing it to the C compiler to reduce memory use even further. - Support in MM for #! to name the interpreter in scripts. Random scripts are no longer seen as shell scripts, #!/bin/sh is required. - Startup scripts (/etc/rc, /usr/etc/rc) rewritten. Single user mode (boot -s) to interrupt the boot process and do repairs. Daily cleanup scripts that are run each night from cron, not just at reboot. Minix can now run continuously. (Ignoring the little fact that the clock tick counter will overflow in 414 days.) Short list of changes in commands: - pc, m2: Pascal and Modula-2 compilers. - readclock -w: Write the current time into the CMOS clock. readclock -2: Add 20 years to compensate for a clock with a Y2K bug. - Several old, useless or minix-only commands removed. Short list of changes in manual pages: - New: pc(1), m2(1), env(1), uptime(1), xargs(1), crontab(1), dosd(4), ACK(7), cron(8), config(8), dosminix(8), serial-ip(8), slip(8). - Changed: cc(1), installation manuals. Long list of differences between 2.0 and 2.0.3: (Warning: This list is riddled with lame jokes and other silly things that happen to sneak in when doing something as boring as compiling this list.) include/ansi.h Sets _POSIX_SOURCE if _MINIX is set. This means that just 'cc -D_MINIX' is enough to also add posix support. (Makes no sense without anyway.) include/configfile.h New header file for the common configuration file format. include/dirent.h Include by itself. This fixes the bug that required to be included before most things in C source files. Many other standard include files also do this, but I won't bore you by mentioning them here. include/ibm/cmos.h include/ibm/portio.h Definitions for the CMOS clock and IBM port I/O routines. include/minix/com.h Appearance of the DOSDSK task. include/ibm/int86.h Defines 'union reg86', a type used to carry register values for interrupt calls. Used by the BIOS and DOS drivers, and by the experimental user mode BIOS calls. include/ibm/partition.h Unused older Minix partition type removed. include/minix/boot.h Removed. MM and FS use a new system call to get boot parameters, a call that can also be used from user space (see svrctl and sysenv). include/minix/callnr.h New svrctl system call, an ioctl like call for servers and tasks. Is used to implement small stuff for which a full blown system call is too much honour. include/minix/com.h One task renamed (DL_ETH -> DP8390) and several changed from specific names (CDROM, SCSI, WINCHESTER) to a generic controller name (CTRLR(n)). The OPTIONAL_IO attribute is replaced by DEV_SCATTER and DEV_GATHER device codes to write to or read from an array of blocks. include/minix/config.h Release and version number changed from 3 digits to just 2. With one release every so many years we don't need three levels. ROBUST setting removed, because it is the opposite of robustness. NR_CTRLRS added, specifying the number of controller tasks. ENABLE_NETWORKING removed. The inet server is no longer part of the kernel image. It is optionally started later as a program. ENABLE_ATAPI added for the ATAPI (CDROM) support in the AT/IDE driver. Cosmetic change of "ADAPTEC" in "AHA1540" in this and several other files. Added ENABLE_FATFILE and ENABLE_DOSFILE for two "file as disk" drivers. ENABLE_DP8390 is a new master switch for the network drivers based on the DP8390 chip. Code for specific cards can be turned on with ENABLE_WDETH, ENABLE_NE2000, and ENABLE_3C503. Atari and shadowing code removed. It's not used, so I can't maintain it working with respect to other changes. include/minix/const.h Copyright changed to tell you that /usr/src/LICENSE contains the new BSD style license. "Do what you want with this, but don't mention us, and don't blame us for anything" is what us normal people think the lawyers are saying there. CLICK_SIZE increased from 256 to 1024 to make swapping to disk more efficient. Has the side effect of increasing the maximum addressable memory in 16-bit protected mode to 64 MB. (You need 512 processes of 128K to reach that amount. The process tables can't possibly be that big.) include/minix/partition.h Partition base and size are now u64_t, a structure posing as a 64 bit number. include/minix/swap.h Describes the header used on swap files/partitions. include/minix/u64.h A buch of routines for 64 bit operations. There is no 'long long', so we have to make do with this. include/net/ Complete overhaul for the new network task. include/signal.h SIGCHLD signal (child terminated) added to the supported set. _NSIG raised from 16 to 17. include/stdio.h Added snprintf() and vsnprintf() to help code to combat buffer overflows. include/string.h Added strncasecmp() and strnlen(). include/sys/ioctl.h Some new calls for the network task. New calls for user mode BIOS calls and manipulating LDT entries (memory mapping.) Mitsumi CD-ROM ioctls removed. include/sys/svrctl.h New svrctl for odd system calls: Calls for a program to sign on as a server (inet), swapon/off, get boot parameter. include/sys/types.h New u64_t type defined as a struct of two u32_t's. src/LICENSE Removed: "Free for educational use" license. Added: "Free for any use" BSD style license. src/Makefile You can now make 'world', 'libraries', 'all', and 'install'. Just type 'make' to see what each does. src/boot/ Edparams command merged into boot.c, block caching removed to reduce complexity, simply "one command" functions don't need {}, 'memsize' and 'emssize' removed in favour of 'memory', new 'leader' and 'trailer' functions to print greeting messages. A20 enable/disable code in boothead.s has special code for PS/2 machines. Bootblock no longer fiddles with the floppy parameters. Really old crates that expect this no longer boot without a workaround. New systems that do not expect this now work. Sit in a HLT to save power while doing nothing. Use new BIOS calls to break the old 8G BIOS barrier. Limit now 2T. BOOT.COM and MKFILE.COM code ported from Minix-vmd. Extboot code replaced by more generic jumpboot bootstrap. Knowledge of controller style devices added, while remaining backwards compatible to I don't know when. src/commands/aal/ Added 'u' flag to make aal more ar compatible. src/commands/ash/ Ash no longer runs any old file as a script if it has executable bits. It leaves this to execve(), and execve only runs scripts that start with #!. Don't turn on -e or -x until .profile is done. src/commands/cron/ New cron backported from Minix-vmd. Has per-user cronjobs and stuff. See cron(8) and crontab(1). src/commands/dhcpd/ New DHCP client/server program. See dhcpd(8) and dhcp.conf(5). src/commands/i386/asmconv/ GNU assembly parser added by R. Veldema, but still buggy. Fixes by Will Rose not yet incorporated. (I totally forgot about this until I saw it here while I compiled this list for 2.1.) src/commands/i386/mtools-3.9.7/ New mtools command to operate on FAT file systems to replace the buggy dos{dir,read,write} on 386+ systems with enough memory. Type 'mtools' to see how it works. The manual pages were junk, so the're not added. With -? you can figure it all out. (I really should start a commands/big hierarchy.) src/commands/i86/cc.c ASCII EM parser added to translation tables. "What's that?", you say? ACK translates from high level to an abstract machine, named EM, which in turn is translated to the target machine. The ability to compile ASCII EM code is nice for machine independent libary files written in EM assembly. Made 'cc -m -i' the default. Repaired the irrel pass (-m) to not choke on big functions, and made it able to turn a standard C file to K&R for the new -m flag. src/commands/ibm/ Removed the Mitsumi stuff (cdplay, etc.). src/commands/ibm/loadfont.c Changed to be able to load the appropriate font from a combined font file, a file that contains 8x8, 8x14, and 8x16 dot fonts. Font files in /usr/lib/fonts/ replaced by combined fonts. src/commands/ibm/part.c Changed to know about controller devices and 64 bit disk offsets. Still user-hostile/expert-friendly. src/commands/ibm/readclock.c Revamped to properly set the clock (Philip read a data sheet), and a Y2K kludge to add 20 years to a clock set 20 years back because it can't run in 2000. (Options -w and -2.) Reads a TZ boot variable that tells the timezone of the hardware clock. Use 'TZ=GMT0' and forget about summer and winter time changeovers. (Windows will go bonkers, of course, which is why my Windows systems use the timezone of Casablanca. Windows doesn't know what time it is no matter what timezone you use.) src/commands/make/ An "include" command added to the syntax. Timing problem on fast machines fixed. src/commands/reboot/ Log shutdown messages in /usr/adm/log instead of authlog. (Reduces the number of logfiles to one.) src/commands/scripts/DESCRIBE.sh src/commands/scripts/MAKEDEV.sh Code to describe/create new ethernet and controller devices added. src/commands/scripts/cd.sh A script for all the commands builtin to the shell. Simply lets the shell do the work. Thanks to the new #! stuff in MM this can work. Does [, cd, command, echo, expr, false, getopts, read, test, true, umask, and wait. Does away with any C code for same. src/commands/scripts/clear.sh Short for 'tget -str cl'. Replaces clr.c thanks to #!. src/commands/sh/ Old Minix shell. Now installed as /usr/bin/msh. src/commands/simple/at.c Still puts an at job in /usr/spool/at/, but alerts cron to this instead of letting the now dead atrun command run the job. src/commands/simple/cleantmp.c New command to carefully clean out /tmp directories. src/commands/simple/cp.c Uses a temp file for hard link administration so that it no longer blows up trying to keep track of too many hard links. src/commands/simple/crc.c Use strerror() to print a meaningful error message instead of just "cannot open". Not a very spectacular change, but I wanted to pay attention to this, as many programmers still have lousy error reporting in their code. src/commands/simple/date.c Added a bit of silliness in the form of a -S flag. It gives the time as "eternal september". September used to be the time that new, uneducated, college students learned about the net. With the start of Prodigy and AOL close to september 1993 some say that that month never ended. It's Sun Sep 2805 17:28:16 CEST 1993 when I write this. :-) src/commands/simple/df.c Replaced by the Minix-vmd version that has many more options, including POSIX mandated 'df -P'. src/commands/simple/ed.c Added 'ed -s' as a synonym for 'ed -'. Fixed a bug with character classes that went unnoticed for an amazing time. (Using two regular expressions went bad on the second.) src/commands/simple/env.c New environment manipulation command. Not very useful, but POSIX mandates it. src/commands/simple/fsck.c "Huge directory" warnings removed. Directories really can get big. Errors with overflows on filesystems with exactly 65535 inodes fixed. src/commands/simple/getty.c Run a shell on the console if you can't execute login. src/commands/simple/grep.c Grep fix to work properly as grep and also as egrep. I believe Michael Haardt gave me the patches. src/commands/simple/hostaddr.c Changed to use data gathered by DHCP. src/commands/simple/intr.c Used in /etc/rc to connect a program back to the console, because /etc/rc is now run completely disconnected to keep programs from having a process group and dying when /etc/rc is done. src/commands/simple/irdpd.c Old "look for a router" daemon. Still available for odd cases, but replaced by DHCP normally. src/commands/simple/isoread.c Fixed by Al Woodhull so that it now actually works. src/commands/simple/kill.c You can now use 'kill -HUP' instead of 'kill -1'. See signal list in sigaction(2). src/commands/simple/last.c Show time since boot if called as "uptime". src/commands/simple/ls.c The -T option shows time to the second. -D (formerly -T) sorts by file type. This is a halfbaked ls, whole alfabet still far from fully used as option letters. src/commands/simple/mkdir.c Allows you to write 'mkdir -m 755' too. The -m option used to only do symbolic modes, as if anyone can remember how. src/commands/simple/mkswap.c New command to initialize swap partitions or files as such. src/commands/simple/mount.c src/commands/simple/umount.c Let mount and umount turn on/off swapping with -s. src/commands/simple/nonamed.c Use the name daemons found by DHCP for information. Added a cache to make it useful for offline use. src/commands/simple/printf.c New command that is works like the printf() library function. It's a new echo that doesn't suffer from BSD vs SystemV incompatibilities. (Under SystemV the behaviour of 'echo -e' is the default.) src/commands/simple/rarpd.c Dumbed down to be a pure RARP daemon. It used to configure the network devices, but that is now dhcpd's job. src/commands/simple/slip.c Implementation of the SLIP protocol, but no header compression. Merely an example of Pseudo IP network device programming. Real PPP programs can be obtained at the other side of the world. src/commands/simple/stat.c New command that is the shell level equivalent of the stat(2) system call. src/commands/simple/stty.c Taught about pixel sizes, mostly useful to guess the console font size. src/commands/simple/sysenv.c New command to show the boot environment with the help of the svrctl(2) system call. Just type 'sysenv'. src/commands/simple/tcpd.c Has a normal and a paranoid version. The latter is run if /etc/serv.access exists to enable network access restrictions. src/commands/simple/xargs.c New xargs command obtained from BSD. src/commands/urlget/ New command to get a file from a Web or FTP site. src/etc/hostname.file This and more files added as defaults to fill /etc/ with (mkdist). src/etc/inet.conf New configuration file for inet. src/etc/profile Timezone now by default GMT instead of CET. (I happen to be in The Netherlands, i.e. the CET timezone. You shouldn't be bothered by that fact.) src/etc/rc Large changes in system startup. /etc/rc now knows a single user mode (boot -s) and calls /usr/etc/rc to do the hard work. (Inspired by Minix-vmd.) src/fs/Makefile FS is now needs the -lsys library for calls to the system task. src/fs/cache.c The scatter/gather I/O has been rewritten. It used to use a vector of individual (position, buf, nbytes, read/write) requests. This was too rich for the way it was used. Now a single starting disk position is used, its all reads (GATHER) or all writes (SCATTER) and the vector only describes memory as (address, size) pairs. So one big disk block is read into a bunch of memory blocks, or written from a bunch of memory blocks. (In retrospect the gather = read and scatter = write names should have been reversed. "Gather" just reminds one too much of reading and scatter of writing.) One important point is that the device drivers only need to do the first element of the memory vector, the rest is optional. So a floppy disk driver may stop at the end of a track. The write code in cache.c knows this and will repeat a scatter operation until all the dirty blocks are written out. src/fs/device.c The interface to the devices has been improved. In order to "open" a device one used to do this: major = (dev >> MAJOR) & BYTE; task = dmap[major].dmap_task; dev_mess.m_type = DEV_OPEN; dev_mess.DEVICE = dev; dev_mess.COUNT = R_BIT|W_BIT; (*dmap[major].dmap_open)(task, &dev_mess); r = dev_mess.REP_STATUS; All this tedious code has been replaced by: r = dev_open(dev, FS_PROC_NR, R_BIT|W_BIT); In many places in FS one can find dev_open() and dev_close() replacing the seven line equivalent. The existing dev_io() routine has had its arguments rearranged a bit, but is basically unchanged. (Only the specific "nonblock" flags became a generic "flags" field.) The dev_*() routines use the dmap[] table to interface to a several kinds of devices. Usually its gen_opcl() and gen_io() for generic devices. (Note that separate open and close routines have been mapped to a single opcl.) Some devices require special processing, so there is tty_opcl() for terminals to do "controlling terminal" stuff, ctty_*() for /dev/tty, and clone_opcl() for the TCP/IP server. Ergo: dev_open(), ---> dmap_opcl ---> gen_opcl(), tty_opcl(), dev_close() ctty_opcl(), clone_opcl() dev_io() ---> dmap_io ---> gen_io(), ctty_io() The *_opcl() functions also use dev_io()/dmap_io to pass there request down to the device after doing special open/close processing. (Whether they use dev_io() or dmap_io depends on what is convenient at a given point in the code. Dev_io() builds a message and chooses the proper dmap[] entry, something one may have already done.) src/fs/main.c Main now uses the new sys_sysctl() call to get boot parameters out of the kernel. (Sys_sysctl() is the kernel interface of the new svrctl() system call.) The old SYS_GBOOT call to get some boot parameters is dead. Variables like ROOT_DEV that aliased boot parameter fields have been renamed to root_dev. A special process ID value PID_SERVER has been invented to mark processes that are or have become a server, like MM, FS and INET. Many examples of the new dev_open() and dev_close() found here. src/fs/misc.c Addition of the FS side of the new svrctl() system call. It implements the FSSIGNON call that allows a process to tell FS that it is becoming a server and that it wants to handle a given group of devices in a given way. (I.e. "generic", "as a terminal", "clone on open". The latter is for inet, where each open of a TCP/IP devices causes a new device inode to spring to life for the new TCP/IP connection. src/fs/open.c Pipe administration moved to the proper first two different zone number slots in the in-core inode. Leave last zone number free. src/fs/pipe.c The totally unused XOPEN code removed. There is a dmap[] call here that I dare not replace by dev_io(). Too strange. src/fs/read.c Unneeded check of rw position against MAX_FILE_POS removed. It caused I/O of more than 4G through character devices to fail. (Many character devices don't even care about the position.) (Found by people doing I/O speed tests. Today's hardware is so ridiculously fast that they ran into the limit in no time.) src/fs/table.c Svrctl call added. Dosdisk table entry added. Open and close dmap[] entries merged into a single opcl field. (They mostly contained the same value already.) The /dev/ip entry is now always unused, but can be claimed by INET later. src/inet/ Replaced by a much newer version. Stable, two ethernets and two pseudo IP networks for serial IP for instance. For 2.0.3 the startup code was changed to allow the program to start as an ordinary program, to configure itself from /etc/inet.conf and to become a server with a few svrctl() calls. src/kernel/3c503.[ch] Code and definitions for the 3C503 network adapter by G. Falzoni. 2.0.0/src/kernel/aha1540.c The file aha_scsi.c is renamed to aha1540.c to better reflect the type of card. Useful if someone with lots of time writes a 2940 driver, so they won't clash in name. src/kernel/*_wini.c Each of the disk drivers can be tied to any of up to four controller tasks through the boot monitor (c0=at, etc). To make this possible the task number is no longer hardcoded. The schedule/finish routines have been replaced by a single transfer function. The abstraction went too far. The schedule function usually did nothing but recode the I/O vector in a different structure (struct trans) and hand it over to finish. Now this is all done by transfer(). (Pity this schedule/finish mistake has been immortalized in the second book. That's the problem with such major mistakes, they never really go away.) The transfer function now has to work with the simplyfied I/O vector. This makes these questions unnecessary: "Byte positions still consecutive?", "I/O direction still the same?", "Is this part of the vector optional?" 64-bit byte position computations. Common code like this: block = (w_dv->dv_base + pos) >> SECTOR_SHIFT; Has due to the lack of a built-in 64-bit type been replaced by this: block = div64u(add64ul(w_dv->dv_base, position), SECTOR_SIZE); See the int64(3) manual page for a list of these 64 bit routines. src/kernel/at_wini.c Addition of ATAPI CD-ROM code by Michael Temari. (His changes were fairly benign. Blame me for the huge differences.) src/kernel/bios_wini.c Old bios13 calls removed in favour of the newer, more generic, int86 call. (Drivers can now make any BIOS call they want.) This driver is still the most easily understood of all drivers. Read it first if you want to study disk drivers. src/kernel/clock.c Old timer value returned by alarm(2) rounded up to the nearest second. Alarm should never return 0 if the timer is still running. src/kernel/console.c Screen dimensions (rows/columns) now variable and obtained from the BIOS tables. This makes it possible to run the console in 132x43 if the video card permits. Reverse video bug fixed. Report screen pixel sizes in termios struct. src/kernel/const.h IRQ vectors renumbered to 0x50 (more or less free) and 0x70 (same as BIOS). This does not upset DOS. src/kernel/dosfile.c New driver to see a big DOS file as a Minix disk using DOS file I/O. src/kernel/driver.c Changes to allow one task to make I/O calls to another task, like dosdisk to at_wini. The do_rdwt and do_vrdwt rewritten to use transfer instead of schedule/finish. src/kernel/fatfile.c New driver to see a big file on a FAT file system by interpreting a FAT file system directly to find the blocks of a file. src/kernel/floppy.c Loose arrays carrying floppy parameters merged into one array of structs. Some parameters (like start times, head settle times) increased a bit after observing reference manual. (Not that the old parameters ever seemed to be a problem.) Series of fdc_out() calls replaced by a single fdc_command() with better checking. src/kernel/keyboard.c Left and right versions of shift-type keys better kept apart. (One used to be able to press both control keys and release just one to make the system think control was no longer active.) CTLR-ALT-INS has the same effect as CTRL-ALT-DEL for Minix in a Windows window. Lock key state (caps, num and scroll lock) kept per virtual console. Struct kb_s removed, since there is only one keyboard. (Only kb_lines[0] was used, wasting the rest.) Better tracing of ALT keys (CTRL + left-ALT is the same as right-ALT, also know als ALTGR on national keyboards like the German one.) src/kernel/keymaps/italian.src Replaced by keymap supplied by Ernesto Del Prete. src/kernel/keymaps/polish.src Brand new keymap by Antek Sawicki. src/kernel/klib386.s src/kernel/klib88.s BIOS disk I/O function bios13 replaced by more generic int86 interrupt call. A20 enable/disable code in klib88 has special code for PS/2 machines. Video memory code changed to address video memory at vid_seg:vid_off instead of vid_seg:0 to support different ways of handling segments. 16-bit p_cp_mess changed to handle any click size instead of just 256. Both p_cp_mess and p_phys_copy compute full 32 bit physical addresses. src/kernel/main.c Kernel, MM, FS, etc. information now comes from an array of a.out headers supplied by the boot monitor. Available memory comes from the new 'memory' boot variable. This allows Minix to start in an arbitrary location in memory, for instance in the memory that DOS offers as "free". src/kernel/mcd.c Mitsumi CD-ROM driver removed. Not only is it obsolete, I couldn't even test any changes, because the only drive we had has gone missing. src/kernel/memory.c "RAM disk is too big" message changed into "Not enough memory for RAM disk". The old message confused people, although either message is equally right. New user BIOS ioctl added that allows a user process to execute a BIOS call if it doesn't mind being limited to the DMA buffer if it needs memory for the call. New LDT getting and setting ioctl. A user process has two LDT entries that it can set to any range of memory, video memory for instance. src/kernel/misc.c Get free memory list from the 'memory' boot variable. "Shadow RAM" feature removed, current machines don't have shadow RAM under 16M anymore. src/kernel/mpx386.s src/kernel/mpx88.s New feature flag bits: Don't patch any sizes into the kernel, offer generic INT support, pass a memory list, new way to pass monitor code back. The IDLE task executes a HLT instruction to save power. (Keeps my new notebook from turning its fan on. There is nothing like a personal reason to add a feature. It also makes VMWare happy.) src/kernel/printer.c Printer driver is made optional with an ENABLE_PRINTER switch. src/kernel/proc.c src/kernel/proc.h Process type tests changed a bit. The queue could be chosen easily using the new p_priority field that tells if a process is a not there, a task, a server, a user process or the IDLE task. This field allows that a user process can change into a server. The static division on slot number didn't allow this. Almost forgot to mention this detail: All the shadowing code has been removed. It got too difficult to maintain something that is not currently used. In such cases one should not hesitate. src/kernel/protect.c src/kernel/protect.h Small interrupt vector / segment descriptor initialization changes. Code and data bases moved to the early start code. New phys2seg() routine that translates a physical address to a segment/offset pair in real mode, or a selector/offset pair in protected mode. In 16-bit protected mode the selector must be chosen among 64K segments starting at 0xA0000, 0xB0000, 0xC0000 and 0xD0000. These selectors replace dedicated video and ethernet selectors that also point in the those areas. (Now there doesn't have to be added new selectors if a new task needs a memory area.) In 32-bit protected mode the flat 4G selector is simply used. src/kernel/pty.c It was so simple. Just let ioctls on the pty side have the same effect as ioctls on the tty side and rlogin is able to transmit the window size. Why didn't I figure this out before? Now we are no longer limited to exactly 80x24 windows to log into Minix. (Only Window size changes aren't automatic yet. Needs SIGWINCH.) src/kernel/rs232.c Thanks to XXX the CLOCAL mode now works properly. src/kernel/start.c Changes to allow for the variable placement of the kernel in memory. Boot parameters structure removed. FS now uses svrctl calls to get boot parameters. src/kernel/system.c Sys_sysctl, the kernel side of the svrctl call added. Sys_puts that allows MM and FS to send console messages instead of bothering the TTY task (no problems anymore with ^S/^Q processing). Sys_findproc that allows a server to find a task by name, like the TCP/IP task that needs DP8390. Lots of small changes in process type tests. Many "can't happen" panics changed into asserts that are compiled out in 16-bit mode. (So 16-bit code is smaller, but runs without checks, or as the comment in assert.h says: "8086 must do without training wheels".) The svrctl calls allow a process to become a server, and implements a getenv() like call for boot parameters. New vir_copy() call to copy bytes from one process' address space to that of another. Saves making umap calls in those places where speed isn't required, and saving a few code bytes always is. src/kernel/table.c Changes in the driver choice code for controllers. Mapdrivers() function added to make those choices. src/kernel/type.h Interface declarations for the int86 routine using a big fat union to be able to access 8086/386 registers in many different ways, i.e. reg86.b.al, reg86.w.al, reg86.l.eax. src/kernel/wini.c Removed. The disk driver selection code has been generalized and moved to table.c src/lib/ansi/atoi.c Changed to simply call strtol(). src/lib/ansi/malloc.c Malloc changed so that it no longer sets errno to ENOMEM if it succeeds. Should be no problem, except that a common bug in the use of perror() causes "Not enough core" errors to appear instead of the proper error message. src/lib/ansi/misc.c Fixed list of (outdated) time zone information removed. One should use a proper TZ definition. src/lib/dummy/ Creates an empty dummy library that is used as libm.a so that -lm works. (Minix math code is in the C library.) src/lib/editline/ Filename completion (if you hit TAB) changed to understand weird characters in filenames. They are simply quoted with a backslash. src/lib/end/ End label declarations simplified a bit. src/lib/i386/int64/ src/lib/i86/int64/ Assembly routines for 64-bit integers. src/lib/i386/misc/oneC_sum.s src/lib/i86/misc/oneC_sum.s Assembly version of oneC_sum(), the Internet checksum. It speeds up networking quite nicely on not too fast machines. (The problem with fast machines is that you don't notice it at all if your code is rotten. That's why a certain Redmond based company should be forced to develop on 486s.) src/lib/i386/rts/crtso.s src/lib/i86/rts/ncrtso.s The variable '_penviron' is initialized to point to either 'environ' or a hidden variable '_penvp'. *_penviron is then used throughout the library as the environment pointer. Applications can now use (and change) 'environ' as the environment pointer, or stupidly use 'environ' for other things without ill effect. src/lib/i386/rts/m2rtso.s src/lib/i386/rts/prtso.s src/lib/i86/rts/nm2rtso.s src/lib/i86/rts/nprtso.s New Pascal and Modula-2 runtime startoffs. src/lib/i86/em/ Files have em_ prefixed so they don't easily clash with other files with the same name when put in the C library. src/lib/i86/misc/getprocessor.s 286/386 detection code fixed. It used a test that depended on the top bits of a segment descriptor being 0xFF on a 286. Some 386+ machines have this for the GDT. We now use the IDT where this can't happen. src/lib/i86/misc/hton86.s Assembly versions of hton[ls] and ntoh[ls]. Not faster or slower than inlined macros, but saves many bytes of code. src/lib/ip/ Several new and updated network library routines. src/lib/libm2 src/lib/libp New Pascal and Modula-2 library. src/lib/other/_svrctl.c For the new svrctl() system call. src/lib/other/configfile.c New "common config file" interpretation routine. src/lib/posix/_exec*.c New group of exec*() functions all interfacing to the execve() system call. src/lib/rts/ New machine independent runtime system stuff, currently containing only setjmp.e moved here from the i386 directory. An old i86/setjmp.s has been removed. Hopefully this code will end the spurious "longj err" seen on some old XTs. Make sure you're seated properly before attempting to read setjmp.e. src/lib/syslib/kmalloc.c Small and simple malloc for small things such as the bootstrap. src/lib/syslib/kprintf.c Moved here from the 'other' directory. It is now only put in the -lsys library and only used for low level system code. Simply as printf, not as printk. (So that the printf = prink macros is no longer needed.) src/lib/syslib/putk.c Used by the kernel printf to put characters on the console with a SYS_PUTS call to the SYSTEM task. If that fails then a write() system call is used. The TCP/IP task needs this to be able to print messages before and after it becomes a server. src/mm/alloc.c Swapping code added. It works by treating swap space as memory that sits above swap_base. Alloc_mem() tries to get memory from a hole below swap_base. If that fails then the swapping code is called to move blocked processes' data spaces away to holes above swap_base. Only processes blocked on MM can be swapped out, and only their data spaces. (Alas this isn't good enough for 640K XTs, so next on the agenda is swapping code spaces of any process. This needs help from the kernel, because the kernel isn't to run those processes.) The max_hole() code is removed, because it was too difficult to figure out what the biggest hole is after swapping everything out that can be swapped out. The exec code that needed it was simply rewritten to immediately use alloc_mem() instead of first testing with max_hole(). This is actually better because splitting the test and the action over two separate calls is a bad style of programming that leads to race conditions and/or security holes. Mem_init() sets the swap_base to one click above the last normal memory click. Swap_on() opens a file through FS to use for swapping. Swap_off() closes the swap file if all currently swapped out processes can be swapped in. Swap_inqueue() puts a process on a queue of processes that must be swapped in as soon as possible because it is now runnable. Swap_in() tries to swap all processes on the inswap queue in. It is called on each turn through the main loop of MM. Swap_out() tries to find a process that is blocked on MM and to swap it out. It returns true if it could find one. Alloc_mem loops over this routine if it can't immediately find a big enough hole. src/mm/exec.c Code added to handle #! for executable scripts. A patch_stack() routine can prepend extra arguments to the argv[] array for optional arguments and the name of the script. This means that if a script that starts with '#!/bin/sh -x' that is called with execle() as '/bin/script script arg1 arg2' (path + argv[]) is executed as '/bin/sh /bin/script -x arg1 arg2'. Call to max_hole() trivially changed into directly calling alloc_mem(). Load_seg() function changed to rw_seg() that can both read and write a segment for use by exec and the swapping code. src/mm/main.c Changes in the memory summary code to accomodate the no longer fixed position of the Minix kernel in memory and the memory list. The single reply message has been changed into one reply message per process in the process table. Processes may have to wait to be swapped in so any reply message has to wait to be sent as well. The 'dont_reply' flag as been removed and replaced by a special error code, E_NO_MESSAGE, that indicates that no reply message must be sent, or has already been sent. "Sent" in this case means having been placed in the outgoing message slot in the process table to be actually sent when possible. Extra reply codes such as 'result2' have been renamed to field names in the per-process reply message. A setreply() function replaced reply() to just set a reply message and if needed move a swapped out process to be inswap queue. At the end of main()'s main loop it tries to swap processes on the inswap queue in and tries to sent pending messages. The SIGCHLD signal is added as a "default ignored" signal. src/mm/misc.c New file for miscellaneous system calls, reboot() and svrctl(). Svrctl() allows a process to do a semi-exit to become a server, or to add or remove swapspace. src/mm/mproc.h The flag name "HANGING" has been renamed to "ZOMBIE", because that is what everyone calls a process that is dead but unwaited for. New flags REPLY (reply message waiting), ONSWAP (data segment swapped out), and SWAPIN (waiting on the inswap queue). src/mm/signal.c Many off by one errors on _NSIG fixed. (_NSIG equals the highest signal number, so (sig <= _NSIG) is the proper test.) Open a core file in nonblocking mode to avoid hanging MM on a named pipe. (Independently found by a few sharpeyed people.) src/mm/utility.c Open a file in nonblocking mode in allowed(). Like above, to not hang on an execve of a named pipe. src/tools/init.c Query 'bootopts' from the boot environments, the flags given on the boot command of the monitor (e.g. 'boot -s'.) These flags are passed to /etc/rc. src/tools/ps.c Changed to allow 'ps -ef' to do the same as 'ps alx'. (System V vs. BSD syntax.) Kees J. Bot