diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-01-16 20:07:25 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-01-16 20:09:33 +0100 |
commit | edce2aed3aa93b84f7b4c70412bdb665da2977b0 (patch) | |
tree | 6953215eb2e65cc79c417fb5d1d6923ef5a2a9a0 /src/import/import.c | |
parent | 49bb233bb734536b9617d838f09a7bf9b8336003 (diff) |
import: support importing qcow2 images
With this change the import tool will now unpack qcow2 images into
normal raw disk images, suitable for usage with nspawn.
This allows has the benefit of also allowing importing Ubuntu Cloud
images for usage with nspawn.
Diffstat (limited to 'src/import/import.c')
-rw-r--r-- | src/import/import.c | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/src/import/import.c b/src/import/import.c index e457adf629..af8d0ec42b 100644 --- a/src/import/import.c +++ b/src/import/import.c @@ -45,10 +45,48 @@ static void on_raw_finished(RawImport *import, int error, void *userdata) { sd_event_exit(event, error); } +static int strip_raw_suffixes(const char *p, char **ret) { + static const char suffixes[] = + ".xz\0" + ".raw\0" + ".qcow2\0" + ".img\0"; + + _cleanup_free_ char *q = NULL; + + q = strdup(p); + if (!q) + return -ENOMEM; + + for (;;) { + const char *sfx; + bool changed = false; + + NULSTR_FOREACH(sfx, suffixes) { + char *e; + + e = endswith(q, sfx); + if (e) { + *e = 0; + changed = true; + } + } + + if (!changed) + break; + } + + *ret = q; + q = NULL; + + return 0; +} + static int pull_raw(int argc, char *argv[], void *userdata) { _cleanup_(raw_import_unrefp) RawImport *import = NULL; _cleanup_event_unref_ sd_event *event = NULL; - const char *url, *local, *suffix; + const char *url, *local; + _cleanup_free_ char *l = NULL; int r; url = argv[1]; @@ -79,13 +117,11 @@ static int pull_raw(int argc, char *argv[], void *userdata) { if (local) { const char *p; - suffix = endswith(local, ".raw.xz"); - if (!suffix) - suffix = endswith(local, ".raw"); - if (!suffix) - suffix = endswith(local, ".xz"); - if (suffix) - local = strndupa(local, suffix - local); + r = strip_raw_suffixes(local, &l); + if (r < 0) + return log_oom(); + + local = l; if (!machine_name_is_valid(local)) { log_error("Local image name '%s' is not valid.", local); |