1134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o/* 2134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o * partinfo.c 3134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o * 4134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o * Originally written by Alain Knaff, <alknaff@innet.lu>. 5134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o * 6134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o * Cleaned up by Theodore Ts'o, <tytso@mit.edu>. 7efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 8134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o */ 9134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o 10134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o#include <sys/types.h> 11134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o#include <fcntl.h> 12bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o#ifdef HAVE_SYS_IOCTL_H 13bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o#include <sys/ioctl.h> 14bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o#endif 15134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o#include <stdio.h> 16134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o#include <linux/hdreg.h> 17134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o#include <unistd.h> 18134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o#include <stdlib.h> 192740156bd12747389eaf745529653b26a3a9d73dTheodore Ts'o#include <errno.h> 20d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#include "nls-enable.h" 21134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o 22bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o#if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE) 23bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o#define BLKGETSIZE _IO(0x12,96) /* return device size */ 24bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o#endif 25bb145b01cf5fd27d9afe03c3262d0e1a326e7ec1Theodore Ts'o 26134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'oint main(int argc, char **argv) 27134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o{ 28134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o struct hd_geometry loc; 29e927168ed69c29df1a405ea71e1e602a6c37436bTheodore Ts'o int fd, i; 30a9bc79add106f2c544c449f514a1113817deae2eTheodore Ts'o unsigned long size; 31134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o 32d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#ifdef ENABLE_NLS 33d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o setlocale(LC_MESSAGES, ""); 3414308a5398984842e808faa3ff2dd6a1c52d90bdTheodore Ts'o setlocale(LC_CTYPE, ""); 35d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o bindtextdomain(NLS_CAT_NAME, LOCALEDIR); 36d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o textdomain(NLS_CAT_NAME); 37e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall set_com_err_gettext(gettext); 38d9c56d3ca0bee11e3446ff7e12e3124d28e298a7Theodore Ts'o#endif 39134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o if (argc == 1) { 40df9c01b1449ccbaa9283486f0f6a50085043036bTheodore Ts'o fprintf(stderr, _("Usage: %s device...\n\nPrints out the " 41fe365fd8eff51c474394e9c02c177121ff727510Theodore Ts'o "partition information for each given device.\n" 42fe365fd8eff51c474394e9c02c177121ff727510Theodore Ts'o "For example: %s /dev/hda\n\n"), argv[0], argv[0]); 43134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o exit(1); 44134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o } 45efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 46134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o for (i=1; i < argc; i++) { 47134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o fd = open(argv[i], O_RDONLY); 48134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o 49134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o if (fd < 0) { 50cca95a827fbac56a8f17bb2900a44d6fb34fbe90Benno Schulenberg fprintf(stderr, _("Cannot open %s: %s"), 51cca95a827fbac56a8f17bb2900a44d6fb34fbe90Benno Schulenberg argv[i], strerror(errno)); 52134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o continue; 53134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o } 54efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 55134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o if (ioctl(fd, HDIO_GETGEO, &loc) < 0) { 56cca95a827fbac56a8f17bb2900a44d6fb34fbe90Benno Schulenberg fprintf(stderr, _("Cannot get geometry of %s: %s"), 57cca95a827fbac56a8f17bb2900a44d6fb34fbe90Benno Schulenberg argv[i], strerror(errno)); 58134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o close(fd); 59134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o continue; 60134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o } 61efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 62efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 63134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o if (ioctl(fd, BLKGETSIZE, &size) < 0) { 64cca95a827fbac56a8f17bb2900a44d6fb34fbe90Benno Schulenberg fprintf(stderr, _("Cannot get size of %s: %s"), 65cca95a827fbac56a8f17bb2900a44d6fb34fbe90Benno Schulenberg argv[i], strerror(errno)); 66134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o close(fd); 67134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o continue; 68134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o } 69efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 70cca95a827fbac56a8f17bb2900a44d6fb34fbe90Benno Schulenberg printf(_("%s: h=%3d s=%3d c=%4d start=%8d size=%8lu end=%8d\n"), 71efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o argv[i], 72134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o loc.heads, (int)loc.sectors, loc.cylinders, 73134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o (int)loc.start, size, (int) loc.start + size -1); 74134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o close(fd); 75134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o } 76134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o exit(0); 77134ea28aaf76a3497361c99e115ff666b0c000b8Theodore Ts'o} 78