1/*- 2 * Copyright (c) 2015 The NetBSD Foundation, Inc. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to The NetBSD Foundation 6 * by John Nemeth 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 * POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30#if HAVE_NBTOOL_CONFIG_H 31#include "nbtool_config.h" 32#endif 33 34#include <sys/cdefs.h> 35#ifdef __RCSID 36__RCSID("$NetBSD: header.c,v 1.10 2019/03/14 10:26:10 mlelstv Exp $"); 37#endif 38 39#include <sys/types.h> 40 41#include <err.h> 42#include <stddef.h> 43#include <stdio.h> 44#include <stdlib.h> 45#include <string.h> 46#include <unistd.h> 47 48#include "map.h" 49#include "gpt.h" 50#include "gpt_private.h" 51 52static int cmd_header(gpt_t, int, char *[]); 53 54static const char *headerhelp[] = { 55 "", 56}; 57 58struct gpt_cmd c_header = { 59 "header", 60 cmd_header, 61 headerhelp, __arraycount(headerhelp), 62 GPT_READONLY, 63}; 64 65#define usage() gpt_usage(NULL, &c_header) 66 67static int 68header(gpt_t gpt) 69{ 70 unsigned int revision; 71 map_t map; 72 struct gpt_hdr *hdr; 73 char buf[128]; 74 75 gpt_show_num("Media Size", (uintmax_t)gpt->mediasz); 76 printf("Sector Size: %u\n", gpt->secsz); 77 78 gpt_show_num("Number of Sectors", 79 (uintmax_t)(gpt->mediasz / gpt->secsz)); 80 81 printf("\nHeader Information:\n"); 82 83 map = map_find(gpt, MAP_TYPE_PRI_GPT_HDR); 84 if (map == NULL) { 85 printf("- GPT Header not found\n"); 86 return -1; 87 } 88 89 hdr = map->map_data; 90 revision = le32toh(hdr->hdr_revision); 91 printf("- GPT Header Revision: %u.%u\n", revision >> 16, 92 revision & 0xffff); 93 gpt_show_num("- First Data Sector", le64toh(hdr->hdr_lba_start)); 94 gpt_show_num("- Last Data Sector", le64toh(hdr->hdr_lba_end)); 95 gpt_uuid_snprintf(buf, sizeof(buf), "%d", hdr->hdr_guid); 96 printf("- Media GUID: %s\n", buf); 97 printf("- Number of GPT Entries: %u\n", le32toh(hdr->hdr_entries)); 98 return 0; 99} 100 101static int 102cmd_header(gpt_t gpt, int argc, char *argv[]) 103{ 104 if (argc != optind) 105 return usage(); 106 107 return header(gpt); 108} 109