<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.restless.systems/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=JennyWakeman</id>
	<title>DisNCord Community Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.restless.systems/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=JennyWakeman"/>
	<link rel="alternate" type="text/html" href="https://wiki.restless.systems/wiki/Special:Contributions/JennyWakeman"/>
	<updated>2026-05-29T17:30:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1255</id>
		<title>Blackstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1255"/>
		<updated>2024-09-11T14:38:21Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: gug&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This project is an attempt to boot a custom kernel on the Dish Network ViP222k series satellite receivers. So far, we have achieved a buffer overflow which could potentially result in remote code execution.&lt;br /&gt;
&lt;br /&gt;
== Project Goals ==&lt;br /&gt;
We&#039;d like to boot a custom kernel (either Linux or NetBSD) via kexec upon gaining code execution on the target, purely over the network without plugging anything into the receiver itself. (Outside of potentially a USB stick?)&lt;br /&gt;
&lt;br /&gt;
== UPnP ==&lt;br /&gt;
On startup, the ViP units expose a UPnP server with a surprising (alarming?) amount of functions. Some examples:&lt;br /&gt;
&lt;br /&gt;
* Increment/decrement channel&lt;br /&gt;
* Force redownload program guide&lt;br /&gt;
* Lock/unlock front panel controls and remote&lt;br /&gt;
* Remote reboot&lt;br /&gt;
* Test satellite switch (annoying, takes a very long time!)&lt;br /&gt;
&lt;br /&gt;
(Among various other things.)&lt;br /&gt;
&lt;br /&gt;
Currently, a Python script has been written (and will eventually be released) that can detect ViP units on a wireless network (via UPnP) and execute exposed actions.&lt;br /&gt;
&lt;br /&gt;
=== Exploit ===&lt;br /&gt;
Though the firmware on the test unit was last updated in 2019, the version of &amp;lt;code&amp;gt;libupnp&amp;lt;/code&amp;gt; present on the system is version 1.6.6, which is susceptible to [https://nvd.nist.gov/vuln/detail/CVE-2012-5958 CVE-2012-5958], a buffer overflow capable of remote code execution. Using Metasploit&#039;s module for this CVE, we were able to trigger the overflow, although without a proper payload, the UPnP server simply crashed (after two attempts).&lt;br /&gt;
&lt;br /&gt;
The potential for this exploit is that we can remotely boot a modified NetBSD or Linux kernel on affected boxes over the network, discovering and exploiting boxes via UPnP.&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=EchoStomp_PLUS&amp;diff=1254</id>
		<title>EchoStomp PLUS</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=EchoStomp_PLUS&amp;diff=1254"/>
		<updated>2024-09-11T14:33:05Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: JennyWakeman moved page EchoStomp PLUS to Blackstar: cooler name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Blackstar]]&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1253</id>
		<title>Blackstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1253"/>
		<updated>2024-09-11T14:33:05Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: JennyWakeman moved page EchoStomp PLUS to Blackstar: cooler name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a project to (hopefully) achieve remote code execution on the Dish Network ViP line of set-top boxes. The unit used for testing is a Dish Network ViP222k.&lt;br /&gt;
&lt;br /&gt;
I wouldn&#039;t place bets on this project&#039;s success. I do not have a background in cybersecurity or pentesting. It&#039;d be funny though.&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
&lt;br /&gt;
* Framebuffer access (for funniest image I&#039;ll ever take)&lt;br /&gt;
* Boot NetBSD (someday, somehow)&lt;br /&gt;
* Run Doom (maybe)&lt;br /&gt;
&lt;br /&gt;
== UPnP ==&lt;br /&gt;
On startup, the ViP units expose a UPnP server with a surprising (alarming?) amount of functions. Some examples:&lt;br /&gt;
&lt;br /&gt;
* Increment/decrement channel&lt;br /&gt;
* Force redownload program guide&lt;br /&gt;
* Lock/unlock front panel controls and remote&lt;br /&gt;
* Remote reboot&lt;br /&gt;
* Test satellite switch (annoying, takes a very long time!)&lt;br /&gt;
&lt;br /&gt;
(Among various other things.)&lt;br /&gt;
&lt;br /&gt;
Currently, a Python script has been written (and will eventually be released) that can detect ViP units on a wireless network (via UPnP) and execute exposed actions.&lt;br /&gt;
&lt;br /&gt;
=== Exploit ===&lt;br /&gt;
Though the firmware on the test unit was last updated in 2019, the version of &amp;lt;code&amp;gt;libupnp&amp;lt;/code&amp;gt; present on the system is version 1.6.6, which is susceptible to [https://nvd.nist.gov/vuln/detail/CVE-2012-5958 CVE-2012-5958], a buffer overflow capable of remote code execution. Using Metasploit&#039;s module for this CVE, we were able to trigger the overflow, although without a proper payload, the UPnP server simply crashed (after two attempts).&lt;br /&gt;
&lt;br /&gt;
The potential for this exploit is that we can remotely boot a modified NetBSD or Linux kernel on affected boxes over the network, discovering and exploiting boxes via UPnP.&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1252</id>
		<title>Blackstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1252"/>
		<updated>2024-09-11T14:32:24Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: add section on cve&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a project to (hopefully) achieve remote code execution on the Dish Network ViP line of set-top boxes. The unit used for testing is a Dish Network ViP222k.&lt;br /&gt;
&lt;br /&gt;
I wouldn&#039;t place bets on this project&#039;s success. I do not have a background in cybersecurity or pentesting. It&#039;d be funny though.&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
&lt;br /&gt;
* Framebuffer access (for funniest image I&#039;ll ever take)&lt;br /&gt;
* Boot NetBSD (someday, somehow)&lt;br /&gt;
* Run Doom (maybe)&lt;br /&gt;
&lt;br /&gt;
== UPnP ==&lt;br /&gt;
On startup, the ViP units expose a UPnP server with a surprising (alarming?) amount of functions. Some examples:&lt;br /&gt;
&lt;br /&gt;
* Increment/decrement channel&lt;br /&gt;
* Force redownload program guide&lt;br /&gt;
* Lock/unlock front panel controls and remote&lt;br /&gt;
* Remote reboot&lt;br /&gt;
* Test satellite switch (annoying, takes a very long time!)&lt;br /&gt;
&lt;br /&gt;
(Among various other things.)&lt;br /&gt;
&lt;br /&gt;
Currently, a Python script has been written (and will eventually be released) that can detect ViP units on a wireless network (via UPnP) and execute exposed actions.&lt;br /&gt;
&lt;br /&gt;
=== Exploit ===&lt;br /&gt;
Though the firmware on the test unit was last updated in 2019, the version of &amp;lt;code&amp;gt;libupnp&amp;lt;/code&amp;gt; present on the system is version 1.6.6, which is susceptible to [https://nvd.nist.gov/vuln/detail/CVE-2012-5958 CVE-2012-5958], a buffer overflow capable of remote code execution. Using Metasploit&#039;s module for this CVE, we were able to trigger the overflow, although without a proper payload, the UPnP server simply crashed (after two attempts).&lt;br /&gt;
&lt;br /&gt;
The potential for this exploit is that we can remotely boot a modified NetBSD or Linux kernel on affected boxes over the network, discovering and exploiting boxes via UPnP.&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1250</id>
		<title>Blackstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1250"/>
		<updated>2024-09-10T14:31:22Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: What? Help me!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a project to (hopefully) achieve remote code execution on the Dish Network ViP line of set-top boxes. The unit used for testing is a Dish Network ViP222k.&lt;br /&gt;
&lt;br /&gt;
I wouldn&#039;t place bets on this project&#039;s success. I do not have a background in cybersecurity or pentesting. It&#039;d be funny though.&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
&lt;br /&gt;
* Framebuffer access (for funniest image I&#039;ll ever take)&lt;br /&gt;
* Boot NetBSD (someday, somehow)&lt;br /&gt;
* Run Doom (maybe)&lt;br /&gt;
&lt;br /&gt;
== UPnP ==&lt;br /&gt;
On startup, the ViP units expose a UPnP server with a surprising (alarming?) amount of functions. Some examples:&lt;br /&gt;
&lt;br /&gt;
* Increment/decrement channel&lt;br /&gt;
* Force redownload program guide&lt;br /&gt;
* Lock/unlock front panel controls and remote&lt;br /&gt;
* Remote reboot&lt;br /&gt;
* Test satellite switch (annoying, takes a very long time!)&lt;br /&gt;
&lt;br /&gt;
(Among various other things.)&lt;br /&gt;
&lt;br /&gt;
Currently, a Python script has been written (and will eventually be released) that can detect ViP units on a wireless network (via UPnP) and execute exposed actions. This has the added advantage of being able to quickly detect model information and grab the unit&#039;s IP (for port scanning, which will be done Soon&amp;lt;sup&amp;gt;ᚾᛖ&amp;lt;/sup&amp;gt;.)&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1249</id>
		<title>Blackstar</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Blackstar&amp;diff=1249"/>
		<updated>2024-09-10T14:14:25Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: jcnjkndjknaskjnckjndsakjfbdfbjhbdhfwboechwfoexuiofaonucfoiunuipqnoirunsoiufcnoiafuoinuciodsnauopibeiqubwrcrberyrwehwrnehuidxfjneoqjrjbijausodjfcobuiewcjneuweqirbqiudhboxnqyuiybduyauiybauiefonjeqpxiqefournqceuroiquriupxueoqxunuqexuehmmnqdpznjafhdfhbehcqoonuiwhmefixuefuzhbeuiqseyuefnhxnhfiuhninhewqioybffgryweiueyzbfyxgexweybfgqixbyefgigeqnxgfeyfqgenxygwehqjggdhgafshfgiexqbeytvieytewvytftewvfiqwvtvyetwgfnyyifbysfubiabduyfboefyeborybiubwufbyeoufybyasybidosafybfucknyndxiuyebifvuebxnqnyszehbyezuyiybiu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a project to (hopefully) achieve remote code execution on the Dish Network ViP line of set-top boxes. The unit used for testing is a Dish Network ViP222k.&lt;br /&gt;
&lt;br /&gt;
I wouldn&#039;t place bets on this project&#039;s success. I do not have a background in cybersecurity or pentesting. It&#039;d be funny though.&lt;br /&gt;
&lt;br /&gt;
== Goals ==&lt;br /&gt;
&lt;br /&gt;
* Framebuffer access (for funniest image I&#039;ll ever take)&lt;br /&gt;
* Boot NetBSD (someday, somehow)&lt;br /&gt;
* Run Doom (maybe)&lt;br /&gt;
&lt;br /&gt;
== UPnP ==&lt;br /&gt;
On startup, the ViP units expose a UPnP server with a surprising (alarming?) amount of functions. Some examples:&lt;br /&gt;
&lt;br /&gt;
* Increment/decrement channel&lt;br /&gt;
* Force redownload program guide&lt;br /&gt;
* Lock/unlock front panel controls and remote&lt;br /&gt;
* Remote reboot&lt;br /&gt;
* Test satellite switch (annoying, takes a very long time!)&lt;br /&gt;
&lt;br /&gt;
(Among various other things.)&lt;br /&gt;
&lt;br /&gt;
Currently, a Python script has been written (and will eventually be released) that can detect ViP units on a wireless network (via UPnP) and execute exposed actions. This has the added advantage of being able to quickly detect model information and grab the unit&#039;s IP (for port scanning, which will be done Soon&amp;lt;sup&amp;gt;ᚾᛖ&amp;lt;/sup&amp;gt;.)&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Quotes&amp;diff=1245</id>
		<title>Quotes</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Quotes&amp;diff=1245"/>
		<updated>2024-09-08T18:42:14Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: /* The most normal sentence said in DisNCord */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Fluff]]&lt;br /&gt;
Add new quotes at the bottom (at least for now, can discuss what&#039;s better).&lt;br /&gt;
&lt;br /&gt;
== The most normal sentence said in DisNCord ==&lt;br /&gt;
[[File:Sunrise_720p.png|200px|thumb|right|the SUN rises]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aquamarine: Sunrise&lt;br /&gt;
Restless Yankee: I also want to post that to /r/minecraft&lt;br /&gt;
aquamarine: wait, lemme flip the sun back around&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The gift that keeps giving ==&lt;br /&gt;
 NCommander: I really keep @YAGPDB.xyz because the thank you counter is always hilarious when it goes off&lt;br /&gt;
 YAGPDB.xyz: Gave +1 Rep to @YAGPDB.xyz&lt;br /&gt;
 NCommander: ...&lt;br /&gt;
 NCommander: you know, kinda like that&lt;br /&gt;
&lt;br /&gt;
== On N&#039;s Life ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
volatilefluid: We&#039;re all just files mounted into your namespace, presumably Plan 9-style.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== On Bad Ideas ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NCommander: ... why is that a normal sentence ...&lt;br /&gt;
pJowok: it&#039;s not a normal sentence, it&#039;s a coherent sentence that is grammatically valid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NCommander on Stream ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NCommander: We&#039;re only using 32GB of ram! I can open 2 more chrome tabs!&lt;br /&gt;
&#039;&#039;long pause and quieter&#039;&#039;&lt;br /&gt;
I&#039;m going to hell for that...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Really puts stuff in perspective ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NCommander: you know, the Queen outlasted PAL broadcasting&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Ah yes, IBM dynasty ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vmlemon: OS/2 is kinda like a Ming vase, or something - fragile, opaque, and awkward to repair, when it breaks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Probably one of the less insane things ever said here ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mineman: is it bad that &amp;quot;cross compiling bash for iOS&amp;quot; is a completely normal sentence here?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How Inoichi 2D was started ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Luna the Foxgirl: But yeah, it started as a subsystem for my lesbian foxgirl mahjong game engine&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== NCommander being on fire ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NCommander: Maybe if the fire asked me out to dinner first&lt;br /&gt;
Mineman and sadmac: *bursts out into laughter*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Simple Truth ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
NCommander: The saying in rehab circles is &amp;quot;fake it til you make it&amp;quot;&lt;br /&gt;
NCommander: but by and large, the difference between online you and real life you is more confidence&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Limits ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Waterpear — Today at 12:46 AM&lt;br /&gt;
&amp;gt;open os/2 stream vod&lt;br /&gt;
&amp;gt;see comment talking about visual j++&lt;br /&gt;
&amp;gt;close os/2 stream vod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== The Software Lifecycle ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FreeFull: Oh boy, it&#039;s time to build perl&lt;br /&gt;
Lunathir: Ran into a bit of software gore&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== When The Void Stares Back ==&lt;br /&gt;
On occasion, the eldritch lore makes itself known ...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dr. Shuppet: As of the MDOS4 toolchain thing, I tried MASM 4.0, and it produced an object file that is accepted by LINK4&lt;br /&gt;
S: However, LINK4 wants an automatic data segment, and I&#039;m not sure how to make one &lt;br /&gt;
S: MASM certainly supports it, since it&#039;s needed for any NE binary, including Windows 1.0&lt;br /&gt;
Restless Yankee: You usually need a DEF file&lt;br /&gt;
RY: ... I suffered through this in Watcom/wasm/wlink, and I got a cold shiver trying to figure it out with what little survives of early Microsoft documentation&lt;br /&gt;
S: Ah, I didn&#039;t think of that, since I&#039;m neither building a DLL nor I&#039;m importing any symbols&lt;br /&gt;
RY: 16-bit EXEs have a DEF file&lt;br /&gt;
RY: There&#039;s a default, but I think I even had one for FLAGGEN&lt;br /&gt;
RY: https://github.com/NCommander/progress-pride-win16/blob/main/source/flaggen.def&lt;br /&gt;
RY: ... how is it I have the cold shiver, and then immediately produce a link written by my own hand that is the probable answer ...&lt;br /&gt;
RY: ... fuck it, that one is going on the quotes page ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Paint Drying, Some Assembly Required ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sadmac356: At this point my &amp;quot;paint drying&amp;quot; is more &amp;quot;if you want to make an apple pie from scratch, you must first create the universe&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tickle Current ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
kraaabs: It’s charging in the way that condensation on a window is flooding your house&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Quotes ==&lt;br /&gt;
[https://github.com/TwoPizza9621536/ncommander-quotes Unofficial NCommander quotes file]&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Homebrew_OS_Development&amp;diff=1242</id>
		<title>Homebrew OS Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Homebrew_OS_Development&amp;diff=1242"/>
		<updated>2024-09-08T18:36:06Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: /* Open Computing Kit (OCK) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Projects]]&lt;br /&gt;
This is a general summary of what OSes are being developed on DisNCord.&lt;br /&gt;
&lt;br /&gt;
=== Open Computing Kit (OCK) ===&lt;br /&gt;
A joint project between Velleda, Sadmac356, Griffin, Europa, and others, [https://github.com/open-computing-kit Open Computing Kit] is an operating system that aims to be as GNU-independent as possible, including a [https://github.com/open-computing-kit/ockernel kernel written in Rust] and its [https://github.com/open-computing-kit/OCKcore own set of coreutils]. It is presently in the very early stages of active development.&lt;br /&gt;
[[File:SeshOS3.png|thumb|SeshOS as of August 6th, 2024]]&lt;br /&gt;
&lt;br /&gt;
=== SeshOS ===&lt;br /&gt;
Written by Mineman, SeshOS is one of the more esoteric OSes on DisNCord. As of 10/15/2022 it has a working malloc thanks to Krabs and Mathewnd.&lt;br /&gt;
&lt;br /&gt;
SeshOS has support for one filesystem: tar ramfs. &lt;br /&gt;
&lt;br /&gt;
Has very basic SMP setup, and has support for the PC Speaker. &lt;br /&gt;
&lt;br /&gt;
Its source code is located at https://github.com/mine-man3000/SeshOS.&lt;br /&gt;
&lt;br /&gt;
Techflash also rewrote the entire thing in C and ported bits of his OS to this.&lt;br /&gt;
=== Pics Of Bread Awful scRipting Interpreter System for Neat Architectures (POBARISNA) ===&lt;br /&gt;
Written by Krabs, POBARISNA is an operating system with a JavaScript-based microkernel design that currently only runs on PowerPC macs. There are prospective plans for ports to other &amp;quot;Neat Architectures&amp;quot; (which Krabs defines as &amp;quot;not a PC/BIOS/UEFI x86 system&amp;quot;), such as SPARC variants and ARM.&lt;br /&gt;
&lt;br /&gt;
The project can be found on [https://gitlab.com/sarahcrowle/pobarisna GitLab].&lt;br /&gt;
&lt;br /&gt;
The JavaScript interpreter used in POBARISNA is [https://duktape.org/ Duktape], an easily embeddable interpreter with a nice API. However, Duktape 2.x has some awkward tooling and a lack of solid control over execution. Therefore, there are plans to replace it with [https://gitlab.com/sarahcrowle/dorktape Dorktape], which will hopefully serve as a modernized fork of the engine.&lt;br /&gt;
&lt;br /&gt;
Being that PowerPC OpenFirmware is a slightly under-documented platform, [[PowerPC OpenFirmware Implementation Details]] should serve as helpful to anyone looking to do something similar.&lt;br /&gt;
[[File:POBARISNA running duktape on bare metal.jpg|alt=An early screenshot of POBARISNA running Duktape in OpenFirmware|thumb|An early screenshot of POBARISNA running Duktape in OpenFirmware]]&lt;br /&gt;
&lt;br /&gt;
=== picotalk ===&lt;br /&gt;
Written by Waterpear, picotalk is a Smalltalk interpreter that aims to be a bare-metal system for embedded use.&lt;br /&gt;
&lt;br /&gt;
An early attempt to implement a system from scratch in C existed, but has been abandoned. Instead, the plan is to recreate the original Smalltalk-80 system, build an RPC layer to allow the development tools to operate over a serial link, and strip out features not needed for embedded systems such as the GUI. A &amp;quot;zeroth prototype&amp;quot; written in Python is in progress, and can run some of the Smalltalk development tools.&lt;br /&gt;
&lt;br /&gt;
=== Rotom OS ===&lt;br /&gt;
Written by SED, [https://github.com/SED4906/rotomos Rotom OS] is an operating system with little information to glean from anything except for its code and a few images. It attempts to be as simple as possible, with ring 3 not yet being implemented.&lt;br /&gt;
[[File:RotomOS.png|thumb|Rotom OS]]&lt;br /&gt;
&lt;br /&gt;
=== styx ===&lt;br /&gt;
Written by Sirocyl and others, styx is an operating system with many ideas, some of which will be listed here:&lt;br /&gt;
* Applications will be double-click to run, much like Windows or macOS.&lt;br /&gt;
* Libraries should live with their application in packaging, similar to Windows.&lt;br /&gt;
* Installation will be done through drag-and-drop, taken from macOS.&lt;br /&gt;
* The system will be as (trans)portable as possible, similar to Classic macOS.&lt;br /&gt;
* The word &amp;quot;styx&amp;quot; is not an acronym, nor will the operating system&#039;s governing body ever be comprised of one member.&lt;br /&gt;
* The system will be consent-first, something that flies in the face of traditional operating systems like Windows and macOS.&lt;br /&gt;
There are many more than are stated here in their Discord server, due to there being too many to list here effectively.&lt;br /&gt;
&lt;br /&gt;
=== Astral ===&lt;br /&gt;
Written by Mathewnd, [https://github.com/Mathewnd/Astral Astral] is a monolithic kernel written in C. It is still at its early stages of development and has the beginnings of a userland.&lt;br /&gt;
&lt;br /&gt;
It has a growing port collection with a few examples being Bash, Doom, Binutils, Coreutils and NASM.&lt;br /&gt;
&lt;br /&gt;
Its current main goal is to have a usable command line interface while also having fun developing the system.&lt;br /&gt;
[[File:Astral neofetch.png|alt=Astral running Neofetch on Oct 11, 2022|thumb|Astral running Neofetch on Oct 11, 2022]]&lt;br /&gt;
&lt;br /&gt;
=== Techflash OS (TFOS) ===&lt;br /&gt;
Written by Techflash, [https://github.com/techflashYT/Techflash-OS Techflash OS] is an operating system that is still very early in development.&lt;br /&gt;
&lt;br /&gt;
It current has very little implemented except for the following:&lt;br /&gt;
&lt;br /&gt;
* A basic boot procedure&lt;br /&gt;
* Enabling a few CPU features&lt;br /&gt;
* Support of a few basic interrupts, such as the [[wikipedia:Intel_8253|PIT]] and keyboard.&lt;br /&gt;
* A very basic framebuffer console&lt;br /&gt;
* Starts of an ELF loader&lt;br /&gt;
* Serial and Parallel support for logging&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Jax_Archive&amp;diff=1238</id>
		<title>Jax Archive</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Jax_Archive&amp;diff=1238"/>
		<updated>2024-09-07T03:24:58Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: /* Magic Number */ whoops&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Jax&#039;&#039;&#039; (or &#039;&#039;&#039;J&#039;&#039;&#039;enny&#039;s &#039;&#039;&#039;A&#039;&#039;&#039;rchive e&#039;&#039;&#039;X&#039;&#039;&#039;change) is an awful backronym and a simple archive format intended to be easy and cheap (processing power-wise) to parse. Structurally, it is similar to &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt;, while not being nearly as wasteful. Instead of fixed-length fields, it uses Pascal-style strings for archive names and descriptions, as well as an additional &#039;descriptor&#039; field. The &#039;descriptor&#039; is a simple key/value style field for additional metadata.&lt;br /&gt;
&lt;br /&gt;
==Magic Number==&lt;br /&gt;
Jax-format archives all begin with the bytes &amp;lt;code&amp;gt;5E 6A 61 78&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;^jax&amp;lt;/code&amp;gt; in ASCII.)&lt;br /&gt;
&lt;br /&gt;
==Records==&lt;br /&gt;
Jax archives are structured as follows:&lt;br /&gt;
&lt;br /&gt;
*Magic number&lt;br /&gt;
*Record for File 1&lt;br /&gt;
*Data for File 1&lt;br /&gt;
*Record for File 2&lt;br /&gt;
*Data for File 2&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
Records are not aligned to any particular byte boundary and neither are the files within the archive, in the interest of creating smaller archives without the need for compression.&lt;br /&gt;
&lt;br /&gt;
Records are structured as follows. Note that a &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; is an 8-bit unsigned integer, a &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt; is a 64-bit signed integer, a &amp;lt;code&amp;gt;ulong&amp;lt;/code&amp;gt; is a 64-bit unsigned integer, and a &amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt; is a 16-bit unsigned integer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Jax archive record structure&lt;br /&gt;
|-&lt;br /&gt;
!Type!!Name!!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;    || Record Type || &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for directory, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for symbolic link, and &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; for a regular file.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;  || Record Name || Pascal-style, see [[#Strings|Strings]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;  || Description || Also Pascal-style, see [[#Descriptors|Descriptors]] for parsing information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ulong&amp;lt;/code&amp;gt;   || Timestamp   || UNIX timestamp of last change, seconds since 12:00 AM or 00:00 on January 1st, 1970&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Mode   || UNIX file mode, `644` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Owner  || UNIX file owner ID, `0` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Group  || UNIX file group ID, `0` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;    || Size        || File size, in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After the record, the file&#039;s content begins. If you just want to read the next record, you can skip `Size` bytes ahead and begin reading from there. Note that the archive&#039;s magic number is only seen once at the very beginning and does not repeat per-record.&lt;br /&gt;
&lt;br /&gt;
===Strings===&lt;br /&gt;
Strings are encoded in Pascal-style, meaning they are prefaced by their length. The length is encoded as an unsigned 16-bit integer (`ushort`). Strings must be encoded as UTF-8.&lt;br /&gt;
&lt;br /&gt;
===Descriptors===&lt;br /&gt;
Descriptors are stored as Pascal-style strings, but they have a strict format. Thankfully, the format is fairly easy to both assemble and parse.&lt;br /&gt;
&lt;br /&gt;
Descriptors are an extensible key/value format for extra file metadata. They look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All keys and values are strings. Key/value pairs are separated by the semicolon (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;U+003B&amp;lt;/code&amp;gt;). The end of a key and the beginning of a value is denoted by the equals sign (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;U+003E&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Key/value pairs may be missing the value (see `bool1` above). In this case, it must be assumed that the value is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. A pair &#039;&#039;&#039;must&#039;&#039;&#039; contain at least the key.&lt;br /&gt;
&lt;br /&gt;
A trailing semicolon is not required. All of the following are valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false;&lt;br /&gt;
key1=value1;key2=value2;bool1=true;bool2=false;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false&lt;br /&gt;
key1=value1;key2=value2;bool1=true;bool2=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Storing a semicolon (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) or equals sign (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;) in a key or value is done by encoding it as a URL entity (&amp;lt;code&amp;gt;%3b&amp;lt;/code&amp;gt; for semicolons, &amp;lt;code&amp;gt;%3e&amp;lt;/code&amp;gt; for equals signs. This is case sensitive.) Note that no other URL entities are to be parsed or encoded.&lt;br /&gt;
&lt;br /&gt;
The following is an example of an encoded equals sign in a value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
einstein-relativity=e%3emc^2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By storing information in a simple dictionary, the Jax archive format is extensible with up to 65,536 bytes of additional metadata. Take the following representation&lt;br /&gt;
of a partial Jax entry (in pseudocode):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[ type = &#039;r&#039;,&lt;br /&gt;
  name = &#039;Test File.001&#039;,&lt;br /&gt;
  description = [&#039;nextFile&#039;:  &#039;Test File.002&#039;,&lt;br /&gt;
                 &#039;ownerName&#039;: &#039;John Doe&#039;,&lt;br /&gt;
                 &#039;groupName&#039;: &#039;wheel&#039; ],&lt;br /&gt;
  size = 512000,&lt;br /&gt;
  uid = 6756,&lt;br /&gt;
  group = 12 ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example is by no means part of the Jax standard, but it demonstrates a potential use case for the extensible key/value store.&lt;br /&gt;
&lt;br /&gt;
==Utilities==&lt;br /&gt;
&lt;br /&gt;
There is no official implementation of Jax yet. The cenix project contains a Jax implementation and utility capable of reading and writing Jax archives. It is available on [https://github.com/notvelleda/cenix/tree/main/jax GitHub].&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Jax_Archive&amp;diff=1237</id>
		<title>Jax Archive</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Jax_Archive&amp;diff=1237"/>
		<updated>2024-09-07T02:56:47Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: /* Utilities */ new implementation :) thanks moff&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Jax&#039;&#039;&#039; (or &#039;&#039;&#039;J&#039;&#039;&#039;enny&#039;s &#039;&#039;&#039;A&#039;&#039;&#039;rchive e&#039;&#039;&#039;X&#039;&#039;&#039;change) is an awful backronym and a simple archive format intended to be easy and cheap (processing power-wise) to parse. Structurally, it is similar to &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt;, while not being nearly as wasteful. Instead of fixed-length fields, it uses Pascal-style strings for archive names and descriptions, as well as an additional &#039;descriptor&#039; field. The &#039;descriptor&#039; is a simple key/value style field for additional metadata.&lt;br /&gt;
&lt;br /&gt;
==Magic Number==&lt;br /&gt;
Jax archive formats all begin with the bytes &amp;lt;code&amp;gt;5E 6A 61 78&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;^jax&amp;lt;/code&amp;gt; in ASCII.)&lt;br /&gt;
&lt;br /&gt;
==Records==&lt;br /&gt;
Jax archives are structured as follows:&lt;br /&gt;
&lt;br /&gt;
*Magic number&lt;br /&gt;
*Record for File 1&lt;br /&gt;
*Data for File 1&lt;br /&gt;
*Record for File 2&lt;br /&gt;
*Data for File 2&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
Records are not aligned to any particular byte boundary and neither are the files within the archive, in the interest of creating smaller archives without the need for compression.&lt;br /&gt;
&lt;br /&gt;
Records are structured as follows. Note that a &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; is an 8-bit unsigned integer, a &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt; is a 64-bit signed integer, a &amp;lt;code&amp;gt;ulong&amp;lt;/code&amp;gt; is a 64-bit unsigned integer, and a &amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt; is a 16-bit unsigned integer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Jax archive record structure&lt;br /&gt;
|-&lt;br /&gt;
!Type!!Name!!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;    || Record Type || &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for directory, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for symbolic link, and &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; for a regular file.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;  || Record Name || Pascal-style, see [[#Strings|Strings]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;  || Description || Also Pascal-style, see [[#Descriptors|Descriptors]] for parsing information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ulong&amp;lt;/code&amp;gt;   || Timestamp   || UNIX timestamp of last change, seconds since 12:00 AM or 00:00 on January 1st, 1970&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Mode   || UNIX file mode, `644` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Owner  || UNIX file owner ID, `0` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Group  || UNIX file group ID, `0` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;    || Size        || File size, in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After the record, the file&#039;s content begins. If you just want to read the next record, you can skip `Size` bytes ahead and begin reading from there. Note that the archive&#039;s magic number is only seen once at the very beginning and does not repeat per-record.&lt;br /&gt;
&lt;br /&gt;
===Strings===&lt;br /&gt;
Strings are encoded in Pascal-style, meaning they are prefaced by their length. The length is encoded as an unsigned 16-bit integer (`ushort`). Strings must be encoded as UTF-8.&lt;br /&gt;
&lt;br /&gt;
===Descriptors===&lt;br /&gt;
Descriptors are stored as Pascal-style strings, but they have a strict format. Thankfully, the format is fairly easy to both assemble and parse.&lt;br /&gt;
&lt;br /&gt;
Descriptors are an extensible key/value format for extra file metadata. They look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All keys and values are strings. Key/value pairs are separated by the semicolon (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;U+003B&amp;lt;/code&amp;gt;). The end of a key and the beginning of a value is denoted by the equals sign (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;U+003E&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Key/value pairs may be missing the value (see `bool1` above). In this case, it must be assumed that the value is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. A pair &#039;&#039;&#039;must&#039;&#039;&#039; contain at least the key.&lt;br /&gt;
&lt;br /&gt;
A trailing semicolon is not required. All of the following are valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false;&lt;br /&gt;
key1=value1;key2=value2;bool1=true;bool2=false;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false&lt;br /&gt;
key1=value1;key2=value2;bool1=true;bool2=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Storing a semicolon (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) or equals sign (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;) in a key or value is done by encoding it as a URL entity (&amp;lt;code&amp;gt;%3b&amp;lt;/code&amp;gt; for semicolons, &amp;lt;code&amp;gt;%3e&amp;lt;/code&amp;gt; for equals signs. This is case sensitive.) Note that no other URL entities are to be parsed or encoded.&lt;br /&gt;
&lt;br /&gt;
The following is an example of an encoded equals sign in a value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
einstein-relativity=e%3emc^2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By storing information in a simple dictionary, the Jax archive format is extensible with up to 65,536 bytes of additional metadata. Take the following representation&lt;br /&gt;
of a partial Jax entry (in pseudocode):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[ type = &#039;r&#039;,&lt;br /&gt;
  name = &#039;Test File.001&#039;,&lt;br /&gt;
  description = [&#039;nextFile&#039;:  &#039;Test File.002&#039;,&lt;br /&gt;
                 &#039;ownerName&#039;: &#039;John Doe&#039;,&lt;br /&gt;
                 &#039;groupName&#039;: &#039;wheel&#039; ],&lt;br /&gt;
  size = 512000,&lt;br /&gt;
  uid = 6756,&lt;br /&gt;
  group = 12 ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example is by no means part of the Jax standard, but it demonstrates a potential use case for the extensible key/value store.&lt;br /&gt;
&lt;br /&gt;
==Utilities==&lt;br /&gt;
&lt;br /&gt;
There is no official implementation of Jax yet. The cenix project contains a Jax implementation and utility capable of reading and writing Jax archives. It is available on [https://github.com/notvelleda/cenix/tree/main/jax GitHub].&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Jax_Archive&amp;diff=1234</id>
		<title>Jax Archive</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Jax_Archive&amp;diff=1234"/>
		<updated>2024-09-06T23:44:01Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: fix record types&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Jax&#039;&#039;&#039; (or &#039;&#039;&#039;J&#039;&#039;&#039;enny&#039;s &#039;&#039;&#039;A&#039;&#039;&#039;rchive e&#039;&#039;&#039;X&#039;&#039;&#039;change) is an awful backronym and a simple archive format intended to be easy and cheap (processing power-wise) to parse. Structurally, it is similar to &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt;, while not being nearly as wasteful. Instead of fixed-length fields, it uses Pascal-style strings for archive names and descriptions, as well as an additional &#039;descriptor&#039; field. The &#039;descriptor&#039; is a simple key/value style field for additional metadata.&lt;br /&gt;
&lt;br /&gt;
==Magic Number==&lt;br /&gt;
Jax archive formats all begin with the bytes &amp;lt;code&amp;gt;5E 6A 61 78&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;^jax&amp;lt;/code&amp;gt; in ASCII.)&lt;br /&gt;
&lt;br /&gt;
==Records==&lt;br /&gt;
Jax archives are structured as follows:&lt;br /&gt;
&lt;br /&gt;
*Magic number&lt;br /&gt;
*Record for File 1&lt;br /&gt;
*Data for File 1&lt;br /&gt;
*Record for File 2&lt;br /&gt;
*Data for File 2&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
Records are not aligned to any particular byte boundary and neither are the files within the archive, in the interest of creating smaller archives without the need for compression.&lt;br /&gt;
&lt;br /&gt;
Records are structured as follows. Note that a &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; is an 8-bit unsigned integer, a &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt; is a 64-bit signed integer, a &amp;lt;code&amp;gt;ulong&amp;lt;/code&amp;gt; is a 64-bit unsigned integer, and a &amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt; is a 16-bit unsigned integer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Jax archive record structure&lt;br /&gt;
|-&lt;br /&gt;
!Type!!Name!!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;    || Record Type || &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; for directory, &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt; for symbolic link, and &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; for a regular file.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;  || Record Name || Pascal-style, see [[#Strings|Strings]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;  || Description || Also Pascal-style, see [[#Descriptors|Descriptors]] for parsing information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ulong&amp;lt;/code&amp;gt;   || Timestamp   || UNIX timestamp of last change, seconds since 12:00 AM or 00:00 on January 1st, 1970&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Mode   || UNIX file mode, `644` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Owner  || UNIX file owner ID, `0` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Group  || UNIX file group ID, `0` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;    || Size        || File size, in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After the record, the file&#039;s content begins. If you just want to read the next record, you can skip `Size` bytes ahead and begin reading from there. Note that the archive&#039;s magic number is only seen once at the very beginning and does not repeat per-record.&lt;br /&gt;
&lt;br /&gt;
===Strings===&lt;br /&gt;
Strings are encoded in Pascal-style, meaning they are prefaced by their length. The length is encoded as an unsigned 16-bit integer (`ushort`). Strings must be encoded as UTF-8.&lt;br /&gt;
&lt;br /&gt;
===Descriptors===&lt;br /&gt;
Descriptors are stored as Pascal-style strings, but they have a strict format. Thankfully, the format is fairly easy to both assemble and parse.&lt;br /&gt;
&lt;br /&gt;
Descriptors are an extensible key/value format for extra file metadata. They look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All keys and values are strings. Key/value pairs are separated by the semicolon (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;U+003B&amp;lt;/code&amp;gt;). The end of a key and the beginning of a value is denoted by the equals sign (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;U+003E&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Key/value pairs may be missing the value (see `bool1` above). In this case, it must be assumed that the value is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. A pair &#039;&#039;&#039;must&#039;&#039;&#039; contain at least the key.&lt;br /&gt;
&lt;br /&gt;
A trailing semicolon is not required. All of the following are valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false;&lt;br /&gt;
key1=value1;key2=value2;bool1=true;bool2=false;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false&lt;br /&gt;
key1=value1;key2=value2;bool1=true;bool2=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Storing a semicolon (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) or equals sign (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;) in a key or value is done by encoding it as a URL entity (&amp;lt;code&amp;gt;%3b&amp;lt;/code&amp;gt; for semicolons, &amp;lt;code&amp;gt;%3e&amp;lt;/code&amp;gt; for equals signs. This is case sensitive.) Note that no other URL entities are to be parsed or encoded.&lt;br /&gt;
&lt;br /&gt;
The following is an example of an encoded equals sign in a value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
einstein-relativity=e%3emc^2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By storing information in a simple dictionary, the Jax archive format is extensible with up to 65,536 bytes of additional metadata. Take the following representation&lt;br /&gt;
of a partial Jax entry (in pseudocode):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[ type = &#039;r&#039;,&lt;br /&gt;
  name = &#039;Test File.001&#039;,&lt;br /&gt;
  description = [&#039;nextFile&#039;:  &#039;Test File.002&#039;,&lt;br /&gt;
                 &#039;ownerName&#039;: &#039;John Doe&#039;,&lt;br /&gt;
                 &#039;groupName&#039;: &#039;wheel&#039; ],&lt;br /&gt;
  size = 512000,&lt;br /&gt;
  uid = 6756,&lt;br /&gt;
  group = 12 ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example is by no means part of the Jax standard, but it demonstrates a potential use case for the extensible key/value store.&lt;br /&gt;
&lt;br /&gt;
==Utilities==&lt;br /&gt;
&lt;br /&gt;
None are officially released (as of September 6th, 2024) but several are in the works. The &amp;quot;reference implementation&amp;quot; (in a way) is Jenny&#039;s, written in Crystal. It is still a work in progress.&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=Jax_Archive&amp;diff=1233</id>
		<title>Jax Archive</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=Jax_Archive&amp;diff=1233"/>
		<updated>2024-09-06T23:43:18Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: create page (feedback welcome!)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Jax&#039;&#039;&#039; (or &#039;&#039;&#039;J&#039;&#039;&#039;enny&#039;s &#039;&#039;&#039;A&#039;&#039;&#039;rchive e&#039;&#039;&#039;X&#039;&#039;&#039;change) is an awful backronym and a simple archive format intended to be easy and cheap (processing power-wise) to parse. Structurally, it is similar to &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt;, while not being nearly as wasteful. Instead of fixed-length fields, it uses Pascal-style strings for archive names and descriptions, as well as an additional &#039;descriptor&#039; field. The &#039;descriptor&#039; is a simple key/value style field for additional metadata.&lt;br /&gt;
&lt;br /&gt;
==Magic Number==&lt;br /&gt;
Jax archive formats all begin with the bytes &amp;lt;code&amp;gt;5E 6A 61 78&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;^jax&amp;lt;/code&amp;gt; in ASCII.)&lt;br /&gt;
&lt;br /&gt;
==Records==&lt;br /&gt;
Jax archives are structured as follows:&lt;br /&gt;
&lt;br /&gt;
*Magic number&lt;br /&gt;
*Record for File 1&lt;br /&gt;
*Data for File 1&lt;br /&gt;
*Record for File 2&lt;br /&gt;
*Data for File 2&lt;br /&gt;
*...&lt;br /&gt;
&lt;br /&gt;
Records are not aligned to any particular byte boundary and neither are the files within the archive, in the interest of creating smaller archives without the need for compression.&lt;br /&gt;
&lt;br /&gt;
Records are structured as follows. Note that a &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt; is an 8-bit unsigned integer, a &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt; is a 64-bit signed integer, a &amp;lt;code&amp;gt;ulong&amp;lt;/code&amp;gt; is a 64-bit unsigned integer, and a &amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt; is a 16-bit unsigned integer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+Jax archive record structure&lt;br /&gt;
|-&lt;br /&gt;
!Type!!Name!!Details&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;    || Record Type || `d` for directory, `s` for symbolic link, and `r` for a regular file.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;  || Record Name || Pascal-style, see [[#Strings|Strings]]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;  || Description || Also Pascal-style, see [[#Descriptors|Descriptors]] for parsing information&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ulong&amp;lt;/code&amp;gt;   || Timestamp   || UNIX timestamp of last change, seconds since 12:00 AM or 00:00 on January 1st, 1970&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Mode   || UNIX file mode, `644` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Owner  || UNIX file owner ID, `0` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;  || File Group  || UNIX file group ID, `0` by default&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;    || Size        || File size, in bytes.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
After the record, the file&#039;s content begins. If you just want to read the next record, you can skip `Size` bytes ahead and begin reading from there. Note that the archive&#039;s magic number is only seen once at the very beginning and does not repeat per-record.&lt;br /&gt;
&lt;br /&gt;
===Strings===&lt;br /&gt;
Strings are encoded in Pascal-style, meaning they are prefaced by their length. The length is encoded as an unsigned 16-bit integer (`ushort`). Strings must be encoded as UTF-8.&lt;br /&gt;
&lt;br /&gt;
===Descriptors===&lt;br /&gt;
Descriptors are stored as Pascal-style strings, but they have a strict format. Thankfully, the format is fairly easy to both assemble and parse.&lt;br /&gt;
&lt;br /&gt;
Descriptors are an extensible key/value format for extra file metadata. They look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
All keys and values are strings. Key/value pairs are separated by the semicolon (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;U+003B&amp;lt;/code&amp;gt;). The end of a key and the beginning of a value is denoted by the equals sign (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;U+003E&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Key/value pairs may be missing the value (see `bool1` above). In this case, it must be assumed that the value is &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;. A pair &#039;&#039;&#039;must&#039;&#039;&#039; contain at least the key.&lt;br /&gt;
&lt;br /&gt;
A trailing semicolon is not required. All of the following are valid:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false;&lt;br /&gt;
key1=value1;key2=value2;bool1=true;bool2=false;&lt;br /&gt;
key1=value1;key2=value2;bool1;bool2=false&lt;br /&gt;
key1=value1;key2=value2;bool1=true;bool2=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Storing a semicolon (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;) or equals sign (&amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;) in a key or value is done by encoding it as a URL entity (&amp;lt;code&amp;gt;%3b&amp;lt;/code&amp;gt; for semicolons, &amp;lt;code&amp;gt;%3e&amp;lt;/code&amp;gt; for equals signs. This is case sensitive.) Note that no other URL entities are to be parsed or encoded.&lt;br /&gt;
&lt;br /&gt;
The following is an example of an encoded equals sign in a value:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
einstein-relativity=e%3emc^2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By storing information in a simple dictionary, the Jax archive format is extensible with up to 65,536 bytes of additional metadata. Take the following representation&lt;br /&gt;
of a partial Jax entry (in pseudocode):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
[ type = &#039;r&#039;,&lt;br /&gt;
  name = &#039;Test File.001&#039;,&lt;br /&gt;
  description = [&#039;nextFile&#039;:  &#039;Test File.002&#039;,&lt;br /&gt;
                 &#039;ownerName&#039;: &#039;John Doe&#039;,&lt;br /&gt;
                 &#039;groupName&#039;: &#039;wheel&#039; ],&lt;br /&gt;
  size = 512000,&lt;br /&gt;
  uid = 6756,&lt;br /&gt;
  group = 12 ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This example is by no means part of the Jax standard, but it demonstrates a potential use case for the extensible key/value store.&lt;br /&gt;
&lt;br /&gt;
==Utilities==&lt;br /&gt;
&lt;br /&gt;
None are officially released (as of September 6th, 2024) but several are in the works. The &amp;quot;reference implementation&amp;quot; (in a way) is Jenny&#039;s, written in Crystal. It is still a work in progress.&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
	<entry>
		<id>https://wiki.restless.systems/index.php?title=User:JennyWakeman&amp;diff=1230</id>
		<title>User:JennyWakeman</title>
		<link rel="alternate" type="text/html" href="https://wiki.restless.systems/index.php?title=User:JennyWakeman&amp;diff=1230"/>
		<updated>2024-09-06T22:54:03Z</updated>

		<summary type="html">&lt;p&gt;JennyWakeman: Created page with &amp;quot;daisy, daisy, give me your answer true&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;daisy, daisy, give me your answer true&lt;/div&gt;</summary>
		<author><name>JennyWakeman</name></author>
	</entry>
</feed>