1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
/*
* Copyright (c) 2004, 2005 Christophe Varoqui
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>
#include <linux/kdev_t.h>
#include <libdevmapper.h>
static void usage(char * progname) {
fprintf(stderr, "usage : %s [-t target type] dev_t\n", progname);
fprintf(stderr, "where dev_t is either 'major minor' or 'major:minor'\n");
exit(1);
}
int dm_target_type(int major, int minor, char *type)
{
struct dm_task *dmt;
void *next = NULL;
uint64_t start, length;
char *target_type = NULL;
char *params;
int r = 1;
if (!(dmt = dm_task_create(DM_DEVICE_STATUS)))
return 1;
if (!dm_task_set_major(dmt, major) ||
!dm_task_set_minor(dmt, minor))
goto bad;
dm_task_no_open_count(dmt);
if (!dm_task_run(dmt))
goto bad;
if (!type)
goto good;
do {
next = dm_get_next_target(dmt, next, &start, &length,
&target_type, ¶ms);
if (target_type && strcmp(target_type, type))
goto bad;
} while (next);
good:
printf("%s\n", dm_task_get_name(dmt));
r = 0;
bad:
dm_task_destroy(dmt);
return r;
}
int main(int argc, char **argv)
{
int c;
int major, minor;
char *target_type = NULL;
while ((c = getopt(argc, argv, "t:")) != -1) {
switch (c) {
case 't':
target_type = optarg;
break;
default:
usage(argv[0]);
return 1;
break;
}
}
/* sanity check */
if (optind == argc - 2) {
major = atoi(argv[argc - 2]);
minor = atoi(argv[argc - 1]);
} else if (optind != argc - 1 ||
2 != sscanf(argv[argc - 1], "%i:%i", &major, &minor))
usage(argv[0]);
if (dm_target_type(major, minor, target_type))
return 1;
return 0;
}
|