SchOS/docs/plan
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Nexoniarz b411836478 libinput, seatd and libseat; sockets from accept() can pass descriptors
Alpine's libinput, libseat, seatd, xf86-input-libinput and usbutils join the
image, and seatd runs from schinit. libinput lists the keyboard and pointer as
an ordinary user, Xorg now drives both through libinput, and a program linked
to libseat running as schos opens seat0 through seatd, is handed
/dev/input/event0 and reads its name through the descriptor.

Two kernel bugs stood in the way, and both would have stopped a Wayland
compositor too. The socket connect() queues for a listener was allocated with
its domain at zero, so sendmsg refused SCM_RIGHTS on the accepted end: a server
could receive descriptors and never send one. And sendmsg treated a control
buffer longer than its messages as an error, where Linux takes a following
header too short to be one as the end; seatd passes a zeroed CMSG_SPACE array
with one descriptor at the front.

Found with /proc/strace and a temporary kinfo in sendmsg's EINVAL sites.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EVRhxi9zpdW2uDUN4FVcao
2026-10-26 16:51:39 +01:00
..
1.0.md eudev starts at boot; Xorg finds its input devices through it 2026-10-26 11:44:21 +01:00
finch.md docs: README, plan, guides and the site describe what is built now 2026-10-26 08:08:05 +01:00
gpu.md docs: README, plan, guides and the site describe what is built now 2026-10-26 08:08:05 +01:00
README.md Schcom is gone; the desktop path is Xorg now, Wayland groundwork next 2026-10-26 09:35:54 +01:00
roadmap.md libinput, seatd and libseat; sockets from accept() can pass descriptors 2026-10-26 16:51:39 +01:00
schapi.md Schcom is gone; the desktop path is Xorg now, Wayland groundwork next 2026-10-26 09:35:54 +01:00

What happens next

Everything in this directory is unbuilt. When a piece of it is finished it leaves — deleted from here, rewritten as a description in ../architecture/. See the rule.

Read 1.0.md first.

It draws the finish line, says where the system stands against it, and holds the register of unfinished work — the one place anything half-built is listed. No new capability starts until that register is empty, and a row leaves it only by being finished or by being deleted from the tree.


What is here

1.0.md The finish line. What 1.0 is, the acceptance test and where each clause stands, the register, and everything explicitly deferred.
roadmap.md Everything else that is scoped and agreed: storage and the installer, graphics, networking, the hardware that makes a laptop a laptop, SchFS beyond SchOS, the kernel's own gaps.
gpu.md Linux's own amdgpu through LDLS, and the /dev/dri a process has to serve. Measured, with the work it needs written down.
finch.md Later. The author's own LLVM language for SchOS's applications and tools in place of C. The language is finished and self-hosting in its own repository; the plan here is a target, bindings generated from include/uapi/, and the compiler in the image.
schapi.md The long-term API layering and the compatibility promise. Direction agreed, nothing built.

What used to be here, and is built

Plans leave this directory when they are done. These did, and what replaced them is the description:

Was Now
Descriptor passing, shared memory, sockets in the filesystem, dynamic linking, the event descriptors (foundations.md) kernel.md, networking.md, syscalls.md
init.md init.md
hybrid.md — drivers in processes, /dev/pci, a modeset API, the panic path, why USB stays devices.md
ldls.md — Linux drivers in a process ldls.md
debugger.md debugging.md
alpine.md — an apk-managed root packages.md
xorg.md — the desktop desktop.md
The interactive crash screen (roadmap.md §4) GMMOS, in graphics.md

And one that was decided against: wayland.md. Wayland needs DRM/KMS, libinput, udev and libseat, and DRM/KMS alone is a kernel graphics subsystem. The desktop is X. The reasoning moved to desktop.md. SchWM, SchDE and the compositor Schcom are gone from the tree: SchOS uses other people's window manager and desktop — Window Maker now; XLibre, Xorg or a Wayland compositor later — and puts its work into what they need underneath (udev, DRM).


The order

Set by 1.0.md, which is the authority. 1.0 is reached (a live system; persistence is not part of it). What is left before anything new starts:

  1. Empty the register: decide the unused in-kernel LDLS window (delete it, or use it), and build socket activation or remove the key.
  2. The owner's list (roadmap.md): the Wayland groundwork (udev first, §5), making LDLS good enough that the GPU driver can run (gpu.md), a boot manager worth looking at (§5b), then the installer, then Finch inside SchOS (finch.md).

What this plan does not address

Stated here so it is not mistaken for covered:

  • No IOMMU, so a driver in a process is isolated against its own bugs and not against a hostile driver.
  • No page cache, so a general writable MAP_SHARED of a file is refused; memfd is the narrow answer.
  • No installer, so nothing a live system writes survives a reboot — by decision, for 1.0.