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