Since it is impossible to go from user space to ring 0 in a typed manner, we have to use some weakly typed representation (that is, we can't use an enum, unless we want to do transmutations and friends). Therefore, we use a string-like representation when moving to kernel space. This is basically just a raw pointer to a C-like, null-terminated string. To avoid further overhead, we use more efficient representations:
The first of the three representations is the simplest one. It consists of a
struct containing two fat pointers, representing the scheme and the reference respectively.
This is a
struct containing two
Strings (that is, growable, heap-allocated UTF-8 string), being the scheme and the reference respectively.
This is a Copy-on-Write (CoW) URL, which, when mutated, gets cloned to heap. This way, you get efficient conditional allocation of the URL.
Not much fanciness here.
Opening URLs happens through the
OPEN system call.
OPEN takes a C-like, null-terminated string, and two pointer-sized integers, keeping the open flags and the file mode, respectively.
The path argument of
OPEN does not have to be a URL. For compatibility reasons, it will default to the
file: scheme. If otherwise specified, the scheme will be resolved by the registrar (see The root scheme), and then opened.