Question

I compiled and ran the chardev.c example from the lkmpg and when writing to the device received an unexpected error:

anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied

The module write function looks like this:

/*  
 * Called when a process writes to dev file: echo "hi" > /dev/chardev 
 */
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
    printk(KERN_ALERT "Sorry, this operation isn't supported.\n");
    return -EINVAL;
}

I'm not getting the expected error of invalid operation and the error printed to /var/log/messages.

I can read from the device with no problem, receiving the expected results:

anon@anon:~/lkmpg$ cat /dev/chardev 
I already told you 6 times Hello world!

The device /dev/chardev is created manually using:

sudo mknod /dev/chardev c 252 0

What's the deal?

--Edit--

Apparently when I mknod to create the device it ends up with the following permissions:

crw-r--r-- 1 root root 252, 0 2009-10-30 09:27 /dev/chardev. 

Once I did sudo chmod a+w /dev/chardev the driver worked as expected.

However, people have said it is not correct to do this.

What is the correct course of action and why?

Was it helpful?

Solution

A really, really, really straight forward and simple example of how to implement character drivers can be found in drivers/watchdog/softdog.c

You can compare your code to this example, which shows you how to do the following:

  • Read from the device
  • Write to the device
  • Present an ioctl interface via the device

While softdog is a very useful tool, its as much a tutorial as anything else. Alan Cox threw it together, so its a good example of more 'proper' implementation.

If you can post the whole source to your module, we can help you find out why your function is not being entered as expected.

Update:

It is perfectly acceptable to allow under privileged users to write to character devices! I repeat, it is perfectly acceptable to allow under privileged users to write to character devices! If this was not the case, stuff like FUSE, Modems, USB Gadgets, CD ROMS and other things would require root access to use.

What you can do is take advantage of group memberships. I.e., on Ubuntu, users permitted to use FUSE (file system in user space) should belong to the 'fuse' group, which permits granular access on who can and can not use that feature. Similarly, on some of my systems, a QRNG (quantum random number generator) is in use .. and is (you guessed it) a character device. I need to allow PHP to access that device , so I:

  • Create a QRNG group
  • Make sure PHP runs as the user (not anonymous system users)
  • Add users owning apps that need access to the device to the QRNG group

I hope that clears it up :)

OTHER TIPS

I think, actual problem is the command which you issued to write is incorrect. Try

#sudo sh -c "echo "hi" > /dev/chardev"

If you want to run multiple commands with sudo then you should use command as shown above. With this, you dont need to do chmod and change its permissions as well. Hope this helps.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top