.. _challenge_9: Solution to Challenge #9 - sysfs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: In the implementation of this module `Greg Kroah-Hartman's blog `_ was taken into considitation when it came to the race-condition between the publication of ``UEVENT_ADD`` of the ``struct kobject`` and the actual addition of files to ``sysfs``. This is the reason for creating the attributes groups and a custom ``struct ktype`` which uses them instead of simply using ``sysfs_create_group`` which is far easier to use. In this challenge, I was asked to implement a small module which exposes various fields to user-space via ``sysfs`` in a dedicated directory called ``/sys/kernel/eudyptula/``. In this directory would be 3 files: #. ``id`` - behaves the same as misc char device from :ref:`challenge 6 ` (and the ``id`` file from :ref:`challenge 8 `). #. ``jiffies`` - exposes the internal jiffies counter (read-only). #. ``foo`` - a special buffer which can be written into only by root and be read by all. Basically it's the same challenge as :ref:`challenge 8 ` but with ``sysfs`` instead of ``debugfs``. The testing flow is as follows: #. Test the Initialization of the Module: .. code-block:: bash dmesg -c > /dev/null # clear the current kernel log. lsmod # see the module isn't loaded yet. ls -la /sys/kernel/eudyptula # verify there is no such device yet. #. Test the ``id`` file: .. code-block:: bash modprobe solution_9 # load the kernel module. dmesg -c # see the loading logs of the module. lsmod # see that the module is currently loaded. ls -la /sys/kernel/eudyptula/id # verify that there is a id file under eudyptula. cat /sys/kernel/eudyptula/id # see roeey777 (i.e. the id) printed out. echo -n eudyptula > /sys/kernel/eudyptula/id # write the "secret" into the device. echo $? # expect to see 0, indicating success. dmesg -c # verify there is no error logs. echo -n nonsense > /sys/kernel/eudyptula/id # write something else than the "secret" into the device. echo $? # expect to see 1, indicating failure. dmesg -c # verify there is an error log indicating that nonsense isn't the "secret". #. Test the ``jiffies`` file: .. code-block:: bash ls -la /sys/kernel/eudyptula/jiffies # verify that there is a jiffies file under eudyptula. cat /sys/kernel/eudyptula/jiffies # see the number of passed jiffies. #. Test the ``foo`` file: .. code-block:: bash ls -la /sys/kernel/eudyptula/foo # verify that there is a foo file under eudyptula. echo test > /sys/kernel/eudyptula/foo # write "test\n" into the exposed kernel buffer. cat /sys/kernel/eudyptula/foo # expect to see test printed out. #. Test the Unloading of the Module: .. code-block:: bash modprobe -r solution_9 # unload the kernel module. dmesg -c # see the unloading logs of the module. lsmod # see that the module isn't loaded. ls -la /sys/kernel/eudyptula # verify that there is no such char device.