blob: 7c71c0ddb2c97d177523e2c9e7f8d24ed648604e [file] [log] [blame]
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "common.h"
/*
* return partition name - uses static storage unless buf is supplied
*/
char *
partname(char *dev, int pno, int lth) {
static char bufp[80];
char *p;
int w, wp;
w = strlen(dev);
p = "";
if (isdigit(dev[w-1]))
p = "p";
/* devfs kludge - note: fdisk partition names are not supposed
to equal kernel names, so there is no reason to do this */
if (strcmp (dev + w - 4, "disc") == 0) {
w -= 4;
p = "part";
}
/* udev names partitions by appending -partN
e.g. ata-SAMSUNG_SV8004H_0357J1FT712448-part1 */
if ((strncmp(dev, PATH_DEV_BYID, strlen(PATH_DEV_BYID)) == 0) ||
strncmp(dev, PATH_DEV_BYPATH, strlen(PATH_DEV_BYPATH)) == 0) {
p = "-part";
}
wp = strlen(p);
if (lth) {
snprintf(bufp, sizeof(bufp), "%*.*s%s%-2u",
lth-wp-2, w, dev, p, pno);
} else {
snprintf(bufp, sizeof(bufp), "%.*s%s%-2u", w, dev, p, pno);
}
return bufp;
}
int
is_probably_full_disk(char *name) {
#ifdef HDIO_GETGEO
struct hd_geometry geometry;
int fd, i = 0;
fd = open(name, O_RDONLY);
if (fd >= 0) {
i = ioctl(fd, HDIO_GETGEO, &geometry);
close(fd);
}
if (i==0)
return (fd >= 0 && geometry.start == 0);
#endif
/*
* The "silly heuristic" is still sexy for us, because
* for example Xen doesn't implement HDIO_GETGEO for virtual
* block devices (/dev/xvda).
*
* -- kzak@redhat.com (23-Feb-2006)
*/
while (*name)
name++;
return !isdigit(name[-1]);
}