2 * Copyright (c) 2004, 2005 Christophe Varoqui
8 #include <libdevmapper.h>
11 #include "devmapper.h"
13 #define UUID_PREFIX "part%d-"
14 #define MAX_PREFIX_LEN 8
15 #define PARAMS_SIZE 1024
18 dm_prereq (char * str, int x, int y, int z)
22 struct dm_versions *target;
23 struct dm_versions *last_target;
25 if (!(dmt = dm_task_create(DM_DEVICE_LIST_VERSIONS)))
28 dm_task_no_open_count(dmt);
30 if (!dm_task_run(dmt))
33 target = dm_task_get_versions(dmt);
35 /* Fetch targets and print 'em */
39 if (!strncmp(str, target->name, strlen(str)) &&
40 /* dummy prereq on multipath version */
41 target->version[0] >= x &&
42 target->version[1] >= y &&
43 target->version[2] >= z
47 target = (void *) target + target->next;
48 } while (last_target != target);
56 dm_simplecmd (int task, const char *name, int no_flush, uint16_t udev_flags) {
58 int udev_wait_flag = (task == DM_DEVICE_RESUME ||
59 task == DM_DEVICE_REMOVE);
60 #ifdef LIBDM_API_COOKIE
65 if (!(dmt = dm_task_create(task)))
68 if (!dm_task_set_name(dmt, name))
71 dm_task_no_open_count(dmt);
72 dm_task_skip_lockfs(dmt);
75 dm_task_no_flush(dmt);
77 #ifdef LIBDM_API_COOKIE
79 udev_flags |= DM_UDEV_DISABLE_LIBRARY_FALLBACK;
80 if (udev_wait_flag && !dm_task_set_cookie(dmt, &cookie, udev_flags))
84 #ifdef LIBDM_API_COOKIE
94 dm_addmap (int task, const char *name, const char *target,
95 const char *params, uint64_t size, int ro, const char *uuid, int part,
96 mode_t mode, uid_t uid, gid_t gid) {
99 char *prefixed_uuid = NULL;
100 #ifdef LIBDM_API_COOKIE
102 uint16_t udev_flags = 0;
105 if (!(dmt = dm_task_create (task)))
108 if (!dm_task_set_name (dmt, name))
111 if (!dm_task_add_target (dmt, 0, size, target, params))
114 if (ro && !dm_task_set_ro (dmt))
117 if (task == DM_DEVICE_CREATE && uuid) {
118 prefixed_uuid = malloc(MAX_PREFIX_LEN + strlen(uuid) + 1);
119 if (!prefixed_uuid) {
120 fprintf(stderr, "cannot create prefixed uuid : %s\n",
124 sprintf(prefixed_uuid, UUID_PREFIX "%s", part, uuid);
125 if (!dm_task_set_uuid(dmt, prefixed_uuid))
129 if (!dm_task_set_mode(dmt, mode))
131 if (!dm_task_set_uid(dmt, uid))
133 if (!dm_task_set_gid(dmt, gid))
136 dm_task_no_open_count(dmt);
138 #ifdef LIBDM_API_COOKIE
140 udev_flags = DM_UDEV_DISABLE_LIBRARY_FALLBACK;
141 if (task == DM_DEVICE_CREATE &&
142 !dm_task_set_cookie(dmt, &cookie, udev_flags))
145 r = dm_task_run (dmt);
146 #ifdef LIBDM_API_COOKIE
147 if (task == DM_DEVICE_CREATE)
148 dm_udev_wait(cookie);
151 dm_task_destroy (dmt);
158 dm_map_present (char * str, char **uuid)
168 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
171 if (!dm_task_set_name(dmt, str))
174 dm_task_no_open_count(dmt);
176 if (!dm_task_run(dmt))
179 if (!dm_task_get_info(dmt, &info))
187 uuidtmp = dm_task_get_uuid(dmt);
188 if (uuidtmp && strlen(uuidtmp))
189 *uuid = strdup(uuidtmp);
192 dm_task_destroy(dmt);
198 dm_mapname(int major, int minor)
201 char *mapname = NULL;
204 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
207 dm_task_no_open_count(dmt);
208 dm_task_set_major(dmt, major);
209 dm_task_set_minor(dmt, minor);
211 if (!dm_task_run(dmt))
214 map = dm_task_get_name(dmt);
215 if (map && strlen(map))
216 mapname = strdup(map);
219 dm_task_destroy(dmt);
226 * Return the device number of the first dependend device
227 * for a given target.
229 dev_t dm_get_first_dep(char *devname)
232 struct dm_deps *dm_deps;
235 if ((dmt = dm_task_create(DM_DEVICE_DEPS)) == NULL) {
238 if (!dm_task_set_name(dmt, devname)) {
241 if (!dm_task_run(dmt)) {
244 if ((dm_deps = dm_task_get_deps(dmt)) == NULL) {
247 if (dm_deps->count > 0) {
248 ret = dm_deps->device[0];
251 dm_task_destroy(dmt);
257 dm_mapuuid(int major, int minor)
263 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
266 dm_task_no_open_count(dmt);
267 dm_task_set_major(dmt, major);
268 dm_task_set_minor(dmt, minor);
270 if (!dm_task_run(dmt))
273 tmp = dm_task_get_uuid(dmt);
277 dm_task_destroy(dmt);
282 dm_devn (char * mapname, int *major, int *minor)
288 if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
291 if (!dm_task_set_name(dmt, mapname))
294 if (!dm_task_run(dmt))
297 if (!dm_task_get_info(dmt, &info))
305 dm_task_destroy(dmt);
310 dm_get_map(int major, int minor, char * outparams)
314 uint64_t start, length;
315 char *target_type = NULL;
318 if (!(dmt = dm_task_create(DM_DEVICE_TABLE)))
321 dm_task_set_major(dmt, major);
322 dm_task_set_minor(dmt, minor);
323 dm_task_no_open_count(dmt);
325 if (!dm_task_run(dmt))
328 /* Fetch 1st target */
329 dm_get_next_target(dmt, NULL, &start, &length,
330 &target_type, ¶ms);
332 if (snprintf(outparams, PARAMS_SIZE, "%s", params) <= PARAMS_SIZE)
335 dm_task_destroy(dmt);
339 #define FEATURE_NO_PART "no_partitions"
342 dm_no_partitions(int major, int minor)
344 char params[PARAMS_SIZE], *ptr;
347 if (dm_get_map(major, minor, params))
351 num_features = strtoul(params, &ptr, 10);
352 if ((ptr == params) || num_features == 0) {
353 /* No features found, return success */
356 for (i = 0; (i < num_features); i++) {
357 if (!ptr || ptr > params + strlen(params))
359 /* Skip whitespaces */
360 while(ptr && *ptr == ' ') ptr++;
361 if (!strncmp(ptr, FEATURE_NO_PART, strlen(FEATURE_NO_PART)))
363 ptr = strchr(ptr, ' ');