Search code examples
c++linuxdiskscsi

Way to get SCSI disk names in Linux C++ application


In my Linux C++ application I want to get names of all SCSI disks which are present on the system. e.g. /dev/sda, /dev/sdb, ... and so on.

Currently I am getting it from the file /proc/scsi/sg/devices output using below code:


    host    chan SCSI id    lun     type    opens   qdepth  busy    online
    0       0       0       0       0       1       128     0       1
    1       0       0       0       0       1       128     0       1
    1       0       0       1       0       1       128     0       1
    1       0       0       2       0       1       128     0       1

// If SCSI device Id is > 26 then the corresponding device name is like /dev/sdaa or /dev/sdab etc.
    if (MAX_ENG_ALPHABETS <= scsiId)
    {
        // Device name order is: aa, ab, ..., az, ba, bb, ..., bz, ..., zy, zz.
        deviceName.append(1, 'a'+ (char)(index / MAX_ENG_ALPHABETS) - 1);
        deviceName.append(1, 'a'+ (char)(index % MAX_ENG_ALPHABETS));
    }
    // If SCSI device Id is < 26 then the corresponding device name is liek /dev/sda or /dev/sdb etc.
    else
    {
        deviceName.append(1, 'a'+ index);
    }

But the file /proc/scsi/sg/devices also contains the information about the disk which were previously present on the system. e.g If I detach the disk (LUN) /dev/sdc from the system the file /proc/scsi/sg/devices still contains info of /dev/sdc which is invalid.

Tell me is there any different way to get the SCSI disk names? like a system call?

Thanks


Solution

  • You can simply read list of all files like /dev/sd* (in C, you would need to use opendir/readdir/closedir) and filter it by sdX (where X is one or two letters).

    Also, you can get list of all partitions by reading single file /proc/partitions, and then filter 4th field by sdX:

    $ cat /proc/partitions
    major minor  #blocks  name
    
    8        0   52428799 sda
    8        1     265041 sda1
    8        2          1 sda2
    8        5    2096451 sda5
    8        6   50066541 sda6
    

    which would give you list of all physical disks together with their capacity (3rd field).