sanos home

sanos change log for latest unstable release


CHANGE LOG FOR SANOS
====================

Changes since last release
--------------------------

    * VGA support.

    * Add support for compiling with MSVC 11.

    * Fix potential buffer overflow in vsprintf.

    * Remove Visual Studio project files.

    * Added support for cross-compiling under Windows.

    * The NASM assembler is now built from source when building under Windows.

    * New Makefile for building under Windows and new deployment script.

    * Indent and unindent commands for editor.

    * The printf routines now support %lld format for 64-bit ints.

    * Added genvmdk utility for generating VMDK disk image files.

    * The C compiler now generates PE import hints for DLL imports.

    * Added strcasestr, strtoull, strtoimax, strtoumax, mkdtemp functions.

    * Added basename and dirname shell commands as well as the basename()
      and dirname() functions in libgen.h.

    * Implemented support for hidden files in ls.
 
    * Fixed handling of NetBIOS keep-alive packets in smbfs.

    * Implemented support for tracking CPU time usage by threads. The times()
      function now returns the system and user time as well as the accumulated
      time used by terminated child threads. The threadtimes() function can
      be used for getting CPU time information for any thread. The shell now 
      also implements the time command.

    * Added find utility

    * Added spawnve(), spawnv(), and spawnl() functions.

    * Support for non-shared executable modules.

    * Added binutils package.

    * Fixed bug in fseek for relative seeks.

    * Added _exit(), stpcpy(), and mkstemps() functions.

    * Implemented support for memory mapped files.

    * Renamed mmap syscall to vmalloc.

    * Check memory permissions on system calls.

    * Fixed recursive delete problem.

    * Added sigsetjmp() and siglongjmp() to C runtime library.

    * Added hypot() function to math library.

    * New package management tool for installing programs.

    * Added stub functions for file locking and termios.

    * Added strsep(), vfscanf(), vfscanf(), and vfscanf() functions.

    * Added zlib, awk, tar, yacc, ctags, zip, unzip and lua packages.

    * Added new shell commands: chgrp, chmod, chown, cp, du, grep,
      ls, mkdir, mv, rm, test, wc.

    * Handle escaping of double quotes in command argument parsing.

    * New POSIX-compliant shell with script support.

    * Added support for script hashbangs in module loader.

    * Text editor improvements:
        - Undo/redo
        - Multi-file support
        - Open/New/Close editor
        - Next/previous word navigation
        - Support for files with tabs
        - Text editor can now be build as Linux binary
        - Text search and goto line
        - Clipboard with cut/copy/paste
        - Pipe command into editor buffer
        - Read from stdin
        - Read-only mode

    * Add ln command to shell.

    * Fixed bug in dfs rmdir so directories with multiple links can be removed.

    * Added getopt_long(), usleep(), and nanosleep().

    * Optimized memcpy() routine.

    * Code generation using callee-saved registers (ebx, edi, and esi).

    * Improved code generation for for-loops.

    * Stack trace dump on abnormal termination.

    * Implemented frame pointer omission in C compiler.

    * Jump optimization in C compiler.

    * Function-level linking in C compiler.

    * Added support for setting thread name for user-mode threads.

    * Changed C style.

    * Added makefile for building Sanos under Linux using GCC. GCC is used
      for compiling the Sanos build tools (cc, as, ar, mkdfs) for Linux and 
      using these to build Sanos. This means that you can build Sanos under 
      Linux without needing anything else than GCC.

    * Sanos is now self-contained in the sense that it can build itself. 
      This includes the boot sector, boot loader, kernel, device drivers,
      OS API, standard C library, assembler, C compiler, and utilities.

    * Added check to dfs file system to prevent deleting non-empty directories.

    * Fixed bug in dfs so reserved inodes are not marked as free when deleted.

    * Added kernel install utility, mkboot, for installing boot sectors, 
      boot loaders, and kernels.
 
    * Added support for phony targets in make utility.

    * Code generation optimizations for C compiler:
        - Optimize 'add/sub r, +/-1' to 'inc/dec r'
        - Optimize 'mov r, 0' to 'xor r,r'
        - Generate 'push imm' for constant function call arguments 

    * Set code and data section sizes for PE files in C compiler.

    * The main Makefile has been updated so Sanos can now build under Linux 
      using WINE.
 
    * New features in the C compiler:
        - Support for masm inline assembler syntax.
        - Support for __declspec(naked) in C compiler
        - New -start option for specifying the start symbol
        - New -fixed option for specifying the PE base image address
        - MSVC compatible data type alignment
        - Custom DOS stub and PE file section alignment
        - Bug fix for unsigned integer constant folding
        - Added pre-defined _TCC_VER macro with TCC version number
        - Set execute bit for generated executable files

    * Data segment registers are now inilialized by the kernel before starting
      a user-mode thread.

    * Updated webserver.c to compile both under sanos and linux.

Version 1.3.4
-------------

    * The ctohtml tools no longer generates self links.

    * Fixed bug in vfs, where file objects where not detached from io waiters.

    * Added /proc/devstat to display device I/O statistics.

    * Changed the secondary boot loader to use BIOS for loading kernel.

    * Implemented virtio block and network device drivers for paravirtualized device io.

    * Implemented support for __declspec MSVC extension in C compiler.

    * Implemented $(VAR:pattern=replace) support in make.

    * Added makedepend utility to sdk.

    * Added filelength() and filelength64() to io.h.
    
    * Refactored stdio routines.

    * Added support for outputting linker map file from C compiler.

    * Implemented C source to HTML conversion tool.

    * Updated C compiler to Tiny C version 0.9.24 and implemented support for
      MSVC 64-bit integer extension (__int64 type and 0i64 constants).

    * The user-mode applications and the C runtime library can now be built 
      under sanos using the C compiler and the assembler.

    * Added assembler (nasm).

    * Added make, ar, and impdef utilities
    
    * Added regex library.

    * Added support for serial console.

    * Fixed bug in DMA setup for IDE/UDMA mode. 

    * Added detabbing to editor and goto begining and end of file.

    * Fixed bug in pthread_barrier_wait (zhanglei8893).

    * Fixed building using Visual C++ 2008 (Marius K). Sanos can now be built using 
      the following command:
        NMAKE sanos MSVC=9

    * Fixed problem with mounting cdrom under QEMU. The ide feature register needs to be 
      cleared before doing an ATAPI packet command in order to signal that it is a PIO
      transfer.
    
    * Added French keyboard table (Rio).

    * Fixed bug in ide driver that prevented UDMA to function correctly
      with QEMU.

    * Modified video driver for ANSI color attributes (Girdosky).

    * Added miomap() and miounmap() to virtual memory manger to allow memory mapping
      of memory based device resources to user mode accessible virtual memory regions. 
      This is useful for mapping frame buffers on graphic cards.
      
    * Added original copyright notice to some library source files.
      
    * Refactored IDE UDMA code.

    * 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.
      
    * STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO added to unistd.h.

    * Basic POSIX signal handling implemented. The following functions have been 
      implemented:
        alarm(), kill(), sigaction(), sigprocmask(), sigpending(), sigsuspend(),
        sigismember(), sigdelset(), sigaddset(), sigfillset(), sigemptyset(), 
        sendsig().

    * Current directory per thread implemented.
    
    * 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.
      
    * Implemented isinf(), isnan(), and isfinite(). The printf() now handles
      denormal (INF and NaN) float values correctly.
      
    * 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):
        o The source ip and port could be garbled in recvmsg().
        o Socket was not implicitly bound on sendmsg().
        o After message was sent with sendto() the socket was permanently
          connected to the destination.
        o 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.
      
    * Added getopt() function.
    
    * Added frexp() function to msvcrt to enable Hotspot Server JVM to load.
    
    * 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
-------------

    * 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.

    * Added sys/time.h header file. Also added tzp parameter to gettimeofday() 
      for POSIX compliance.

    * New simple text editor utility (edit.exe) added.

    * 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 behaviour 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
-------------

    * 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.

    * Suspending all user threads when shutting down.

    * Raw sockets implemented.

    * Ping command added to shell.

    * Header files added for ANSI/POSIX compliance: netdb.h, stdint.h, 
      sys/uio.h, arpa/inet.h, netinet/in.h, netinet/tcp.h, sys/select.h, 
      sys/socket.h.

    * Now stat() and fstat() only returns the length of the file if the second 
      argument is NULL. Otherwise, stat() and fstat() returns 0 on success to 
      comply with POSIX.

    * The dirent struct renamed to direntry to avoid name clash with POSIX 
      standard. Also, the opendir has been renamed to _opendir, and readdir has 
      been renamed to _readdir.

    * Implemented opendir(), readdir(), rewinddir(), and closedir() according to 
      POSIX and added dirent.h include file.
 
    * Implemented alloca() and added alloca.h header file.

    * Primary path separator can now be configured in krnl.ini.

    * Added realpath() to stdlib.c.

    * The Visual Studio Wizard now supports extended project directory 
      structure.

    * Project files now uses Release and Debug as configuration instead of SanOS 
      and SanOSDebug.

    * Port I/O definitions moved from krnl.h to iop.h.

    * load() renamed to dlopen(), unload() renamed to dlclose(), resolve() 
      renamed to dlsym() for POSIX compliance. The dlfcn.h header file added.

    * Added CREATE_POSIX flag for beginthread() in order to support POSIX thread 
      function signatures.

    * Threads are now being signaled on termination.

    * getthreadblock() system call implemented.

    * POSIX thread support added. Added sched.c, sched.h, semaphore.c, 
      semaphore.h, pthread.h, pthread.c, mutex.c, condvar.c, barrier.c, rwlock.c, 
      spinlock.c.

    * utime.h header moved from include/sys to include.

    * uname() implemented and utsname.h header added. uname command implemented 
      in shell.

    * chsize{64} renamed to ftruncate{64} and added to unistd.h.

    * flush() renamed to fsync() and added to unistd.h.

    * Added strtok_r() to string.h.

    * Fixed bug in password encoding for smbfs

    * 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.1
-------------

    * Added hlt to idle task to decrease CPU usage when running under VMWare
      (TSU).

    * Added uk keyboard bindings (TSU).

    * The static modifier removed from internal routines in sysapi.c to prevent 
      "over-optimization" of the stack frames (TSU).

    * The configuration from /etc/os.ini has been renamed from config to 
      osconfig.

    * The add_to_history() function in readline.c is no longer static and now 
      has a prototype in stdlib.h.

    * The os.vcproj file has been modified to explicitly set the /GF /Gy /Oi 
      /Ob1 flags. Now the project file is converted correctly to VC7.1 format 
      (TSU).

    * VT102 support in console driver.

    * Atomic operations added in atomic.h.

    * Instance counting added in crt0.c to properly initialize/terminate the 
      crt.

    * Guard pages implemented.

    * Support for JDK 1.4.2.

    * Changed stack guard page support to comply with win32.

    * The jinit utility can now load configuration from alternative ini file.

    * ifconfig command implemented in shell.

    * /proc/dhcpstat implemented.

    * Bug in GetFileTimes() fixed.

    * _open_osfhandle() in msvcrt leaked file handles. This has been fixed.

    * Console input implemented using readline() in msvcrt.

    * tempnam() added to stdio.h.

    * sys/utime.h added.

    * Self handle for thread now stored in TIB.

    * Improved C++ compatibility in Standard C library. All function 
      declarations now in extern "C". The standard new and delete operator 
      implemented.

    * mkmutex() and mutexrel() implemented.

    * pread() and pwrite() implemented.

    * Intrinsic math functions implemented (acos, asin, cosh, pow, sinh, tanh).


Version 1.3.0
-------------

    * cd support added to ide driver.

    * cdfs iso9660 filesystem implemented.

    * SetFilePointer() implemented in kernel32.

    * kbhit() and putch() implemented in conio.c.

    * 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.

    * mode parameter added to mkdir() for ANSI conformance.

    * chmod() and fchmod() system calls implemented. No file systems yet 
      implement these.

    * The user time for /proc/loadavg was counted as dpc time. This problem has 
      been fixed.

    * sysinfo() implemented. GetSystemInfo() and GlobalMemoryStatus() in 
      kernel32 now returns correct values.

    * Code cleanup in msvcrt.h. All exports moved to msvcrt.def.

    * 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:
          o Check for short packets in icmp.
          o ICMP transmit buffer changed to PBUF_IP.
          o ip_id in ip_output_if() changed to static.
          o Checksum folded into 16-bit in chksum().
          o The TCP retransmission time-out backoff corrected.
          o Segments in ooseq, unacked and unsent are now removed on abort.
          o Check for pcb already in listen mode in tcp_listen().
          o TCP retransmission of unacknowled segments moved to tcp_rexmit().
          o The snd_wl1 was not initialized correctly.
          o If accept fails in SYN_RECVD, EABORT is retuned to prevent further 
            processing of pcb.
          o Segments on unacked now removed before segments on the unsent list.
          o Now also sending an acknowledge for TCP segments that fall outside 
            the current window.
          o Only direct UDP packets which does not match perfectly to 
            unconnected pcbs.
          o 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.

    * system() now uses spawn() to execute new program.

    * Enabled cursor on console when kbhit() is called.

    * Real mode os loader initialization implemented as DOS stub for osldr.dll. 
      Now the boot sector calls the real mode entry point in real mode. The real 
      mode startup initializes the system, enters 32-bit protected mode and calls 
      the protected mode startup routine in osldr.dll. This simplifies the boot 
      loaders and removes the 512 byte limitation on real mode initialization 
      code.

    * Support for compressed boot image for initial RAM disk.


Version 1.2.9
-------------

    * 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:
          o Number of thread priorities changed from 8 to 32.
          o Scheduler now uses a thread ready summary to determine next thread 
            to run.
          o Win32 thread priority mapping changed to new 32 level priority 
            system based on normal priority class mapping.
          o User mode code only allowed to set priority levels 1-15.
          o User mode code not allowed to change priority for kernel threads.
          o Dynamic and base priority for threads implemented.
          o Priority boosting implemented.
          o Quantum units are now charged after restarting waiting thread.
          o Preemption when threads with higher priority than running thread 
            ready implemented

    * TCP port numbers initialized on startup to random value in range 4096-
      5120.

    * Processor load information (/proc/loadavg) implemented.

    * Shell code cleaned up. Help texts added. Better argument checking.

    * Buffer overflows fixed in module loader.

    * Send and receive timeouts (SO_SNDTIMEO and SO_RCVTIMEO in setsockopt()) 
      implemented for TCP sockets.


Version 1.2.8
-------------

    * Garbage was outputted when printing negative numbers using printf. This 
      problem has been fixed.

    * lseek() failed with -EINVAL when seeking on a device larger than 2GB. This 
      prevented fdisk from working on disks larger than 2GB. This problem has been 
      fixed.

    * The fddone flag in bootfd.c has been marked volatile to prevent 
      optimization of interrupt wait loop.


Version 1.2.7
-------------

    * When a file or socket object was closed the kernel object was accessed in 
      hfree() after being freed. The file and socket objects are now freed in 
      destroy_object() to avoid this problem.

    * Handles to kernel objects was not removed from the handle table if the 
      handle count was greater than one. This problem has been fixed.

    * Closing a socket now sends a IOEVT_CLOSE event to attached iomux. This 
      signals a select() on a socket to return when one of the read sockets are 
      being closed by the application.

    * File was marked as modified when using futime() with dfs. This was 
      overwriting the mtime for the inode when the file was closed. Now the inode 
      is just marked dirty.

    * Floppy device was not detected unless floppy disk was inserted. This 
      problem has been fixed by delaying initialization of fdc until first use.

    * Added queue to loopback adapter.

    * The yield() routine now discards the remaining quantum for the thread 
      before yielding.

    * Loopback packets to own address are now redirected in ether_output().

    * In syscall() in kernel the error code from system calls was set in the err 
      field in the tib. This overwrote the stderr handle for the thread. Now the 
      errnum field is correctly set in the tib.

    * Garbage returned by WSAGetLastError() because tib->err was mistakenly used 
      instead of tib->errnum. This has been fixed.

    * The value of errno is now the positive version of the error number instead 
      of the negative.

    * dup2(), creat(), sopen(), umask(), eof(), and access() added.

    * File sharing, permission mode and additional open flags (O_TEMPORARY, 
      O_SHORT_LIVED, O_DIRECT, O_SEQUENTIAL, O_RANDOM) implemented for smbfs.

    * Temporary files added to dfs (O_TEMPORARY flag in open()).

    * tell() did not correctly return the file position. It just flushed the 
      file. This has been fixed and tell() now returns the file position.

    * vfs and smbfs now supports large files (>2GB).

    * stat64(), fstat64(), tell64(), lseek64() and chsize64() added to os 
      interface.

    * stat() and fstat() changed to conform to ANSI standard.

    * 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.

    * Math routines using the i387 instruction set added to standard C library 
      (acos, asin, atan, atan2, ceil, cos, cosh, exp, fabs, floor, fmod, frexp, 
      ldexp, log, log10, modf, pow, sin, sinh, sqrt, tan, tanh).

    * abort() now raises SIGABRT.

    * div(), labs(), ldiv(), and system() added to stdlib.c.

    * memccpy(), memicmp(), strset() added to string.c.

    * strtod() and atof() implemented.

    * asctime(), _ctime(), _strdate(), _strtime() added to time.c.

    * /proc/bufstat added to buffer cache manager to show statistic for the 
      buffer cache.

    * Previously exit() stopped the user mode code and shutdown the kernel. The 
      exit() routine now exits the currently executing job. The exitos() routine 
      now shuts down the kernel.

    * Support for O_TEXT and O_BINARY flags added to vsf.c.

    * connect() failed for local sockets. This problem has been fixed.

    * calloc() reported out of memory if num was zero. This problem has been 
      fixed.


Version 1.2.6
-------------

    * iomux did not work with IOEVT_WRITE. This problem has been fixed.

    * getsockname() returned garbage in sin_port and sin_addr. This problem has 
      been fixed.

    * getpeername() returned garbage in sin_addr. This problem has been fixed.

    * New HTTP server implemented (httpd.dll).

    * PE resource API implemented.

    * Threads are now rescheduled after setprio() to immediately reflect the new 
      thread priority.

    * New sis900 network driver implemented (sis900.sys).

    * ls reported wrong size for files larger than 1GB. This problem has been 
      fixed.

    * NIC support for multicast filtering. Implemented in sis900 and rtl8139. 
      Not yet implemented in network stack.

    * /dev/cmos renamed to /dev/nvram.

    * ether_crc() moved to src\net\ether.c.

    * struct stats_nic moved to include\net\stats.h.

    * lookup_board() implemented in dev.c.

    * pci_{read|write}_config_{byte|word|dword} implemented in pci.c.

    * Proper handling of kernel traps. Now enters debugger with correct 
      exception.


Version 1.2.5
-------------

    * iomux kernel synchronization objects implemented.

    * select() implemented.

    * Support for building with Visual Studio 6.

    * setjmp/longjmp moved from msvcrt to libc.

    * Exceptions with signal() and raise() implemented.

    * Revalidate partition drivers after fdisk.

    * Bug in FPU context handling fixed.

    * strftime() implemented.

    * Bug loading DLL with no imports fixed.

    * recv() call hangs when reading from a TCP socket which have been closed by 
      remote peer. This problem has been fixed. recv() now returns -ECONNRESET.


Version 1.2.4
-------------

    * Implemented /proc/uptime to display time since boot up.

    * Added readline() with command line editing, command history and filename 
      completion.

    * Support for .exe applications in msvcrt.dll.

    * Script action moved to script section in setup.exe.

    * Removed safety pool code in pframe.c.

    * Added tags to page frame database to identify memory usage.

    * Added /proc/memusage.

    * Renamed /os to /bin

    * SO_BROADCAST implemented.

    * Mapping of network errors to winsock error codes.

    * Implemented main entry in libc with parseargs.

    * Fixed bug in TCP retransmission.

    * Made ne2000 driver work with WAFER.

    * Return info on WSAStartup.

    * Moved netif binding to os.c

    * Reading netif parameters from [netif] in os.ini to allow static 
      configuration of ip address and dns servers.

    * Added disabled netif for all packet devices on startup.

    * Added ioctl() support for changing netif parameters.

    * Added alloc_linear_pageframes() and alloc_pages_linear() for allocating 
      linear physical memory blocks.

    * RTL8139 network driver implemented (rtl8139.sys).

    * Added PCI subsystem identifier to driver binding code.

    * Implemented Intel EtherExpress Pro100 NIC network driver (eepro100.sys)

    * Implemented lock count on objects. Objects are closed when handle count 
      reaches zero, and objects are destroyed when handle count and refcnt reaches 
      zero.

    * Buffer leak in devfs set_inode_block() fixed.

    * Support for lseek() beyond end of file in dfs and smbfs.

    * Bug in register_interrupt_handler() caused kernel to hang on startup. This 
      problem has been fixed.

    * Support for LBA mode for hd boot in osldr.

    * Keyboard interrupt handling has been made more robust (failed on xpc).

    * sendmsg() and recvmsg() added.