Initial commit
This commit is contained in:
commit
b686116502
33 changed files with 2722 additions and 0 deletions
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
isodir
|
||||||
|
kernel
|
||||||
|
libc
|
||||||
|
interface_manual
|
||||||
|
man_pages
|
||||||
|
old_stuff
|
||||||
|
static_system_stuff
|
||||||
|
sysroot
|
||||||
|
utils
|
||||||
|
*.iso
|
||||||
|
*~
|
||||||
|
#*#
|
||||||
|
.vscode
|
||||||
|
dev_tools/build_util_src/*.tar.xz
|
||||||
|
dev_tools/build_util_src/higher_half_test
|
||||||
|
notes/FreeBSD's bootloader.png
|
||||||
|
notes/quick_sort_explore.c
|
8
build.sh
Executable file
8
build.sh
Executable file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
. ./headers.sh
|
||||||
|
|
||||||
|
for PROJECT in $PROJECTS; do
|
||||||
|
(cd $PROJECT && DESTDIR="$SYSROOT" $MAKE install)
|
||||||
|
done
|
12
clean.sh
Executable file
12
clean.sh
Executable file
|
@ -0,0 +1,12 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
. ./config.sh
|
||||||
|
|
||||||
|
for PROJECT in $PROJECTS; do
|
||||||
|
(cd $PROJECT && $MAKE clean)
|
||||||
|
done
|
||||||
|
|
||||||
|
rm -rf sysroot
|
||||||
|
rm -rf isodir
|
||||||
|
rm -rf fenix.iso
|
27
config.sh
Executable file
27
config.sh
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
SYSTEM_HEADER_PROJECTS="libc kernel"
|
||||||
|
PROJECTS="libc kernel"
|
||||||
|
|
||||||
|
export MAKE=${MAKE:-make}
|
||||||
|
export HOST=${HOST:-$(./default-host.sh)}
|
||||||
|
|
||||||
|
export AR=${HOST}-ar
|
||||||
|
export AS=${HOST}-as
|
||||||
|
export CC=${HOST}-gcc
|
||||||
|
|
||||||
|
export PREFIX=/usr
|
||||||
|
export EXEC_PREFIX=$PREFIX
|
||||||
|
export BOOTDIR=/boot
|
||||||
|
export LIBDIR=$EXEC_PREFIX/lib
|
||||||
|
export INCLUDEDIR=$PREFIX/include
|
||||||
|
|
||||||
|
export CFLAGS='-O2 -g'
|
||||||
|
export CPPFLAGS=''
|
||||||
|
|
||||||
|
# Sysroot time!
|
||||||
|
export SYSROOT="$(pwd)/sysroot"
|
||||||
|
export CC="$CC --sysroot=$SYSROOT"
|
||||||
|
|
||||||
|
# A workaround for -elf gcc targets
|
||||||
|
if echo "$HOST" | grep -Eq -- '-elf($|-)'; then
|
||||||
|
export CC="$CC -isystem=$INCLUDEDIR"
|
||||||
|
fi
|
3
default-host.sh
Executable file
3
default-host.sh
Executable file
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
echo i686-elf
|
41
dev_tools/build_util_src/README
Normal file
41
dev_tools/build_util_src/README
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
This script automatically builds the cross-compiler needed to build FENIX at
|
||||||
|
this stage in time. It sets up a cross-compiler for i686-elf in ~/opt/cross.
|
||||||
|
|
||||||
|
This version of the script, suitable for building current, unversioned
|
||||||
|
pre-releases of FENIX, uses GCC 9.2.0 and Binutils 2.32. You'll need to
|
||||||
|
download these from the GNU website:
|
||||||
|
Binutils: https://ftp.gnu.org/gnu/binutils/binutils-2.32.tar.xz
|
||||||
|
GCC: https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.xz
|
||||||
|
Download these tarballs into the same folder as build_cross_compiler.sh
|
||||||
|
|
||||||
|
Additionally, you'll need the following:
|
||||||
|
- A suitable C compiler (probably GCC)
|
||||||
|
- make
|
||||||
|
- Bison
|
||||||
|
- Flex
|
||||||
|
- GMP
|
||||||
|
- MPC
|
||||||
|
- MPFR
|
||||||
|
- Texinfo
|
||||||
|
|
||||||
|
These correspond to these Fedora packages:
|
||||||
|
- gcc (or whatever C compiler you use, like Clang)
|
||||||
|
- make
|
||||||
|
- bison
|
||||||
|
- flex
|
||||||
|
- gmp-devel
|
||||||
|
- libmpc-devel
|
||||||
|
- mpfr-devel
|
||||||
|
- texinfo
|
||||||
|
|
||||||
|
Once you're ready, simply run build_cross_compiler.sh. (You may first need
|
||||||
|
to run `chmod +x build_cross_compiler.sh` in order to make it executable.
|
||||||
|
|
||||||
|
Once done, you'll probably want to add ~/opt/cross/bin to your PATH. You'll
|
||||||
|
probably also want to verify that it worked. To do so, you can start by
|
||||||
|
checking if it runs using:
|
||||||
|
`i686-elf-gcc --version`
|
||||||
|
You can also try compiling a small test kernel included in cross_compiler_test.
|
||||||
|
Simply run `make`. If everything worked, it should successfully compile. You can
|
||||||
|
then run `make test` to open the kernel in QEMU. (Note: You'll need
|
||||||
|
qemu-system-i386 to test the test kernel.
|
41
dev_tools/build_util_src/build_cross_compiler.sh
Executable file
41
dev_tools/build_util_src/build_cross_compiler.sh
Executable file
|
@ -0,0 +1,41 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# Extract binutils and gcc
|
||||||
|
# You can try changing versions, if you want.
|
||||||
|
# The official setup is binutils 2.32 and GCC 9.2.0
|
||||||
|
tar -xvf binutils-2.32.tar.xz
|
||||||
|
tar -xvf gcc-9.2.0.tar.xz
|
||||||
|
|
||||||
|
# We'll eventuall change to, like, i686-fenix or something,
|
||||||
|
# but, for now, this is what we'll use.
|
||||||
|
# Besides, we'd need patches for a custom OS target
|
||||||
|
TARGET=i686-elf
|
||||||
|
PREFIX="$HOME/opt-test/cross"
|
||||||
|
PATH="$PREFIX/bin:$PATH"
|
||||||
|
|
||||||
|
# Go ahead and make sure the prefix exists
|
||||||
|
mkdir -p $PREFIX
|
||||||
|
|
||||||
|
# Binutils build
|
||||||
|
mkdir build-binutils
|
||||||
|
cd build-binutils
|
||||||
|
# Binutils w/o native language support. Feel free to remove --disable-nls
|
||||||
|
# if you want stuff in your native language. Also, enable sysroot support.
|
||||||
|
../binutils-2.32/configure --target=$TARGET --prefix="$PREFIX" --with-sysroot --disable-nls --disable-werror
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
|
||||||
|
# GCC build
|
||||||
|
cd ..
|
||||||
|
mkdir build-gcc
|
||||||
|
cd build-gcc
|
||||||
|
# Check for $PREFIX/bin in PATH
|
||||||
|
which -- $TARGET-as || exit 1
|
||||||
|
# GCC w/o NLS and with only C support. Also, it shouldn't rely on having
|
||||||
|
# headers available to it. You can optionally remove --disable-nls for
|
||||||
|
# nativle language stuffs, or add ,C++ to languages, if you wanna have C++.
|
||||||
|
../gcc-9.2.0/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c --without-headers
|
||||||
|
make all-gcc
|
||||||
|
make all-target-libgcc
|
||||||
|
make install-gcc
|
||||||
|
make install-target-libgcc
|
24
dev_tools/build_util_src/cross_compiler_test/Makefile
Normal file
24
dev_tools/build_util_src/cross_compiler_test/Makefile
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Reminder that you'll need the cross compiler toolchain setup already.
|
||||||
|
PREFIX = i686-elf-
|
||||||
|
CC = $(PREFIX)gcc
|
||||||
|
AS = $(PREFIX)as
|
||||||
|
CFLAGS = -ffreestanding -O2
|
||||||
|
WARNFLAGS = -Wall -Wextra
|
||||||
|
|
||||||
|
all: test.bin
|
||||||
|
|
||||||
|
test: test.bin
|
||||||
|
grub-file --is-x86-multiboot test.bin
|
||||||
|
qemu-system-i386 -kernel test.bin
|
||||||
|
|
||||||
|
test.bin: boot.o kernel.o linker.ld
|
||||||
|
$(CC) -T linker.ld -o test.bin $(CFLAGS) -nostdlib boot.o kernel.o -lgcc
|
||||||
|
|
||||||
|
boot.o: boot.s
|
||||||
|
$(AS) boot.s -o boot.o
|
||||||
|
|
||||||
|
kernel.o: kernel.c
|
||||||
|
$(CC) -c kernel.c -o kernel.o -std=gnu99 $(CFLAGS) $(WARNFLAGS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm *.o test.bin
|
109
dev_tools/build_util_src/cross_compiler_test/boot.s
Executable file
109
dev_tools/build_util_src/cross_compiler_test/boot.s
Executable file
|
@ -0,0 +1,109 @@
|
||||||
|
/* Declare constants for the multiboot header. */
|
||||||
|
.set ALIGN, 1<<0 /* align loaded modules on page boundaries */
|
||||||
|
.set MEMINFO, 1<<1 /* provide memory map */
|
||||||
|
.set FLAGS, ALIGN | MEMINFO /* this is the Multiboot 'flag' field */
|
||||||
|
.set MAGIC, 0x1BADB002 /* 'magic number' lets bootloader find the header */
|
||||||
|
.set CHECKSUM, -(MAGIC + FLAGS) /* checksum of above, to prove we are multiboot */
|
||||||
|
|
||||||
|
/*
|
||||||
|
Declare a multiboot header that marks the program as a kernel. These are magic
|
||||||
|
values that are documented in the multiboot standard. The bootloader will
|
||||||
|
search for this signature in the first 8 KiB of the kernel file, aligned at a
|
||||||
|
32-bit boundary. The signature is in its own section so the header can be
|
||||||
|
forced to be within the first 8 KiB of the kernel file.
|
||||||
|
*/
|
||||||
|
.section .multiboot
|
||||||
|
.align 4
|
||||||
|
.long MAGIC
|
||||||
|
.long FLAGS
|
||||||
|
.long CHECKSUM
|
||||||
|
|
||||||
|
/*
|
||||||
|
The multiboot standard does not define the value of the stack pointer register
|
||||||
|
(esp) and it is up to the kernel to provide a stack. This allocates room for a
|
||||||
|
small stack by creating a symbol at the bottom of it, then allocating 16384
|
||||||
|
bytes for it, and finally creating a symbol at the top. The stack grows
|
||||||
|
downwards on x86. The stack is in its own section so it can be marked nobits,
|
||||||
|
which means the kernel file is smaller because it does not contain an
|
||||||
|
uninitialized stack. The stack on x86 must be 16-byte aligned according to the
|
||||||
|
System V ABI standard and de-facto extensions. The compiler will assume the
|
||||||
|
stack is properly aligned and failure to align the stack will result in
|
||||||
|
undefined behavior.
|
||||||
|
*/
|
||||||
|
.section .bss
|
||||||
|
.align 16
|
||||||
|
stack_bottom:
|
||||||
|
.skip 16384 # 16 KiB
|
||||||
|
stack_top:
|
||||||
|
|
||||||
|
/*
|
||||||
|
The linker script specifies _start as the entry point to the kernel and the
|
||||||
|
bootloader will jump to this position once the kernel has been loaded. It
|
||||||
|
doesn't make sense to return from this function as the bootloader is gone.
|
||||||
|
*/
|
||||||
|
.section .text
|
||||||
|
.global _start
|
||||||
|
.type _start, @function
|
||||||
|
_start:
|
||||||
|
/*
|
||||||
|
The bootloader has loaded us into 32-bit protected mode on a x86
|
||||||
|
machine. Interrupts are disabled. Paging is disabled. The processor
|
||||||
|
state is as defined in the multiboot standard. The kernel has full
|
||||||
|
control of the CPU. The kernel can only make use of hardware features
|
||||||
|
and any code it provides as part of itself. There's no printf
|
||||||
|
function, unless the kernel provides its own <stdio.h> header and a
|
||||||
|
printf implementation. There are no security restrictions, no
|
||||||
|
safeguards, no debugging mechanisms, only what the kernel provides
|
||||||
|
itself. It has absolute and complete power over the
|
||||||
|
machine.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
To set up a stack, we set the esp register to point to the top of the
|
||||||
|
stack (as it grows downwards on x86 systems). This is necessarily done
|
||||||
|
in assembly as languages such as C cannot function without a stack.
|
||||||
|
*/
|
||||||
|
mov $stack_top, %esp
|
||||||
|
|
||||||
|
/*
|
||||||
|
This is a good place to initialize crucial processor state before the
|
||||||
|
high-level kernel is entered. It's best to minimize the early
|
||||||
|
environment where crucial features are offline. Note that the
|
||||||
|
processor is not fully initialized yet: Features such as floating
|
||||||
|
point instructions and instruction set extensions are not initialized
|
||||||
|
yet. The GDT should be loaded here. Paging should be enabled here.
|
||||||
|
C++ features such as global constructors and exceptions will require
|
||||||
|
runtime support to work as well.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Enter the high-level kernel. The ABI requires the stack is 16-byte
|
||||||
|
aligned at the time of the call instruction (which afterwards pushes
|
||||||
|
the return pointer of size 4 bytes). The stack was originally 16-byte
|
||||||
|
aligned above and we've pushed a multiple of 16 bytes to the
|
||||||
|
stack since (pushed 0 bytes so far), so the alignment has thus been
|
||||||
|
preserved and the call is well defined.
|
||||||
|
*/
|
||||||
|
call kernel_main
|
||||||
|
|
||||||
|
/*
|
||||||
|
If the system has nothing more to do, put the computer into an
|
||||||
|
infinite loop. To do that:
|
||||||
|
1) Disable interrupts with cli (clear interrupt enable in eflags).
|
||||||
|
They are already disabled by the bootloader, so this is not needed.
|
||||||
|
Mind that you might later enable interrupts and return from
|
||||||
|
kernel_main (which is sort of nonsensical to do).
|
||||||
|
2) Wait for the next interrupt to arrive with hlt (halt instruction).
|
||||||
|
Since they are disabled, this will lock up the computer.
|
||||||
|
3) Jump to the hlt instruction if it ever wakes up due to a
|
||||||
|
non-maskable interrupt occurring or due to system management mode.
|
||||||
|
*/
|
||||||
|
cli
|
||||||
|
1: hlt
|
||||||
|
jmp 1b
|
||||||
|
|
||||||
|
/*
|
||||||
|
Set the size of the _start symbol to the current location '.' minus its start.
|
||||||
|
This is useful when debugging or when you implement call tracing.
|
||||||
|
*/
|
||||||
|
.size _start, . - _start
|
114
dev_tools/build_util_src/cross_compiler_test/kernel.c
Executable file
114
dev_tools/build_util_src/cross_compiler_test/kernel.c
Executable file
|
@ -0,0 +1,114 @@
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/* Check if the compiler thinks you are targeting the wrong operating system. */
|
||||||
|
#if defined(__linux__)
|
||||||
|
#error "You are not using a cross-compiler, you will most certainly run into trouble"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This tutorial will only work for the 32-bit ix86 targets. */
|
||||||
|
#if !defined(__i386__)
|
||||||
|
#error "This tutorial needs to be compiled with a ix86-elf compiler"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Hardware text mode color constants. */
|
||||||
|
enum vga_color {
|
||||||
|
VGA_COLOR_BLACK = 0,
|
||||||
|
VGA_COLOR_BLUE = 1,
|
||||||
|
VGA_COLOR_GREEN = 2,
|
||||||
|
VGA_COLOR_CYAN = 3,
|
||||||
|
VGA_COLOR_RED = 4,
|
||||||
|
VGA_COLOR_MAGENTA = 5,
|
||||||
|
VGA_COLOR_BROWN = 6,
|
||||||
|
VGA_COLOR_LIGHT_GREY = 7,
|
||||||
|
VGA_COLOR_DARK_GREY = 8,
|
||||||
|
VGA_COLOR_LIGHT_BLUE = 9,
|
||||||
|
VGA_COLOR_LIGHT_GREEN = 10,
|
||||||
|
VGA_COLOR_LIGHT_CYAN = 11,
|
||||||
|
VGA_COLOR_LIGHT_RED = 12,
|
||||||
|
VGA_COLOR_LIGHT_MAGENTA = 13,
|
||||||
|
VGA_COLOR_LIGHT_BROWN = 14,
|
||||||
|
VGA_COLOR_WHITE = 15,
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg)
|
||||||
|
{
|
||||||
|
return fg | bg << 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint16_t vga_entry(unsigned char uc, uint8_t color)
|
||||||
|
{
|
||||||
|
return (uint16_t) uc | (uint16_t) color << 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t strlen(const char* str)
|
||||||
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
while (str[len])
|
||||||
|
len++;
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const size_t VGA_WIDTH = 80;
|
||||||
|
static const size_t VGA_HEIGHT = 25;
|
||||||
|
|
||||||
|
size_t terminal_row;
|
||||||
|
size_t terminal_column;
|
||||||
|
uint8_t terminal_color;
|
||||||
|
uint16_t* terminal_buffer;
|
||||||
|
|
||||||
|
void terminal_initialize(void)
|
||||||
|
{
|
||||||
|
terminal_row = 0;
|
||||||
|
terminal_column = 0;
|
||||||
|
terminal_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK);
|
||||||
|
terminal_buffer = (uint16_t*) 0xB8000;
|
||||||
|
for (size_t y = 0; y < VGA_HEIGHT; y++) {
|
||||||
|
for (size_t x = 0; x < VGA_WIDTH; x++) {
|
||||||
|
const size_t index = y * VGA_WIDTH + x;
|
||||||
|
terminal_buffer[index] = vga_entry(' ', terminal_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_setcolor(uint8_t color)
|
||||||
|
{
|
||||||
|
terminal_color = color;
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_putentryat(char c, uint8_t color, size_t x, size_t y)
|
||||||
|
{
|
||||||
|
const size_t index = y * VGA_WIDTH + x;
|
||||||
|
terminal_buffer[index] = vga_entry(c, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_putchar(char c)
|
||||||
|
{
|
||||||
|
terminal_putentryat(c, terminal_color, terminal_column, terminal_row);
|
||||||
|
if (++terminal_column == VGA_WIDTH) {
|
||||||
|
terminal_column = 0;
|
||||||
|
if (++terminal_row == VGA_HEIGHT)
|
||||||
|
terminal_row = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_write(const char* data, size_t size)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < size; i++)
|
||||||
|
terminal_putchar(data[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void terminal_writestring(const char* data)
|
||||||
|
{
|
||||||
|
terminal_write(data, strlen(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
void kernel_main(void)
|
||||||
|
{
|
||||||
|
/* Initialize terminal interface */
|
||||||
|
terminal_initialize();
|
||||||
|
|
||||||
|
/* Newline support is left as an exercise. */
|
||||||
|
terminal_writestring("Hello, kernel World!\n");
|
||||||
|
}
|
43
dev_tools/build_util_src/cross_compiler_test/linker.ld
Executable file
43
dev_tools/build_util_src/cross_compiler_test/linker.ld
Executable file
|
@ -0,0 +1,43 @@
|
||||||
|
/* The bootloader will look at this image and start execution at the symbol
|
||||||
|
designated as the entry point. */
|
||||||
|
ENTRY(_start)
|
||||||
|
|
||||||
|
/* Tell where the various sections of the object files will be put in the final
|
||||||
|
kernel image. */
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
/* Begin putting sections at 1 MiB, a conventional place for kernels to be
|
||||||
|
loaded at by the bootloader. */
|
||||||
|
. = 1M;
|
||||||
|
|
||||||
|
/* First put the multiboot header, as it is required to be put very early
|
||||||
|
early in the image or the bootloader won't recognize the file format.
|
||||||
|
Next we'll put the .text section. */
|
||||||
|
.text BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(.multiboot)
|
||||||
|
*(.text)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read-only data. */
|
||||||
|
.rodata BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(.rodata)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read-write data (initialized) */
|
||||||
|
.data BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read-write data (uninitialized) and stack */
|
||||||
|
.bss BLOCK(4K) : ALIGN(4K)
|
||||||
|
{
|
||||||
|
*(COMMON)
|
||||||
|
*(.bss)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The compiler may produce other sections, by default it will put them in
|
||||||
|
a segment with the same name. Simply add stuff here as needed. */
|
||||||
|
}
|
10
headers.sh
Executable file
10
headers.sh
Executable file
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
. ./config.sh
|
||||||
|
|
||||||
|
mkdir -p "$SYSROOT"
|
||||||
|
|
||||||
|
for PROJECT in $SYSTEM_HEADER_PROJECTS; do
|
||||||
|
(cd $PROJECT && DESTDIR="$SYSROOT" $MAKE install-headers)
|
||||||
|
done
|
16
iso.sh
Executable file
16
iso.sh
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
. ./build.sh
|
||||||
|
|
||||||
|
mkdir -p isodir
|
||||||
|
mkdir -p isodir/boot
|
||||||
|
mkdir -p isodir/boot/grub
|
||||||
|
|
||||||
|
cp sysroot/boot/fenix.kernel isodir/boot/fenix.kernel
|
||||||
|
cat > isodir/boot/grub/grub.cfg <<EOF
|
||||||
|
menuentry "fenix" {
|
||||||
|
multiboot /boot/fenix.kernel
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
grub-mkrescue -o fenix.iso isodir
|
94
notes/CWPL/CWPL_v1
Executable file
94
notes/CWPL/CWPL_v1
Executable file
|
@ -0,0 +1,94 @@
|
||||||
|
Clumsy Wolf Public License
|
||||||
|
Version 1
|
||||||
|
|
||||||
|
0) You are free to use this package as you wish, for any purpose
|
||||||
|
1) You are free to study the source code and change it to your
|
||||||
|
liking. To allow you to do so, the souce code will be provided to
|
||||||
|
the best of the primary author's ability. If you make changes,
|
||||||
|
you are under no obligation to notify anyone or share those
|
||||||
|
changes with the original authors of this package.
|
||||||
|
2) You are free to give unmodified copies of this package to anyone
|
||||||
|
you wish, so long as you keep a copy of this license in with it.
|
||||||
|
3) You are free to give modified copies of this package to anyone
|
||||||
|
you wish, so long as that package is licensed under this license,
|
||||||
|
including future versions of this license, or any GNU General
|
||||||
|
Public License-compatible license. Additionally, any modified
|
||||||
|
version must include a notice clearly stating that you modified
|
||||||
|
the package.
|
||||||
|
4) If you distribute this package, modified or unmodified, in binary
|
||||||
|
format, you must either include the source code with the binary
|
||||||
|
distribution, or provide a link to the source code of the version
|
||||||
|
of this package being distributed (i.e. an unmodified package
|
||||||
|
links to the original's source code, a modified package links to
|
||||||
|
the modified package's source code). If you are providing a link
|
||||||
|
to a modified version, you must take reasonable effort to ensure
|
||||||
|
the link stays available for at least 3 months from the last
|
||||||
|
distribution of the binary package.
|
||||||
|
5) You may distribute this package, modified or unmodified, for a
|
||||||
|
fee. However, you may not distribute the source code for a fee
|
||||||
|
if you choose not to charge a fee for the binary package, and if
|
||||||
|
the binary package is distributed for a fee, you must either
|
||||||
|
include the source code with the binary package or provide the
|
||||||
|
source code free of charge upon request. If you are only
|
||||||
|
providing the source code of the package, you may charge a fee
|
||||||
|
for it, though.
|
||||||
|
6) If you distribute this package unmodified, any and all downstream
|
||||||
|
recipients will automatically receive a license to use, modify,
|
||||||
|
and distribute this package subject to this license. You are not
|
||||||
|
responsible for enforcing compliance by third parties with this
|
||||||
|
license. However, you may not impose any restrictions beyond what
|
||||||
|
this license permits.
|
||||||
|
7) If you distribute this package (modified or unmodified) you may
|
||||||
|
not impose any form of license fee, royalty, or other charge for
|
||||||
|
exercise of rights granted under this license, nor may you
|
||||||
|
initiate litigation of any form alleging any patent claim is
|
||||||
|
infringed by making, using, selling, offering for sale,
|
||||||
|
importing, running, modifying, or distributing this package or
|
||||||
|
any portion thereof.
|
||||||
|
8) If you make any changes to this package, you grant any users of
|
||||||
|
any version of this package containing those changes a
|
||||||
|
non-exclusive, worldwide, royalty-free patent license to any
|
||||||
|
patent claims you may have to those changes for the purpose of
|
||||||
|
making, using, selling, offering for sale, importation, running,
|
||||||
|
modification, or distribution of the versions of this package
|
||||||
|
containing those changes.
|
||||||
|
9) If any conditions are imposed on you by a third-party that
|
||||||
|
contradict the conditions of this license, you are not excused
|
||||||
|
from the conditions of this license. If you cannot distribute
|
||||||
|
this package in such a way that satisfies your obligations under
|
||||||
|
this license and under any obligations imposed by a third-party,
|
||||||
|
then you may not distribute this package in any form at all.
|
||||||
|
10) THIS PACKAGE COMES WITH NO WARRANTY TO THE EXTENT PERMITTED BY
|
||||||
|
LAW. EXCEPT WHERE OTHERWISE STATED IN WRITING, THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THIS PACKAGE "AS IS"
|
||||||
|
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
|
||||||
|
RISK AS TO THE QUALITY AND PERFORMANCE OF THIS PACKAGE IS WITH
|
||||||
|
YOU. SHOULD THIS PACKAGE PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR, OR CORRECTION.
|
||||||
|
11) IN NO EVENT, UNLESS REQUIRED BY LAW OR AGREED TO IN WRITING,
|
||||||
|
WILL ANY COPYRIGHT HOLDER OR OTHER PARTY WHO MODIFIES/
|
||||||
|
DISTRIBUTES THIS PACKAGE AS PERMITTED ABOVE BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
|
||||||
|
THE PROGRAM, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED
|
||||||
|
OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
12) If the disclaimer of warranty and limitation of liability
|
||||||
|
provided above cannot be put into effect due to local law,
|
||||||
|
reviewing courts shall apply local law that most closely
|
||||||
|
approximates an absolute waiver of all civil liability in
|
||||||
|
connection with this package, unless a warranty or assumption of
|
||||||
|
liability accompanies a copy of this package in return for a
|
||||||
|
fee.
|
||||||
|
13) You are not required to accept this license in order to use this
|
||||||
|
package. However, you must accept this license in order to
|
||||||
|
modify or distribute this package.
|
||||||
|
14) If you are distributing any version of this package, you are
|
||||||
|
permitted to remove the disclaimers in section 11 and 12.
|
||||||
|
However, you must include in the distribution a notice about the
|
||||||
|
extent of the warranty and/or liability, as well as a disclaimer
|
||||||
|
that it is you who is offering the warranty and/or assumption of
|
||||||
|
liability and *not* the original developers of this package.
|
||||||
|
Additionally, remove this section from the license file, and
|
||||||
|
renumber any sections following the section(s) removed.
|
43
notes/CWPL/CWPL_v2
Executable file
43
notes/CWPL/CWPL_v2
Executable file
|
@ -0,0 +1,43 @@
|
||||||
|
Clumsy Wolf Public License
|
||||||
|
Version 2
|
||||||
|
|
||||||
|
0) You are free to use this package as you wish, for any purpose and
|
||||||
|
to study the source code and change it to your liking. To allow
|
||||||
|
you to do so, the souce code will be provided to the best of the
|
||||||
|
primary author's ability. If you make changes, you are under no
|
||||||
|
obligation to notify anyone or share those changes with the
|
||||||
|
original authors of this package.
|
||||||
|
1) You are free to give unmodified copies of this package to anyone
|
||||||
|
you wish, so long as you keep a copy of this license in with it.
|
||||||
|
You are also free to give modified copies of this package to
|
||||||
|
anyone you wish, so long as that package is licensed under this
|
||||||
|
license, including future versions of this license, or any less
|
||||||
|
restrictive license. Additionally, any modified version should
|
||||||
|
include a note stating that you modified the package.
|
||||||
|
2) If you make any changes to this package, you agree to not pursue
|
||||||
|
patent claims relating to any patents you may hold over the
|
||||||
|
changes you have made.
|
||||||
|
3) THIS PACKAGE COMES WITH NO WARRANTY TO THE EXTENT PERMITTED BY
|
||||||
|
LAW. EXCEPT WHERE OTHERWISE STATED IN WRITING, THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THIS PACKAGE "AS IS"
|
||||||
|
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE
|
||||||
|
RISK AS TO THE QUALITY AND PERFORMANCE OF THIS PACKAGE IS WITH
|
||||||
|
YOU. SHOULD THIS PACKAGE PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR, OR CORRECTION.
|
||||||
|
4) IN NO EVENT, UNLESS REQUIRED BY LAW OR AGREED TO IN WRITING,
|
||||||
|
WILL ANY COPYRIGHT HOLDER OR OTHER PARTY WHO MODIFIES/
|
||||||
|
DISTRIBUTES THIS PACKAGE AS PERMITTED ABOVE BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
|
||||||
|
THE PROGRAM, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED
|
||||||
|
OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
5) If you are distributing any version of this package, you are
|
||||||
|
permitted to remove the disclaimers in section 3 and 4. However,
|
||||||
|
you must include in the distribution a notice about the extent of
|
||||||
|
the warranty and/or liability, as well as a disclaimer that it is
|
||||||
|
you who is offering the warranty and/or assumption of liability
|
||||||
|
and *not* the original developers of this package. Additionally,
|
||||||
|
remove this section from the license file, and renumber any
|
||||||
|
sections following the section(s) removed.
|
65
notes/CWPL/CWPL_v5
Normal file
65
notes/CWPL/CWPL_v5
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
Clumsy Wolf Public License
|
||||||
|
Version 5
|
||||||
|
|
||||||
|
0) You are free to use this package as you wish, except as detailed by clause 3.
|
||||||
|
This freedom includes the freedom to study the source code and change it as
|
||||||
|
you please. To allow you to do so, the source code will be provided to the
|
||||||
|
best of the primary author's ability. If you make any changes, you are under
|
||||||
|
no obligation to notify anyone or share those changes with the original
|
||||||
|
authors of this package.
|
||||||
|
1) You are free to give unmodified copies of this package to anyone you wish,
|
||||||
|
so long as you keep a copy of this license in with it. You are also free to
|
||||||
|
give modified copies of this package to anyone you wish, so long as that
|
||||||
|
package includes a notice stating that the package includes modifications
|
||||||
|
not approved or endorsed by the original authors and the package is released
|
||||||
|
under either this license, including future versions of this license, or any
|
||||||
|
license with similar restrictions, such as the Hippocratic License or the
|
||||||
|
Cooperative Nonviolent Public License.
|
||||||
|
2) If you make and submit any changes to this package, you agree to not pursue
|
||||||
|
any patent claims relating to patents you may hold over any changes you have
|
||||||
|
made.
|
||||||
|
3) This package is not to be used by any individual or organization in a way
|
||||||
|
that promotes, lobbies for, derives income from, or otherwise supports:
|
||||||
|
- sex trafficking or human trafficking
|
||||||
|
- slavery or indentured servitude
|
||||||
|
- any form of child labour
|
||||||
|
- gambling, tobacco, or other adversely addictive behaviours
|
||||||
|
- warfare or weapons manufacturing, including nuclear processes that may
|
||||||
|
contribute to the production of nuclear weapons, regardless of primary
|
||||||
|
usage of said process
|
||||||
|
- environmental destruction, including but not limited to deforestation,
|
||||||
|
pollution of air or waterways, production of fossil fuels or energy by
|
||||||
|
use of fossil fuels (including but not limited to coal--including
|
||||||
|
so-called "clean coal"--oil, or natural gas) or disposal of waste in a
|
||||||
|
way that adversely affects the environment at large
|
||||||
|
- hate speech or discrimination based on age, gender, gender identity,
|
||||||
|
race, sexuality, religion, nationality, and/or ethnicity
|
||||||
|
- fascism, contemporary American conservatism, or any other forms of
|
||||||
|
authoritarianism, including whatever it is China is doing.
|
||||||
|
- authoritarian religious movements, including but not limited to Christian
|
||||||
|
dominionism and Christian Reconstruction, Islamic jihadism, Hindutva, or
|
||||||
|
any other attempt at theocracy
|
||||||
|
- surveillance at any level, whether individual or large-scale
|
||||||
|
- incarceration of any human being
|
||||||
|
Additionally, commercial use of this package is only permitted by individuals
|
||||||
|
or worker-owned cooperatives.
|
||||||
|
4) THIS PACKAGE COMES WITH NO WARRANTY TO THE EXTENT PERMITTED BY LAW, EXCEPT
|
||||||
|
WHERE OTHERWISE STATED IN WRITING. THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THIS PACKAGE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO
|
||||||
|
THE QUALITY AND PERFORMANCE OF THIS PACKAGE IS WITH YOU. SHOULD THIS PACKAGE
|
||||||
|
PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR
|
||||||
|
CORRECTION
|
||||||
|
5) IN NO EVENT, UNLESS REQUIRED BY LAW OR AGREED TO IN WRITING, WILL ANY
|
||||||
|
COPYRIGHT HOLDER OR OTHER PARTY WHO MODIFIES/DISTRIBUTES THIS PACKAGE AS
|
||||||
|
PERMITTED ABOVE BE LIABLE TO YOU FOR DAMAGE, INCLUDING ANY GENERAL, SPECIAL,
|
||||||
|
INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO
|
||||||
|
USE THE PROGRAM, EVEN IF SUCH HOLDER OR OTHER PARTIES HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
6) If you are distributing any version of this package, you are permitted to
|
||||||
|
replace this license with CWPL v5l, v5w, or v5lw which removes the
|
||||||
|
disclaimers in clauses 4 and/or 5, under the strict condition that you
|
||||||
|
include in the package a notice that it is you who is offering the warranty
|
||||||
|
and/or assumption of liability and not the original developers of this
|
||||||
|
package.
|
59
notes/CWPL/CWPL_v5l
Normal file
59
notes/CWPL/CWPL_v5l
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
Clumsy Wolf Public License
|
||||||
|
Version 5l (with distributor assumption of liability)
|
||||||
|
|
||||||
|
0) You are free to use this package as you wish, except as detailed by clause 3.
|
||||||
|
This freedom includes the freedom to study the source code and change it as
|
||||||
|
you please. To allow you to do so, the source code will be provided to the
|
||||||
|
best of the primary author's ability. If you make any changes, you are under
|
||||||
|
no obligation to notify anyone or share those changes with the original
|
||||||
|
authors of this package.
|
||||||
|
1) You are free to give unmodified copies of this package to anyone you wish,
|
||||||
|
so long as you keep a copy of this license in with it. You are also free to
|
||||||
|
give modified copies of this package to anyone you wish, so long as that
|
||||||
|
pacakge includes a notice stating that the package includes modifications
|
||||||
|
not approved or endorsed by the original authors and the package is released
|
||||||
|
under either this license, including future versions of this license, or any
|
||||||
|
license with similar restrictions, such as the Hippocratic License or the
|
||||||
|
Cooperative Nonviolent Public License.
|
||||||
|
2) If you make and submit any changes to this package, you agree to not pursue
|
||||||
|
any patent claims relating to patents you may hold over any changes you have
|
||||||
|
made.
|
||||||
|
3) This package is not to be used by any individual or organization in a way
|
||||||
|
that promotes, lobbies for, derives income from, or otherwise supports:
|
||||||
|
- sex trafficking/human trafficking
|
||||||
|
- slavery or indentured servitude
|
||||||
|
- any form of child labour
|
||||||
|
- gambling, tobacco, or other adversely addictive behaviours
|
||||||
|
- warfare or weapons manufacturing, including nuclear processes that may
|
||||||
|
contribute to the production of nuclear weapons, regardless of primary
|
||||||
|
usage of said process
|
||||||
|
- environmental destruction, including but not limited to deforestation,
|
||||||
|
pollution of air or waterways, production of fossil fuels or energy by
|
||||||
|
use of fossil fuels (including but not limited to coal--including
|
||||||
|
so-called "clean coal"--oil, or natural gas) or disposal of waste in a
|
||||||
|
way that adversely affects the environment at large
|
||||||
|
- hate speech or discrimination based on age, gender, gender identity,
|
||||||
|
race, sexuality, religion, nationality, and/or ethnicity
|
||||||
|
- fascism, contemporary American conservatism, or any other forms of
|
||||||
|
authoritarianism, including whatever it is China is doing.
|
||||||
|
- authoritarian religious movements, including but not limited to Christian
|
||||||
|
dominionism and Christian Reconstruction, Islamic jihadism, Hindutva, or
|
||||||
|
any other attempt at theocracy
|
||||||
|
- surveillance at any level, whether individual or large-scale
|
||||||
|
- incarceration of any human being
|
||||||
|
Additionally, commercial use of this package is only permitted by individuals
|
||||||
|
or worker-owned cooperatives.
|
||||||
|
4) THIS PACKAGE COMES WITH NO WARRANTY TO THE EXTENT PERMITTED BY LAW, EXCEPT
|
||||||
|
WHERE OTHERWISE STATED IN WRITING. THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THIS PACKAGE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO
|
||||||
|
THE QUALITY AND PERFORMANCE OF THIS PACKAGE IS WITH YOU. SHOULD THIS PACKAGE
|
||||||
|
PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR, OR
|
||||||
|
CORRECTION
|
||||||
|
5) If you are distributing any version of this package, you are to replace this
|
||||||
|
license with the original CWPL v5, unless
|
||||||
|
a) you intend to assume liability for the version you are distributing in
|
||||||
|
a manner consistent with the original CWPL v5, or
|
||||||
|
b) you intend to replace this license with CWPL v5w or v5lw as described
|
||||||
|
in the original CWPL v5.
|
51
notes/CWPL/CWPL_v5lw
Normal file
51
notes/CWPL/CWPL_v5lw
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
Clumsy Wolf Public License
|
||||||
|
Version 5lw (with distributor warranty and assumption of liability)
|
||||||
|
|
||||||
|
0) You are free to use this package as you wish, except as detailed by clause 3.
|
||||||
|
This freedom includes the freedom to study the source code and change it as
|
||||||
|
you please. To allow you to do so, the source code will be provided to the
|
||||||
|
best of the primary author's ability. If you make any changes, you are under
|
||||||
|
no obligation to notify anyone or share those changes with the original
|
||||||
|
authors of this package.
|
||||||
|
1) You are free to give unmodified copies of this package to anyone you wish,
|
||||||
|
so long as you keep a copy of this license in with it. You are also free to
|
||||||
|
give modified copies of this package to anyone you wish, so long as that
|
||||||
|
pacakge includes a notice stating that the package includes modifications
|
||||||
|
not approved or endorsed by the original authors and the package is released
|
||||||
|
under either this license, including future versions of this license, or any
|
||||||
|
license with similar restrictions, such as the Hippocratic License or the
|
||||||
|
Cooperative Nonviolent Public License.
|
||||||
|
2) If you make and submit any changes to this package, you agree to not pursue
|
||||||
|
any patent claims relating to patents you may hold over any changes you have
|
||||||
|
made.
|
||||||
|
3) This package is not to be used by any individual or organization in a way
|
||||||
|
that promotes, lobbies for, derives income from, or otherwise supports:
|
||||||
|
- sex trafficking/human trafficking
|
||||||
|
- slavery or indentured servitude
|
||||||
|
- any form of child labour
|
||||||
|
- gambling, tobacco, or other adversely addictive behaviours
|
||||||
|
- warfare or weapons manufacturing, including nuclear processes that may
|
||||||
|
contribute to the production of nuclear weapons, regardless of primary
|
||||||
|
usage of said process
|
||||||
|
- environmental destruction, including but not limited to deforestation,
|
||||||
|
pollution of air or waterways, production of fossil fuels or energy by
|
||||||
|
use of fossil fuels (including but not limited to coal--including
|
||||||
|
so-called "clean coal"--oil, or natural gas) or disposal of waste in a
|
||||||
|
way that adversely affects the environment at large
|
||||||
|
- hate speech or discrimination based on age, gender, gender identity,
|
||||||
|
race, sexuality, religion, nationality, and/or ethnicity
|
||||||
|
- fascism, contemporary American conservatism, or any other forms of
|
||||||
|
authoritarianism, including whatever it is China is doing.
|
||||||
|
- authoritarian religious movements, including but not limited to Christian
|
||||||
|
dominionism and Christian Reconstruction, Islamic jihadism, Hindutva, or
|
||||||
|
any other attempt at theocracy
|
||||||
|
- surveillance at any level, whether individual or large-scale
|
||||||
|
- incarceration of any human being
|
||||||
|
Additionally, commercial use of this package is only permitted by individuals
|
||||||
|
or worker-owned cooperatives.
|
||||||
|
4) If you are distributing any version of this package, you are to replace this
|
||||||
|
license with the original CWPL v5, unless
|
||||||
|
a) you intend to assume liability and offer a warranty for the version you
|
||||||
|
are distributing in a manner consistent with the original CWPL v5, or
|
||||||
|
b) you intend to replace this license with CWPL v5l or v5w as described
|
||||||
|
in the original CWPL v5.
|
57
notes/CWPL/CWPL_v5w
Normal file
57
notes/CWPL/CWPL_v5w
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
Clumsy Wolf Public License
|
||||||
|
Version 5w (with distributor warranty)
|
||||||
|
|
||||||
|
0) You are free to use this package as you wish, except as detailed by clause 3.
|
||||||
|
This freedom includes the freedom to study the source code and change it as
|
||||||
|
you please. To allow you to do so, the source code will be provided to the
|
||||||
|
best of the primary author's ability. If you make any changes, you are under
|
||||||
|
no obligation to notify anyone or share those changes with the original
|
||||||
|
authors of this package.
|
||||||
|
1) You are free to give unmodified copies of this package to anyone you wish,
|
||||||
|
so long as you keep a copy of this license in with it. You are also free to
|
||||||
|
give modified copies of this package to anyone you wish, so long as that
|
||||||
|
pacakge includes a notice stating that the package includes modifications
|
||||||
|
not approved or endorsed by the original authors and the package is released
|
||||||
|
under either this license, including future versions of this license, or any
|
||||||
|
license with similar restrictions, such as the Hippocratic License or the
|
||||||
|
Cooperative Nonviolent Public License.
|
||||||
|
2) If you make and submit any changes to this package, you agree to not pursue
|
||||||
|
any patent claims relating to patents you may hold over any changes you have
|
||||||
|
made.
|
||||||
|
3) This package is not to be used by any individual or organization in a way
|
||||||
|
that promotes, lobbies for, derives income from, or otherwise supports:
|
||||||
|
- sex trafficking/human trafficking
|
||||||
|
- slavery or indentured servitude
|
||||||
|
- any form of child labour
|
||||||
|
- gambling, tobacco, or other adversely addictive behaviours
|
||||||
|
- warfare or weapons manufacturing, including nuclear processes that may
|
||||||
|
contribute to the production of nuclear weapons, regardless of primary
|
||||||
|
usage of said process
|
||||||
|
- environmental destruction, including but not limited to deforestation,
|
||||||
|
pollution of air or waterways, production of fossil fuels or energy by
|
||||||
|
use of fossil fuels (including but not limited to coal--including
|
||||||
|
so-called "clean coal"--oil, or natural gas) or disposal of waste in a
|
||||||
|
way that adversely affects the environment at large
|
||||||
|
- hate speech or discrimination based on age, gender, gender identity,
|
||||||
|
race, sexuality, religion, nationality, and/or ethnicity
|
||||||
|
- fascism, contemporary American conservatism, or any other forms of
|
||||||
|
authoritarianism, including whatever it is China is doing.
|
||||||
|
- authoritarian religious movements, including but not limited to Christian
|
||||||
|
dominionism and Christian Reconstruction, Islamic jihadism, Hindutva, or
|
||||||
|
any other attempt at theocracy
|
||||||
|
- surveillance at any level, whether individual or large-scale
|
||||||
|
- incarceration of any human being
|
||||||
|
Additionally, commercial use of this package is only permitted by individuals
|
||||||
|
or worker-owned cooperatives.
|
||||||
|
4) IN NO EVENT, UNLESS REQUIRED BY LAW OR AGREED TO IN WRITING, WILL ANY
|
||||||
|
COPYRIGHT HOLDER OR OTHER PARTY WHO MODIFIES/DISTRIBUTES THIS PACKAGE AS
|
||||||
|
PERMITTED ABOVE BE LIABLE TO YOU FOR DAMAGE, INCLUDING ANY GENERAL, SPECIAL,
|
||||||
|
INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO
|
||||||
|
USE THE PROGRAM, EVEN IF SUCH HOLDER OR OTHER PARTIES HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
5) If you are distributing any version of this package, you are to replace this
|
||||||
|
license with the original CWPL v5, unless
|
||||||
|
a) you intend to offer a warranty for the version you are distributing in
|
||||||
|
a manner consistent with the original CWPL v5, or
|
||||||
|
b) you intend to replace this license with CWPL v5l or v5lw as described
|
||||||
|
in the original CWPL v5.
|
195
notes/config file formats
Normal file
195
notes/config file formats
Normal file
|
@ -0,0 +1,195 @@
|
||||||
|
at.allow/at.deny: line by line list of user names
|
||||||
|
=================================================
|
||||||
|
user1
|
||||||
|
user2
|
||||||
|
user3
|
||||||
|
|
||||||
|
fstab
|
||||||
|
=====
|
||||||
|
# comment
|
||||||
|
# device mount-point fs-type options dump pass
|
||||||
|
LABEL=/<tab>/<tab>fxfs<tab>defaults<tab>1<tab>1
|
||||||
|
UUID=[uuid]<tab>none<tab>swap<tab>defaults<tab>0<tab>0
|
||||||
|
-----
|
||||||
|
device is a name, label, or UUID for a block device
|
||||||
|
mount-point is the folder to mount it in (for swap, it's none)
|
||||||
|
fs-type is the filesystem type
|
||||||
|
options is the options for mounting
|
||||||
|
dump is how often it's backed up by dump (0 is never)
|
||||||
|
pass is the order for checking by fsck (0 don't, 1 immediately, 2 after boot)
|
||||||
|
-----
|
||||||
|
FS options
|
||||||
|
auto/noauto - automatically mount on boot or only explicitly
|
||||||
|
dev/nodev - behaviour of interpretation of block special devices
|
||||||
|
exec/noexec - can binaries be executed
|
||||||
|
rw/ro - read/write or read-only
|
||||||
|
sync/async - synchronous/asynchronous IO (are writes done when commands issued?)
|
||||||
|
suid/nosuid - operation of the suid and sgid bits
|
||||||
|
user/users/nouser - anyone can mount, group users can mount, root can mount
|
||||||
|
user implicitly implies noexec, nosuid, nodev
|
||||||
|
defaults - default set (i.e. rw, suid, dev, exec, auto, nouser, async)
|
||||||
|
check=[none, normal, strict] - fsck checking level (ext/probably fxfs)
|
||||||
|
check=[r, n, s] - policy for allowed filenames (vfat)
|
||||||
|
r - relaxed, n - normal, s - strict
|
||||||
|
windows_names - only allow windows characters in names? (vfat/ntfs)
|
||||||
|
uid=n, gid=n - set uid and gid for files on system (vfat/ntfs)
|
||||||
|
umask/dmask/fmask=nnn - masking of fs nodes (vfat/ntfs)
|
||||||
|
umask - user file creation, dmask - directory, fmask - files
|
||||||
|
|
||||||
|
gettydefs
|
||||||
|
=========
|
||||||
|
|
||||||
|
group
|
||||||
|
=====
|
||||||
|
group1::24:user1,user2
|
||||||
|
-----
|
||||||
|
Simple format. name:password:gid:members
|
||||||
|
|
||||||
|
host.conf
|
||||||
|
=========
|
||||||
|
# order can be any or all of bind (name server), hosts (hosts file), or nis
|
||||||
|
# this determines the order in which these are tried
|
||||||
|
order bind hosts nis
|
||||||
|
# multi can be on or off and determines if a host can have multiple IPs in hosts
|
||||||
|
multi on
|
||||||
|
# check if an IP is associated with a hostname given. can be on or off
|
||||||
|
nospoof on
|
||||||
|
# spoof attempts (above) log message to the syslog facitilty. on or off.
|
||||||
|
alert off
|
||||||
|
# domain name to remove from hostnames before lookup
|
||||||
|
# for example, aegis.example.com would become aegis with this setting.
|
||||||
|
trim example.com
|
||||||
|
|
||||||
|
hosts
|
||||||
|
=====
|
||||||
|
# IP_address hostname1 hostname2
|
||||||
|
127.0.0.1<tab>localhost<space>loopback
|
||||||
|
::1<tab>localhost
|
||||||
|
|
||||||
|
hosts.allow/deny
|
||||||
|
================
|
||||||
|
ALL: ALL
|
||||||
|
ALL: ALL EXCEPT 192.168.0.125
|
||||||
|
ALL: 192.168.1.0/24
|
||||||
|
ALL: LOCAL
|
||||||
|
ALL: .example.com
|
||||||
|
ALL: .example.com EXCEPT testing.example.com
|
||||||
|
sshd: LOCAL
|
||||||
|
sshd, in.ftpd: LOCAL
|
||||||
|
in.ftpd: KNOWN
|
||||||
|
----------------
|
||||||
|
There's more than this, but this is a good start to talk about. It's
|
||||||
|
service: host. ALL matches everything, either all services or all hosts.
|
||||||
|
You can use EXCEPT to add an exception. You can use subnet masks like good
|
||||||
|
old 192.168.0.0/16. You could also use LOCAL for all on the local subnet.
|
||||||
|
You can also specify domain names, including as exceptions. You can specify
|
||||||
|
specific daemons, like sshd here. You can also do multiple for one rule. If you
|
||||||
|
prefix in., it's specifically for incoming traffic. Finally, there's the
|
||||||
|
wildcards KNOWN, UNKNOWN, and PARANOID, which are for known hostnames, unknown
|
||||||
|
hostnames, and hostnames that are spoofed. There's also apparently command
|
||||||
|
expansiona and all that, but we'll cross that bridge when we get to it.
|
||||||
|
|
||||||
|
hosts.lpd
|
||||||
|
=========
|
||||||
|
+
|
||||||
|
hostname
|
||||||
|
-hostname
|
||||||
|
+@netgroup
|
||||||
|
-@netgroup
|
||||||
|
---------
|
||||||
|
+ alone means any host on the network. hostname is a remote host allowed to
|
||||||
|
print on the local system. Add a - to forbid that. @netgroup is an NIS netgroup.
|
||||||
|
- works the same for these.
|
||||||
|
|
||||||
|
inittab
|
||||||
|
=======
|
||||||
|
id:2:initdefault:echo "Runlevel 2"
|
||||||
|
-------
|
||||||
|
Pretty simple. id is a unique identifier. Two characters, it seems. Next is
|
||||||
|
the runlevel. Multiple can be specified (i.e. 234). Action is how the process
|
||||||
|
is to be run. Options include respawn (restart the process if existing, do not
|
||||||
|
start if not started), wait (start the process, wait for it to stop), once
|
||||||
|
(start process, do not restart on termination), boot (only start on boot),
|
||||||
|
bootwait (like wait, but only on boot), powerfail (only on SIGPWR), powerwait
|
||||||
|
(like wait, but only on SIGPWR), off (if started, send SIGTERM, wait 5 seconds,
|
||||||
|
then kill the process with SIGKILL), initdefault (used to determine default
|
||||||
|
runlevel), sysinit (executed before attempts to access console, processes are
|
||||||
|
executed and waited for termination of).
|
||||||
|
|
||||||
|
issue
|
||||||
|
=====
|
||||||
|
We'll need something good to go here. I'll work it out later.
|
||||||
|
|
||||||
|
ld.so.conf
|
||||||
|
==========
|
||||||
|
/usr/include
|
||||||
|
/home/user1/builds/include
|
||||||
|
----------
|
||||||
|
Just a list of directories. Simple enough.
|
||||||
|
|
||||||
|
motd
|
||||||
|
====
|
||||||
|
We may or may not do this, since we'll have an issue file.
|
||||||
|
|
||||||
|
mtab
|
||||||
|
====
|
||||||
|
/dev/sda1 / fxfs rw,exec,suid,dev,async,nouser 0 0
|
||||||
|
/dev/sdb1 /mnt ext4 rw,nosuid,nodev,user=user1 0 0
|
||||||
|
----
|
||||||
|
It's fstab but only the currently mounted filesystems. Simple enough.
|
||||||
|
|
||||||
|
passwd
|
||||||
|
======
|
||||||
|
user1:x:1001:24:GECOS field:/home/user1:/bin/sh
|
||||||
|
------
|
||||||
|
username:password:uid:gid:gecos field:home directory:login shell
|
||||||
|
Password is stored in /etc/shadow. x is a placeholder for that.
|
||||||
|
gid is the primary group for the user. Files created by this user have this gid.
|
||||||
|
|
||||||
|
printcap
|
||||||
|
========
|
||||||
|
lw|LaserWriter:lw=/dev/ttya:br#9600:ms=-parity,onlcr,ixon,decctlq:\
|
||||||
|
sd=/var/spool/lw:lf=/var/spool/lp-log:mx#0
|
||||||
|
--------
|
||||||
|
There's a lot to dissect here, and it's probably best to save that dissection
|
||||||
|
for a proper man page. Long story short, it's a series of options separated by
|
||||||
|
colons. The first option is name and aliases. Everythings else is options that
|
||||||
|
we'll need to specify in the man page. It's kinda like the termcap database,
|
||||||
|
though. So, yeah.
|
||||||
|
|
||||||
|
profile
|
||||||
|
=======
|
||||||
|
It seems to be a shell script, basically. Fun.
|
||||||
|
|
||||||
|
protocols
|
||||||
|
=========
|
||||||
|
ip<tab>0<tab>IP # internet protocol
|
||||||
|
---------
|
||||||
|
It's basically official-name protocol-number alias. We'll need to find these.
|
||||||
|
|
||||||
|
securetty
|
||||||
|
=========
|
||||||
|
/dev/tty0
|
||||||
|
---------
|
||||||
|
A list of ttys from which root can login.
|
||||||
|
|
||||||
|
services
|
||||||
|
========
|
||||||
|
ssh 22 SSH
|
||||||
|
--------
|
||||||
|
Like protocols, but it's port instead of protocol.
|
||||||
|
|
||||||
|
shadow
|
||||||
|
======
|
||||||
|
user1:$id$salt$hash:7:7:21:14
|
||||||
|
------
|
||||||
|
username:crypt(3) output:days since pw change:til change allowed:\
|
||||||
|
til change required:til expiration warning
|
||||||
|
For crypt(3) output, $id is the algorithm used, $salt is the salt used, $hash
|
||||||
|
is the outputted hash.
|
||||||
|
|
||||||
|
shells
|
||||||
|
======
|
||||||
|
/bin/sh
|
||||||
|
------
|
||||||
|
Pathnames of shells. Simple enough.
|
96
notes/env_vars
Normal file
96
notes/env_vars
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
Make primary
|
||||||
|
============
|
||||||
|
ARFLAGS - flags for ar
|
||||||
|
CC - the default C compiler
|
||||||
|
CFLAGS - flags for cc
|
||||||
|
FC - the default FORTRAN complier
|
||||||
|
FFLAGS - flags for FORTRAN
|
||||||
|
GET - the program to use for SCCS get
|
||||||
|
GFLAGS - flags for get
|
||||||
|
LDFLAGS - flags for the linker
|
||||||
|
LEX - the default lexer
|
||||||
|
LFLAGS - flags for the lexer
|
||||||
|
MAKEFLAGS - default args for make
|
||||||
|
MAKESHELL - shell for make
|
||||||
|
PROJECTDIR - directory to search for SCCS files not in current directory
|
||||||
|
YACC - the default yacc implementation
|
||||||
|
YFLAGS - flags for yacc
|
||||||
|
|
||||||
|
Environment
|
||||||
|
===========
|
||||||
|
BROWSER - colon-separated list of browsers to try using for URLs
|
||||||
|
CDPATH - directories to use as a base for cd
|
||||||
|
COLUMNS - width for terminal screen/window
|
||||||
|
DATEMSK - template file for getdate()
|
||||||
|
DEAD - where mailx saves partial messages; defaults to ~/dead.letter
|
||||||
|
DISPLAY - default display for X11 programs
|
||||||
|
EDITOR - default text editor
|
||||||
|
ENV - a script to execute when starting sh interactively
|
||||||
|
EXINIT - commands to execute when starting ex
|
||||||
|
FCEDIT - the default value for sh's -e option
|
||||||
|
HISTFILE - file for terminal history
|
||||||
|
HISTSIZE - number of lines in the history file
|
||||||
|
HOME - home directory
|
||||||
|
IFS - characters used for field splitting, * expansion, and the read utility
|
||||||
|
LD_LIBRARY_PATH - directores to search for shared objects
|
||||||
|
LIBPATH - alternative for LD_LIBRARY_PATH
|
||||||
|
LINENO - line number in script before executing a command
|
||||||
|
LINES - height of terminal screen/window
|
||||||
|
LISTER - the command mailx uses when the folders command is given
|
||||||
|
LOGNAME - the user's login name
|
||||||
|
LPDEST - printer to use for lp
|
||||||
|
MAIL - the path of the user's mailbox
|
||||||
|
MAILCHECK - how often mail should be checked by sh
|
||||||
|
MAILPATH - where something mail-related is kept
|
||||||
|
MAILRC - mail configuration file
|
||||||
|
MANPATH - where man pages are
|
||||||
|
MBOX - where mailx saves read messages
|
||||||
|
MORE - default options for more (string of command line arguments)
|
||||||
|
MSGVERB - message components for fmtmsg()
|
||||||
|
OLDPWD - working directory before the last cd operation
|
||||||
|
OPTARG - used by getopts for argument storage
|
||||||
|
OPTERR - used by some getopts implementations for error stuff
|
||||||
|
OPTIND - used by getopts as the index of the next argument to parse
|
||||||
|
PAGER - the default output filter/paginator; defaults to more
|
||||||
|
PATH - where to look for executables
|
||||||
|
PBS_DPREFIX - default prefix for directives for qsub
|
||||||
|
PPID - parent process ID for the current shell
|
||||||
|
PRINTER - secondary printer to use for lp
|
||||||
|
PS1 - interactive prompt for shell
|
||||||
|
PS2 - continuation prompt for shell (i.e. for lines broken by \)
|
||||||
|
PS3 - prompt used for select loops in scripts
|
||||||
|
PS4 - prompt for script executed in debug mode
|
||||||
|
PWD - current working directory
|
||||||
|
RANDOM - generates a random number (from /dev/{u,}random?)
|
||||||
|
SECONDS - amount of time current shell has been around?
|
||||||
|
SHELL - preferrred command interpreter
|
||||||
|
TMPDIR - location for temporary files
|
||||||
|
TERM - terminal type for output
|
||||||
|
TERMCAP - tells system to use termcap rather than terminfo
|
||||||
|
TERMINFO - tells system to use terminfo rather than termcap
|
||||||
|
TZ - timezone
|
||||||
|
USER - alias for LOGNAME?
|
||||||
|
VISUAL - default visual text editor (subset of EDITOR)
|
||||||
|
|
||||||
|
Localization
|
||||||
|
============
|
||||||
|
LANG - language
|
||||||
|
LC_ALL - locale to use
|
||||||
|
LC_COLLATE - locate for collating order
|
||||||
|
LC_CTYPE - locale for character handling functions
|
||||||
|
LC_MESSAGES - language for messages
|
||||||
|
LC_MONETARY - locale for monetary values
|
||||||
|
LC_NUMERIC - locale for numbers
|
||||||
|
LC_TIME - locale for date/time formatting
|
||||||
|
NLSPATH - message catalogs
|
||||||
|
|
||||||
|
Unknown (not in standard)
|
||||||
|
=======
|
||||||
|
These are only briefly referenced as things that compliant applications
|
||||||
|
should avoid conflicting with. I don't know what these do.
|
||||||
|
-------
|
||||||
|
CHARSET
|
||||||
|
HISTORY
|
||||||
|
MAILER
|
||||||
|
NPROC
|
||||||
|
PROCLANG
|
259
notes/fs_hierarchy
Executable file
259
notes/fs_hierarchy
Executable file
|
@ -0,0 +1,259 @@
|
||||||
|
/ - root directory
|
||||||
|
/bin - essential command binaries
|
||||||
|
/boot - bootup files
|
||||||
|
/dev - device files
|
||||||
|
/etc - configuration stuffs
|
||||||
|
/home - User home directories
|
||||||
|
/lib - essential libraries and kernel modules
|
||||||
|
/lib64 - 64-bit libraries (on amd64)
|
||||||
|
/media - removeable media mount point
|
||||||
|
/mnt - all-purpose mount point
|
||||||
|
/opt - add-on software packages
|
||||||
|
/root - root's home directory
|
||||||
|
/sbin - essential system binaries
|
||||||
|
/srv - web server stuffs (if we have a web server)
|
||||||
|
/tmp - volatile temporary files
|
||||||
|
/usr - user data
|
||||||
|
/var - variable data
|
||||||
|
|
||||||
|
Stuff in /bin:
|
||||||
|
==============
|
||||||
|
cat
|
||||||
|
chgrp
|
||||||
|
chmod
|
||||||
|
chown
|
||||||
|
cp
|
||||||
|
date
|
||||||
|
dd
|
||||||
|
df
|
||||||
|
dmesg
|
||||||
|
echo
|
||||||
|
ed
|
||||||
|
false
|
||||||
|
hostname
|
||||||
|
kill
|
||||||
|
ln
|
||||||
|
login
|
||||||
|
ls
|
||||||
|
mkdir
|
||||||
|
mknod
|
||||||
|
more
|
||||||
|
mount
|
||||||
|
mv
|
||||||
|
netstat
|
||||||
|
ping
|
||||||
|
ps
|
||||||
|
pwd
|
||||||
|
rm
|
||||||
|
rmdir
|
||||||
|
sed
|
||||||
|
sh
|
||||||
|
stty
|
||||||
|
su
|
||||||
|
sync
|
||||||
|
tar
|
||||||
|
test and [
|
||||||
|
true
|
||||||
|
umount
|
||||||
|
uname
|
||||||
|
|
||||||
|
Stuff in dev:
|
||||||
|
=============
|
||||||
|
null - discards input, produces EOF when read from
|
||||||
|
zero - discards input, produces a bunch of \0 when read from
|
||||||
|
full - produces \0 when read from, generates ENOSPC when written to
|
||||||
|
random - a pseudorandom number generator (cryptographically secure)
|
||||||
|
urandom - a pseudorandom number generator (not cryptographically secure)
|
||||||
|
console - system console
|
||||||
|
stdin - standard input
|
||||||
|
stdout - standard output
|
||||||
|
stderr - standard error
|
||||||
|
ppp - PPP interface
|
||||||
|
lp* - line printers (e.g. lp0)
|
||||||
|
ptmx - psuedo-terminal controller
|
||||||
|
/pts/* - pseudo-terminals (e.g. /pts/0)
|
||||||
|
tty* - terminals (e.g. tty0)
|
||||||
|
ttyS* - serial port (e.g. ttyS0)
|
||||||
|
ttyUSB* - usb serial converter, modem, etc. (e.g. ttyUSB)
|
||||||
|
fb* - frame buffer (e.g. fb0)
|
||||||
|
fd* - floppy drive (e.g. fd0-fd7)
|
||||||
|
hd* - IDE hard drive (ATA drive/ATAPI CD drive)
|
||||||
|
hda - first channel primary drive
|
||||||
|
hdb - first channel secondary drive
|
||||||
|
hdc - second channel primary drive
|
||||||
|
hdd - second channel secondary drive
|
||||||
|
e.g. hda1 - first channel, primary drive, first partition
|
||||||
|
ht* - IDE tape (e.g. ht0), can prefix n for no-rewind
|
||||||
|
js* - joystick (e.g. js0), prefix d for digital instead of analogue (e.g. djs0)
|
||||||
|
md* - RAID (metadisk) (e.g. md0)
|
||||||
|
mouse* - Mouse (e.g. mouse0)
|
||||||
|
pp* - parallel ports (e.g. pp0)
|
||||||
|
nvme*n*p* - NVMe (drive controller, drive, partition) (e.g. nvme0n1p1)
|
||||||
|
mmcblk*p* - MMC (SD cards, etc.) (device, partition) (e.g. mmcblk0p1)
|
||||||
|
pd* - parallel port IDE devices (e.g. pda0 - first device, first partition)
|
||||||
|
ram* - ram disks (e.g. ram0)
|
||||||
|
rpda* - PDAs, like my Dell Axim (e.g. rpda0)
|
||||||
|
pt* - parallel port ATAPI tape device (e.g. pt0, npt0)
|
||||||
|
sd* - SCSI/SATA/USB/Firewire mass storage device
|
||||||
|
e.g. sda1 - first drive, first partition
|
||||||
|
ses* - enclosure driver (e.g. ses0)
|
||||||
|
sg* - generic SCSI layer (e.g. sg0)
|
||||||
|
sr* - ROM driver (optical disks) (e.g. sr0)
|
||||||
|
scd* - SCSI CD-ROM device, replaces sr* for this (e.g. scd0)
|
||||||
|
st* - magnetic tape (e.g. st0)
|
||||||
|
nst* - magnetic tape, no rewind (e.g. st0)
|
||||||
|
can suffix l, m, or a for modes 1, 2, or 3 (default is 0)
|
||||||
|
I kinda wanna change some things and remove some others. Like, some, I'll keep.
|
||||||
|
scd0? Yep. hda for ATA drives? Yep. lp, fb, fd, pp, nvme? Yep. I kinda wanna
|
||||||
|
split off USB and Firewire mass storage device. Not sure how. ud0 and fwd0,
|
||||||
|
maybe? Might remove pd for parallel port IDE devices and move PDAs to pda
|
||||||
|
instead of rpda.
|
||||||
|
|
||||||
|
/etc hierarchy:
|
||||||
|
===============
|
||||||
|
init.d - scripts for system initialisation
|
||||||
|
opt - config for /opt
|
||||||
|
rc[0-6].d - scripts for different runlevels
|
||||||
|
X11 - config for X (if we actually try to get graphics going)
|
||||||
|
|
||||||
|
Stuff in etc:
|
||||||
|
=============
|
||||||
|
at.allow - users allowed to use at (doesn't exist by default)
|
||||||
|
at.deny - users not allowed to use at (exists empty by default)
|
||||||
|
fstab - static filesystem info
|
||||||
|
gettydefs? - getty settings?
|
||||||
|
group - list of groups
|
||||||
|
host.conf - resolver conf. file
|
||||||
|
hosts - static hostnames
|
||||||
|
hosts.allow - host access file for TCP wrappers
|
||||||
|
hosts.deny - host access file for TCP wrappers
|
||||||
|
hosts.lpd? - trusted hosts for lpd?
|
||||||
|
inittab - config file for init
|
||||||
|
issue - pre-login message/id
|
||||||
|
ld.so.conf - extra dirs for shared libraries
|
||||||
|
motd - message of the day
|
||||||
|
mtab? - dynamic filesystem info
|
||||||
|
passwd - password file
|
||||||
|
printcap? - lpd printer capability db?
|
||||||
|
profile - default sh init file
|
||||||
|
protocols - IP protocol listings
|
||||||
|
securetty - TTY access control for root login
|
||||||
|
services - port names for network services
|
||||||
|
shadow - shadow password file
|
||||||
|
shells - pathnames of login shells
|
||||||
|
|
||||||
|
/media hierarchy:
|
||||||
|
=================
|
||||||
|
floppy - floppy drive (if present)
|
||||||
|
cdrom - cd drive (if present)
|
||||||
|
cdrecorder - cd writer (if present)
|
||||||
|
zip - zip drive (if, for some reason, present)
|
||||||
|
|
||||||
|
Stuff for /sbin:
|
||||||
|
================
|
||||||
|
shutdown
|
||||||
|
fastboot
|
||||||
|
fasthalt
|
||||||
|
fdisk
|
||||||
|
fsck
|
||||||
|
fsck.fxfs - fsck for the FENIX file system
|
||||||
|
halt
|
||||||
|
init
|
||||||
|
mkfs
|
||||||
|
mkfs.fxfs - make a FENIX file system
|
||||||
|
mkswap
|
||||||
|
reboot
|
||||||
|
swapon
|
||||||
|
swapoff
|
||||||
|
tty - the actual program that runs the TTY, not the minor utility
|
||||||
|
update
|
||||||
|
|
||||||
|
/srv hierarchy:
|
||||||
|
===============
|
||||||
|
ftp - ftp files
|
||||||
|
www - http files
|
||||||
|
|
||||||
|
/usr hierarchy:
|
||||||
|
===============
|
||||||
|
bin - user-facing commands
|
||||||
|
games - games.
|
||||||
|
include - C include files
|
||||||
|
lib - libraries
|
||||||
|
lib64 - 64-bit libraries (on amd64)
|
||||||
|
local - local hierarchy; safe from system updates
|
||||||
|
bin - local binaries
|
||||||
|
etc - config for local binaries
|
||||||
|
games - local game binaries
|
||||||
|
include - local C headers
|
||||||
|
lib - local libraries
|
||||||
|
lib64 - local 64-bit libraries (on amd64)
|
||||||
|
man - local online manuals
|
||||||
|
sbin - local system binaries
|
||||||
|
share - local arch-independent hierarchy
|
||||||
|
src - local source code
|
||||||
|
sbin - non-vital system binaries
|
||||||
|
share - architecture-independent files
|
||||||
|
calendar - files for calendar(1)
|
||||||
|
dict - word lists for look(1)
|
||||||
|
doc - documentation
|
||||||
|
games - files used by games
|
||||||
|
locale - locale info
|
||||||
|
man - online manuals
|
||||||
|
might have language subdirs i.e. man/en/man1, man/en_US/man1, etc.
|
||||||
|
might also have architechture subdirs i.e. man/en/man8/i386, etc.
|
||||||
|
man1 - user programs
|
||||||
|
man2 - system calls
|
||||||
|
man3 - library calls
|
||||||
|
man4 - special files
|
||||||
|
man5 - file formats
|
||||||
|
man6 - games
|
||||||
|
man7 - miscellaneous
|
||||||
|
man8 - system administration
|
||||||
|
misc - misc. systemwide files
|
||||||
|
ascii - file w/ ascii character set table
|
||||||
|
termcap/termcap.db - terminal capability database
|
||||||
|
nls - message catalogs for native lang support
|
||||||
|
terminfo - terminfo database
|
||||||
|
zoneinfo - tz info
|
||||||
|
src - source code
|
||||||
|
X11R6 - X11 release 6, if we need it
|
||||||
|
|
||||||
|
/var hierarchy:
|
||||||
|
===============
|
||||||
|
backups - system backups; probably don't touch, it's reserved
|
||||||
|
cache - app cache data
|
||||||
|
fonts - locally generated fonts
|
||||||
|
man - locally formatted man pages
|
||||||
|
www - www proxy/cache data
|
||||||
|
<package> - package specific cache data
|
||||||
|
crash - crash dumps
|
||||||
|
cron - crontabs
|
||||||
|
games - variable game data
|
||||||
|
lib - variable state info
|
||||||
|
hwclock - state directory for hwclock (will we have hwclock?)
|
||||||
|
misc - misc. state data
|
||||||
|
xdm - X display manager var data (if we have this)
|
||||||
|
<editor> - editor backup files/state
|
||||||
|
<pkgtool> - packaging support files
|
||||||
|
<package> - state data for package
|
||||||
|
local - var data for /usr/local
|
||||||
|
lock - lock files
|
||||||
|
all files are of form LCK..*
|
||||||
|
log - logs
|
||||||
|
lastlog - last login of each user
|
||||||
|
messages - system messages
|
||||||
|
wtmp - record of logins and logouts
|
||||||
|
mail - mailbox files
|
||||||
|
all files are just usernames
|
||||||
|
msgs - reserved for...something?
|
||||||
|
opt - var data for /opt
|
||||||
|
preserve - reserved for vi crash saves
|
||||||
|
run - data for running processes
|
||||||
|
spool - app spool data
|
||||||
|
lpd? - printer spool?
|
||||||
|
printer - spool for given printer
|
||||||
|
mqueue? - outgoing mail queue?
|
||||||
|
news - news spool
|
||||||
|
uucp - uucp spool
|
||||||
|
tmp - temp files preserved between reboots
|
||||||
|
yp? - NIS database files?
|
8
notes/goals
Executable file
8
notes/goals
Executable file
|
@ -0,0 +1,8 @@
|
||||||
|
My goals for FENIX have changed back to trying to make a fully POSIX-compliant
|
||||||
|
system. We may branch out a little, include some stuff from the old first
|
||||||
|
version of UNIX. We may also branch into the Linux Standard. We might write
|
||||||
|
out own package manager. Not sure yet. But the core of the system will be fully
|
||||||
|
POSIX-compliant.
|
||||||
|
|
||||||
|
I want to make a system that I can get *certified* as UNIX. I don't just want
|
||||||
|
it to be "Fenris' UNIX*-like*". I want it to be "Fenris' UNIX".
|
28
notes/groups
Normal file
28
notes/groups
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
root (0) - complete system control
|
||||||
|
bin (1) - historical
|
||||||
|
daemon (2) - all system daemons with user accounts
|
||||||
|
tty (5) - access to ttys?
|
||||||
|
ftp (11) - has personal ftp (~/srv/ftp)? Can control ftpd?
|
||||||
|
mail (12) - ability to use usermail (/usr/bin/mail)
|
||||||
|
log (19) - access to /var/log
|
||||||
|
locate (21) - ability to use locate
|
||||||
|
http (33) - has personal site (~/srv/www)? Can control httpd?
|
||||||
|
games (50) - access to games (/usr/games, /var/games, etc.)
|
||||||
|
lock (54) - access to lockfiles
|
||||||
|
network (90) - access to network devices (lan, wifi, dial-up, etc.)
|
||||||
|
floppy (94) - access to floppy drives
|
||||||
|
scanner (96) - access to scanners
|
||||||
|
power (98) - ability to control power state of the system (e.g. shut it down)
|
||||||
|
users (985) - default user group
|
||||||
|
video (986) - access to video hardware (used for FENIX display server?)
|
||||||
|
uucp (987) - access to serial ports and connected devices
|
||||||
|
storage (988) - access to removable storage (usb drives, zip disks, etc.)
|
||||||
|
optical (990) - access to optical drives
|
||||||
|
lp (991) - access to printers and parallel port devices
|
||||||
|
input (993) - access to input devices other than keyboard
|
||||||
|
disk (994) - access to block devices not in floppy, storage, or optical
|
||||||
|
(this includes access to all hard drives)
|
||||||
|
audio (995) - access to audio devices
|
||||||
|
wheel (998) - administration; subsumes adm and log, has access to su
|
||||||
|
adm (999) - access to protected logs (i.e. kernel logs)
|
||||||
|
nobody (65534) - an unprivileged group
|
20
notes/important_daemons
Normal file
20
notes/important_daemons
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
This is not necessarily a complete list. We may add some, we may remove some.
|
||||||
|
|
||||||
|
init - Self-explanatory. We're using SysV-style.
|
||||||
|
biod - NFS client daemon
|
||||||
|
crond - for cron jobs
|
||||||
|
dhcpd - for handling DHCP
|
||||||
|
fingerd - interface for the finger command and protocol
|
||||||
|
ftpd - FTP server
|
||||||
|
httpd - HTTP server
|
||||||
|
inetd - network connection requests
|
||||||
|
lpd - line printer daemon for print spooling
|
||||||
|
nfsd - NFS server daemon
|
||||||
|
ntpd - netword time sync
|
||||||
|
sshd - SSH server
|
||||||
|
sendmail - SMTP daemon
|
||||||
|
swapper/sched - manages swapping
|
||||||
|
syslogd - handles logging
|
||||||
|
syncd - keeps file systems synched with system memory
|
||||||
|
vhand - release pages of memory for other processes
|
||||||
|
ypbind - NIS daemon, basically
|
384
notes/libk stuff
Normal file
384
notes/libk stuff
Normal file
|
@ -0,0 +1,384 @@
|
||||||
|
(Almost) all of this will be in libc as well, but this stuff should be a part
|
||||||
|
of libk (the libc makefile's FREE_OBJS variable). Anything not on this list
|
||||||
|
that the kernel will need that isn't otherwise a part of the libc is probably
|
||||||
|
best put in kernel dev, rather than in libc dev (e.g. info on the elf format
|
||||||
|
or endianness). This also isn't a complete list. This is based off what the
|
||||||
|
Linux klibc has that overlaps with what a POSIX-compliant libc has. We may need
|
||||||
|
to add more from the POSIX libc, and I may have not put in dependencies here or
|
||||||
|
there (types that are needed, or macros, or functions, or whatever).
|
||||||
|
|
||||||
|
X - complete; ~ - prototype exists; ? - not sure if done
|
||||||
|
Unless otherwise specified, *() denotes a function, *[] an array variable,
|
||||||
|
* \* a pointer, [A-Z_0-9]+ a macro, [a-z_0-9] a variable or type, and anything
|
||||||
|
prefixed with struct is a struct.
|
||||||
|
(hello() is a function, hello[] is an array, hello * is a pointer, HELLO is a
|
||||||
|
macro, HELLO() is a function macro, hello is a variable or type, and
|
||||||
|
struct hello is a struct.)
|
||||||
|
|
||||||
|
arpa/inet.h
|
||||||
|
inet_addr()
|
||||||
|
inet_ntoa()
|
||||||
|
inet_ntop()
|
||||||
|
inet_pton()
|
||||||
|
assert.h (complete)
|
||||||
|
ctype.h (complete as far as libk is concerned - don't need locale variants)
|
||||||
|
dirent.h
|
||||||
|
DIR type
|
||||||
|
struct dirent
|
||||||
|
alphasort()
|
||||||
|
closedir()
|
||||||
|
fdopendir()
|
||||||
|
opendir()
|
||||||
|
readdir()
|
||||||
|
dirrd()
|
||||||
|
scandir()
|
||||||
|
errno.h (complete)
|
||||||
|
fcntl.h
|
||||||
|
struct flock
|
||||||
|
open()
|
||||||
|
openat()
|
||||||
|
creat()
|
||||||
|
fcntl()
|
||||||
|
Neccesary macros for the above
|
||||||
|
fnmatch.h
|
||||||
|
X FNM_NOMATCH
|
||||||
|
X FNM_PATHNAME
|
||||||
|
X FNM_PERIOD
|
||||||
|
X FNM_NOESCAPE
|
||||||
|
~ fnmatch()
|
||||||
|
grp.h
|
||||||
|
X struct group
|
||||||
|
~ getgrid()
|
||||||
|
~ getgrnam()
|
||||||
|
inttypes.h
|
||||||
|
imaxabs()
|
||||||
|
strtoimax()
|
||||||
|
limits.h (complete)
|
||||||
|
net/if.h
|
||||||
|
netinet/in.h
|
||||||
|
netinet/tcp.h
|
||||||
|
poll.h
|
||||||
|
pwd.h
|
||||||
|
struct passwd
|
||||||
|
getpwuid()
|
||||||
|
getpwman()
|
||||||
|
sched.h
|
||||||
|
struct sched_param
|
||||||
|
sched_setscheduler()
|
||||||
|
sched_yield()
|
||||||
|
setjmp.h
|
||||||
|
sigjmp_buf[]
|
||||||
|
setjmp()
|
||||||
|
longjmp()
|
||||||
|
sigsetjmp()
|
||||||
|
siglongjmp()
|
||||||
|
signal.h
|
||||||
|
sig_atomic_t
|
||||||
|
SIGRTMIN
|
||||||
|
SIGRTMAX
|
||||||
|
sigemptyset()
|
||||||
|
sigfillset()
|
||||||
|
sigaddset()
|
||||||
|
sigdelset()
|
||||||
|
sigismember()
|
||||||
|
signal()
|
||||||
|
sigaction()
|
||||||
|
sigprocmask()
|
||||||
|
sigpending()
|
||||||
|
sigsuspend()
|
||||||
|
raise()
|
||||||
|
kill()
|
||||||
|
stdarg.h
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||||
|
stdbool.h (complete)
|
||||||
|
stddef.h (complete)
|
||||||
|
stdint.h (complete)
|
||||||
|
stdio.h
|
||||||
|
X FILE type
|
||||||
|
X EOF
|
||||||
|
X BUFSIZ
|
||||||
|
X _IO*BF
|
||||||
|
X stdin, stdout, stderr
|
||||||
|
~ fopen()
|
||||||
|
~ fdopen()
|
||||||
|
~ fclose()
|
||||||
|
~ fseek()
|
||||||
|
~ rewind()
|
||||||
|
~ fputs()
|
||||||
|
fputs_unlocked()
|
||||||
|
X puts()
|
||||||
|
~ fputc()
|
||||||
|
~ putc()
|
||||||
|
X putchar()
|
||||||
|
fputc_unlocked()
|
||||||
|
putchar_unlocked()
|
||||||
|
putc_unlocked()
|
||||||
|
~ fgetc()
|
||||||
|
fgetc_unlocked()
|
||||||
|
~ fgets()
|
||||||
|
fgets_unlocked()
|
||||||
|
~ getc()
|
||||||
|
~ getchar()
|
||||||
|
getc_unlocked()
|
||||||
|
getchar_unlocked()
|
||||||
|
~ ungetc()
|
||||||
|
X printf()
|
||||||
|
~ vprintf()
|
||||||
|
~ fprintf()
|
||||||
|
~ vfprintf()
|
||||||
|
~ sprintf()
|
||||||
|
~ vsprintf()
|
||||||
|
~ snprintf()
|
||||||
|
~ vsnprintf()
|
||||||
|
~ sscanf()
|
||||||
|
~ vsscanf()
|
||||||
|
? perror()
|
||||||
|
rename()
|
||||||
|
renameat()
|
||||||
|
remove()
|
||||||
|
~ fread()
|
||||||
|
~ fwrite()
|
||||||
|
ftell()
|
||||||
|
~ ferror()
|
||||||
|
~ feof()
|
||||||
|
fileno()
|
||||||
|
~ clearrerr()
|
||||||
|
stdlib.h
|
||||||
|
X EXIT_FAILURE
|
||||||
|
X EXIT_SUCCESS
|
||||||
|
? abort()
|
||||||
|
X abs()
|
||||||
|
~ system()
|
||||||
|
~ atexit()
|
||||||
|
~ atoi()
|
||||||
|
~ atol()
|
||||||
|
~ atoll
|
||||||
|
~ exit()
|
||||||
|
~_Exit()
|
||||||
|
X labs()
|
||||||
|
X llabs()
|
||||||
|
~ strtol()
|
||||||
|
~ strtoll()
|
||||||
|
~ strtoul()
|
||||||
|
~ strtoull()
|
||||||
|
~ getenv()
|
||||||
|
putenv()
|
||||||
|
setenv()
|
||||||
|
unsetenv()
|
||||||
|
X bsearch()
|
||||||
|
~ qsort()
|
||||||
|
X srand()
|
||||||
|
X rand()
|
||||||
|
srand48()
|
||||||
|
jrand48()
|
||||||
|
mrand48()
|
||||||
|
nrand48()
|
||||||
|
lrand48()
|
||||||
|
random()
|
||||||
|
srandom()
|
||||||
|
unlockpt()
|
||||||
|
ptsname()
|
||||||
|
posix_openpt()
|
||||||
|
grantpt()
|
||||||
|
realpath()
|
||||||
|
string.h
|
||||||
|
memccpy()
|
||||||
|
memchr()
|
||||||
|
X memcmp()
|
||||||
|
X memcpy()
|
||||||
|
X memmove()
|
||||||
|
X memset()
|
||||||
|
X strcat()
|
||||||
|
~ strchr()
|
||||||
|
X strcmp()
|
||||||
|
~ strcpy()
|
||||||
|
X strcspn()
|
||||||
|
strdup()
|
||||||
|
~ strerror()
|
||||||
|
strsignal()
|
||||||
|
X strlen()
|
||||||
|
~ strncat()
|
||||||
|
~ strncmp()
|
||||||
|
~ strncpy()
|
||||||
|
strpbrk()
|
||||||
|
~ strstr()
|
||||||
|
X strtok()
|
||||||
|
strtok_r()
|
||||||
|
sys/mman.h
|
||||||
|
mmap()
|
||||||
|
munmap()
|
||||||
|
shm_open()
|
||||||
|
shm_unlink()
|
||||||
|
msync()
|
||||||
|
mprotect()
|
||||||
|
mlockall()
|
||||||
|
munlockall()
|
||||||
|
mlock()
|
||||||
|
munlock()
|
||||||
|
sys/resource.h
|
||||||
|
getpriority()
|
||||||
|
setpriority()
|
||||||
|
getrusage()
|
||||||
|
sys/select.h
|
||||||
|
FD_CLR()
|
||||||
|
FD_ISSET()
|
||||||
|
FD_SET()
|
||||||
|
FD_ZERO()
|
||||||
|
FD_SETSIZE
|
||||||
|
select()
|
||||||
|
pselect()
|
||||||
|
sys/socket.h
|
||||||
|
X sa_family_t
|
||||||
|
X struct sockaddr
|
||||||
|
X socklen_t
|
||||||
|
struct msghdr
|
||||||
|
struct cmsghdr
|
||||||
|
CMSG_DATA()
|
||||||
|
CMSG_NXTHDR()
|
||||||
|
CMSG_FIRSTHDR()
|
||||||
|
accept()
|
||||||
|
bind()
|
||||||
|
connect()
|
||||||
|
getpeername()
|
||||||
|
getsockname()
|
||||||
|
getsockopt()
|
||||||
|
listen()
|
||||||
|
recv()
|
||||||
|
recvfrom()
|
||||||
|
recvmsg()
|
||||||
|
send()
|
||||||
|
sendmsg()
|
||||||
|
sendto()
|
||||||
|
setsockopt()
|
||||||
|
shutdown()
|
||||||
|
socket()
|
||||||
|
socketpair()
|
||||||
|
sys/stat.h
|
||||||
|
S_IFMT macro family
|
||||||
|
S_I[RWX](USR|GRP|OTH) and related macros
|
||||||
|
S_IS. macro family
|
||||||
|
stat()
|
||||||
|
fstat()
|
||||||
|
fstatat()
|
||||||
|
lstat()
|
||||||
|
umask()
|
||||||
|
mknod()
|
||||||
|
mknodat()
|
||||||
|
mkfifo()
|
||||||
|
utimensat()
|
||||||
|
fchmodat()
|
||||||
|
sys/statvfs.h
|
||||||
|
struct statvfs
|
||||||
|
fstatvfs()
|
||||||
|
statvfs()
|
||||||
|
sys/time.h
|
||||||
|
gettimeofday()
|
||||||
|
gettitimer()
|
||||||
|
settitimer()
|
||||||
|
utimes()
|
||||||
|
sys/uio.h
|
||||||
|
struct iovec
|
||||||
|
readv()
|
||||||
|
writev()
|
||||||
|
sys/un.h
|
||||||
|
???
|
||||||
|
sys/utsname.h
|
||||||
|
X struct utsname
|
||||||
|
~ uname()
|
||||||
|
sys/wait.h
|
||||||
|
WEXITSTATUS()
|
||||||
|
WTERMSIG()
|
||||||
|
WIFEXITED()
|
||||||
|
WIFSTOPPED()
|
||||||
|
WIFSIGNALED()
|
||||||
|
WSTOPSIG()
|
||||||
|
X wait()
|
||||||
|
waitpid()
|
||||||
|
syslog.h
|
||||||
|
~ closelog()
|
||||||
|
~ openlog()
|
||||||
|
~ syslog()
|
||||||
|
termios.h
|
||||||
|
TCSANOW
|
||||||
|
TCSADRAIN
|
||||||
|
TCSAFLUSH
|
||||||
|
tcgetattr()
|
||||||
|
tcsetattr()
|
||||||
|
tcflow()
|
||||||
|
tcflush()
|
||||||
|
tcdrain()
|
||||||
|
tcgetsid()
|
||||||
|
tcsendbreak()
|
||||||
|
cfgetospeed()
|
||||||
|
cfgetispeed()
|
||||||
|
cfsetospeed()
|
||||||
|
cfsetispeed()
|
||||||
|
time.h
|
||||||
|
X time()
|
||||||
|
~ nanosleep()
|
||||||
|
unistd.h
|
||||||
|
X F_OK
|
||||||
|
X R_OK
|
||||||
|
X W_OK
|
||||||
|
X X_OK
|
||||||
|
STDERR_FILENO
|
||||||
|
STDIN_FILENO
|
||||||
|
STDOUT_FILENO
|
||||||
|
access()
|
||||||
|
chdir()
|
||||||
|
chown()
|
||||||
|
close()
|
||||||
|
dup()
|
||||||
|
dup2()
|
||||||
|
_exit()
|
||||||
|
execl()
|
||||||
|
execle()
|
||||||
|
execlp()
|
||||||
|
execv()
|
||||||
|
execve()
|
||||||
|
execvp()
|
||||||
|
faccessat()
|
||||||
|
fchdir()
|
||||||
|
fchown()
|
||||||
|
fchownat()
|
||||||
|
fdatasync()
|
||||||
|
fork()
|
||||||
|
fsync()
|
||||||
|
ftruncate()
|
||||||
|
getegid()
|
||||||
|
geteuid()
|
||||||
|
getgid()
|
||||||
|
getgroups()
|
||||||
|
gethostname()
|
||||||
|
getopt()
|
||||||
|
getuid()
|
||||||
|
isatty()
|
||||||
|
lchown()
|
||||||
|
link()
|
||||||
|
linkat()
|
||||||
|
lseek()
|
||||||
|
nice()
|
||||||
|
pipe()
|
||||||
|
pread()
|
||||||
|
pwrite()
|
||||||
|
read()
|
||||||
|
readlink()
|
||||||
|
readlinkat()
|
||||||
|
rmdir()
|
||||||
|
setegid()
|
||||||
|
seteuid()
|
||||||
|
setgid()
|
||||||
|
setuid()
|
||||||
|
sleep()
|
||||||
|
symlink()
|
||||||
|
symlinkat()
|
||||||
|
sync()
|
||||||
|
unlink()
|
||||||
|
unlinkat()
|
||||||
|
write()
|
||||||
|
utime.h
|
||||||
|
struct utimbuf
|
||||||
|
utime()
|
543
notes/notes on code standards and style
Normal file
543
notes/notes on code standards and style
Normal file
|
@ -0,0 +1,543 @@
|
||||||
|
Intellectual property
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Regarding proprietary programs:
|
||||||
|
|
||||||
|
Don't reference them. We don't need to get in trouble.
|
||||||
|
|
||||||
|
Regarding free programs:
|
||||||
|
|
||||||
|
Be careful referencing them, especially if they use a GPL-style license. I
|
||||||
|
don't need that fucking licensing nightmare getting dragged into this. If it
|
||||||
|
uses a 0BSD-style license, you can freely reference it, even copy it. I just
|
||||||
|
ask that you properly credit the original.
|
||||||
|
|
||||||
|
Trademarks:
|
||||||
|
|
||||||
|
Don't bother with acknowledgements. Just make sure it's written in a way to
|
||||||
|
not be mistaken for our own trademark.
|
||||||
|
|
||||||
|
Program design
|
||||||
|
==============
|
||||||
|
|
||||||
|
Which language:
|
||||||
|
|
||||||
|
C. We use C around here. It's honestly the only language I'm still comfortable
|
||||||
|
with. I'm out of practice with anything else. Though, for what we do here, C is
|
||||||
|
kinda the most suitable language we have anyways.
|
||||||
|
|
||||||
|
In particular, though, of what I'm even familiar with, I don't like
|
||||||
|
object-oriented programming, so no C++ or Java. Java's too bloated anyways.
|
||||||
|
Same for Clojure. FORTRAN's not really useful here, though I do want to have
|
||||||
|
a library for FORTRAN. And Prolog is really only useful as a proof language.
|
||||||
|
So, really, C is the only thing I want to use (except where we need asm).
|
||||||
|
|
||||||
|
Compatibility:
|
||||||
|
|
||||||
|
We do compatibility here. Current, we're working off POSIX/the Single UNIX
|
||||||
|
Specification, the ISO C standard, and the Filesystem Hierarchy Standard.
|
||||||
|
Everything implemented should *not* conflict with these standards. We can add
|
||||||
|
things here and there, where needed or where it might be fun. But anything added
|
||||||
|
should either be something not specified by the standard (like the init system)
|
||||||
|
or that is otherwise optional, e.g. a game.
|
||||||
|
|
||||||
|
Non-standard features:
|
||||||
|
|
||||||
|
Don't use them. For instance, don't use any GNU C extensions. You should be
|
||||||
|
writing standard compliant code. Specifically, we use `-std=c99`.
|
||||||
|
|
||||||
|
More on C standards:
|
||||||
|
|
||||||
|
We use C99. However, there are some exceptions. For instance, we never use
|
||||||
|
single-line comments (//). Instead, we always use block comments (/* */).
|
||||||
|
|
||||||
|
Other things not to do include using trigraphs (why do those even still exist?)
|
||||||
|
and writing anything in pre-standard style.
|
||||||
|
|
||||||
|
Conditional compilation:
|
||||||
|
|
||||||
|
I guess use if statements in functions where possible. Outside of functions,
|
||||||
|
of course, use #if/#ifdef/#ifndef. In general, that's what you should do.
|
||||||
|
|
||||||
|
Writing Programs
|
||||||
|
================
|
||||||
|
|
||||||
|
Standards:
|
||||||
|
|
||||||
|
We obey POSIX around here. We want to implement all stuff found in the standards
|
||||||
|
referenced above. We don't want to deviate where it matters. Where does it
|
||||||
|
matter? Well, if the standard has something to say about it, it matters. For
|
||||||
|
instance, the POSIX standard specifies that cat has the following form:
|
||||||
|
cat [-u] [file...]
|
||||||
|
Don't add shit to that. We don't need `cat -v`.
|
||||||
|
|
||||||
|
If the standard doesn't have something to say, then consider the following:
|
||||||
|
1. Are we considering implementation details?
|
||||||
|
2. Is this optional, insofar as it's just a program that a user might install?
|
||||||
|
In the first case, for instance, POSIX doesn't say how printf should do its
|
||||||
|
thing. It says what printf needs to support (format specifiers, etc.) and what
|
||||||
|
results it should put out, but it doesn't specify the internals. It's a black
|
||||||
|
box. Here's what goes in, here's what goes out. What happens in the middle?
|
||||||
|
That's up to us to decide. Anything like that is fair game. POSIX and SUS don't
|
||||||
|
specify the initialization process/sequence for a UNIX system. Thus, how we
|
||||||
|
actually start up the system, our init program, is completely up to us.
|
||||||
|
|
||||||
|
In the second case, just make sure it's optional. Don't make it a key part of
|
||||||
|
the system. Like, if we were to add a COBOL compiler, don't make it important.
|
||||||
|
You should be able to remove the COBOL compiler from the system without it
|
||||||
|
breaking things. It should basically function like a software package that the
|
||||||
|
user'd install themselves. (In fact, you may just want to make it an installable
|
||||||
|
software package.) Do keep in mind for this kind of stuff, if there's a
|
||||||
|
standard, you should probably follow it. Like, if we do a COBOL compiler, follow
|
||||||
|
the COBOL standards. Please.
|
||||||
|
|
||||||
|
Robustness:
|
||||||
|
|
||||||
|
In general, arbitrary limits should be avoided. In general, try to accommodate,
|
||||||
|
e.g., long file names. It's okay to use, say, limits.h to get a limit for
|
||||||
|
something like path name lengths, but try to not do something like that, to have
|
||||||
|
a cap on that kinda stuff.
|
||||||
|
|
||||||
|
Keep all non-printing characters found in files. Try to support different
|
||||||
|
locales and character encodings, like UTF-8. There should be functions to help
|
||||||
|
you deal with that stuff.
|
||||||
|
|
||||||
|
Check for errors when making calls, especially system calls. In cases of errors,
|
||||||
|
print a fucking error message. Nothing is more frustrating for an end user than
|
||||||
|
having something fail and not being told why. (This was frustrating for me
|
||||||
|
during my first attempt at moving FENIX's kernel to the higher half. grub-file
|
||||||
|
tells you whether it's a valid multiboot header but not why it fails if it
|
||||||
|
isn't. I still have no clue why it wasn't working.)
|
||||||
|
|
||||||
|
Check memory allocation calls (malloc, calloc, realloc) for NULL return. Don't
|
||||||
|
just assume it allocated successfully. Be careful with realloc. Don't just
|
||||||
|
assume it's going to keep stuff in place.
|
||||||
|
|
||||||
|
If you call free, don't try to reference that memory again. Assume that the
|
||||||
|
moment you free'd it, something else immediately snapped that memory up.
|
||||||
|
|
||||||
|
If a malloc/calloc/realloc fails, that should be a fatal error. The only
|
||||||
|
exception should be in the login shell and related important system processes,
|
||||||
|
like TTY. If those have failed calls, that needs to be dealt with somehow.
|
||||||
|
After all, these are important bits. So, I don't know quite how to deal with
|
||||||
|
that, but definitely keep that in mind.
|
||||||
|
|
||||||
|
When declaring variables, most should be immediately initialized. For instance,
|
||||||
|
if you create a variable for a flag, it should be initialized to a sane default.
|
||||||
|
For example, if you want a flag for "hey, use this option", it should be
|
||||||
|
initialized to whatever the default should be (off or on). This is especially
|
||||||
|
important for static variables, which may be referenced by a different call
|
||||||
|
without it being initialized, which would be bad!
|
||||||
|
|
||||||
|
In the case of impossible conditions, print something to tell the user that
|
||||||
|
the program's hit a bug. Sure, someone's going to have to go in with the source
|
||||||
|
and a debugger and find that bug, but at least let the user know that a bug's
|
||||||
|
occurred. That way, the program doesn't just stop and they have no idea why.
|
||||||
|
You don't need to give a detailed explanation (though you may want to give some
|
||||||
|
info that might be useful to someone who wants to debug), but at least give
|
||||||
|
them something like "Oops, we've hit a bug! Killing <program>..." so they know
|
||||||
|
that what they tried to do led to a bug.
|
||||||
|
|
||||||
|
For exit values, don't just use error counts. Different errors should have
|
||||||
|
different error values. In general, the POSIX standard will give you an idea
|
||||||
|
of what error values matter, and you can define others as they're needed.
|
||||||
|
|
||||||
|
For temporary files, you should generally put them in /tmp, but probably have
|
||||||
|
some way for the user to tell the program where they might actually want temp.
|
||||||
|
files to go. Check TMPDIR, maybe? (By the way, be careful with this stuff. You
|
||||||
|
might hit security issues.)
|
||||||
|
|
||||||
|
Library behaviour:
|
||||||
|
|
||||||
|
Try to make functions reentrant. In general, if a function needs to be
|
||||||
|
thread-safe, it'll be reentrant, but even if it doesn't, it's not the worst
|
||||||
|
idea to make it reentrant. Even dynamic memory, though if it can't be avoided,
|
||||||
|
then so be it.
|
||||||
|
|
||||||
|
Also, some naming convention for you:
|
||||||
|
- If it's a POSIX function/macro/whatever, use that name
|
||||||
|
- Structs should be struct posix_name, not just posix_name
|
||||||
|
- If it's a function/whatever for making something work, start it with a _
|
||||||
|
- For instance _do_thing()
|
||||||
|
|
||||||
|
Basically, if it's not supposed to be user-facing, start it with _. Otherwise,
|
||||||
|
use a normal name, probably with one given in the standard.
|
||||||
|
|
||||||
|
Formatting error messages:
|
||||||
|
|
||||||
|
In compilers, use give error messages like so:
|
||||||
|
<sourcefile>:<lineno>: <message>
|
||||||
|
Line numbers start from 1.
|
||||||
|
|
||||||
|
If it's a program, tell give an error message that tells the user the program
|
||||||
|
and the issue. You'll probably want to also include a PID. For example:
|
||||||
|
<program> (<PID>): <message>
|
||||||
|
|
||||||
|
You might be able to get away with omitting the program and PID.
|
||||||
|
|
||||||
|
Interface standards:
|
||||||
|
|
||||||
|
Don't make behaviour specific to the name used. Even if we were to add GNU awk
|
||||||
|
compatibility to our awk implementation, don't make whether it uses GNU awk
|
||||||
|
mode dependent on whether you call awk or gawk. Make it a flag. In general,
|
||||||
|
though, this probably won't be an issue.
|
||||||
|
|
||||||
|
Don't make behaviour dependent on device. For instance, don't make output
|
||||||
|
differ depending on whether we're using a VTTY or a proper physical TTY. Leave
|
||||||
|
the specifics to the low-level interfaces (unless, of course, you're working on
|
||||||
|
those low-level interface, in which case you should do what you need to do).
|
||||||
|
The only exception is checking whether a thing is running interactively before
|
||||||
|
printing out terminal control characters for things like color. Like, in cal,
|
||||||
|
someone may just want to redirect that into a file. It shouldn't include the
|
||||||
|
codes used to change the color of the current day. Also, if you're outputting
|
||||||
|
binary data, maybe don't just send it to stdout. Ask, probably.
|
||||||
|
|
||||||
|
Finding executable and stuff:
|
||||||
|
|
||||||
|
Start with argv[0]. If it's a path name, it should be basename(argv[0]).
|
||||||
|
|
||||||
|
That's all I have to say, really.
|
||||||
|
|
||||||
|
GUIs:
|
||||||
|
|
||||||
|
We're not really concerned about them at this point in time. When we get to
|
||||||
|
that, we're gonna probably be running off the X Window System. We'll probably
|
||||||
|
have our own WM/DE. But, again, we're not worried about that right now. Right
|
||||||
|
now, we're focused on just getting the console level stuff up.
|
||||||
|
|
||||||
|
CLIs:
|
||||||
|
|
||||||
|
Follow POSIX guidelines for options. I've broken this next rule quite a bit,
|
||||||
|
but maybe make use of getopt() for parsing arguments, instead of what I've been
|
||||||
|
doing in manually searching for them.
|
||||||
|
|
||||||
|
We're not doing long-named options. The idea is nice, but for now, we're
|
||||||
|
sticking with the POSIX standard. Maybe we'll add 'em in one day. (I mean, I
|
||||||
|
guess we could use them in non-POSIX utilities, but still.)
|
||||||
|
|
||||||
|
Memory usage:
|
||||||
|
|
||||||
|
Try to keep it reasonably low. Obviously, we don't need to keep it that low, but
|
||||||
|
don't go using all the RAM just to print out a message.
|
||||||
|
|
||||||
|
Valgrind's not the worst tool to play with. You might not need to worry about
|
||||||
|
all the messages it gives, but in general, try to keep it quiet, unless that
|
||||||
|
would really fuck up things otherwise. In other words, if it bitches at you
|
||||||
|
about not freeing up memory before exiting, add in the necessary free()s.
|
||||||
|
|
||||||
|
File usage:
|
||||||
|
|
||||||
|
In general, /etc is where configuration for system-level stuff goes. Runtime
|
||||||
|
created files should go in /var/cache or /tmp. You can also use /var/lib.
|
||||||
|
Files may be stored in /usr, but be prepared for a read-only /usr. Don't assume
|
||||||
|
you can write to /usr.
|
||||||
|
|
||||||
|
Style and other important things about C
|
||||||
|
========================================
|
||||||
|
|
||||||
|
Formatting:
|
||||||
|
|
||||||
|
Keep lines to 80 characters or less (especially since FENIX currently only
|
||||||
|
supports 80 character lines).
|
||||||
|
|
||||||
|
The open brace for any code block should go on the line where it starts.
|
||||||
|
int main(void) {
|
||||||
|
if(test) {
|
||||||
|
do{
|
||||||
|
} while(test);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
There should be a space before any open brace or after any close brace (if
|
||||||
|
something follows said close brace).
|
||||||
|
|
||||||
|
Keep any function definitions to one line. Like this:
|
||||||
|
int main(void)
|
||||||
|
not:
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
If a function definition is longer than 80 character, you are allowed to split
|
||||||
|
it.
|
||||||
|
|
||||||
|
For function bodies, use the following standards:
|
||||||
|
|
||||||
|
No space between function/keyword and paren. Like this:
|
||||||
|
int main(void)
|
||||||
|
if(test)
|
||||||
|
for(int i = 0; i < 10; i++)
|
||||||
|
printf("Hello, World!\n");
|
||||||
|
|
||||||
|
When splitting expressions, split after the operator:
|
||||||
|
if(condition1 && condition2 &&
|
||||||
|
condition3)
|
||||||
|
|
||||||
|
Do-whiles, as hinted at above, should have the end brace and while on the same
|
||||||
|
line, like so:
|
||||||
|
do {
|
||||||
|
thing();
|
||||||
|
} while(test);
|
||||||
|
|
||||||
|
For indentation, spaces, 2 spaces specifically. And, yeah. Use your brain on
|
||||||
|
how to actually use that. (The exception to this rule is makefiles, which
|
||||||
|
require tabs and a specific indentation style. Look up more on makefiles for
|
||||||
|
that information.)
|
||||||
|
|
||||||
|
Comments:
|
||||||
|
|
||||||
|
Try to start programs and headers with a description of what it is. For example,
|
||||||
|
from stdlib.h:
|
||||||
|
/*
|
||||||
|
* <stdlib.h> - standard library definitions
|
||||||
|
*
|
||||||
|
* This header is a part of the FENIX C Library and is free software.
|
||||||
|
* You can redistribute and/or modify it subject to the terms of the
|
||||||
|
* Clumsy Wolf Public License v4. For more details, see the file COPYING.
|
||||||
|
*
|
||||||
|
* The FENIX C Library is distributed WITH NO WARRANTY WHATSOEVER. See
|
||||||
|
* The CWPL for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
In general, it should say what the file/program is, what it does, and include
|
||||||
|
that free software, no warranty header.
|
||||||
|
|
||||||
|
Try to write comments in english, but if you can't then write it in your native
|
||||||
|
language. I'd prefer you use english, since that's my native language. I also
|
||||||
|
kinda understand spanish and know a small bit of danish. But, if you can't do
|
||||||
|
english or spanish, write in what you know. Just romanize your comment. For
|
||||||
|
instance, if you're writing in japanese, please use romaji instead of normal
|
||||||
|
japanese script. Otherwise, things get weird.
|
||||||
|
|
||||||
|
Probably not the worst idea to have a comment on what functions do, but don't
|
||||||
|
feel like you *need* to add them, especially if the function has a sensible
|
||||||
|
name. Like, if they function is called do_x(), you don't need a comment that
|
||||||
|
says that it "Does X".
|
||||||
|
|
||||||
|
Please only use one space after a sentence. It'll annoy me otherwise. Also, use
|
||||||
|
complete sentences, capitalize sentences unless they start with a lowercase
|
||||||
|
identifier, etc., etc.
|
||||||
|
|
||||||
|
When commenting code, try not to comment the obvious. In general, if you need
|
||||||
|
to have a comment on what a variable does, you need to re-name the variable.
|
||||||
|
If you need to comment on what a block of code is doing, consider whether it
|
||||||
|
needs to be that complicated or if you can simplify it. This isn't always true,
|
||||||
|
but in general, try to keep to that rule of thumb.
|
||||||
|
|
||||||
|
Using C constructs:
|
||||||
|
|
||||||
|
Always declare the type of objects. Explicitly declare all arguments to
|
||||||
|
functions and declare the return type of the function. So, it's `int var`, not
|
||||||
|
just `var`, and it's `int main(void)`, not `main()`.
|
||||||
|
|
||||||
|
When it comes to compiler options, use -Wall. Try to get rid of any warnings you
|
||||||
|
can, but if you can't, don't fret about it.
|
||||||
|
|
||||||
|
Be careful with linting tools. In general, don't bother with them, unless you
|
||||||
|
think it'll help with a bug. Don't just run linting tools, though. Like, you
|
||||||
|
generally don't need to bother casting malloc(). If your tool is telling you
|
||||||
|
that you need to, you can probably ignore it.
|
||||||
|
|
||||||
|
extern declarations should go at the start of a file or in a header. Don't put
|
||||||
|
externs inside function if you can avoid it.
|
||||||
|
|
||||||
|
Declare as many variables as you need. Sure, you can just carefully reuse the
|
||||||
|
same variable for different things, but it's probably better to just make
|
||||||
|
another variable. (The exception to this rule is counters like i, j, etc,
|
||||||
|
unless you specifically need to preserve the value of one of them.)
|
||||||
|
|
||||||
|
Avoid shadowing. If you declare a global variable, don't declare local variables
|
||||||
|
with the same name.
|
||||||
|
|
||||||
|
Declarations should either be on the same line or in multiple declarations.
|
||||||
|
So, do this:
|
||||||
|
int foo, bar;
|
||||||
|
Or this:
|
||||||
|
int foo;
|
||||||
|
int bar;
|
||||||
|
Not this:
|
||||||
|
int foo,
|
||||||
|
bar;
|
||||||
|
|
||||||
|
In if-else statements, *always use brackets*. Please. It makes it much clearer
|
||||||
|
as to what belongs to what. It'll keep you from ending up in a situation where
|
||||||
|
you've accidentally got a function call outside of an if-statement that should
|
||||||
|
actually be inside it. Also, single line else if.
|
||||||
|
|
||||||
|
Typedef your structs in the declaration. Basically, your structure declarations
|
||||||
|
should probably look like this:
|
||||||
|
typedef struct _f_foo {
|
||||||
|
/* Stuff goes here */
|
||||||
|
} foo;
|
||||||
|
|
||||||
|
Names:
|
||||||
|
|
||||||
|
Don't be terse in your naming. Give it a descriptive english name. Like, name
|
||||||
|
it `do_ending_newline`, not just `d`.
|
||||||
|
|
||||||
|
If it's only used shortly for an obvious purpose, you can ignore this. Like,
|
||||||
|
you can continue with for(int i = 0...). You don't need to name that variable
|
||||||
|
something else like counter. We're programmers. We know what i is used for.
|
||||||
|
|
||||||
|
Try not to use too many abbreviations in names. You can if you need to, but
|
||||||
|
you should try not to.
|
||||||
|
|
||||||
|
Use underscores to separate words in identifiers (snake_case), not CamelCase.
|
||||||
|
|
||||||
|
If a variable is supposed to be a command-line flag, maybe include a comment
|
||||||
|
for what option it's supposed to be (i.e. /* -b */). If your flags are those
|
||||||
|
kinda octal things (04 for -x, 02 for -y, 01 for -z), definitely include a
|
||||||
|
comment on what corresponds to what (/* 04: -x, 02: -y, 01: -z */).
|
||||||
|
|
||||||
|
For names with constant values, you can probably decide on your own whether it's
|
||||||
|
better to use an enum or #define. If you use a #define, the name should be in
|
||||||
|
all uppercase ("DEFINE_CONST"). Enums should use lowercase ("enum_const").
|
||||||
|
|
||||||
|
For file names, I guess try to keep them short (14 characters), but don't feel
|
||||||
|
like you need to. It's not the worst idea for working with older UNIXes. Just
|
||||||
|
don't feel the need to be compatible with DOS 8.3 filenames. We don't care about
|
||||||
|
Microsoft's shit. Just other UNIXes.
|
||||||
|
|
||||||
|
Portability:
|
||||||
|
|
||||||
|
FENIX doesn't necessarily need to be portable, but should be portable purely
|
||||||
|
as a result of being completely to standard. So, our programs should be able to
|
||||||
|
run on any system that is standards compliant.
|
||||||
|
|
||||||
|
In general, you should use features in the standard. Don't try to write an
|
||||||
|
interface in a program if you can just use an interface in POSIX. Again, if
|
||||||
|
you're doing kernel or libc dev, you can kinda fudge this, but for util dev,
|
||||||
|
definitely use the standard interfaces.
|
||||||
|
|
||||||
|
Don't worry about supporting non-UNIX systems. Windows? Don't worry about it.
|
||||||
|
If you can do something using pure ISO C, then it doesn't hurt, but don't
|
||||||
|
overcomplicate it if you can just use a POSIX function instead.
|
||||||
|
|
||||||
|
Porting between CPU:
|
||||||
|
|
||||||
|
For a start, we're not worried about anything not 32-bit or higher. 16-bit?
|
||||||
|
Not a concern. In general, though, anything architecture dependent should be
|
||||||
|
in an arch dir. So, the actual low-level kernel code? arch/i386 (or whatever
|
||||||
|
arch you're writing for).
|
||||||
|
|
||||||
|
In general, assume that your types will be as defined in limits.h.
|
||||||
|
|
||||||
|
Don't assume endianness. Be careful about that stuff.
|
||||||
|
|
||||||
|
Calling system functions:
|
||||||
|
|
||||||
|
Just call the POSIX functions. Use standard interfaces to stuff.
|
||||||
|
|
||||||
|
Internationalization:
|
||||||
|
|
||||||
|
Um. Not sure how to handle this right now. If you want to port into another
|
||||||
|
language, get in touch.
|
||||||
|
|
||||||
|
Character set:
|
||||||
|
|
||||||
|
Try to stick to ASCII. (This is why I asked for romaji earlier.)
|
||||||
|
|
||||||
|
If you need non-ASCII, use UTF-8. Try to avoid this if possible.
|
||||||
|
|
||||||
|
Quote characters:
|
||||||
|
|
||||||
|
Be careful. Quotes are 0x22 ('"') and 0x27 ('''). Don't let your computer fuck
|
||||||
|
that stuff up.
|
||||||
|
|
||||||
|
If you're internationalizing, though, use the right quotes for stuff. Like, in
|
||||||
|
French, you'd want «».
|
||||||
|
|
||||||
|
mmap:
|
||||||
|
|
||||||
|
Don't assume it works for everything or fails for everything.
|
||||||
|
|
||||||
|
Try it on a file you want to use. If it fails, use read() and write().
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
=============
|
||||||
|
|
||||||
|
Man pages:
|
||||||
|
|
||||||
|
The primary method of documenting stuff for FENIX is in the man pages. All else
|
||||||
|
is secondary. Man pages should have a fairly standard format of:
|
||||||
|
Title
|
||||||
|
Synopsis
|
||||||
|
Description
|
||||||
|
Options
|
||||||
|
Examples
|
||||||
|
Author
|
||||||
|
Copyright
|
||||||
|
|
||||||
|
The title is fairly basic. Name the thing and give a short description. For
|
||||||
|
instance: head - copy the first part of files.
|
||||||
|
|
||||||
|
The synopsis is just a listing of how the program works. So, for head, it's
|
||||||
|
head [-n number] file ...
|
||||||
|
Any optional arguments should be in square brackets. Mutually exclusive options
|
||||||
|
should be in the same brackets separated by pipes ([-s|-v]). Options that don't
|
||||||
|
take a further parameter (unlike -n in the above example) can be grouped
|
||||||
|
togethers if the software can take them that way ([-elm] for you can do -e, -l
|
||||||
|
and/or -m, -el, -lm or -em, or -elm). Variable type stuff, like file or number
|
||||||
|
should be """italicized""" (/fIvariable/fR). If you want to note that you can
|
||||||
|
repeat the last argument, e.g. take multiple files, use ellipses.
|
||||||
|
|
||||||
|
Description should give a full description of how it works. Tell what it does,
|
||||||
|
note any oddities or behaviour to be noted, and give a quick rundown of how
|
||||||
|
options change things.
|
||||||
|
|
||||||
|
Options should list each option one by one and explain it in detail.
|
||||||
|
|
||||||
|
Examples should give at least one example of how to use it and what the example
|
||||||
|
would do.
|
||||||
|
|
||||||
|
The author should be whoever wrote the program. List the original author(s).
|
||||||
|
So, you may notice plenty of utils have the author as "Kat", since I, Kat, am
|
||||||
|
the one who wrote them.
|
||||||
|
|
||||||
|
Copyright should contain the following:
|
||||||
|
Copyright (C) 2019 The FENIX Project
|
||||||
|
|
||||||
|
This software is free software. Feel free to modify it
|
||||||
|
and/or pass it around.
|
||||||
|
A lot of older man pages will list the copyright as:
|
||||||
|
Copyright (C) 2019 Katlynn Richey
|
||||||
|
Not the worst idea to update that if you see it.
|
||||||
|
|
||||||
|
You might also want to include the package of a thing, if it's got one. For
|
||||||
|
example, utilities include:
|
||||||
|
This <util> implementation is a part of the fenutils package.
|
||||||
|
|
||||||
|
Physical manual:
|
||||||
|
|
||||||
|
The secondary documentation is the manual written in roff. Practically, it
|
||||||
|
documents the same kinda things. Name, synopsis, options, etc. It also includes
|
||||||
|
some other stuff, like See Also, for related stuff; Diagnostics, for what all
|
||||||
|
errors it can produce; and Bugs, for any bugs in a program. Additionally, the
|
||||||
|
author field is different, and the details for that, along with other bits,
|
||||||
|
can be found in the Intro.
|
||||||
|
|
||||||
|
License for the manuals:
|
||||||
|
|
||||||
|
The manuals are tentatively under CC-BY. Maybe I'll write my own license, like
|
||||||
|
with the CWPL. For now, though, it's CC-BY.
|
||||||
|
|
||||||
|
Credits:
|
||||||
|
|
||||||
|
In man pages (including physical), include the original author of the program,
|
||||||
|
not the author of the man page. (Generally, you should be writing the man
|
||||||
|
pages yourself anyways.)
|
||||||
|
|
||||||
|
On the title page of the physical manual, all the folx behind the project should
|
||||||
|
be named. For now, this is fairly small. If it gets too big, we'll give them
|
||||||
|
all credit within the first few pages and have the author on the manual as
|
||||||
|
"The FENIX Project Manual Team".
|
||||||
|
|
||||||
|
On other manuals:
|
||||||
|
|
||||||
|
Don't copy other people's manuals wholesale. Try to write it yourself. The
|
||||||
|
exception is in working with the POSIX standard. Don't copy that wholesale, but
|
||||||
|
you can base your man page on the relevant POSIX page. Just know that the
|
||||||
|
POSIX page probably won't give you a complete man page!
|
||||||
|
|
||||||
|
Releases
|
||||||
|
========
|
||||||
|
|
||||||
|
I'll worry about that later.
|
8
notes/runlevels
Normal file
8
notes/runlevels
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
0 - shutdown system, power-off hardware
|
||||||
|
1 - Single-user mode
|
||||||
|
Only mounts /
|
||||||
|
2 - Multi-user mode
|
||||||
|
3 - Multi-user mode with networking
|
||||||
|
4 - Multi-user mode; Boot to X/FENIX display server
|
||||||
|
5 - User-definable? Reboot to firmware on UEFI?
|
||||||
|
6 - Reboot
|
68
notes/stuff we gotta do ourselves
Normal file
68
notes/stuff we gotta do ourselves
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
There's a lot that the SUS doesn't define, stuff that's up to us. This is a list
|
||||||
|
of some of that stuff.
|
||||||
|
|
||||||
|
Stuff it doesn't include:
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Tools specifically use for for development. The development tools are, according
|
||||||
|
to the Guide to the Single Unix Specification, intended for the installation,
|
||||||
|
not development of debugging. This includes stuff like debuggers, assembly
|
||||||
|
language tools (like as), and program style tools (like linters). There can
|
||||||
|
be standards for this sort of thing (things that a linter might want to include,
|
||||||
|
assembly language definitions like the x86 assembly standard, etc.), but it's
|
||||||
|
not in the SUS. So, if we want to include any of these, we gotta do 'em
|
||||||
|
ourselves.
|
||||||
|
|
||||||
|
Stuff that isn't "useful to conforming applications"/"from shell scripts or
|
||||||
|
typical application programs" This is a lot of user-facing stuff that they'd
|
||||||
|
use interactively and that can't be used from, like, a shell script and that
|
||||||
|
isn't useful for any of the goals of the SUS. For example, news and calendar
|
||||||
|
are listed this way. I definitely want those. I may also include a music player,
|
||||||
|
assuming I can figure that out. And, of course, other, similar applications,
|
||||||
|
like web browsers, RSS readers, etc. Stuff that we can just include if we want.
|
||||||
|
|
||||||
|
Things that might have been replaced. Specifically, I'm talking about cpio and
|
||||||
|
tar. Those were removed in favour of pax, but we still probably want those lying
|
||||||
|
around.
|
||||||
|
|
||||||
|
Things that have been subsumed by other applications. Sure, cpp and ld might be
|
||||||
|
a part of c99, but we probably still want those around separately, even if it's
|
||||||
|
just breaking the rule ("rule", guideline) that what a program does shouldn't be
|
||||||
|
determined by how it was invoked. (i.e. We just make c99 behave with linking
|
||||||
|
flags if started as ld and with compiling C++ flags if started as cpp.)
|
||||||
|
|
||||||
|
"Terminal-oriented" or otherwise low-level programs. Things like login, passwd,
|
||||||
|
chroot, or su. These are things we're gonna need but that the SUS doesn't touch.
|
||||||
|
(Oh, and wall.)
|
||||||
|
|
||||||
|
mknod. It's only excluded for being too implementation-defined, but we still
|
||||||
|
probably want it.
|
||||||
|
|
||||||
|
Graphical interfaces. Curses is part of the SUS, but anything beyond that
|
||||||
|
(X servers, the actual interfaces that run on said servers) is up to us (at
|
||||||
|
least to the extent there isn't a standard; we can't just write our own graphics
|
||||||
|
server and call it X11).
|
||||||
|
|
||||||
|
Anything on the system level. XSH defines a lot of interfaces to that system
|
||||||
|
level stuff, and I think there are a few more utilities that do that interfacing
|
||||||
|
in XCU, but the kernel level stuff they reference is up to us. This includes
|
||||||
|
how we do scheduling (niceness notwithstanding), memory allocation (as called
|
||||||
|
through the malloc family), interrupts, hard disk stuff (including the file
|
||||||
|
system), and more.
|
||||||
|
|
||||||
|
dump, an old backup program. Fun stuff.
|
||||||
|
|
||||||
|
Stuff the standard mentions probably needing:
|
||||||
|
=============================================
|
||||||
|
|
||||||
|
Text formatting. I'd put my money on troff, but we could do TeX. The POSIX
|
||||||
|
standard mentioned work in the area of SGML could help, as this is something
|
||||||
|
they feel they don't have but need, and the FHS mentioned SGML directories, so
|
||||||
|
we could do SGML (though I think I'd rather do troff).
|
||||||
|
|
||||||
|
More control over printing. Specifically, I think we're gonna have an lpd,
|
||||||
|
instead of lp just going straight to the printer, so we could have control over
|
||||||
|
scheduling (and even cancelling) print jobs. We could also probably put in some
|
||||||
|
stuff to help with formatting print jobs.
|
||||||
|
|
||||||
|
Tools for working in other programming langauges besides C and FORTRAN.
|
42
notes/tentative_dev_timeline
Normal file
42
notes/tentative_dev_timeline
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
X Get a kernel that can draw to screen
|
||||||
|
Higher half?
|
||||||
|
Paging
|
||||||
|
X Get GDT setup
|
||||||
|
- Enter protected mode
|
||||||
|
*THIS IS A BOOTLOADER THING. GRUB DOES THIS FOR YOU.*
|
||||||
|
X Get interrupts working
|
||||||
|
Get the PIT working, especially IRQ0
|
||||||
|
HPET can come later
|
||||||
|
Multitasking/Scheduler (with niceness)
|
||||||
|
Get memory mapping up
|
||||||
|
Get a memory manager going
|
||||||
|
Setup a heap
|
||||||
|
Multithreading support
|
||||||
|
Hardware abstraction layer
|
||||||
|
Get IRQ1 (keyboard) working
|
||||||
|
Get a basic debug/rescue shell working
|
||||||
|
Get IRQ8 and IRQ14 working
|
||||||
|
Get a hard drive driver working (with UNIX/MINIX-esque file system driver)
|
||||||
|
Get the basic init system set up
|
||||||
|
Add userspace stuff to GDT, including TSS
|
||||||
|
Get the C lib. program initialization set up
|
||||||
|
Get a program loader working
|
||||||
|
Get necessary C lib. stuff for vsh working
|
||||||
|
Get vsh loading
|
||||||
|
Get other interrupt handlers set up
|
||||||
|
Add utils into build tooling alongside kernel and libc
|
||||||
|
Get the TTY properly set up
|
||||||
|
Get curses going
|
||||||
|
Get core utilities (and requirements) finished
|
||||||
|
Get vsh finished (fully sh-compliant), including built-ins
|
||||||
|
Get rc-based init going
|
||||||
|
Get multiuser support (/etc/passwd, etc.)
|
||||||
|
Add networking support
|
||||||
|
Finish the C library
|
||||||
|
Add amd64 and EFI support
|
||||||
|
Get misc. and XSI utilities working
|
||||||
|
Get complex utilities working
|
||||||
|
Get the C toolchain working
|
||||||
|
Get multiuser utils finished
|
||||||
|
Get dev utils working
|
||||||
|
Get SCCS working
|
224
notes/util_cats
Normal file
224
notes/util_cats
Normal file
|
@ -0,0 +1,224 @@
|
||||||
|
Core - These go in /bin
|
||||||
|
=======================
|
||||||
|
at
|
||||||
|
batch
|
||||||
|
X cat
|
||||||
|
chgrp
|
||||||
|
chmod
|
||||||
|
chown
|
||||||
|
cp
|
||||||
|
crontab
|
||||||
|
dd
|
||||||
|
df
|
||||||
|
dmesg
|
||||||
|
du
|
||||||
|
X echo
|
||||||
|
X false
|
||||||
|
file
|
||||||
|
find
|
||||||
|
getconf
|
||||||
|
grep
|
||||||
|
hostname
|
||||||
|
X ln
|
||||||
|
logger
|
||||||
|
login
|
||||||
|
ls
|
||||||
|
mkdir
|
||||||
|
X mkfifo
|
||||||
|
mknod
|
||||||
|
mount
|
||||||
|
mv
|
||||||
|
netstat
|
||||||
|
newgrp
|
||||||
|
nice
|
||||||
|
nohup
|
||||||
|
pathchk
|
||||||
|
ping
|
||||||
|
printf
|
||||||
|
ps
|
||||||
|
renice
|
||||||
|
rm
|
||||||
|
X rmdir
|
||||||
|
sh
|
||||||
|
X sleep
|
||||||
|
stty
|
||||||
|
su
|
||||||
|
sync
|
||||||
|
tar
|
||||||
|
X tee
|
||||||
|
time
|
||||||
|
touch
|
||||||
|
tput
|
||||||
|
X true
|
||||||
|
X tty
|
||||||
|
umount
|
||||||
|
X uname
|
||||||
|
xargs
|
||||||
|
|
||||||
|
Important system stuff - These go in /sbin
|
||||||
|
==========================================
|
||||||
|
shutdown
|
||||||
|
fastboot
|
||||||
|
fasthalt
|
||||||
|
fdisk
|
||||||
|
fsck (especially fsck.fxfs)
|
||||||
|
halt
|
||||||
|
init
|
||||||
|
mkfs (especially mkfs.fxfs)
|
||||||
|
mkswap
|
||||||
|
reboot
|
||||||
|
swapon
|
||||||
|
swapoff
|
||||||
|
update
|
||||||
|
|
||||||
|
Shell built-ins - These may or may not have standalone versions
|
||||||
|
===============================================================
|
||||||
|
alias
|
||||||
|
bg
|
||||||
|
~ cd
|
||||||
|
command
|
||||||
|
env
|
||||||
|
fc
|
||||||
|
fg
|
||||||
|
getopts
|
||||||
|
hash
|
||||||
|
jobs
|
||||||
|
X kill
|
||||||
|
pwd
|
||||||
|
read
|
||||||
|
tabs
|
||||||
|
test
|
||||||
|
type
|
||||||
|
ulimit
|
||||||
|
umask
|
||||||
|
unalias
|
||||||
|
wait
|
||||||
|
|
||||||
|
C toolchain - Stuff used for C language development
|
||||||
|
===================================================
|
||||||
|
ar
|
||||||
|
awk
|
||||||
|
cc/c99
|
||||||
|
cflow
|
||||||
|
cxref
|
||||||
|
lex
|
||||||
|
yacc
|
||||||
|
|
||||||
|
XSI - X/Open Source utilities
|
||||||
|
=============================
|
||||||
|
cal
|
||||||
|
compress
|
||||||
|
date
|
||||||
|
fuser
|
||||||
|
ipcrm
|
||||||
|
ipcs
|
||||||
|
X link
|
||||||
|
nl
|
||||||
|
uncompress
|
||||||
|
unlink
|
||||||
|
zcat
|
||||||
|
|
||||||
|
SCCS
|
||||||
|
====
|
||||||
|
admin
|
||||||
|
delta
|
||||||
|
get
|
||||||
|
prs
|
||||||
|
rmdel
|
||||||
|
sact
|
||||||
|
sccs
|
||||||
|
unget
|
||||||
|
val
|
||||||
|
what
|
||||||
|
|
||||||
|
Dev utils - General development utilities (not C-specific)
|
||||||
|
==========================================================
|
||||||
|
asa
|
||||||
|
ctags
|
||||||
|
fort77
|
||||||
|
gencat
|
||||||
|
m4
|
||||||
|
make
|
||||||
|
nm
|
||||||
|
od
|
||||||
|
patch
|
||||||
|
pax
|
||||||
|
strip
|
||||||
|
|
||||||
|
Complex - Utilities that will be difficult, might need lex/yacc or curses, etc.
|
||||||
|
===============================================================================
|
||||||
|
bc
|
||||||
|
ed
|
||||||
|
ex
|
||||||
|
expr
|
||||||
|
join
|
||||||
|
lp
|
||||||
|
mailx
|
||||||
|
more
|
||||||
|
pr
|
||||||
|
sed
|
||||||
|
vi
|
||||||
|
|
||||||
|
Multi-user - Utilities for multi-user interactions and the like
|
||||||
|
===============================================================
|
||||||
|
id
|
||||||
|
X logname
|
||||||
|
mesg
|
||||||
|
talk
|
||||||
|
who
|
||||||
|
write
|
||||||
|
|
||||||
|
Obsolete batch job commands
|
||||||
|
===========================
|
||||||
|
qalter
|
||||||
|
qdel
|
||||||
|
qhold
|
||||||
|
qmove
|
||||||
|
qmsg
|
||||||
|
qrerun
|
||||||
|
qrls
|
||||||
|
qselect
|
||||||
|
qsig
|
||||||
|
qstat
|
||||||
|
qsub
|
||||||
|
|
||||||
|
Miscellaneous
|
||||||
|
=============
|
||||||
|
X basename
|
||||||
|
X cksum
|
||||||
|
X cmp
|
||||||
|
comm
|
||||||
|
csplit
|
||||||
|
cut
|
||||||
|
diff
|
||||||
|
X dirname
|
||||||
|
X expand
|
||||||
|
fold
|
||||||
|
X head
|
||||||
|
iconv
|
||||||
|
locale
|
||||||
|
localedef
|
||||||
|
locate
|
||||||
|
look
|
||||||
|
man
|
||||||
|
paste
|
||||||
|
sort
|
||||||
|
split
|
||||||
|
strings
|
||||||
|
tail
|
||||||
|
tr
|
||||||
|
tsort
|
||||||
|
unexpand
|
||||||
|
uniq
|
||||||
|
uucp
|
||||||
|
uudecode
|
||||||
|
uuencode
|
||||||
|
uustat
|
||||||
|
uux
|
||||||
|
X wc
|
||||||
|
|
||||||
|
Additions - Things not in any standard
|
||||||
|
======================================
|
||||||
|
basic (bas?)???
|
||||||
|
cobol
|
||||||
|
dump
|
6
qemu.sh
Executable file
6
qemu.sh
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
. ./iso.sh
|
||||||
|
|
||||||
|
qemu-system-$(./target-triplet-to-arch.sh $HOST) -cdrom fenix.iso
|
7
target-triplet-to-arch.sh
Executable file
7
target-triplet-to-arch.sh
Executable file
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if echo "$1" | grep -Eq 'i[[:digit:]]86-'; then
|
||||||
|
echo i386
|
||||||
|
else
|
||||||
|
echo "$1" | grep -Eo '&[[:alnum:]_]*'
|
||||||
|
fi
|
Loading…
Reference in a new issue