This is a list of changes made during the development of Sortix 0.9. Release engineering: * Begin development of Sortix 0.9. * Update version number to 0.9. Documentation: * Fix doc/obsolete-stuff not listing gethostbyaddr. * Document times(2) as obsolete. * Document select(2) as obsolete. * Document POSIX divergence. * Refuse to implement broken POSIX advisory file locks. * Document gethostid(3) and sethostid(3) as obsolete. * Fix typo of losing in user-guide. * Fix overview of core programs in user-guide. * Document cross-compilation sins. * Add doc/portability-sins. * Add example variables to doc/cross-development. * Refuse to implement gethostent(3). * Update documentation for the upcoming 0.9 release. Build system: * Remove ASLFAGS from kernel Makefile. * Add libdl and librt to libc. * Rename Sortix kernel directory to kernel. * Rename mxsh to sh. * Preprocess assembly files with the C preprocessor. * Rename libc-sortix to libk. * Add sysroot-base-headers-all-archs makefile target. * Add libexec directory. * Refactor default compiler options logic. * Remove obsolete uninstall Makefile target from projects. * Add sortix.bin makefile target. * Add /var/empty directory. * Ongoing build system maintainance. * Refactor root makefile install target. Removals: * Remove mxmpp. * Remove kernel/serialterminal.{cpp,h}. * Remove kernel/utf8.{cpp,h}. * Remove mention of the unusable BIOS VBE driver from user-guide. * Remove obsolete system calls. * Remove tix-object-insert. * Remove calc(1). * Remove conway, pong and snake games. * Remove VGA text mode support from libdispd. * Remove objtype environment variable from init. * Remove __fsetlocking(3). * Remove _flushlbf(3). * Remove __flbf(3). * Remove tmpnam(3). * Remove inclusion of from read(2) and write(2). * Remove sbrk(2). System Interface Improvements: * Add d_namlen, d_dev, and d_type to struct dirent. * Add C11 static_assert to . * Improve wchar declarations in , and . * Improve ix86 and x86_64 data types ABI. * Add fsblkcnt_t and fsfilcnt_t. * Move OFF_MIN and OFF_MAX to . * Add tcgetwincurpos(2). * Add pipe2(2). * Add ttyname_r(3). * Add uname(3). * Add vscanf_callback(3). * Add getdomainname(2). * Add syslog(3). * Add getumask(2). * Add asprintf(3) and vasprintf(3). * Add statvfs(2), fstatvfs(2) and fstatvfsat(2). * Add O_NOCTTY. * Add O_TTY_INIT. * Add tzset(3). * Add rdmsr(2) and wrmsr(2). * Add sched_yield(2). * Add exit_thread(2). * Add libpthread. * Add pthread_self(3). * Add pthread_equal(3). * Add pthread_mutex_lock(3) and pthread_mutex_unlock(3). * Add pthread_mutex_trylock(3). * Add pthread_mutex_init(3) and pthread_mutex_destroy(3). * Add pthread_mutexattr_init(3) and pthread_mutexattr_destroy(3). * Add pthread_mutexattr_gettype(3) and pthread_mutexattr_settype(3). * Add pthread_cond_{broadcast,signal}(3) and pthread_cond_wait(3). * Add pthread_cond_timedwait(3). * Add pthread_cond_init(3) and pthread_cond_destroy(3). * Add pthread_condattr_init(3) and pthread_condattr_destroy(3). * Add pthread_condattr_getclock(3) and pthread_condattr_setclock(3). * Add pthread_rwlock_{rdlock,wrlock}(3) and pthread_rwlock_unlock(3). * Add pthread_rwlock_tryrdlock(3) and pthread_rwlock_trywrlock(3). * Add pthread_rwlock_init(3) and pthread_rwlock_destroy(3). * Add pthread_rwlockattr_init(3) and pthread_rwlockattr_destroy(3). * Add pthread_exit(3). * Add pthread_key_create(3) and pthread_key_delete(3). * Add pthread_getspecific(3) and pthread_setspecific(3). * Add pthread_once(3). * Add pthread_sigmask(3). * Add pthread_create(3). * Add pthread_attr_init(3) and pthread_attr_destroy(3). * Add pthread_attr_setstacksize(3) and pthread_attr_getstacksize(3). * Add pthread_join(3). * Add pthread_attr_getdetachstate(3) and pthread_attr_setdetachstate(3). * Add pthread_detach(3). * Add ESIGPENDING. * Implement signals. * Add execlpe(3). * Add sysconf(_SC_GETGR_R_SIZE_MAX). * Add sysconf(_SC_GETPW_R_SIZE_MAX). * Add qsort_r(3). * Add fmemopen(3). * Add recvmsg(2) and sendmsg(2). * Add getsockopt(2) and setsockopt(2). * Add wcwidth(3) and wcswidth(3). * Add dscandir_r(3). * Add alphasort_r(3). * Add versionsort_r(3). * Add isascii(3). * Add btowc(3) and wctob(3). * Add tcgetblob(2) and tcsetblob(2). * Add wcstof(3), wcstod(3) and wcstold(3). * Add wcsftime(3). * Add wcpcpy(3). * Add wcpncpy(3). * Add wcscasecmp(3). * Add wcsdup(3). * Add wcsncasecmp(3). * Add wcsnlen(3). * Add wcslcat(3) and wcslcpy(3). * Add type limits and print/scan specifiers to . * Add timingsafe_memcmp(3). * Add explicit_bzero(3). * Add ESTALE. * Add fpathconf(2). * Add getpeername(2) and getsockname(2). * Implement recvfrom(2) and sendto(2). * Add shutdown(2). * Add memrchr(3). * Add . * Add strsep(3). * Add stresep(3). * Add getentropy(2). * Add arc4random(3). * Add sysconf(_SC_MONOTONIC_CLOCK). * Add semaphores API. * Add fcntl(F_PREVFD) and fcntl(F_NEXTFD). * Add cbprintf(3) and vcbprintf(3). * Add remaining standard errno values. * Add gethostname(2) and sethostname(2). * Add AT_EACCESS support to faccessat(2). * Add reallocarray(3). * Add umount(2) and unmountat(2). Standard Library Improvements: * Improve basename(3) and dirname(3). * Add %m support to vprintf_callback(3). * Rewrite getenv(3), setenv(3), unsetenv(3) and clearenv(3). * Handle NULL strings in vprintf_callback(3). * Thread secure errno(3). * Thread-secure user-space heap. * Thread-secure exit(3). * Thread-secure stdio. * Thread-secure error(3). * Thread-secure psignal(3). * Thread-secure setlocale(3). * Thread-secure rand(3). * Thread-secure dregister(3) and dunregister(3). * Add attribute format to standard library headers. * Ensure system call indices are valid expressions in libc syscall stubs. * Improve qsort_r(3) run-time complexity using quicksort. * Revise stdio implementation. * Delay heap initialization until first heap expansion. * Implement standard library feature macros. * Honor feature macros in . * Honor feature macros in . * Honor feature macros in . * Honor feature macros in . * Honor feature macros in . * Honor feature macros in . * Rename crt1.o to crt0.o and install compatibility crt1.o. * Reimplement wchar conversion API. * Improve execvpe(3) logic and run shell on ENOEXEC. * Honor feature macros in . * Rename libc/aux to libc/c++. * Reuse the argv[0] string in program_invocation_name(3). * Remove dcloseall() and fcloseall(). * Use strnlen(3) in strndup(3). * Indirectly closedir(3) from exit(3). * Indirectly free(3) buffers in fshutdown(3). * Indirectly fflush(3) from fshutdown(3). * Initialize stdin, stdout and stderr at compile time. * Lazily close files in exit(3). * Improve mkstemp(3) random path generation. * Honor feature macros in . * Warn on sprintf use. * Warn on asctime and ctime use. * Rewrite malloc(3). * Use PWD in get_current_dir_name(3) if correct. * Warn on rand and srand use. * Warn on mktemp use. * Forward compatibility with future rename of _start to __start. Kernel Improvements: * Rename struct kernel_dirent::d_off to d_nextoff. * Add function for clearing user-space memory from the kernel. * Improve the reliability of the kernel likely and unlikely macros. * Open stdin, stdout and stderr in the kernel rather than init. * Clean up the serial driver read and write routines. * Refactor i386 and x86_64 interrupt support. * Refactor PCI BAR support. * Refactor kernel PAT, MTRR, and MSR usage. * Rename useresp to esp and userrsp to rsp. * Move O_ACCMODE into kernel headers. * Maintain fsbase and gsbase as per-thread registers. * Handle ELF notes during program load. * Add kernel uthread support. * Implement thread creation in tfork(2). * Deliver SIGPIPE on filesystem socket disconnect. * Add format attribute to kernel print and panic functions. * Clean up scheduler. * Clean up kernel thread creation code. * Relocate kernel IO port functions to . * Refactor kernel interrupt and thread register support. * Refactor process id allocation and accounting. * Implement searching for multiple PCI devices matching a pattern. * Add utility functions for mapping PCI memory areas. * Refactor kernel graphics support. * Let kernel debugger know how it was invoked. * Add unicode support to kernel terminal and console. * Memory efficiently extract the initrd. * Increase default pipe buffer size to 64 KiB. * Implement SO_RCVBUF and SO_SNDBUF for filesystem sockets. * Add support for \e[9xm and \e[10xm escape sequences. * Clean up initrd extraction code. * Optimize reading the CMOS real time clock. * Display progress bar during initrd extraction. * Flatten initrd symbolic links to hardlinks inside the same directory. * Add #! support to execve(2). * Slightly improve addralloc virtual address space leaking. * Maintain count of used blocks in the filesystem cache. * Maintain size of allocated memory in the heap. * Maintain counts of physical frames used for particular purposes. * Store loaded programs in special allocations rather than the kernel heap. * Improve memset(3) performance. * Rename to . * Support \e[39m and \e[49m in the console. * Remove String::Combine kernel function. * Retire calltrace support in favor of the kernel debugger. * Upgrade to latest upstream multiboot header. * Optimize file descriptor allocation. * Securely copy to and from user-space. * Add symbolic links. * Implement yielding a timeslice to another thread. * Optimize userfs using scheduler yield hints. * Optimize pipe transfers using scheduler yield hints. * Refactor interrupt handler registration. * Initialize system call table at compile time. * Rewrite program loader. * Add unicode replacement character onto VGA font. Utilities Improvements: * Offer option to dump environment in tix-build(1) recovery shell. * Use getdomainname(2) in uname(3). * Improve asteroids keyboard input handling. * Add env(1). * Improve mv(1). * Add -d option to ls(1). * Add -i option to ls(1). * Add -t option to ls(1). * Add chmod(1). * Add expr(1). * Add sort(1). * Add uniq(1). * Add basename(1). * Add dirname(1). * Add tr(1). * Run command-not-found in sh only if errno is ENOENT. * Use fmemopen(3) internally in sh(1). * Rewrite chvideomode(1). * Remove DEFAULT_STUFF environmental variable from init(1). * Add unicode support to editor(1). * Add carray(1). * Add --format option to mkinitrd(1). * Rewrite ls(1). * Use a proper shell as sh(1) backend if available. * Port tix to Sortix. * Add sleep(1). * Set TERM=sortix in init. * Use -k when tix-build makes distclean. * Improve cp(1). * Rewrite column(1). * Use arc4random(3) in asteroids(1). * Ignore unsupported cp --preserve option. * Add pkg.make.needed-vars.AR. * Improve cp's install(1) emulation. * Add symbolic link support to cp(1). * Add symbolic link support to ls(1). * Fix sprintf uses in sh. * Add yes(1). * Move sh to its own directory. * Add line editing, history and tab completion to shell. * Use SHLVL to determine if a shell is outermost. * Add option parsing to the shell. * Improve shell line reading. * Use shell tokenization to recognize complete lines. * Lexically change working directory in shell. * Move editor to its own subdirectory. * Add control-arrow commands to editor. * Handle movement between editor lines with tabs. * Refactor editor viewport positioning. * Add line numbering to editor. * Improve editor syntax highlighting of include statements. * Add uuid support to extfs. * Optimize extfs syncing inodes. * Optimize extfs syncing blocks. * Hash extfs inode cache lookup. * Notes on extfs speedup. * Implement modified time in extfs. * Add unmount(1). * Move init to its own directory. * Improve init. * Add tix-build support for catching warnings. * Rewrite pager(1). * Work around a getdelim bug in column(1). * Add space as an alias for page down in pager(1). * Highlight binary constants in the editor. * Add the Trianglix Desktop Environment. Bug fixes: * Fix wrong return type in getpgid(2) implementation. * Fix Sortix::Process::GetParentProcessId forward declaration return type. * Fix unportable pid_t printing in calltrace(3). * Fix unportable gid_t parsing in fgetgrent_r(3). * Fix unportable gid_t and uid_t parsing in fgetpwent_r(3). * Fix unportable pid_t parsing in sh(1). * Add missing includes to . * Fix MAKEFLAGS not being correctly purified in tix-build(1). * Fix tix-build(1) not preserving PKG_CONFIG_LIBDIR in PKG_CONFIG_FOR_BUILD. * Fix incorrect usage of __is_sortix_foo macros in preprocessor conditionals. * Fix not being wrapped in __BEGIN_DECLS and __END_DECLS. * Fix libc function implementations without extern "C" linkage. * Fix unode readdirents not setting struct kernel_dirent::d_type. * Fix struct kernel_dirent::d_namlen being called d_namelen. * Fix bugs in vprintf_callback(3) and improve %c and %s support. * Fix accept4 ignoring addrlen parameter as input. * Fix fcntl(fd, F_SETFL, x) not setting the descriptor flags properly. * Fix insecure user-space pointer dereferences in sys_memstat. * Fix insecure user-space pointer dereferences in sys_waitpid. * Fix insecure user-space pointer dereferences in sys_tfork. * Fix insecure user-space pointer dereferences in sys_kernelinfo. * Fix %T in strftime(3) being incorrectly implemented. * Fix tix programs not including to get SIGPIPE. * Fix negated return value in sigisemptyset(3). * Fix range check in sigismember(3). * Fix memory leak in getlogin_r(3). * Silence uninitialized variable warning in wcrtomb(3). * Silence uninitialized variable warning in tix-execpatch(1). * Fix wrong return types in towlower(3) and towupper(3) implementations. * Fix lseek changing errno in fdio_install_fd when no real error occurs. * Fix wrong return value for fcntl(F_SETFL, ...). * Fix wrong return type of ModeToDT kernel function. * Fix send(2) calling sys_recv rather than sys_send. * Fix symlinkat(2) calling sys_linkat rather than sys_symlinkat. * Fix setegid(2) calling sys_getegid rather than sys_setegid. * Fix seteuid(2) calling sys_geteuid rather than sys_seteuid. * Fix setgid(2) calling sys_getgid rather than sys_setgid. * Fix setuid(2) calling sys_getuid rather than sys_setuid. * Fix unportable pid_t printing in sortix/interrupt.cpp. * Fix unportable pid_t printing in sortix/kernel.cpp. * Fix unportable pid_t printing in sortix/scheduler.cpp. * Fix cat(1) argument parsing. * Fix du(1) argument parsing. * Fix ls(1) argument parsing. * Fix pwd(1) argument parsing. * Fix wc(1) argument parsing. * Include in . * Fix readdir(3) not preserving errno in case of end-of-directory condition. * Fix print format warnings in kernel/x86-family/memorymanagement.cpp. * Fix print format warnings in kernel/syscall.cpp. * Fix tcgetpgrp resetting the foreground process group to zero. * Fix buffer overflow in execvpe(3). * Fix basename(3) and dirname(3) returning incorrect strings. * Fix strtol(3) handling negative numbers incorrectly. * Fix not including . * Fix not declaring struct timespec. * Fix not declaring size_t. * Fix missing includes from private kernel headers. * Fix not including and . * Fix vscanf_callback(3) not ungetcing the last character when stopping. * Fix 32-bit PCI devices not having bar sizes correctly determined. * Fix canonicalize_file_name_at(3) not handling file paths correctly. * Fix init not respecting the home directory from /etc/passwd. * Fix including . * Fix wrong allocation failure check in dscandir_r(3). * Fix kernel refcounted classes without virtual destructor. * Fix troublesome debug assertions in kernel/process.cpp. * Fix mktemp(3) prototype visibility in . * Fix missing braces in kernel/debugger.cpp. * Fix getpagesize(2) visibility in . * Fix files relying on including . * Fix wrong TSS limit. * Fix uninitialized bool in kernel Descriptor class. * Fix editor writing NUL bytes to terminal. * Fix calloc not erroring on multiplication overflow. * Fix premature return during VGA text buffer emergency reset. * Fix getopt_long(3) not handling invalid options and long options properly. * Fix cross-development not building binutils with --disable-werror. * Fix missing parentheses in grp and pwd implementation. * Fix libc files not including their associated header. * Fix non-portable asm keyword usage in in system header. * Fix usage of inline keyword in . * Fix C++ comments in . * Fix C++ comments in . * Fix buffer overflow in which(1). * Fix wrong project paths for ext and mbr in user-guide. * Fix memory leak of processes that are not process group leaders. * Fix suboptimal heap chunk spliting. * Fix 4 KiB memory leak on x86_64 for each process. * Fix editor not displaying an error when stdio is not a terminal. * Fix mkinitrd not maintaining correct hard link count. * Fix warning about converting a signed value to an unsigned value. * Fix ATA PIO driver not correctly detecting harddisk size. * Fix insecure user-space pointer dereferences in sys_execve. * Fix libk being built with -mmmx, -msse and -msse2 on x86_64. * Fix typo of `occurred' in posix-divergence. * Fix libc files not including if using static_assert(3). * Fix libc files not including if using alignas(3). * Fix polling Unix sockets in both incoming and outgoing directions. * Fix filesystem sockets sending SIGPIPE on disconnect. * Fix user-space filesystems not disconnecting properly. * Fix x86 longjmp(3) not restoring ebx. * Fix libc/msr/wrmsr.cpp not containing its own file path. * Fix missing TLB-flush in mprotect(). * Fix declaring access(2) constants. * Fix overlapping socket level constants. * Fix dispd console rendering sync hack not using fsync(2). * Fix init using usleep instead of nanosleep. * Fix wrongly named system call constants. * Fix memccpy(3) being terribly broken. * Fix FileCache::ChangeNumBlocks using memory after realloc shrink. * Fix missing TLB-flush in exit_thread(2). * Fix dispd.h using C++ comments. * Fix not being C89 friendly. * Fix using C++ comments. * Fix i386 not including <__/stdint.h>. * Fix terminology in exec family. * Fix process constructor not zeroing the user timers. * Fix wrong return type of init_stdio(). * Fix dregister not being thread safe. * Fix strlcpy(3) and strlcat(3) being horribly broken. * Fix format string problems in error(3) calls. * Fix clearenv(3) leaving internal pointer alive after free. * Fix uninitalized memory accesses in editor. * Fix including in C++. * Fix memchr(3) missing an unsigned char cast. * Fix init having its own poor vasprintf(3). * Fix strchrnul(3) and strrchr(3) missing an unsigned char cast. * Fix strtol("0xz", &s, 16) handling. * Fix the environment functions not rejecting the empty name. * Fix mkstemp(3) not rejecting bad templates. * Fix mkstemp(3) creating files with an insecure mode. * Fix mktime(3) and timegm(3) not sanitizing the broken down time. * Fix interrupt worker quality. * Fix tfork(2) not copying signal properties. * Fix Ref self-assignment. * Fix class process constructor forgetting some members. * Fix getdelim(2) leaking a freed pointer. * Fix readdir() setting errno on success. * Fix fdopen setting FD_CLOEXEC wrongly. * Fix strtol(3) quality. * Fix setenv(3) error case. * Fix atoi(3) out-of-range cases. * Fix error case in tfork(2). * Fix wmemmove(3) off-by-one bounds error. * Fix wcschr(3) family like strchr(3) was fixed. * Fix return value of wcscat(3). * Fix strerror_r(3) range error case. * Fix paste in editor not deleting the selection. * Fix FILE being a macro. * Fix kernel leaking ESPIPE in non-error cases. * Fix user-space filesystem copying. * Fix mbrfs partition size and length calculation. * Fix waitpid status copying to user-space. * Fix mbr error messages on empty partitions. * Fix userfs bugs return values and bugs. * Fix how the shell appends. * Fix extfs rename between directories. * Fix userfs renaming between directories. * Fix waiting for absolute time on clocks. * Fix wrong sizeof in memstat(2). * Fix page protection bugs. * Fix renegade graphical console rendering thread. * Fix assertion failure panic message ending with a newline. * Fix _start not following the ABI. * Fix math.h not providing some C99 functions. * Fix pwd(1) unsetting PWD and exit code. * Fix cp(1) error message. * Fix NOTO typo. Style: * Sort types. * Move the declaration of the DIR structure into its own header. * Split libc/dirent/dir.cpp into multiple files. * Split libc/dirent/fddir-sortix.cpp into multiple files. * Update kernel memory management to current coding conventions. * Update kernel/end.cpp to current coding conventions. * Update to current coding conventions. * Update kernel/kb/layout/us.{cpp,h} to current coding conventions. * Update kernel/kb/ps2.{cpp,h} to current coding conventions. * Update kernel/linebuffer.{cpp,h} to current coding conventions. * Update kernel/{x64,x86}/process.cpp to current coding conventions. * Update kernel/{x64,x86}/thread.cpp to current coding conventions. * Update kernel/{x64/x64,x86/x86}.cpp to current coding conventions. * Update kernel/x86-family/x86-family.{cpp,h} to current coding conventions. * Update kernel/uart.{cpp,h} to current coding conventions. * Update kernel/syscall.cpp to current coding conventions. * Update kernel/copy.cpp to current coding conventions. * Update libc/locale/setlocale.cpp to current coding conventions. * Update libc/stdlib/rand.cpp to current coding conventions. * Split libc/ctype/ctype.cpp into multiple files. * Split libc/wctype/wctype.cpp into multiple files. * Replace kernel STATIC_ASSERT macro with C++11 static_assert. * Update libc/string/memset.cpp to current coding conventions. * Update libc/string/memcmp.cpp to current coding conventions. * Update libc/string/memmove.cpp to current coding conventions. * Update mkinitrd to current coding conventions. * Update kramfs to current coding conventions. * Update strcpy(3) and wcscpy(3) to current coding conventions. * Update string compare family to current coding conventions. * Update iswcntrl(3) to current coding conventions. * Update memmove(3) to current coding conventions. * Update strcspn(3) to current coding conventions. * Update strpbrk(3) to current coding conventions. * Update strspn(3) to current coding conventions. * Update wcscspn(3) to current coding conventions. * Update wcspbrk(3) to current coding conventions. * Update wcsspn(3) to current coding conventions. * Update stpcpy(3) and wcpcpy(3) to current coding conventions. * Update memcpy(3) to current coding style. * Update strdup(3) to current coding conventions. * Update strndup(3) to current coding conventions. * Clean up kernel attribute packed use. * Clean up COM driver. * Update kernel/descriptor.cpp to current coding conventions. * Update extfs to current coding conventions. Regression testing: * Add regress(1). * Add test-pthread-basic. * Add test-pthread-tls. * Add test-pthread-self. * Add test-pthread-once. * Add test-signal-raise. * Add test-pthread-main-join. * Add test-pthread-argv. * Add test-fmemopen. Miscellaneous Improvements: * Harden strcpy calls. * Use the word invalid instead of illegal. * Change BRAND_KERNEL_NAME to Sortix.