#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <err.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <CoreFoundation/CoreFoundation.h>
#include "util.h"
static char *
findRealDevice(char *dev) {
struct dirent *dp;
DIR *dir;
struct stat sbuf;
ino_t mine;
char *dName;
char *retval = NULL;
if (stat(dev, &sbuf) == -1) {
warn("cannot stat device file %s", dev);
return NULL;
}
if (sbuf.st_nlink == 1) { return NULL;
}
#define BEGINS(x, y) (!strncmp((x), (y), strlen((y))))
if (BEGINS(dev, "/dev/rdisk") || BEGINS(dev, "rdisk") ||
BEGINS(dev, "/dev/disk") || BEGINS(dev, "disk")) {
return NULL;
}
if (BEGINS(dev, "/dev/")) {
dName = dev + 4;
} else {
dName = dev;
}
#undef BEGINS
mine = sbuf.st_ino;
dir = opendir("/dev");
while ((dp = readdir(dir))) {
char *tmp = dp->d_name;
char dbuf[6 + strlen(tmp)];
memcpy(dbuf, "/dev/", 6);
memcpy(dbuf + 5, tmp, sizeof(dbuf) - 5);
if (!strcmp(dbuf, dName))
continue;
tmp = strrchr(dbuf, 's');
if (!tmp)
continue;
if (dp->d_fileno == mine) {
retval = strndup(dbuf, tmp - dbuf);
break;
}
}
closedir(dir);
return retval;
}
void
doStatus(const char *dev) {
char *realDev = findRealDevice((char*)dev);
printf("Device %s\n", dev);
if (realDev) {
printf("\tReal device is %s\n", realDev);
} else {
realDev = (char*)dev;
}
dev = realDev;
if (IsAppleLabel(dev) != 1) {
printf("\t* * * NOT A VALID LABEL * * *\n");
return;
}
printf("Metadata size = %u\n", GetMetadataSize(dev));
if (VerifyChecksum(dev) == 0)
printf("Metadata checksum is good\n");
else
printf("\t* * * Checksum is bad * * *\n");
return;
}