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: