VBoxVolInfo.cpp revision d7143bbabd4040bb139c989e7d26ef819637d53a
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell/* $Id$ */
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste/** @file
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * Apps - VBoxVolInfo, Volume information tool.
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste */
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste/*
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * Copyright (C) 2012 Oracle Corporation
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste *
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * This file is part of VirtualBox Open Source Edition (OSE), as
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * available from http://www.virtualbox.org. This file is free software;
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * you can redistribute it and/or modify it under the terms of the GNU
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * General Public License (GPL) as published by the Free Software
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * Foundation, in version 2 as it comes in the "COPYING" file of the
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
7cbae22b7560eefcf086863923459880aa87f014Jaco Jooste */
7bf512aea50c834dc9c3ef5a0a228059fcc753a5jenkins
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell/*******************************************************************************
7c0e808d02c2c2e2008cf8ccdaee6400f5834387Joe Bandenburg* Header Files *
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell*******************************************************************************/
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell#include <dirent.h>
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell#include <libdevmapper.h>
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell#include <stdio.h>
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell#include <sys/types.h>
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell#include <sys/stat.h>
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell#include <unistd.h>
15f60c5ba586de69e94c6045e9bf91103e924020James Phillpotts
15f60c5ba586de69e94c6045e9bf91103e924020James Phillpotts/*******************************************************************************
15f60c5ba586de69e94c6045e9bf91103e924020James Phillpotts* Function Prototypes *
15f60c5ba586de69e94c6045e9bf91103e924020James Phillpotts*******************************************************************************/
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnellvoid print_dev_name(dev_t devid);
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell/*
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell * Extracts logical volume dependencies via devmapper API and print them out.
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell */
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnellint main(int argc, char **argv)
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell{
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell struct dm_task *dmtask;
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell struct dm_info dminfo;
184c2aab7c668e864d6a346cf2e53270f365f6e0Phill Cunnington
184c2aab7c668e864d6a346cf2e53270f365f6e0Phill Cunnington if (argc != 2)
184c2aab7c668e864d6a346cf2e53270f365f6e0Phill Cunnington {
184c2aab7c668e864d6a346cf2e53270f365f6e0Phill Cunnington fprintf(stderr, "USAGE: %s <volume_name>\n", argv[0]);
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell return 1;
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell }
87e1cbcd02820f55e1816ee4efe9e9127be22a11James Phillpotts
87e1cbcd02820f55e1816ee4efe9e9127be22a11James Phillpotts dmtask = dm_task_create(DM_DEVICE_DEPS);
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell if (!dmtask)
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell return 2;
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell if (dm_task_set_name(dmtask, argv[1]))
c871a8ff857961f6d1bd43c62072979969d53b59Tom Rumsey if (dm_task_run(dmtask))
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell if (dm_task_get_info(dmtask, &dminfo))
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell {
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell struct dm_deps *dmdeps = dm_task_get_deps(dmtask);
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell if (dmdeps)
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell {
09a132902baa28c2f781680ea18958f95491f5bcCraig McDonnell unsigned i;
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell for (i = 0; i < dmdeps->count; ++i)
9689679261c7316504327bc5c012c9808bcc3e18Jaco Jooste print_dev_name(dmdeps->device[i]);
9689679261c7316504327bc5c012c9808bcc3e18Jaco Jooste }
9689679261c7316504327bc5c012c9808bcc3e18Jaco Jooste }
9689679261c7316504327bc5c012c9808bcc3e18Jaco Jooste
9689679261c7316504327bc5c012c9808bcc3e18Jaco Jooste dm_task_destroy(dmtask);
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell return 0;
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell}
aa3a2aee90d1c61946a08c839d9838be7658b453Craig McDonnell
/*
* Looks up device name by id using /dev directory. Prints it to stdout.
*/
void print_dev_name(dev_t devid)
{
char path[PATH_MAX];
struct dirent *de;
DIR *dir = opendir("/dev");
while ((de = readdir(dir)) != NULL)
{
struct stat st;
snprintf(path, sizeof(path), "/dev/%s", de->d_name);
if (!stat(path, &st))
if (S_ISBLK(st.st_mode))
if (devid == st.st_rdev)
{
puts(de->d_name);
break;
}
}
closedir(dir);
}