Example
In this example, we're going to create a resource manager called /dev/atoz that
will be a directory resource manager.
It's going to manifest the files
/dev/atoz/a through to
dev/atoz/z, with a cat of any of the files returning the
uppercase letter corresponding to the filename.
# cd /dev
# ls
atoz null ptyp2 socket ttyp0 ttyp3
enet0 ptyp0 ptyp3 text ttyp1 zero
mem ptyp1 shmem tty ttyp2
# ls -ld atoz
dr-xr-xr-x 1 root 0 26 Sep 05 07:59 atoz
# cd atoz
# ls
a e i m q u y
b f j n r v z
c g k o s w
d h l p t x
# ls -l e
-r--r--r-- 1 root 0 1 Sep 05 07:59 e
# cat m
M# cat q
Q#
The example above illustrates that the directory atoz shows up in the
/dev directory, and that you can do an ls of the directory
itself and cd into it.
The /dev/atoz directory has a size of 26,
which is the number
that we selected in the code.
Once in the atoz directory, doing another ls shows the
contents: the files a through z.
Doing an ls of a particular file, say e, shows that the file
is readable by all (the -r--r--r-- part) and is one byte in size.
Finally, doing a few random cat's shows that the files have the stated contents.
(Note that since the files contain only one byte, there's no linefeed after the character
is printed, which is why the prompt shows up on the same line as the output.)
Now that we've seen the characteristics, let's take a look at the code, which is organized into the following functions:
- main() and declarations
- Main function; this is where we initialize everything and start the resource manager running.
- my_open()
- The handler routine for the _IO_CONNECT message.
- my_read()
- The handler routine for the _IO_READ message.
- my_read_dir() and my_read_file()
- These two routines perform the actual work of the my_read() function.
- dirent_size() and dirent_fill()
- Utility functions to deal with the struct dirent structure.
Note that while the code is broken up here into several short sections with text, you can find the complete version of atoz.c in the Sample Programs appendix.