If APM power down fails, the apm driver tries to engage power
management, and tries power down again.

Some ATA controllers failed HDIDENTIFY, returning garbage. Now the ide
driver waits until the controller asserts DRQ before reading the
parameter block.

Added tm_gmtoff and tm_zone fields to struct tm in time.h.

Added math routines in math.c.

Added rusage() in sys/resource.h.

Sanos can now be build using Microsoft Visual Studio 8. The sanos.sln solution
now uses the makefile for building sanos. The old Visual Studio 7 solution
has been renamed to sanos-vc7.sln.

Fixed bug in hfree() that could crash the kernel (JHO).

VMWare VMI implemented.

Implemented physical/virtual machine interface. This interface allows the kernel to
run parvirtualized on top of a virtual machine monitor.

Cleaned up port I/O functions (_inp -> inp, ...).

The kernel now uses the BIOS memory map to initialize the
page frame database

Pathname pattern-matching with glob() and fnmatch() added to libc.

Renamed jobs to processes.

Kernel related files moved from /bin and /etc to /boot.

Implemented vfork() and exec(). It uses setjmp()/longjmp() to emulate the
behaviour of vfork()/exec(). The exit() function also resumes active vforks.
Also waitpid() and wait() has been implemented. The new getchildstat() and
setchildstat() are used for tracking zombie child jobs. A SIGCHLD is generated
when a child terminates.

New MODLOAD_NOSHARE flag for load_module() to prevent sharing when
loading an executable file. This can be used for preventing aliasing
of global variables for executable files.

The wait() function has been renamed to waitone() to avoid
clash with POSIX wait().

Added header files: sys/param.h, sys/times.h, inttypes.h

Support for local heaps by defining USE_LOCAL_HEAP. The heap size and
commit increment are now initialized from the PE header
of the executable. The global heap uses os.dll for heap parameters.

Jobs now have ids that can be used to simulate process ids. Each job also has
a parent job and a handle to the main thread. The getjobhandle() function
returns a new handle to the main thread of the job. The getpid() and getppid()
functions have been implemented. The P_CHILD flag for spawn() can be set
to create a child job.

Kernel thread handles are now protected from being closed from
user mode applications.

New shell command keybd for changing keyboard layout.

Environment variables has been implemented. Now each job has its own copy of
environment variables which are inherited by the jobs they spawn. The setenv(),
putenv() and unsetenv() functions has been implemented. The spawn() function
now takes an env parameter which can override the default environment. A
set command has been added to the shell to display and set environment variables.

Support for VMDK virtual disk image format used by VMware and Qemu. The mkdfs tool can
now generate vmdk images directly using the -t option. This enables creation of disk
images for PC emulators in the build process. By using 'nmake boothd' a bootable harddisk
image can be built.

SMBIOS driver added to kernel. The SMBIOS driver is use for retrieving
system management information from the SMBIOS structures.

Added malloc_usable_size() function to memory allocator. This returns the usable
size of an allocation.

Bug in ftpd fixed that could cause a connection to loop with the last command
when connection was broken (TTA).

The C runtime library can now be used with the Tiny C compiler.

Fixed various bugs in UDP socket module (DSA):

The source ip and port could be garbled in recvmsg().

Socket was not implicitly bound on sendmsg().

After message was sent with sendto() the socket was permanently connected to the destination.

Additional checks on input parameters.

Added tulip network driver.

The toupper() and tolower() macros did not properly check the character type
before conversion. This problem has been fixed (SMC).

The poll() function for waiting for events on a set of file descriptor has
been implemented. The sys/poll.h header file has been added.

Added /proc/virtmem to display an overview of all mapped virtual memory.

Fixed parsing of IP headers in ping command.

Sanos can now boot without the /etc/krnl.ini and /etc/os.ini using only
default values.

When a driver fails initialization the driver module is no longer unloaded.
This is to prevent kernel crashes when drivers fail without proper cleaning
up of aquired resources.

Fixed bug in dfs files system that could corrupt a directory when adding entries.

Qemu does not seem to respond correctly to a REQUEST SENSE atapi command. The
final interrupt is missing. This prevented mounting of cdrom drives under
Qemu. The cdfs now only revalidates the cdrom drive if the revalidate option
is given in the mount command. This allows successful mounting of cdrom
drives when running sanos under Qemu.

The stack is now moved to 0:7c00 before boot image is read in the cdemboot boot
sector. This prevents overwriting the stack when reading the boot image.
Now booting from cdrom under Qemu works correctly.

The size of the buffer in cfltcvt() output.c was only 80 bytes long. This has
been changed to CVTBUFSIZE to prevent buffer overflow in ecvtbuf() (YBO).

The remote debugging protocol has been changed to include more information on
connect and now uses run length compression of data blocks to speed up transfer
over serial lines.

Version 1.3.3 (Oct 20, 2005)

GetLogicalDrives() in kernel32 implemented.

A bug in cmd_ipconfig() in sh.c prevented proper display of network
configuration if no DNS servers was configured. This problem has been fixed.
(FGA)

New -a option added to mkdfs to support file lists with alternative files
names. This simplifies configurations with both debug and release builds.

The Visual Studio wizard can now generate a floppy disk boot image
configured for the application.

Shell prompt can be configured by setting the prompt property in the
[shell] section of the os.ini file.

If command line arguments are given to the shell it now executes the
built-in command and exits the shell.

The floppy motor timeout routine now acquires the floppy mutex before
turning off the motor in order to prevent race conditions.

Advanced Power Management (APM) support implemented. The computer can now
be powered off after os shutdown. The mode parameter for exitos() can be used
to specify the shutdown mode (halt, reboot, poweroff, debug). A shutdown
command has been added to the shell. The power status can be retrieved using
/proc/apm.

Added /proc/cpu for CPU information.

The raise() function now returns an error if the signal number is invalid.

Breakpoint traps are now sent to the user mode signal handler. This allows
breakpoints to be handled by user mode code.

Signals now exits the currently executing job with the signal number as
exit code. However, if the debug flag in the PEB is set the debugger is
entered if an unhandled signal is encountered. The debug flag can be set using
the debug command in the shell. The debug flag can be configured using the
debug property in the [os] section of os.ini. The default value of the debug
flag is 0, unless the system is build in debug configuration.

readv() and writev() implemented in vfs.

The kernel log is now implemented by the device driver /dev/klog. The
kernel log now support ioctl for waiting for new log entries in the kernel
log. The kprintf has been extended to support different log levels.

The syslog interface has been redesigned in to comply with POSIX. The
syslog now supports logging to a syslog server by setting the loghost property
in the [os] section of os.ini.

New klog daemon to read entries from the kernel log (/dev/klog) and add
them to the system log.

The sockaddr and sockaddr_in structures has been change to conform to
winsock definitions.

The sleep() function has been renamed to msleep(). A new POSIX conformant
sleep function has been added to unistd.h.

The syserror() function has been moved from libc.lib to the os.dll as an
exported os api call.

readline() now uses stdin and stdout for input and output.

Bug in iomux fixed. Now a monitored event signals the iomux and not the
associated object.

Implemented popen() and pclose(). Also added a P_SUSPEND parameter to
spawn() to allow new jobs to be started suspended.

The kernel version information is now kept in a version resource in
krnl.dll. The version information is retrieved using the new module version
information functions in verinfo.c.

The build type can now be controlled by compile time switches. The kernel
version can be displayed in the Windows Explorer by viewing Properties for
krnl.dll and selecting the Version tab.

User management added to kernel. Each thread is now assigned to a user and
a group. A thread has both a real and an effective user and group owner. The
{get|set}[e]{uid|gid}() functions can be used to change the effective and real
user and group for a thread. When a new thread is created the effective user
and group are inherited from the creator thread.

Added functions to query /etc/passwd and /etc/group files.

New whoami, id, chmod, and chown commands added to shell. The format of
the output from ls has been changed to display the file permission info.

New file system version for DFS. The new version supports user and group
owner for files and directories as well as permission bits. The new DFS
version also supports files larger than 2GB. The fchown() and chown()
functions has been added to vfs.

DES-based crypt() implementation added.

The spawn() function now computes the pgm parameter from the cmdline
parameter if the pgm parameter is NULL. The initpgm and initargs properties in
the [os] section of /etc/os.ini has been replaced with a single property named
init. The default for init has been changed to /bin/sh.

The behavior of the initial application has been changed. Previously the
os shut down after the initial application exited. Now the initial application
is executed again if it exits.

Telnet daemon moved from the shell to separate server (telnetd.exe). The
new telnet daemon has a more robust handling of the telnet protocol. The
telnet daemon invokes the new login utlity in order to log on user.

FTP daemon implemented.

Version 1.3.2 (Apr 3, 2005)

The fdmotor task in the floppy driver has been replaced by a timer.

Standard POSIX/ANSI API routines now returns -1 on error and set error
code in errno to comply with POSIX/ANSI standard.

Added format option to dfs mount options to allow a device to be formatted
when mounting. This is useful for ram disks. Also added progress option to log progress
messages during formatting of device.

The file system now has a separate step for destroying the file object
after all locks has been released. This should prevent race condition when
reads/writes are pending when the file is closed. This could lead to kernel panic because
the file object was destroyed while being accessed in the read/write routines.

Changed err_tcp() in tcpsock.c to set IOEVT_CLOSE if the error code is
ERST. This will trigger a socket in readfds in select() when the connection has been reset
by the peer.

The kernel now uses a dual licensing scheme allowing both BSD and GPL
license. The overall kernel license mode can be set by compiling with -D BSD
or -D GPL. Individual source files can use these defines for conditional
compilation. The /proc/copyright is adjusted to reflect the overall licensing
mode of the kernel. The license() kernel api routine can be used in kernel
modules for runtime checks of the kernel license mode.

Added new API routines to wsock32 and kernel32 to better support java nio.

Added /proc/screen to capture the contents of the console screen buffer.

The shell now supports execution of initialization script. The script file
is specified using the initcmds property in the [shell] section in os.h. Each
line in the file is executed as a shell command. An exec command has been
added to the shell to allow execution of script files.

If no hostname has been configured, the network initialization code now
tries to find the hostname for the computer by making a DNS query on the assigned IP address.

Version 1.3.0 (Aug 8, 2004)

setjmp() did not return the correct value from longjmp(). This problem has
been fixed.

Intrinsic fmod function (_CIfmod) implemented.

The stdin, stdout and stderr macros in stdio.h required os.h to be
included to define the job structure. This is no longer needed. The standard
files are now resolved using the __stdhndl() function in the stdio library.

TCP keep-alive packets was not acknowledged correctly. This could lead to
connections where the peer had KEEPALIVE enabled to be terminated after long
periods of no activity. This problem has been fixed by also sending an
acknowledge for TCP segments that fall outside the current window.

Changes from lwIP 0.6.4 added to networking code:

Check for short packets in icmp.

ICMP transmit buffer changed to PBUF_IP.

ip_id in ip_output_if() changed to static.

Checksum folded into 16-bit in chksum().

The TCP retransmission time-out backoff corrected.

Segments in ooseq, unacked and unsent are now removed on abort.

Check for pcb already in listen mode in tcp_listen().

TCP retransmission of unacknowled segments moved to tcp_rexmit().

The snd_wl1 was not initialized correctly.

If accept fails in SYN_RECVD, EABORT is retuned to prevent further
processing of pcb.

Segments on unacked now removed before segments on the unsent list.

Now also sending an acknowledge for TCP segments that fall outside the
current window.

Only direct UDP packets which does not match perfectly to unconnected
pcbs.

Check for short packets in udp.

Support for kernel options supplied by the loader added. The kernel options
are
embedded in the loader. The mkdfs utility now have a -K option to set kernel
options
for a bootable image. The setup utility has been updated to allow kernel
options to
be specified in the sysprep section.

The ide device driver now supports the ideprobe kernel option to disable
probing of
ide devices. When ideprobe=0 the BIOS settings are used to determine the
number of disks.

Renamed format() syscall to mkfs().

Boot from CD-ROM using El Torito implemented. The system is booted in No
Emulation
mode. The BOOTIMG.BIN contains a small DFS filesystem (512K). A special boot
sector
(cdboot) loads the secondary boot loader (osldr) from the image and starts it
using
boot drive 0xFF. The secondary bootloader has been relocated to 0x00090000 to
allow
the boot image to fit into low memory. It loads the kernel from the boot image
and
starts the kernel. The kernel boots the system using the boot image
(/dev/initrd)
as root file system. The rest of the CD is mouted on /usr to allow access to
the
entire CD. The boot ISO image can be created using the mkisofs tool.

Boot from network using PXE implemented.

Escape character changed from '\' to '^' in .ini files.

The hd driver failed to read multiple sectors per read command. This problem
has been
fixed. The status register is now read before the next sector is read in the
dpc
handler. This reenables interrupts from the IDE controller before the last
byte of
the current sector is read.

UDMA mode disabled in IDE driver for VMware disk drives.

File objects are now I/O objects. This is the first step in enabling
selectable
file handles, i.e. allow for using select() on file handles. While this is not
very
useful for regular files it is interesting for devices and pipes.

Support for select() for device drivers implemented in device manager.
Device drivers
must call dev_setevt() and dev_clrevt() to signal events. A flag parameter has
been
added to dev_read() and dev_write(). This parameter is used to indicate
non-blocking
I/O operations (DEVFLAG_NBIO).

Support for select() and non-blocking I/O for pipe file system. O_NONBLOCK added to flags in open() and ioctl() support for FIONBIO for file
objects.

Added job list to PEB. The jobs command in the shell can now be used to
display
all running jobs.

The kernel startup has been changed to open only one file object for the
console. Then
three handles are allocated for the initial stdin, stdout and stderr.

The get_option() routine failed to handle parameters without values. This
problem has been
fixed.

Version 1.2.9 (Sep 19, 2003)

New mkfloppy utility for writing raw floppy disks.

TCP connections are now reset before kernel shutdown or reboot.

Serial transmitter could hang. Interrupts are now disabled when draining
the transmit queue to prevent race condition with interrupt service routine.
The transmitter is now started directly by the write routine. Previously the
transmitter was started by the DPC. The interrupt service routines now also
checks for multiple interrupt indications per interrupt.

New Visual Studio wizard for creating sanos application projects.

Scheduler enhancements:

Number of thread priorities changed from 8 to
32.

Scheduler now uses a thread ready summary to determine next thread to run.

Modified signal() and raise() to conform to ANSI standard. Signal info can
be obtained in signal handler by using getsiginfo(). The sendsig() function
can be used to raise signals with context info.

Support for 64 bit integer arithmetic. All compiler support routines for
64 bit integer operations implemented in libc.

CreateFile() and SetFileTime() implemented in kernel32.

WIN32 structured exception handling implemented in kernel32. When kernel32
is loaded it takes over the global signal handler and dispatches the
exceptions in the exception chain in the TIB.

MSVCRT exception handling implemented.

setcontext() implemented.

Added more complete ANSI Standard C Library. Many standard header files
has been added to the include directory (conio.h, errno.h, fcntl.h, float.h,
io.h, malloc.h, math.h, memory.h, process.h, share.h, signal.h, stddef.h,
sys/types.h, unistd.h), and prototypes has been moved to their ANSI specified
standard headers.

The thread ready queues could become corrupted if a thread that was
already ready was marked ready again. This could lead to kernel traps in the
object manager because of faulty dispatching of threads. This problem has been
fixed, by linking the threads on the ready queues in double linked lists and
introducing new thread states. Now only threads in ready state are in the
ready queues.

Added job object to group threads executing an application. The
CREATE_NEW_JOB flags can be used in beginthread() to start a new job. The
spawn() function can be used to start an application in a new job.

/dev/random and /dev/urandom devices added.

BSD style random number functions added to lib.

New stdio implementation with buffering, unget, and support for printf and
scanf processing.

C/C++ initializes and terminators are now processed by the crt
startup/shutdown code include atexit() handlers.