lang2
lang2

Reputation: 11966

programmatically detect SD card write protect

Back in the good-old days of floppy, if you enable write protection of a floppy, DOS would kindly tell you that you cannot write to it. Now we have SD card that can hold the content of thousands of floppy and we still have the write protection - and it's handy sometime. But nobody is able to tell me I can't write to it, at least on Linux. I have a lovely script that partition and format a SD card in a way I like. It took me 1/2 hour of debugging just to find out that the SD card is write-protected.

So the question, is there a way that the software can detect such condition?

Thanks,

Upvotes: 2

Views: 4002

Answers (1)

xwindows -on strike-
xwindows -on strike-

Reputation: 471

The driver knows when the card is write-protected, and it actually warns when you mount it via command line:

# mount /dev/sdc1 /media/flash
mount: block device /dev/sdc1 is write-protected, mounting read-only

In case you would like to check it yourself at device level, you can use the hdparm command to query read-only status of disk device, including SD card and USB flash drive in general. This program should be available in most GNU/Linux distributions, commonly in a package named "hdparm".

If you are not root, be sure to specify full path to the hdparm command; and this assumes you have read permission on your card of course.

For example: my SD card is inserted, detected as /dev/sdc, and write protection tab is at Unlock:

$ /sbin/hdparm -r /dev/sdc

/dev/sdc:
 readonly      =  0 (off)

When I slided the write protection tab to Lock, re-insert the card, and run the command again:

$ /sbin/hdparm -r /dev/sdc

/dev/sdc:
 readonly      =  1 (on)

If you would like to do it in shell script, you can try something like:

READONLY=`/sbin/hdparm -r /dev/sdc 2>&1 | sed -n 's/^.*= *\([01]\) .*$/\1/p'`
if [ "$READONLY" = "0" ]
then
    echo Card is writable.
else
    echo Card is not writable.
fi

Note: If you prefer to do it in C, you can try either:

  • Opening the device file in write mode and see if it fails with errno value EROFS (Read-only file system), or...
  • Opening the device file in read mode, then issue ioctl() named BLKROGET, and check if the result value is nonzero; this is the way hdparm work.

Upvotes: 2

Related Questions