[kpartx] bug fixes for dos extended partition [3/4]
[platform/upstream/multipath-tools.git] / kpartx / devmapper.c
1 /*
2  * Copyright (c) 2004, 2005 Christophe Varoqui
3  */
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7 #include <libdevmapper.h>
8 #include <ctype.h>
9 #include <linux/kdev_t.h>
10
11 extern int
12 dm_prereq (char * str, int x, int y, int z)
13 {
14         int r = 1;
15         struct dm_task *dmt;
16         struct dm_versions *target;
17         struct dm_versions *last_target;
18
19         if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
20                 return 1;
21
22         dm_task_no_open_count(dmt);
23
24         if (!dm_task_run(dmt))
25                 goto out;
26
27         target = dm_task_get_versions(dmt);
28
29         /* Fetch targets and print 'em */
30         do {
31                 last_target = target;
32
33                 if (!strncmp(str, target->name, strlen(str)) &&
34                     /* dummy prereq on multipath version */
35                     target->version[0] >= x &&
36                     target->version[1] >= y &&
37                     target->version[2] >= z
38                    )
39                         r = 0;
40
41                 target = (void *) target + target->next;
42         } while (last_target != target);
43
44         out:
45         dm_task_destroy(dmt);
46         return r;
47 }
48
49 extern int
50 dm_simplecmd (int task, const char *name) {
51         int r = 0;
52         struct dm_task *dmt;
53
54         if (!(dmt = dm_task_create(task)))
55                 return 0;
56
57         if (!dm_task_set_name(dmt, name))
58                 goto out;
59
60         dm_task_no_open_count(dmt);
61
62         r = dm_task_run(dmt);
63
64         out:
65         dm_task_destroy(dmt);
66         return r;
67 }
68
69 extern int
70 dm_addmap (int task, const char *name, const char *target,
71            const char *params, unsigned long size) {
72         int r = 0;
73         struct dm_task *dmt;
74
75         if (!(dmt = dm_task_create (task)))
76                 return 0;
77
78         if (!dm_task_set_name (dmt, name))
79                 goto addout;
80
81         if (!dm_task_add_target (dmt, 0, size, target, params))
82                 goto addout;
83
84         dm_task_no_open_count(dmt);
85
86         r = dm_task_run (dmt);
87
88         addout:
89         dm_task_destroy (dmt);
90         return r;
91 }
92
93 extern int
94 dm_map_present (char * str)
95 {
96         int r = 0;
97         struct dm_task *dmt;
98         struct dm_info info;
99
100         if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
101                 return 0;
102
103         if (!dm_task_set_name(dmt, str))
104                 goto out;
105
106         dm_task_no_open_count(dmt);
107
108         if (!dm_task_run(dmt))
109                 goto out;
110
111         if (!dm_task_get_info(dmt, &info))
112                 goto out;
113
114         if (info.exists)
115                 r = 1;
116 out:
117         dm_task_destroy(dmt);
118         return r;
119 }
120
121
122 const char *
123 dm_mapname(int major, int minor)
124 {
125         struct dm_task *dmt;
126         const char *mapname;
127
128         if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
129                 return NULL;
130
131         dm_task_no_open_count(dmt);
132         dm_task_set_major(dmt, major);
133         dm_task_set_minor(dmt, minor);
134
135         if (!dm_task_run(dmt))
136                 goto out;
137
138         mapname = strdup(dm_task_get_name(dmt));
139 out:
140         dm_task_destroy(dmt);
141         return mapname;
142 }
143