119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/*
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * partinfo.c
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Originally written by Alain Knaff, <alknaff@innet.lu>.
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Cleaned up by Theodore Ts'o, <tytso@mit.edu>.
73984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt *
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h>
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h>
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_SYS_IOCTL_H
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/ioctl.h>
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h>
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <linux/hdreg.h>
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h>
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h>
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <errno.h>
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "nls-enable.h"
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined(__linux__) && defined(_IO) && !defined(BLKGETSIZE)
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BLKGETSIZE _IO(0x12,96)	/* return device size */
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main(int argc, char **argv)
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	struct hd_geometry loc;
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	int fd, i;
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	unsigned long size;
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef ENABLE_NLS
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	setlocale(LC_MESSAGES, "");
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	setlocale(LC_CTYPE, "");
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	bindtextdomain(NLS_CAT_NAME, LOCALEDIR);
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	textdomain(NLS_CAT_NAME);
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if (argc == 1) {
393984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt		fprintf(stderr, _("Usage:  %s device...\n\nPrints out the "
403984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt			"partition information for each given device.\n"
413984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt			"For example: %s /dev/hda\n\n"), argv[0], argv[0]);
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		exit(1);
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
443984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	for (i=1; i < argc; i++) {
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		fd = open(argv[i], O_RDONLY);
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (fd < 0) {
493984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt			fprintf(stderr, _("Cannot open %s: %s"),
503984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt				argv[i], strerror(errno));
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			continue;
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
533984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (ioctl(fd, HDIO_GETGEO, &loc) < 0) {
553984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt			fprintf(stderr, _("Cannot get geometry of %s: %s"),
563984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt				argv[i], strerror(errno));
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			close(fd);
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			continue;
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
603984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
613984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		if (ioctl(fd, BLKGETSIZE, &size) < 0) {
633984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt			fprintf(stderr, _("Cannot get size of %s: %s"),
643984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt				argv[i], strerror(errno));
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			close(fd);
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project			continue;
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		}
683984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt
693984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt		printf(_("%s: h=%3d s=%3d c=%4d   start=%8d size=%8lu end=%8d\n"),
703984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt		       argv[i],
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		       loc.heads, (int)loc.sectors, loc.cylinders,
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		       (int)loc.start, size, (int) loc.start + size -1);
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project		close(fd);
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	exit(0);
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
77