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