DCMD_BLK_PART_DESCRIPTION
QNX SDP8.0Devctl and Ioctl CommandsDeveloper
Get an extended description of a partition
Synopsis:
#include <sys/dcmd_blk.h>
#define DCMD_BLK_PART_DESCRIPTION   __DIOF(_DCMD_BLK, 3, struct partition_description)
Arguments to devctl():
| Argument | Value | 
|---|---|
| filedes | A file descriptor that you obtained by opening the device. | 
| dcmd | DCMD_BLK_PART_DESCRIPTION | 
| dev_data_ptr | A pointer to a struct partition_description that the device can fill in (see below). | 
| n_bytes | sizeof(struct partition_description) | 
            
| dev_info_ptr | NULL | 
Description:
This command gets an extended description of the partition for the device associated with the given file descriptor.
Input:
None.
Output:
    The header dcmd_blk.h defines the
    struct partition_description structure as follows:
struct partition_description {
    char        scheme[4];
    uint32_t    index;
    uint64_t    header;
    char        fsdll[16];
    uint32_t    sequence;
    char        reserved[92];
    union {
        struct part_pc_entry {
            uint8_t     boot_ind;
            uint8_t     beg_head;
            uint8_t     beg_sector;
            uint8_t     beg_cylinder;
            uint8_t     os_type;
            uint8_t     end_head;
            uint8_t     end_sector;
            uint8_t     end_cylinder;
            uint32_t    part_offset;
            uint32_t    part_size;
        }           pc;
        gpt_entry_t gpt;
    }           entry;
};
The gpt.h header defines the
    struct gpt_entry_t structure and related definitions as follows:
    
#define GUID_NBYTES 16 typedef struct { uint8_t byte[GUID_NBYTES]; } guid_t; #define GPT_PARTN_NAME_SIZE_UCL2 36 struct gpt_entry_t { guid_t partition_type_guid; guid_t unique_partition_guid; uint64_t starting_lba; uint64_t ending_lba; uint64_t attributes; uint16_t partition_name[GPT_PARTN_NAME_SIZE_UCL2]; };
The members include:
- scheme
 - A string that identifies the layout scheme for the partition:
            
            
            
Scheme Constant Value Personal Computer-style FS_PARTITION_PC "pc\x00\x00" Globally Unique ID Partition Table FS_PARTITION_GPT "gpt\x00"  - index
 - The index in the partition table.
 - header
 - The location of the partition header.
 - fsdll
 - A shortened version of the name of the shared object that supports the partition (for example, qnx6 for the Power-Safe filesystem's shared object, fs-qnx6.so).
 - sequence
 - The partition enumeration order.
 - entry
 - A union that contains partition-specific information:
            
- pc — the entry for a PC-style partition:
                    
- boot_ind
 - 0x80 if the partition is bootable, 0x00 if it isn't.
 - beg_head
 - The beginning head number.
 - beg_sector
 - The beginning sector number.
 - beg_cylinder
 - The beginning cylinder number.
 - os_type
 - The partition type; refer to
                                
Partitions
in the Filesystems chapter of the System Architecture guide. - end_head
 - The end head number.
 - end_sector
 - The end sector number.
 - end_cylinder
 - The end cylinder number.
 - part_offset
 - The offset of the partition, in bytes.
 - part_size
 - The number of sectors in the partition.
 
 - 
                    gpt — the entry for a GUID partition:
                    
- partition_type_guid
 - The globally unique identifier for the partition type.
 - unique_partition_guid
 - The partition's globally unique identifier.
 - starting_lba
 - The starting logical block address.
 - ending_lba
 - The ending logical block address, inclusive.
 - attributes
 - Flags that indicate attributes, such as read-only.
 - partition_name
 - The name of the partition.
 
 
 - pc — the entry for a PC-style partition:
                    
 
Errors:
The devctl()
    function can return the following, in addition to the error codes
    listed in its entry in the C Library Reference:
    
- ENOTTY
 - The file descriptor is for a raw block device, and hence there's no partition information.
 
Example:
#include <stdio.h>
#include <stdlib.h>
#include <devctl.h>
#include <sys/dcmd_blk.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
int main (void)
{
    int fd;
    int ret;
    struct partition_description pd;
    uint64_t slba, elba;
    fd = open ("/dev/hd0t179", O_RDONLY);
    if (fd == -1)
    {
        perror ("open() failed");
        return (EXIT_FAILURE);
    }
    /*  Determine the partition's start and end LBAs. */
    ret = devctl(fd, DCMD_BLK_PART_DESCRIPTION, &pd, sizeof pd, NULL);
    if (ret == EOK)
    {
        if (strcmp(pd.scheme, FS_PARTITION_PC) == 0) {
            printf ("PC: ");
            slba = pd.entry.pc.part_offset;
            elba = pd.entry.pc.part_offset + pd.entry.pc.part_size - 1;
        }
        else if (strcmp(pd.scheme, FS_PARTITION_GPT) == 0) {
            printf ("GPT: ");
            slba = pd.entry.gpt.starting_lba;
            elba = pd.entry.gpt.ending_lba;
        }
        printf ("start: %lld end: %lld\n", slba, elba);
    } else {
        printf ("DCMD_BLK_PART_DESCRIPTION failed: %s\n", strerror(ret) );
        return (EXIT_FAILURE);
    }
    return (EXIT_SUCCESS);
}
Related links:
devctl() in the QNX OS C Library Reference
Page updated: 
